From 07ab3fc885f3447f0ba7ba39c00fb50a7f81bf3b Mon Sep 17 00:00:00 2001 From: vunited Date: Thu, 2 Jan 2020 17:07:44 +0800 Subject: [PATCH 1/8] 2020/1/4 Signed-off-by: vunited --- src/com/enums/SeasonEnum.java | 21 ++++ src/com/test/javaBasic/JavaDay04.java | 156 ++++++++++++++++++++++++++ src/javaBasic/JavaDay04.java | 156 -------------------------- 3 files changed, 177 insertions(+), 156 deletions(-) create mode 100644 src/com/enums/SeasonEnum.java create mode 100644 src/com/test/javaBasic/JavaDay04.java delete mode 100644 src/javaBasic/JavaDay04.java diff --git a/src/com/enums/SeasonEnum.java b/src/com/enums/SeasonEnum.java new file mode 100644 index 0000000..2685fef --- /dev/null +++ b/src/com/enums/SeasonEnum.java @@ -0,0 +1,21 @@ +package com.enums; + +/** + * + * @author geekjason + * + */ +public enum SeasonEnum { + //spring春天 + SPRING(1),SUMMER(2),AUTUMN(3),WINTER(4); + private int seq; + SeasonEnum(int seq){ + this.seq = seq; + } + public int getSeq() + { + return seq; + } + + +} diff --git a/src/com/test/javaBasic/JavaDay04.java b/src/com/test/javaBasic/JavaDay04.java new file mode 100644 index 0000000..a75d1c7 --- /dev/null +++ b/src/com/test/javaBasic/JavaDay04.java @@ -0,0 +1,156 @@ +package com.test.javaBasic; + +import java.util.Arrays; +import java.util.Random; +import java.util.Scanner; + +public class JavaDay04 { + public static void main(String[] args) { +// System.out.println(ballHight(10, 3)); +// System.out.println(2 * rabNum(10)); +// System.out.println(defValue(0)); + +// 算法:排序--------冒泡排序(Bubble Sort):两两比较,大的值放后面 + int[] demoArr = { 5, 9, 7, 4, 3 }; +// 对象方法排序 +// Arrays.sort(demoArr); //升序 + // 手动排序 +// {5,9,7,4,3} +// +// {5,9,7,4,3} 第一轮 第一次 +// {5,7,9,4,3} 第一轮 第二次 +// {5,7,4,9,3} 第一轮 第三次 +// {5,7,4,3,9} 第一轮 第四次 +// +// {5,7,4,3,9} 第二轮 第一次 +// {5,4,7,3,9} 第二轮 第二次 +// {5,4,3,7,9} 第二轮 第三次 +// +// {4,5,3,7,9} 第三轮 第一次 +// {4,3,5,7,9} 第三轮 第二次 +// +// {3,4,5,7,9} 第四轮 第一次 + + arraySort(demoArr); + System.out.println(Arrays.toString(demoArr)); + +// 算法:查找(有序)------二分法 + //手写二分法 + int[] demoArr02 = { 12, 24, 53, 23, 56, 74, 96, 235, 65, 47, 70, 1, 2, 5, 9, 7, 30 }; + arraySort(demoArr02); //查找之前 首先排序 + System.out.println(Arrays.toString(demoArr02)); + int value = 80; //被查询的值 + int high = demoArr02.length - 1; //右侧边界下标 + int low = 0; //左侧边界下标 + int middle = 0; //下标中值 + int index = 0; //接被查询的值的下标 + boolean boo = false; //开关(判断被查询的值是否在数组中) + while (low <= high) { //循环条件(左侧边界下标 <=右侧边界下标) + middle = (low + high) / 2; //下标中值赋值 等于(左侧边界+右侧边界)/2 + if (demoArr02[middle] == value) { //如果被查询的值等于中间下标对应元素值 + boo = true; //打开开关 + index = middle; //将下标中值赋值给index + break; //跳出循环 + } + if (demoArr02[middle] > value) { //如果被查询的值<中间下标对应元素值 + high = middle - 1; //新的右侧边界等于原中值下标-1 + } + if (demoArr02[middle] < value) { //如果被查询的值>中间下标对应元素值 + low = middle + 1; //新的左侧边界等于原中值下标+1 + } + } + if(boo) { //判断开关状态 + System.out.println(value+"在数组中,下标为"+index); + }else { + System.out.println(value+"不在数组中"); + } + //系统对象的方法实现查找 + System.out.println(Arrays.binarySearch(demoArr02,80)); + + //控制台输入 使用场景:局部或方法功能测试 +// Scanner scan=new Scanner(System.in); //实例化Scanner对象 +// int x=scan.nextInt(); //创建整型变量 从控制台赋值 +// System.out.println(x); +//// Byte y=scan.nextByte(); +//// System.out.println(y); +// String s=scan.next(); //创建字符串变量,从控制台赋值 +// System.out.println(s); +// double h=scan.nextDouble(); +// int n=scan.nextInt(); +// System.out.println(ballHight(h,n)); + + //生成随机数 + Random rd=new Random(); //导入随机数类 + int target=rd.nextInt(100)+1; //random.nextInt(n) 生成[0,n)随机整数 + if(target<=3) { + System.out.println("恭喜获得SSR"); + }else if(target<=13) { + System.out.println("恭喜获得SR"); + }else if(target<=63) { + System.out.println("恭喜获得R"); + }else { + System.out.println("谢谢惠顾"); + } + + } + +// case:1 一个球从h米高度坠落,第一次反弹至h/2,第二次反弹至第一次的一半。 +// 计算第n次,反弹回多少米 + public static double ballHight(double h, int n) { + if (n == 0) { + return h; + } else { + return ballHight(h, n - 1) / 2; + } + } +// 1:ballHight(h,n)==ballHight(h,n-1)/2 2: ballHight(h,0)==h + +//case:2 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 +//后每个月又开始生兔子.计算,第n个月 兔子总数为多少。 +//月份 数量 +//1 1 +//2 1 +//3 2 +//4 3 +//5 5 +//6 8 +// rabNum(6)==rabNum(5) + rabNum(4) rabNum(2)==1 rabNum(1)==1 + public static int rabNum(int month) { + if (month == 2 || month == 1) { + return 1; + } else { + return rabNum(month - 1) + rabNum(month - 2); + } + } + +//case:3 一个防御盾牌,每次被攻击,防御值减少一半再减少1点,以后每次被攻击, +//防御值都减少(当前防御值的一半加1点),到第十次被攻击结束之后,防御值只剩1点, +//计算防御盾牌初始值为多少。 + public static int defValue(int attTime) { +// defValue(n)== (defValue(n+1)+1)*2 +// defValue(10)==1 + if (attTime == 10) { + return 1; + } else { + return (defValue(attTime + 1) + 1) * 2; + } + } + + public static void arraySort(int[] demoArr) { + for (int i = 0; i < demoArr.length - 1; i++) { + for (int j = 0; j < demoArr.length - 1 - i; j++) { + if (demoArr[j] > demoArr[j + 1]) { + int temp = demoArr[j]; + demoArr[j] = demoArr[j + 1]; + demoArr[j + 1] = temp; + } + } + } + } +// !!!debug运行(debug测试):点击debug按钮 F6:下一步 F8:直接运行至下一个断点(如无断点,结束运行) +// F5:进入方法 F7:退出方法 + + + + +} diff --git a/src/javaBasic/JavaDay04.java b/src/javaBasic/JavaDay04.java deleted file mode 100644 index 380dcc5..0000000 --- a/src/javaBasic/JavaDay04.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.test.javaBasic; - -import java.util.Arrays; -import java.util.Random; -import java.util.Scanner; - -public class JavaDay04 { - public static void main(String[] args) { -// System.out.println(ballHight(10, 3)); -// System.out.println(2 * rabNum(10)); -// System.out.println(defValue(0)); - -// 㷨--------ð(Bubble Sort):Ƚϣֵź - int[] demoArr = { 5, 9, 7, 4, 3 }; -// 󷽷 -// Arrays.sort(demoArr); // - // ֶ -// {5,9,7,4,3} -// -// {5,9,7,4,3} һ һ -// {5,7,9,4,3} һ ڶ -// {5,7,4,9,3} һ -// {5,7,4,3,9} һ Ĵ -// -// {5,7,4,3,9} ڶ һ -// {5,4,7,3,9} ڶ ڶ -// {5,4,3,7,9} ڶ -// -// {4,5,3,7,9} һ -// {4,3,5,7,9} ڶ -// -// {3,4,5,7,9} һ - - arraySort(demoArr); - System.out.println(Arrays.toString(demoArr)); - -// 㷨ң------ַ - //дַ - int[] demoArr02 = { 12, 24, 53, 23, 56, 74, 96, 235, 65, 47, 70, 1, 2, 5, 9, 7, 30 }; - arraySort(demoArr02); //֮ǰ - System.out.println(Arrays.toString(demoArr02)); - int value = 80; //ѯֵ - int high = demoArr02.length - 1; //Ҳ߽± - int low = 0; //߽± - int middle = 0; //±ֵ - int index = 0; //ӱѯֵ± - boolean boo = false; //أжϱѯֵǷУ - while (low <= high) { //ѭ߽± <=Ҳ߽±꣩ - middle = (low + high) / 2; //±ֵֵ ڣ߽+Ҳ߽磩/2 - if (demoArr02[middle] == value) { //ѯֵм±ӦԪֵ - boo = true; //򿪿 - index = middle; //±ֵֵindex - break; //ѭ - } - if (demoArr02[middle] > value) { //ѯֵ<м±ӦԪֵ - high = middle - 1; //µҲ߽ԭֵ±-1 - } - if (demoArr02[middle] < value) { //ѯֵ>м±ӦԪֵ - low = middle + 1; //µ߽ԭֵ±+1 - } - } - if(boo) { //жϿ״̬ - System.out.println(value+"У±Ϊ"+index); - }else { - System.out.println(value+""); - } - //ϵͳķʵֲ - System.out.println(Arrays.binarySearch(demoArr02,80)); - - //̨ ʹóֲ򷽷ܲ -// Scanner scan=new Scanner(System.in); //ʵScanner -// int x=scan.nextInt(); //ͱ ӿֵ̨ -// System.out.println(x); -//// Byte y=scan.nextByte(); -//// System.out.println(y); -// String s=scan.next(); //ַӿֵ̨ -// System.out.println(s); -// double h=scan.nextDouble(); -// int n=scan.nextInt(); -// System.out.println(ballHight(h,n)); - - // - Random rd=new Random(); // - int target=rd.nextInt(100)+1; //random.nextInt(n) [0,n) - if(target<=3) { - System.out.println("ϲSSR"); - }else if(target<=13) { - System.out.println("ϲSR"); - }else if(target<=63) { - System.out.println("ϲR"); - }else { - System.out.println("ллݹ"); - } - - } - -// case:1 һh׸߶׹䣬һηh/2ڶηһεһ롣 -// nΣض - public static double ballHight(double h, int n) { - if (n == 0) { - return h; - } else { - return ballHight(h, n - 1) / 2; - } - } -// 1:ballHight(h,n)==ballHight(h,n-1)/2 2: ballHight(h,0)==h - -//case2 һӣӳ3ÿ¶һӣСӳ -//ÿֿʼ.㣬n Ϊ١ -//· -//1 1 -//2 1 -//3 2 -//4 3 -//5 5 -//6 8 -// rabNum(6)==rabNum(5) + rabNum(4) rabNum(2)==1 rabNum(1)==1 - public static int rabNum(int month) { - if (month == 2 || month == 1) { - return 1; - } else { - return rabNum(month - 1) + rabNum(month - 2); - } - } - -//case3 һƣÿαֵһټ1㣬Ժÿα -//ֵ(ǰֵһ1)ʮα֮󣬷ֵֻʣ1㣬 -//ƳʼֵΪ١ - public static int defValue(int attTime) { -// defValue(n)== (defValue(n+1)+1)*2 -// defValue(10)==1 - if (attTime == 10) { - return 1; - } else { - return (defValue(attTime + 1) + 1) * 2; - } - } - - public static void arraySort(int[] demoArr) { - for (int i = 0; i < demoArr.length - 1; i++) { - for (int j = 0; j < demoArr.length - 1 - i; j++) { - if (demoArr[j] > demoArr[j + 1]) { - int temp = demoArr[j]; - demoArr[j] = demoArr[j + 1]; - demoArr[j + 1] = temp; - } - } - } - } -// !!!debugУdebugԣdebugť F6һ F8:ֱһϵ㣨޶ϵ㣬У -// F5:뷽 F7˳ - - - - -} From 6cde856f67ec1aa33724cd94baa2bdbcbc726ccd Mon Sep 17 00:00:00 2001 From: vunited Date: Sat, 4 Jan 2020 15:28:38 +0800 Subject: [PATCH 2/8] 2020/1/4 --- .settings/org.eclipse.wst.common.component | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 .settings/org.eclipse.wst.common.component diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component deleted file mode 100644 index e24a7e5..0000000 --- a/.settings/org.eclipse.wst.common.component +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - From 9f5d7d1eef2a7cef58f25395b3e3f55e3e7a2579 Mon Sep 17 00:00:00 2001 From: vunited Date: Sun, 5 Jan 2020 22:17:54 +0800 Subject: [PATCH 3/8] java6 -> java8 --- .classpath | 10 +- .settings/.gitignore | 1 + .settings/org.eclipse.core.resources.prefs | 1 - APITest/spider-flow-api/pom.xml | 55 ------- APITest/spider-flow-core/pom.xml | 56 ------- APITest/spider-flow-web/pom.xml | 38 ----- mysql-connector-java-5.1.39-bin.jar | Bin 0 -> 989497 bytes pom.xml | 139 +++++++++++++----- spider/pom.xml | 117 +++++++++++++++ .../resources/application.properties | 0 .../resources/logback-spring.xml | 0 .../resources/static/css/easyui.css | 0 .../resources/static/css/editor.css | 0 .../resources/static/css/index.css | 0 .../resources/static/css/layui-blue.css | 0 .../resources/static/datasource-edit.html | 0 .../resources/static/datasources.html | 0 .../resources/static/editCron.html | 0 .../resources/static/editor.html | 0 .../resources/static/favicon.ico | Bin .../resources/static/index.html | 0 .../resources/static/js/canvas-viewer.js | 0 .../static/js/codemirror/codemirror.css | 0 .../static/js/codemirror/codemirror.js | 0 .../resources/static/js/codemirror/idea.css | 0 .../static/js/codemirror/placeholder.js | 0 .../static/js/codemirror/show-hint.css | 0 .../static/js/codemirror/show-hint.js | 0 .../static/js/codemirror/spiderflow-hint.js | 0 .../static/js/codemirror/spiderflow.js | 0 .../resources/static/js/codemirror/sql.js | 0 .../resources/static/js/common.js | 0 .../resources/static/js/cron/cron.js | 0 .../resources/static/js/cron/easyui.min.css | 0 .../static/js/cron/images/spinner_arrows.png | Bin .../static/js/cron/images/tabs_icons.png | Bin .../static/js/cron/jquery-2.1.4.min.js | 0 .../static/js/cron/jquery.easyui.min.js | 0 .../resources/static/js/editor.js | 0 .../resources/static/js/index.js | 0 .../resources/static/js/jquery.easyui.min.js | 0 .../resources/static/js/jsontree/icons.svg | 0 .../resources/static/js/jsontree/jsontree.css | 0 .../resources/static/js/jsontree/jsontree.js | 0 .../resources/static/js/layui/css/layui.css | 0 .../static/js/layui/css/layui.mobile.css | 0 .../static/js/layui/css/modules/code.css | 0 .../css/modules/laydate/default/laydate.css | 0 .../css/modules/layer/default/icon-ext.png | Bin .../layui/css/modules/layer/default/icon.png | Bin .../layui/css/modules/layer/default/layer.css | 0 .../css/modules/layer/default/loading-0.gif | Bin .../css/modules/layer/default/loading-1.gif | Bin .../css/modules/layer/default/loading-2.gif | Bin .../static/js/layui/ext/eleTree/eleTree.css | 0 .../static/js/layui/ext/eleTree/eleTree.js | 0 .../js/layui/ext/treeselect/treeselect.js | 0 .../js/layui/extends/formSelects-v4.css | 0 .../static/js/layui/extends/formSelects-v4.js | 0 .../static/js/layui/extends/treeGrid.js | 0 .../static/js/layui/font/iconfont.eot | Bin .../static/js/layui/font/iconfont.svg | 0 .../static/js/layui/font/iconfont.ttf | Bin .../static/js/layui/font/iconfont.woff | Bin .../static/js/layui/images/face/0.gif | Bin .../static/js/layui/images/face/1.gif | Bin .../static/js/layui/images/face/10.gif | Bin .../static/js/layui/images/face/11.gif | Bin .../static/js/layui/images/face/12.gif | Bin .../static/js/layui/images/face/13.gif | Bin .../static/js/layui/images/face/14.gif | Bin .../static/js/layui/images/face/15.gif | Bin .../static/js/layui/images/face/16.gif | Bin .../static/js/layui/images/face/17.gif | Bin .../static/js/layui/images/face/18.gif | Bin .../static/js/layui/images/face/19.gif | Bin .../static/js/layui/images/face/2.gif | Bin .../static/js/layui/images/face/20.gif | Bin .../static/js/layui/images/face/21.gif | Bin .../static/js/layui/images/face/22.gif | Bin .../static/js/layui/images/face/23.gif | Bin .../static/js/layui/images/face/24.gif | Bin .../static/js/layui/images/face/25.gif | Bin .../static/js/layui/images/face/26.gif | Bin .../static/js/layui/images/face/27.gif | Bin .../static/js/layui/images/face/28.gif | Bin .../static/js/layui/images/face/29.gif | Bin .../static/js/layui/images/face/3.gif | Bin .../static/js/layui/images/face/30.gif | Bin .../static/js/layui/images/face/31.gif | Bin .../static/js/layui/images/face/32.gif | Bin .../static/js/layui/images/face/33.gif | Bin .../static/js/layui/images/face/34.gif | Bin .../static/js/layui/images/face/35.gif | Bin .../static/js/layui/images/face/36.gif | Bin .../static/js/layui/images/face/37.gif | Bin .../static/js/layui/images/face/38.gif | Bin .../static/js/layui/images/face/39.gif | Bin .../static/js/layui/images/face/4.gif | Bin .../static/js/layui/images/face/40.gif | Bin .../static/js/layui/images/face/41.gif | Bin .../static/js/layui/images/face/42.gif | Bin .../static/js/layui/images/face/43.gif | Bin .../static/js/layui/images/face/44.gif | Bin .../static/js/layui/images/face/45.gif | Bin .../static/js/layui/images/face/46.gif | Bin .../static/js/layui/images/face/47.gif | Bin .../static/js/layui/images/face/48.gif | Bin .../static/js/layui/images/face/49.gif | Bin .../static/js/layui/images/face/5.gif | Bin .../static/js/layui/images/face/50.gif | Bin .../static/js/layui/images/face/51.gif | Bin .../static/js/layui/images/face/52.gif | Bin .../static/js/layui/images/face/53.gif | Bin .../static/js/layui/images/face/54.gif | Bin .../static/js/layui/images/face/55.gif | Bin .../static/js/layui/images/face/56.gif | Bin .../static/js/layui/images/face/57.gif | Bin .../static/js/layui/images/face/58.gif | Bin .../static/js/layui/images/face/59.gif | Bin .../static/js/layui/images/face/6.gif | Bin .../static/js/layui/images/face/60.gif | Bin .../static/js/layui/images/face/61.gif | Bin .../static/js/layui/images/face/62.gif | Bin .../static/js/layui/images/face/63.gif | Bin .../static/js/layui/images/face/64.gif | Bin .../static/js/layui/images/face/65.gif | Bin .../static/js/layui/images/face/66.gif | Bin .../static/js/layui/images/face/67.gif | Bin .../static/js/layui/images/face/68.gif | Bin .../static/js/layui/images/face/69.gif | Bin .../static/js/layui/images/face/7.gif | Bin .../static/js/layui/images/face/70.gif | Bin .../static/js/layui/images/face/71.gif | Bin .../static/js/layui/images/face/8.gif | Bin .../static/js/layui/images/face/9.gif | Bin .../resources/static/js/layui/layui.all.js | 0 .../resources/static/js/log-viewer.js | 0 .../static/js/mxgraph/css/common.css | 0 .../static/js/mxgraph/css/explorer.css | 0 .../resources/static/js/mxgraph/mxgraph.js | 0 .../static/js/mxgraph/mxgraph.min.js | 0 .../static/js/mxgraph/resources/editor.txt | 0 .../static/js/mxgraph/resources/editor_de.txt | 0 .../static/js/mxgraph/resources/editor_zh.txt | 0 .../static/js/mxgraph/resources/graph.txt | 0 .../static/js/mxgraph/resources/graph_de.txt | 0 .../static/js/mxgraph/resources/graph_zh.txt | 0 .../resources/static/js/spider-editor.js | 0 .../main => spider}/resources/static/log.html | 0 .../static/resources/templates/edge.html | 0 .../resources/templates/executeSql.html | 0 .../static/resources/templates/function.html | 0 .../static/resources/templates/loop.html | 0 .../static/resources/templates/loopJoin.html | 0 .../static/resources/templates/output.html | 0 .../static/resources/templates/process.html | 0 .../static/resources/templates/request.html | 0 .../static/resources/templates/root.html | 0 .../static/resources/templates/start.html | 0 .../static/resources/templates/variable.html | 0 .../resources/static/spiderList.html | 0 .../resources/static/task.html | 0 .../resources/static/variable-edit.html | 0 .../resources/static/variables.html | 0 .../spiderflow/ExpressionEngine.java | 0 .../spiderflow/Grammerable.java | 0 .../spiderflow/SpiderApplication.java | 2 +- .../spiderflow/annotation/Comment.java | 0 .../spiderflow/annotation/Example.java | 0 .../spiderflow/annotation/Return.java | 0 .../spiderflow/common/CURDController.java | 0 .../SpiderFlowThreadPoolExecutor.java | 0 .../configuration/ResourcesConfiguration.java | 0 .../configuration/WebSocketConfiguration.java | 0 .../spiderflow/context/CookieContext.java | 0 .../spiderflow/context/RunnableNode.java | 0 .../spiderflow/context/RunnableTreeNode.java | 0 .../spiderflow/context/SpiderContext.java | 0 .../context/SpiderContextHolder.java | 0 .../controller/DataSourceController.java | 0 .../controller/SpiderFlowController.java | 0 .../controller/SpiderRestController.java | 0 .../spiderflow/controller/TaskController.java | 0 .../controller/VariableController.java | 0 .../spiderflow/core/Spider.java | 0 .../function/Base64FunctionExecutor.java | 0 .../function/DateFunctionExecutor.java | 0 .../function/ExtractFunctionExecutor.java | 0 .../function/FileFunctionExecutor.java | 0 .../function/JsonFunctionExecutor.java | 0 .../function/ListFunctionExecutor.java | 0 .../function/MD5FunctionExecutor.java | 0 .../function/RandomFunctionExecutor.java | 0 .../function/StringFunctionExecutor.java | 0 .../function/ThreadFunctionExecutor.java | 0 .../function/UrlFunctionExecutor.java | 0 .../extension/ArrayFunctionExtension.java | 0 .../extension/DateFunctionExtension.java | 0 .../extension/ElementFunctionExtension.java | 0 .../extension/ElementsFunctionExtension.java | 0 .../extension/ListFunctionExtension.java | 0 .../extension/MapFunctionExtension.java | 0 .../extension/ObjectFunctionExtension.java | 0 .../extension/ResponseFunctionExtension.java | 0 .../extension/StringFunctionExtension.java | 0 .../executor/shape/ExecuteSQLExecutor.java | 0 .../core/executor/shape/FunctionExecutor.java | 0 .../core/executor/shape/LoopExecutor.java | 0 .../core/executor/shape/LoopJoinExecutor.java | 0 .../core/executor/shape/OutputExecutor.java | 0 .../core/executor/shape/ProcessExecutor.java | 0 .../core/executor/shape/RequestExecutor.java | 0 .../core/executor/shape/StartExecutor.java | 0 .../core/executor/shape/VariableExecutor.java | 0 .../expression/DefaultExpressionEngine.java | 0 .../core/expression/ExpressionError.java | 0 .../expression/ExpressionGlobalVariables.java | 0 .../core/expression/ExpressionTemplate.java | 0 .../expression/ExpressionTemplateContext.java | 0 .../interpreter/AstInterpreter.java | 0 .../interpreter/JavaReflection.java | 0 .../expression/interpreter/Reflection.java | 0 .../core/expression/parsing/Ast.java | 0 .../expression/parsing/CharacterStream.java | 0 .../core/expression/parsing/Parser.java | 0 .../core/expression/parsing/Span.java | 0 .../core/expression/parsing/Token.java | 0 .../core/expression/parsing/TokenStream.java | 0 .../core/expression/parsing/TokenType.java | 0 .../core/expression/parsing/Tokenizer.java | 0 .../spiderflow/core/io/HttpRequest.java | 0 .../spiderflow/core/io/HttpResponse.java | 0 .../spiderflow/core/job/SpiderJob.java | 0 .../spiderflow/core/job/SpiderJobContext.java | 0 .../spiderflow/core/job/SpiderJobManager.java | 0 .../core/mapper/DataSourceMapper.java | 0 .../core/mapper/SpiderFlowMapper.java | 0 .../spiderflow/core/mapper/TaskMapper.java | 0 .../core/mapper/VariableMapper.java | 0 .../spiderflow/core/model/DataSource.java | 0 .../spiderflow/core/model/SpiderFlow.java | 0 .../spiderflow/core/model/Task.java | 0 .../spiderflow/core/model/Variable.java | 0 .../core/serializer/FastJsonSerializer.java | 0 .../core/service/DataSourceService.java | 0 .../core/service/SpiderFlowService.java | 0 .../spiderflow/core/service/TaskService.java | 0 .../core/service/VariableService.java | 0 .../core/utils/DataSourceUtils.java | 0 .../spiderflow/core/utils/ExtractUtils.java | 0 .../spiderflow/core/utils/FileUtils.java | 0 .../core/utils/SpiderFlowUtils.java | 0 .../spiderflow/executor/FunctionExecutor.java | 0 .../executor/FunctionExtension.java | 0 .../spiderflow/executor/PluginConfig.java | 0 .../spiderflow/executor/ShapeExecutor.java | 0 .../spiderflow/expression/DynamicMethod.java | 0 .../org => spider}/spiderflow/io/Line.java | 0 .../spiderflow/io/RandomAccessFileReader.java | 0 .../spiderflow/io/SpiderResponse.java | 0 .../spiderflow/listener/SpiderListener.java | 0 .../logback/SpiderFlowFileAppender.java | 0 .../logback/SpiderFlowWebSocketAppender.java | 0 .../spiderflow/model/Grammer.java | 0 .../spiderflow/model/JsonBean.java | 0 .../spiderflow/model/Plugin.java | 0 .../spiderflow/model/Shape.java | 0 .../spiderflow/model/SpiderLog.java | 0 .../spiderflow/model/SpiderNameValue.java | 0 .../spiderflow/model/SpiderNode.java | 0 .../spiderflow/model/SpiderOutput.java | 0 .../model/SpiderWebSocketContext.java | 0 .../spiderflow/model/WebSocketEvent.java | 0 .../org => spider}/spiderflow/utils/Maps.java | 0 .../websocket/WebSocketEditorServer.java | 0 276 files changed, 229 insertions(+), 190 deletions(-) create mode 100644 .settings/.gitignore delete mode 100644 APITest/spider-flow-api/pom.xml delete mode 100644 APITest/spider-flow-core/pom.xml delete mode 100644 APITest/spider-flow-web/pom.xml create mode 100644 mysql-connector-java-5.1.39-bin.jar create mode 100644 spider/pom.xml rename {APITest/spider-flow-web/src/main => spider}/resources/application.properties (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/logback-spring.xml (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/css/easyui.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/css/editor.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/css/index.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/css/layui-blue.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/datasource-edit.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/datasources.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/editCron.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/editor.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/favicon.ico (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/index.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/canvas-viewer.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/codemirror/codemirror.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/codemirror/codemirror.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/codemirror/idea.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/codemirror/placeholder.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/codemirror/show-hint.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/codemirror/show-hint.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/codemirror/spiderflow-hint.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/codemirror/spiderflow.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/codemirror/sql.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/common.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/cron/cron.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/cron/easyui.min.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/cron/images/spinner_arrows.png (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/cron/images/tabs_icons.png (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/cron/jquery-2.1.4.min.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/cron/jquery.easyui.min.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/editor.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/index.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/jquery.easyui.min.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/jsontree/icons.svg (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/jsontree/jsontree.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/jsontree/jsontree.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/css/layui.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/css/layui.mobile.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/css/modules/code.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/css/modules/laydate/default/laydate.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/css/modules/layer/default/icon-ext.png (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/css/modules/layer/default/icon.png (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/css/modules/layer/default/layer.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/css/modules/layer/default/loading-0.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/css/modules/layer/default/loading-1.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/css/modules/layer/default/loading-2.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/ext/eleTree/eleTree.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/ext/eleTree/eleTree.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/ext/treeselect/treeselect.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/extends/formSelects-v4.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/extends/formSelects-v4.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/extends/treeGrid.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/font/iconfont.eot (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/font/iconfont.svg (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/font/iconfont.ttf (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/font/iconfont.woff (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/0.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/1.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/10.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/11.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/12.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/13.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/14.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/15.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/16.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/17.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/18.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/19.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/2.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/20.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/21.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/22.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/23.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/24.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/25.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/26.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/27.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/28.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/29.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/3.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/30.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/31.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/32.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/33.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/34.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/35.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/36.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/37.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/38.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/39.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/4.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/40.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/41.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/42.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/43.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/44.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/45.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/46.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/47.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/48.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/49.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/5.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/50.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/51.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/52.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/53.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/54.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/55.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/56.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/57.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/58.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/59.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/6.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/60.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/61.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/62.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/63.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/64.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/65.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/66.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/67.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/68.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/69.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/7.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/70.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/71.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/8.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/images/face/9.gif (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/layui/layui.all.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/log-viewer.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/mxgraph/css/common.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/mxgraph/css/explorer.css (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/mxgraph/mxgraph.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/mxgraph/mxgraph.min.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/mxgraph/resources/editor.txt (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/mxgraph/resources/editor_de.txt (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/mxgraph/resources/editor_zh.txt (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/mxgraph/resources/graph.txt (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/mxgraph/resources/graph_de.txt (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/mxgraph/resources/graph_zh.txt (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/js/spider-editor.js (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/log.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/edge.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/executeSql.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/function.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/loop.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/loopJoin.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/output.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/process.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/request.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/root.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/start.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/resources/templates/variable.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/spiderList.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/task.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/variable-edit.html (100%) rename {APITest/spider-flow-web/src/main => spider}/resources/static/variables.html (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/ExpressionEngine.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/Grammerable.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/SpiderApplication.java (96%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/annotation/Comment.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/annotation/Example.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/annotation/Return.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/common/CURDController.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/concurrent/SpiderFlowThreadPoolExecutor.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/configuration/ResourcesConfiguration.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/configuration/WebSocketConfiguration.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/context/CookieContext.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/context/RunnableNode.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/context/RunnableTreeNode.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/context/SpiderContext.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/context/SpiderContextHolder.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/controller/DataSourceController.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/controller/SpiderFlowController.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/controller/SpiderRestController.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/controller/TaskController.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/controller/VariableController.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/Spider.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/Base64FunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/DateFunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/ExtractFunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/FileFunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/JsonFunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/ListFunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/MD5FunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/RandomFunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/StringFunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/ThreadFunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/UrlFunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/extension/ArrayFunctionExtension.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/extension/DateFunctionExtension.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/extension/ElementFunctionExtension.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/extension/ElementsFunctionExtension.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/extension/ListFunctionExtension.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/extension/MapFunctionExtension.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/extension/ObjectFunctionExtension.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/extension/ResponseFunctionExtension.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/function/extension/StringFunctionExtension.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/shape/ExecuteSQLExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/shape/FunctionExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/shape/LoopExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/shape/LoopJoinExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/shape/OutputExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/shape/ProcessExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/shape/RequestExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/shape/StartExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/executor/shape/VariableExecutor.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/DefaultExpressionEngine.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/ExpressionError.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/ExpressionGlobalVariables.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/ExpressionTemplate.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/ExpressionTemplateContext.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/interpreter/AstInterpreter.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/interpreter/JavaReflection.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/interpreter/Reflection.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/parsing/Ast.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/parsing/CharacterStream.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/parsing/Parser.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/parsing/Span.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/parsing/Token.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/parsing/TokenStream.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/parsing/TokenType.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/expression/parsing/Tokenizer.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/io/HttpRequest.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/io/HttpResponse.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/job/SpiderJob.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/job/SpiderJobContext.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/job/SpiderJobManager.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/mapper/DataSourceMapper.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/mapper/SpiderFlowMapper.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/mapper/TaskMapper.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/mapper/VariableMapper.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/model/DataSource.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/model/SpiderFlow.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/model/Task.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/model/Variable.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/serializer/FastJsonSerializer.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/service/DataSourceService.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/service/SpiderFlowService.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/service/TaskService.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/service/VariableService.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/utils/DataSourceUtils.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/utils/ExtractUtils.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/utils/FileUtils.java (100%) rename {APITest/spider-flow-core/src/main/java/org => spider}/spiderflow/core/utils/SpiderFlowUtils.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/executor/FunctionExecutor.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/executor/FunctionExtension.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/executor/PluginConfig.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/executor/ShapeExecutor.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/expression/DynamicMethod.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/io/Line.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/io/RandomAccessFileReader.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/io/SpiderResponse.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/listener/SpiderListener.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/logback/SpiderFlowFileAppender.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/logback/SpiderFlowWebSocketAppender.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/model/Grammer.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/model/JsonBean.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/model/Plugin.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/model/Shape.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/model/SpiderLog.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/model/SpiderNameValue.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/model/SpiderNode.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/model/SpiderOutput.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/model/SpiderWebSocketContext.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/model/WebSocketEvent.java (100%) rename {APITest/spider-flow-api/src/main/java/org => spider}/spiderflow/utils/Maps.java (100%) rename {APITest/spider-flow-web/src/main/java/org => spider}/spiderflow/websocket/WebSocketEditorServer.java (100%) diff --git a/.classpath b/.classpath index e9769aa..717c15a 100644 --- a/.classpath +++ b/.classpath @@ -1,16 +1,16 @@ - + + - + - - - + + diff --git a/.settings/.gitignore b/.settings/.gitignore new file mode 100644 index 0000000..5a6a423 --- /dev/null +++ b/.settings/.gitignore @@ -0,0 +1 @@ +/org.eclipse.wst.common.component diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index ba754b9..f9fe345 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,5 +1,4 @@ eclipse.preferences.version=1 -encoding//APITest/spider-flow-web/src/main/resources/application.properties=UTF-8 encoding//src/main/java=UTF-8 encoding//src/test/java=UTF-8 encoding/=UTF-8 diff --git a/APITest/spider-flow-api/pom.xml b/APITest/spider-flow-api/pom.xml deleted file mode 100644 index ce55263..0000000 --- a/APITest/spider-flow-api/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - 4.0.0 - - org.spiderflow - spider-flow - 0.3.2 - - spider-flow-api - spider-flow-api - https://gitee.com/jmxd/spider-flow/tree/master/spider-flow-api - - UTF-8 - - - - org.springframework.boot - spring-boot-starter-web - - - com.alibaba - fastjson - 1.2.58 - - - org.apache.commons - commons-text - 1.6 - - - com.baomidou - mybatis-plus-boot-starter - 3.1.0 - - - org.springframework - spring-jdbc - - - mysql - mysql-connector-java - - - com.alibaba - druid-spring-boot-starter - 1.1.16 - - - com.alibaba - transmittable-thread-local - 2.11.2 - - - - diff --git a/APITest/spider-flow-core/pom.xml b/APITest/spider-flow-core/pom.xml deleted file mode 100644 index 32cb557..0000000 --- a/APITest/spider-flow-core/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - 4.0.0 - - org.spiderflow - spider-flow - 0.3.2 - - spider-flow-core - spider-flow-core - https://gitee.com/jmxd/spider-flow/tree/master/spider-flow-core - - UTF-8 - - - - org.springframework.boot - spring-boot-starter-quartz - - - commons-io - commons-io - 2.6 - - - commons-codec - commons-codec - - - org.jsoup - jsoup - 1.11.3 - - - us.codecraft - xsoup - 0.3.1 - - - - - - - - - - - - - - org.spiderflow - spider-flow-api - ${spider-flow.version} - - - diff --git a/APITest/spider-flow-web/pom.xml b/APITest/spider-flow-web/pom.xml deleted file mode 100644 index 3aa92e9..0000000 --- a/APITest/spider-flow-web/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - 4.0.0 - - org.spiderflow - spider-flow - 0.3.2 - - spider-flow-web - spider-flow-web - https://gitee.com/jmxd/spider-flow/tree/master/spider-flow-web - - UTF-8 - - - - org.springframework.boot - spring-boot-starter-websocket - - - org.spiderflow - spider-flow-core - ${spider-flow.version} - - - - - - org.springframework.boot - spring-boot-maven-plugin - - spider-flow - org.spiderflow.SpiderApplication - - - - - diff --git a/mysql-connector-java-5.1.39-bin.jar b/mysql-connector-java-5.1.39-bin.jar new file mode 100644 index 0000000000000000000000000000000000000000..dac6e149816359eb170b372e07efd9513079f3d6 GIT binary patch literal 989497 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

dZLm|XPw3RnO0nQXOos>@=5Y}GGnp@ z3<+I$s}seG?-tCpL+*a;H^+Npd`Eex2Tthk^+W`rQ^f?Rkm~#iIy3ks3u5_}Y)nC* z_3%LD|74Tv(_QVK5?qWFvip(Qq08=p3)-XQ^l!39KkvAsr}3j6(@$NaB<7+eHo3ul z!DyD8>5!V@Ey;WGSz3@OEbxi>N*rJr%=I_Xhv;iW%DLi+(2wCYlb!DBjIqp3(KPu0 zP*!Wl2C@f{TU!^9iOvwuX;K8Roh)ur`@??)y3RMkZ&67KrZ?Ko^jkNi5jLe2_i7(7 z7{^QRz>4qQ9LgT7V`YB*C%x+bJn?bm7%w@u_xu+ZUirPj(2qfhkQ`hF?b*S-l<^89C9d zjL<)UJyp1fte)tpAs`|^6q+IOJxjmP#zn*9yy$s!kri{IR3N<|e258tH^X zu;8o-r*{~B@(^p#d$HasPis7K>Z$m~j_5jXZNm;lkAzGn+= zJFZEG2%jCL!L?o8xhTRl1cg07hb)F?rh1PwTg3vL>6c!oKlu}hl#fv)gJ=v$7coy5 z`s;gJEMs2n;SP+U@G=ilqRp`oysHgxGGgZFrD~L&^}z_5y!~RNj-uH@A89#dqCO<$ zLJO3-v01j!gf1QjP@M{j$Sj7#%afISkd@CezyzyqJt>->5^A9bdKcgaj%*?|a)6O+ zvH%1aSBn>Dt>@(biuij9;&7yJhdD>kE^-p~8!ciR9z(N|F_TP&pOPA^Opag3wG2*Q zY8u(1yHr;-Z>}INH;pQbz=K&JDoD75UC7HSu0S4ugq&QlOOQl)3ZwWNqu3q~t_Y#q z&dexCB%O&kMqvzm)I**fnt>_kttPF5pp~F$9?GY4VFlNmuec#M`+hvghjP;SSLU3p zq(kfXf1}*|LxG_fEUx4+(rzwlXkNjn#xpLWnOr07)=#Z>K z4HX97lvIhH5Y4M6@nF4H<2>3jbeR%1{e_74po~PrkGP*m`UUbG>0zQ-Jx9)ckqfhCgAA5lP8e zU!y9Hn|lAL^jUV#9rj;BV(vEoX)JtevY8zC#{19%!kU*M;jO4i`e2je1GAdSN%31`Ki-72ay6|&q;3TluGm2=QyDMB`y6{oi{m(b(U(azu z2a~oP_<;Tl9*6ry7I$!Kc7ZK5HbDl3L6w&41!2T-^_XjWWM-*#%SmM(p7KukN4Jm5 z^)S4*Y%vhEoEi3kwbkOiIo_FCZ@%P1^qD>c(%vlz_aoKcS%C_`!P8ENq3Pr zEx{otpu)SqZfS7O5M{bTu1t~*<^IYfF3tvHC@@R5AJ<8pV;mf3cI{AUd>p!+S|27$m=>L#p|MfSF+syw)=Go`I zz!a1qr-4bDn+Z+)9YW|Lr0%z%3>;a2pJF%yQ-jU*g3zby4_pq6D2eKYyf?K%7zS`@ zay9UrngN&o1f(|A$R$jpZkO%;bQq$&IdCZTnpY_M;#qdJZTg& zr;H&VHdEDXfg%GEH~enev39{CVyM33>1g5voQRIpuOs`Up&Hi%$;=XmndEuYnmm)f ze&dj6-#-`+Tj4?vG)*&0v-Nf1pr>cIUDGq%-^1uCKl{N|nj=|VktWk^H)yx5^VDqR ztbg(iwYaGdcBlF4WJn@3DVc(7z^O)Ih=MU9`3YkMOoCafxUnJwX5qBy4p3_#gRmp! zk>p0y?D`vk?Hh9IPc+a*skyXFD_3qFjY?+4I-!&%L)Eb&NZ>>fTzi_%?>-i)whmo6 z59g4(-;i%1)iT|TqL0R+DUK(UwOEuB^$l_x_$mSe_>wH#dD)>w-vs4u51Ao0`Tjn# z8-p~(`jYk=Ul9K*Vt>nwBZ~e>opnE{lj7f{PHAIngMU$}qZKU`=jGseTBS3Yh05yv z@(kQlQN!fClsLoK6`U!3{*(`lG!0^sdar;L_V)J{Flm@L4dd;^I&5@D5BUdtHgvMB z@*H2ZkN)HI22vAL5k(fqAriA!i;+{?t*hvtLl99Iz?rhdTw*C|-!z& z_fu%5it$V5YlyWTZ>%)7>|M00Je2mIslRMKJ=E$^s#HskoqW!DT%u*&NO;WOV>u(K zG-Jc5{G+{qJJq4w+Drm3MU4XfDt;LkB6?@DxN4~yA+z7C{Xnc*ZR82kxqG+jTh_GI zF75w1UarF#C8(7?=-wAtW~6ViYJNFdZ5Uqc<5@Y`3sdNAhAu!9Ca|0Z(vSWZw|X^G zT?)EF*>bU?3CQ0>UT-feC%fewM?&`DQ=?Pf!A1MYvCMLjvK0$`D9wL83@dFY%fFHy zMoUmi?*oY4U`mC!KgAy!_wMp8RiL%fghm}BZ6pbjFvf_cS5?o&?;R;DXRe15m!lYU z_lF{+$b+nQdi+XaIsLIMAvLdyP@GE&5S&^nvHM9;34Z}QWY1Yl0X3F?05OQhVV7MX zgK>}>z)o7m*dd)Z2r~w4HxI_1H-&$Q04i3(2~M2K1)d|24h%FQmn97Bh)#-z!MKHU zPtb0VEud1x{QHqc>XlhV_E?oX*K#t$|%zWSC^caH2l~z#*6T~jq3T=ZXiH0vl@38UL zJ!bBHAk^Zvph2~_|8z0?X9mVMv3|I0w^UujVLpK(pY z99=&2H?#~K*}n-z00pH886^}A$^~@r_Lemoo)nKo9OIMj3p`ssZ59L1`$m-G3I-=Y zE-rPmGt<#!`fBp?^Y~pBz*x!XAwP{DmPG%mn1M)NMFg@Vh+}uWADLt$_2xJBu`%~x zSCFVVw~V1bzsrQ(vZamPh>@J7r&sPdtE=n7EHc7}9>T^31z0?x)^lWx)pQonp z2v(2r2_E*kErv%RScy)oUVvP^7F87^adSVbpv9u4!ll-v!(?>JJpCulR$ZY@PT!^V zl_ud8vEpuxa5p5{vqr2?t;2eW&nga+79WFfugVFlDC-LvYhJc6L^sd-hRyslbaJ(; zNbb@X(TUrO6nrD|r2_G+5@a_K1ax>_AHA2z`hANrn{=+m-%Oo#wh0!=3o5i)0~I-B zXg#?;mNLki!d(56ECFc6WE2Ia7TY)f!}jsly9+I!2`89Z@v_5@^XlgG;13C9C2V6k z$|-xYF`7MyYG%c7U%ZYRD`7qas8>ioYq@fd) zV*rph38(F_h)n8%#Qr~LltezcbWqrjps{-eqzhmdV`Q3)J=H%0ga z0b_+!{0bV!BV_t7^1V*EFR1o}8?e73$d48W;0V)BVCD_uMKuy=odWYbB+=71K$ULd ztSTDU)NN=6vGWsru0CzZBHV0^>*3Y#)Z|DSH zn5+QVla+l@)x69}b^P)1_{imFd|>>b&l_C%H(XeHuO3 zEjyVQm-sf0Kz>=f`-ov838u7Uam&+|##*~Hnj-w+%jM@WpYB-R+qG5YSNHO7>+X(>ryG8OM*z#RFK{! zelN$K@SMuz=5H8D2u!lGcB`|%tB+2aPxPt2LcPU1tEq#DbxR3-VAgHTB3(JI131bh zJHX;ThD-pLJ#D8jJCELPkNJr%ZUm1JQs)#hXL_G`=(L~Kk@I&IYy56Mfw9kKpd8Us z$fHS1Q(cJ_%5a}@fWO;SGWyL*U2b0iQz=b0U=rrI2^Ko=4G-+M@Vcpz4|ZeuN8XPWQFHpj5{-7Ue~zN_5{0qRdHH)PQqD^M<_xY3y#y{ zutHEIQLQrj0QYv8cZ7a7`ne(T#)VNwHKIiMc8qXWObw#xw>D8me|nsH`(-d;Amv*u zLp#P>B;s*P(zT!mP2mTi&x$gcqJC9oYmv-25veI{2uY;BPprt|jka<5fS&_0j5k5R zE#$d`s<%n)#eUGJLV=8HIepgp_OxlqpZ~4*?>}-lZ`ykc=%3Zi{lBRp{AjuiZ2sfC zR^0drTj6;!BQMbtn@i9j8;h@|B+O-kTg8PvewE81;G=-twz_Waj=Kh2D&MH#3sCwG zg54;DX>2%BuFrR0Oi$-Wf)z zF-~K|gkD0riq#33s$qhz+I9MvYl&&a@rZe(xG9V`TH|)D&f(`Vi(A({CBX@)Upr+` z)`fjn=3aOdd|qO&-8!Xd@fkne${+Z|jpcTjPE0-wMAKV4gNb$LuXde07e}N_^3Qx= z#M&@D@DxpIEmKI?GeGp%`)!aj9{UQ>;*ASiMJ=_fXw5{O+u_0R^wEulz|VsnLo~v3 z6C}gpQcE_Ad6qVpw?{fKPjUq9=tWG)3AmLsH(wjYg^8=5I@nZwkO#? zXhi}Yb@D!EaP?~@6;5owFdpj(!o!3Hu$bsZUxG zR%+jX{~X%lIdW}}{j4b4|4nH7Z!5~_KSO|@x_|=w*K~93ge!$QEr`e=WtTcCJc4=o z=3tz45-`wQ%RkzIZ$x%z5%IoDdC#iJGy+RR$z{BtebAj{U0Nm&uZCtfFr9Gicr%$z zuUzBt0;Y|`M1d>nwEosWsEGQd$jISDu&xE~pc4|76eQBUz1v4(Ya5}SG8c^kQR!_a zBCIJKl3!S{;TfK<#x!Fm{CK>EWaBe-mgK`Tg|22*u_0h0XopT&#LI-@(-5X`Cc zBYO}9Xo^!IJ|VpZIIQMsyn9n}^dS@kE6DoRA^1-*NW{$Bkl`^(^^uSO8EcBwVVjWf zZ?sB%Of`#E#tON9`nBQ5`5@NE%?TU~k5qz>XPf!BITi-!!N&Vl=MRFZ0^Mp%6Tl+F zY8+b|&xT@w5pP>}B55@EJc!GTSf1Ocas)(N)2OHPq!)`grg#Qawa^(MywV?2;uOUUfggbO(QY`lN-5iC zR~cX-<5{-i1Ni6t5aEFr@$u7VSLUZr$^SEc_|M4UpVYHzR_@AbC^}^6Y9X13h=Ldp zFc2W5dkp#%!9k#ifB`VE%*;o7=cbMlpvTD`_>GizXNigw)sT`ZWv~%&WhCYDnwn6O zP0i+&1uAu#elJR&<-RpO*OMlQh9RswsXsui)uq!DhuNjib?4I#6CGe$V2?)~c8Amr z!i9s;AGD$60U$>Yd0f1^T?4w3T?97V$NtDI+zY1z20F>1&FkR<-K6kW5H?tM1%hKF zTkHqJtTegy+axqzhMv>m)Xp-*`w3g@y8_M00bB2(NX?6svF@{Bgf>1JCLfvOmv&%3 zp%QjV0I^_Cd7(A7~xHxYH2xl&Fb=SZfD_f+-BJ^%68-$_B?ILRdYxZM15-`59sB6k;>pN z=i4VW=3_}Y;xsT=2t*l*=FcZIO+?AyB3_twqexN@qr(10-88dV1r1c$j0w^8SVMn> z#Z!EB;N5tr-w8$vb}t&PbhlvD(7(SyRnbW{Ov$cv+G)%Ol?Z4jqElb2g*$BQ`@po5 z(|x!TkR_s8tGSVR2qoI~J^Qm174loQ`QeQgmjf1Md9qR#D0_6nqE?`W*~k#zT=QM2 zq;b>ND@vUWP<5HvC~QdJDMocH#8JTAl=_TQ|NgCoK8Ja73=NeJr*ik4EXiUU$u z6gS!CT?LzoE6}H-!%CHxDXAIL?Gu8)n#(~(uoI)s2FIKbRCGlNq_RwjDl>ptXQ}EH z)94b)_#M(QTVl|pJ$+yjoJklMAu&MpQrG|Rtl*cT>x{5^h&79*W-^ar3DqF6O<6%9 zeAOr}t3#|9wrL%Yy@ebuC?i1N;4h&>5{$YUZ_-9sA`dyIW~wnQQ;;mEkr^<5LrF`X z1ViHpgXSPGAa|n#lX{a8lDl_;shc`McM}rA=Abb^cS{9hw`T*>Gi=xTMb4FMZqgC5 zvmX(%vj^#dmNDUq5aC#{GttmNg$jk`sXV}SN6yvvYVJHTZ~cM!g@46(Rb0o4%wQUv zQ1^OoIx}}8mPlJZlUcbZ*IKbRgoFjiS!1Y|HJN`+rb)b>GHPqda}8))s+&PIWpXnx)VOw~})FjrA6oT(o7 zd{=|LuRskc89DGSc005T1E89G=8Z(0iLZAfI@k?P!*ks~8QxlTL-%R5`LKwiofxqSm*mmTn!a?WNf z!S zyn5TTF^ zXtXp)s-ccjhlxbhQmbj02-4w-j`iXs!P<)6u(t=-QbMmc-yl=Vz$y5J(K}TB*eN?y&hU&;op`#wszEyI5o0m3f%Ciy_2dDXa!A7qym-F~ zg``;0fE{`zu*mCWdmNx3qcKRwloGmKSw|@TTn7vNK>a@^^vqWGr$ij zdGb#H$b!&oO@XwRhA{21x<5SYf?Mw2^ZaXir_BI*pOMxAUEy6rUX;V(U1QaLsD+l_ z-Ry6tT9$8y4;T+5aYcV-j&btnf|-59r1cWIogQq4O8<5kpY-?FLEY8s#HC&abY{_r z%jnQg%rcZgw>T7=VxT75QCzcfg1sk)Vrnid93MO*6n%t#z%n;qD z9@od@h!oprel83q+1_Q3Tz=#g<4d8;HTpH7%V~luUTA5^Hg&y_Ys7J(&*7bORGWz7 ziPmv#8{q?2+<*qR4}iV<2#nir!5zhR175SM@R5k~&gU+@74=yG8e1vKJrF92AH4+5?V8?xVE0*6ihwD0uJdruuAjm+X&)s{aOma~kJr;ho10tD=gSL3FY_|V zV0`#4HmOJ%BH*ZalC+40t>~Z&1RF9swUF@y^@?+;0S5FvS&5Toovupd`_n?in>wAkse+GgwYrx` zQ{F~M``-%F`y#~gbe4rNCg7w)Rw4UpUBWKfsVa$12e|7j4!onV!7X1Zz5rd>C#o0)#GQPE@rdCYl3~hO_c7A6B8&awQtm z>d9HJi^hVL@rqEy!1M{NgWBl2b$TiiHOch~wyJ_U+dEd#E?61I_9$RbWuhmbM!K|&Y_hR3F%_=gb`V`hWSQfHJ&)u{SVM%2a+=I9$@X(GJ~$-+|l zMp;U8FPRs)&gk4zYh_RV^c+90Qdnqss??acX?=&VCGKN4Q-(lL*x1tAbzYqVYI7gF zr)$jV|7(k-dqlL}2Q6woF>1l9n5A=p`ALB^FV}Gx?)N@E0cCX5aLgjWDp#swj^QW> z-9Dhm8j*gOBdvI;5OueEATD37RMEE3ON9CvxPK@ZxbN@Y_?Dg{Lt)_I)2-OV%5Xko zr0%K{+n`#7eUEKhBtm=Bitv~R0zp7mO;i#$+Hi8k8r`0e$H$i)cG`}mIga;;KVx8S z1vmo4g$B_Z9|6{!xE6xz5Y#XZyYLDjYUr}}#;5T0zh_RZ35Pl8K%S0Io}D`*$^MeI zYpKK#NIN7HM9@md7h0@)fkraZ8lk!|oN(e0zyZnIC-Yuu-1CH%?-Q#G@RaH-S@rx2 z{yy5im2~*il_&0pDf<6}990dhUH+pW8LbZGj=Y5OMYd*4HUYmc$gc|mAXE=Q-6!5x zRZhHzfQbtkz)zEH9a8JufaS_2URE8!J*cQ@rP8Zftxpk#LS?O3C;1~-sjL>MTr#w= z($adb@o9PDV@g~zX^`qqZS$JRcKZJQF?Qy7hMoDkt|R-Ue87iG-K#_Sgq#oIRlG(v zwS~*7mvk&OzezOJHNQzVm0H}Um+^@!JqTcdYkxq6o3u-70V{d0Vgc(R?>~Uc9Y#cn z`@?)McUSj~^`u9M6~A|Z!yRI=QEo}*FnQuZE*9s&M{i$J2pRlAizk!!sz`kjNE zZCC!%9HC^(O~SAI9urZz#eUi69G|0btHajL?T$KA?!Fz3#+?={WZQWvP)+VFH_1nw z;;lCXr`$Fo@Om^$zPs~rl*Q6reV$s6NGukUrEwWOOcRrNLI;ZbBmocVLWi;N(Om(}`P32R z4eOs3wzIEVT#I`;TMav4q^8EW>r@w)8y8=zAKsQk$vo+I$y05v)EtuciCrU?)1y8i z=J|eOKR-F5OQ{27Gq7{3;)vX`@Knpm-oID`B${hcb4>iEQr-Ik)$hICFOSW&sYBVSyD$%f3JFSiv1BkOup5DwPBI90tU7|X>e z`JX(MUj~rf^Xm$$p^)s1o)AFrLaXgf)`vP49t)>P}1Drg=c~ldqoNIZ>__?6G z1iV?N8km<+Akl3E3`0ikHWktfvyd_T1DM{@fib2qG~kx20kKxC7zi*Mv-t*GhM2DS z`Fp6=^R-BsESnMMEFZvT#U4t1Vc4$bFBIDe$7Yzk(K-d6PHevUdo~yQ`xPu7h&>67 z5iXdRzR_;N2W;~n%h7HuAFw?uH((zM8GH^(K&F&SW8-ZiHT-2E;obrfSzOkQ7!0D$ zy>{JH`pr`HXo{>{A^;t|*<5qmt}uSXdd6LT#if8>Nfns2khmQrpLS{_%~Ll<1O`wX`9MkU3`&_?B>|9F zO8T)+csu3FSMiKcbu9&@BU+xUN5N!!vgbJDJk&&=h=domqJ)XS&}<1mg~FKzR^kY$91sAMF%E2KD$Mjj2CJf*M$kP6b7} zJ81tZzazReV7}jOk*{%87xr+-=nT3`wzyMCN-Y_iAlJ(#r7P_ul<5w+8)x=FIa;!~ z6C>BlB=tk4<#0O$q!5ec7+whNDJ&aE48PQrjO3UWf-LT~CFix8j2$>qiYeSh zaMHxu*dwRsL)A_LY%_!N#~W}T&^61j1;h_}JRVAQnEY%oou9-tx46!A1@OcZ+|1lq5Z?#~`$V+yoGeWjfkLu-2F1hve~7(*M~?a1WW6dC_ z*yT+0Sm1YalqbFafIcQ=q#GUEG|_7J$n(}D)pG*f5xk=rAA5$#ynge)gPA_mO6YSV zd9C^ROCs@FskQI;K9i9T-Df1uZ_%HY8SIa&)Bzw_wB4YL25Co(v9xZw%N=SdD0M9j z%~SN1K;7!!f^3TOh^eq{R7$C3{gkRCk)aroA=w%`2S=V@t+hacHhZlwEMi+LS#7FP zJ6HRYwbnrIn+6$dIoi@ZSWSpnEnRWN6olkk)ovM)c(Lb*I+6E<3S3JAJq zFLT5J*#6{1rYH$#0T2YGEZ)$C6MI{yhy{)qI+V=->Q=1NJaio7nZJ23thRq>vRQ3e z)Oa?z2*aVC4Z_y&(g(}B4xKc-!Tt_>R4p!B)FYrVo|7@6QKjQ8q+yklD04}bxk_(b zE%t%9;!r=yT=kjvxtTFsf@Zi9$#hVZS~y^_SxHBa1$QL3ZiIDo<)*FgEzYTWy^lEc zK*C=Bd9Yir5R4(xX;-T5T?<-cfu8@^8NK&Al zSktn%Q8Bc89~ zX_m={tR%MQxUKImM13CWVa3_MCKa<+H|}B#^*W8ycIIuypee-{T+|T_6<(OKUYiCTj`;zu-ag|JN#D`Z zvf5ibZkem6@eQb)A@2EBRZ+W;%&D_I2~b&{y^2ex+@=G!X#}_d-LQ^n*(AHg93|AL zY`3Y}nJ2sDEKyZpW)6O!Xz7giJ;Nzy9|U1gTlGpoA2Cr+(=lD@?ImBS_^x#hPfVS6 zQgrsw#W!%5>>SR$p+<8J2;Mha7{jFU#q1!p%;~FG3Ka@T1aCL|I%q##kCVXh5= z++8|^j`^PapTz0^CK(g`|6tfA?nWl|&Oc^MPX7Xen_`FD&HrRx=s!l}Jpa27$ap9z zNdLR@tH^(T_TPb?Y-On*t_M0#DzBoThYGyBg07&2KR9@pi1)8xdXW)|dbxq(5D6t| zMNm`i*1MHfhlLng?By@=#|{h4d}aO3&5_jmY^N)?p3K~y?(bjpkv14x;^S%kjZqln zh`3|mhRrZeX{k5rAwd=pPzcnL>IripWQ0Z<&~ig@3AKcK7(%H7HbP9#t(WK`=h^Mk zz0DZwD-kINmMI;j=_I&s+|R`~b8naQL2A$w_G%b_w_`jZyP6KUOwOjzkv+61j+@&{ zj-(=n=>@WlnDGnSaG+bypbpe#4~7C1S)6#%NBk3OAvIaZ((mGGFX7X%+Kl_;T%~I* z>5b1Wg{U$N(u3dWSqs=TMNJ8ROM;qa{nZ(xwut=+aA&YBM=}g8RdvVOn+=YXQi&?` zVK=m$B2w57Nqz|hd7J4>72l7KY_8L-FJUq)Ir#x0H z$k|Z%sRu2DF$1Qci1dRqB-v>6lvZ8Mnn zD(FOA+5P`U>9_yE)PMHJe?32ny#HqBXlZQtuU3rwI>r1ZKb+BspPj|>f4?kXXkcq> zXKP~oe~gobtW6ATUF?<39Zd|3|9wX#E9#}-??vZik)7|2`|-3vUHKA`F2^);Pp`k22T2Ey?^fGu5dg#(l;a=|@sx0&TS zJ@cMyzTaK%_=45`UV=82!4_hOEKFM%Fw>YUWDdJpVRk@(0;NqK-LGe*$#_9jgVtWM zU3rjam1n3W)(5UrtkFb+j|Hh$po(+7&-oD0Z|yd)TPK-OJue0ubJfr<+oxo!fGoNT z4h8(1v6BQSc2<*M<IBSE)rte)q$fdUYb+;sCJ7ws_ZTmR3W>q0Xh+AcXMr&9rPl#_6Uss832S; zcRSh27JUK$lpl{hn~A+`?8q~XmWXdhE|CB2K-4m%jlfjHfP4t5t>I)p%_eJYL2M5Z z{auWq`ittp89EaA=Zq~pyJsx}2pn9Y~x-1)$U(7aoF?G znpUidG*7af6{_&;OL~X2Y&P;Z8^6TJ@Q>_%f^6%D3hA?HuK5|SMI~ghnh|VDGT2kB zzp$4yb{hs(OIP%(uW&+$t$Z>&EUfOFE#zhcm+n@zM%SNyock9 zGGiPt+dNSY++#fx!r;@x7qu@aKpWu`<-okX4wyphp$;`ww9usteHyz9zF|FahVprw z@7U!yMSjEku%KcLjgit_FMvuzeDPbsuh7e=qH4JY_E)h@INr*e!H=h@i_7O~kJT%5 zEf`0{(}p4Ort;#ZNRh1(u@-YtwDCZ3CmJA{5lKv9u^w3h;l5B0t>T?eFMuoTbbFHh z++yDfgrwofji=e=!ZJ;z$JTOsXe?7IDHS7W0M*y30U)xaIYeE7i%?Pan?qz{?!xkq zt_g@Tj#&^uXiLZ!@>#yC3pDiL1>8^S2AtJ9a_%=yEAviED5I_eB0D0Jo9P`pe%`N;dHysoEza<^R_crK!`awZXRV>d;L6U_g&9ILfGRkk zXPBzs3*8S%wOaG{$>*Iuw^96b5Q$th2VngWn*FdxzzMP7N?-9<>&x9(7va8ooI!1t z_v+s8B{W$zuOCH3?*L3TE1E%*F;)`O7L;OFpyoxOAE{qon_LsWpQ=wYe~^Y{GyVYol^ zM2Yq{55t_sR`QX`aB_)lSC;-u((mzk6sz23$mXmh>@J`5>F$Za z8AIFd?BHEiOqdL94-6S2IWx&u#?_C<1eqm?{bBaeCDZoC;@|` zaa%XeF9Vy0Yqm3rTmc7J6L!i0>obg3phl>c0fAYyY%9{_m35($tAFL}ul-^*3Gm5R z)f!XjQo$w3fl#UJ8MU?cIV&)1^%w41s5^{RHdgBt09dfDP3N}B{&_Y^zx7t3e`bUH zXEy#>Q2%eUA!uN2U~6RZgE0I!BAfk(s;*d}PIiDEzKbe9A4C!?E-lTV&k*+P7o}n) zK0ijf_DBRaA{Q~Nq;HhJKiqDiJRJZ6GJ*e~{@GK){I>f;G{AKoq3}IDtRtcGZBkVauHn05iXr?usPbB_8Hek@delh>w zA&%gW73_cVUX(3tO#bK5Rh6+uHbM6-+1UDfHEpY907VoKCjSnm1+2B1f~N&(qw%$_ z88<$2aZ#J?>Smgr9lRWgwm%1jo#alBzL4h550~uu3kgZ46EhkNiG<V;V0 zXqKz;U>ea!MVLb=&ylw*7u6pR1$R^+_CN@PKauQI`&nW4fZkp0`5W)R?wXn-Ad63# z5;FWg+H8$RuhN1I!%4y!OmagqDiX0&DOXWH5bmV}4_O{lO-8!8DXSX=PPQcJqIqsg zgIJ^XGPC1)TF%^CQlnwndYKJHb4tb~0zN5)VR}R3-V0i7NAbLPj|F;$<$1{*Qm!H` z)m&$FX(1UkQ>8|8&5@^eCuK3PwR>3oFS``U!8PTrnBTpq2Zdo_*V0!S!K8pR2ULG6O5DV$@$TbEAMgk zCvJ}e8~`OmLZP)9s=Sw%6DH=^>lP+@qkg-9D2$w(j=7f$`-rlQZv`PrPv@mKghmyK zZnc9Ml|o10rps=L&-FJ{f-0A;Hm8iOw+S+urai}u5G0eQpGJC8+F3||LBOymGs@&Q z`f5;}9cKyBmge?pkkly_mn#?A1mD_uuIAoYg=uOC5but33Lpr8zMA#n2m^Z{MN~SL} z0cKQAsWG+4HZc$DMqS2PpiI~4&`?FXJPKM*%VfMdGuRoW<^C!>*=<*7^ z_@`@dL7T9Gy6UEMAxq7^Z+DJmgiX!Gf6fmET^VZM7!S=p1ab&aQW;EVzL9+*_ng7i*&>L0iqz6iX4Bq&c)`y zUlT1pcO|b>Hs<%q(>T!`6V~{v4iu`avJYldhT!`V3tYIUW)~YXyM$u#vWF7F>G|4O zIH2YN?PjFtk`V=H8Xp~MEdP%~yH3h6!H}R6J0{e`UfL>c=m~-^8qbwv*F_?U0RRkc zRz+{ym1TApG|~{q<^aeCBudX7q3;Ot7eA=q zJ@+SA>SmT-l<3=)FqIX)ur-kIQXk?!xcsaBo}L)QU$Q~r?_m2jM%Y+4IJ!mJajhlj zOSYEUg)21f;i|+R{oq{kCyRrQEHnjJUYnMh#up4N>u7TWr#!ZHbQ)zYUhn1SBu0Mm ziMq|c9}=dV1PPg7Drc*wdd&`TP9U!U%|nzths&=9PheZyvwr`4$Qzd>c>Tj7MDmB` zi19xh^44~S|DLNBt69loYoL75-k({J!b8A|3!<+EnSo1eiUF>*?jZmnf&&D`vD9I3 z(i^84m}LO(8>wxzzW9<X{22+T|;LwKN|9ts9-2yj012@(} z2IMZu%U2~dAja&iJhISQv}eSb(^nM|YxNQoBe$=F$x9=XJ0=3eOBFgZW|O;e6a1^Y ztPps?v6VWM%JEo(!&_n`)q&*q3A4AzfSL>T(Ea>Ffc8@Xc6Z6%Ic9hMUIp=u49pJX z?goH2*>5WVZM50YLI)y_1yl79{^@d50GbTTXcEQau;1v2r>@Gw z4Vc#KphwIpP9=q-Rwalql6PX}tfEDf07cSoXzB*(Ar_aiEH!#g5Q>G2Qh3NF7nLW^ zm}r{FYzJe~m(>l4mo^F5P(>0-1d<*qzJS5}*Ifp{t)qwym5>gZ4Q07DL_&K*6c#KU zNXE33s1}lPS)Vl?cnE6SN}8=U+3lD`k)m;K$0#Op@auD6*-?6>r0X`hjM9^)^cL3g zZ@3d7d?REt3{AZkF_FLrr=XhUiCAlI~1!99}yKLIRbUHU%r-4@=IB9rV?GI*Kg(@i`cw^CMZmBOLMN*LMK%M zS1=|r=&Q#wXoz6oYmQgLSunu(LrH~o8+b`3D&gQb&WnvcS(NB=jCXI>G@b=Lh$1-( z%sGa5ZZ7o23%dmbW8)Q146Zd$q<`)=1wa=sZp<^N5Ud+6)o_}u86^pNAu1wo4WC8o z9%{^29V&Ahs^6(A7`KHD^~N?xEGV1UD~|27sTLoJ4o{A@kr;aF8Agnpi!0|WkdDs$98vlJz<0ICd1qAr}TbFrr4USipR*xq&ZMwGwkoV_d~*E?x9DUGFnH^ z8Aqq@rPSo4oGGvJ0(F3_UsONtNp3VoC1~QL)udAcD$comTN}}aYHcU88qNf`ECIX+`U;)wIU{N|V@gx1W zh_VHR_;70RQA2D+nUSb>W1X4%W>oDcTa`I4U@`{QmL+AljIM)-#!NlG#PG3dv&w`% z&#cRP-N9#|nI`D_#tb&E!~PAvmf-N2ktwA~)c6;IFKeQ#>!`_shtzVHd|u7bn|H*L97)q0|$}aZp~yAvzswPdE|pT zYyUSMPxcgZ_Trfe45QSQiq}JV$jq=_VLLZX@Y*_qQF4#HW^_3++O^}tHJ%hH?dU)| zVe*9PoBYw_SBBzc>SuDQL`||d8~2auWt;Z!=6ToF{l$3UP;Lf$jcqA$D`7_F;~O3~ zq?gD$ayDn+WVziVjMD*&!zE|qX0Z$Mn%mpuv1PBPnDzRk6~s3twpVHw-{9VyrXOHE zlO1q~6}cw^;E_}Z^5`b-;0Ale{e^nUUY&01a(w@)c0vbgt>rG&GSd;Q*?;~@@|Ii; z@{tthgnT3vdxXK)>y>(P-+j%D!5cfa&D(XsEcQ;#>{{-fO8T8@kn1MxPEEX<=1_&= z5B7)?QLbb1pDUKbP3ew1ssjiRoO(3&SrqdTgqnm*I0Wfw8{*4e9`itN(35<+gVXU_ ziv+J+D67K2N7=9EdB>!(PG;=Io!L}qWGCgi;z>`ypehe9TkKVK~ zDh`|N{~keK(mHK4&|W$=n2&TU18|=qC+N!Sk91iu5S7xkjw{J2t)yFZXgeod?Z+g) ze8PUgD-ipJ6KdmC^+XE#uXT{$5psv_OF#Xwf22trNoX8F^z?4IQ?DO4D*gaDLOvxZ zg?Ksgm}yJ)_sdLXJmK8=V(!MfRzOf0)kA=NrvfK`nyMLJ?<}al$~U&hE#880aavWx zHHNXVjypOu7@L|luo`e2Qog&E-{l2B6E}@VxkuuBr>MALa&6B|T%^Jr6Z2-}-bx`4pTeoa&dFj?tZAVSn+#OEZm4v_ z`BB_AMB25;7YbI>x03XppnKRMu&e#FTTOn_ARNCv-b|cJL%bl-fiq5U==4Fe@*P9v zH^XCR|GCrp27}wrcQgM&lzEif`ZTloigx9b*zrAnvwe8`)&cqL&^!ow6{8;%PH~`% zWR`wSI~{!|gL}Q*$lhh);ECgKxPd;`btZ$Whxd$4V4D6~U6D%nw9<@#s*h9ZR%36v1NpuGVrTlsw>n)`5oEt4 z?6U5_LaOf2`A4J6AtX%*5<;32#cip)mDPnifE)J}M5Si=?5uK$_Wr`BTI-2cF0j-) z#ipso0HlYK6tnhbTC{F80J07RrU39=m;|;CP-_SlZKs)ehm|{jz7Ya@h?+rOE+} zW-I=v0j1%-tSg;Bkxt}{Xv8;y`8SOrJl7EXQ^W%DUuaH|L6UiS&7%B=CZ@smOHBgB z;t#0B@RKknEwqH_6Ar{mEz*?oWpY46=*+=Zsp@_eONcDBciNBtLMQ%RrmbiCL+t*^ z#=D_@{bKu{12s`cI~!>`BLinUN8Eg(_!`GT7*<_pdJ6uOxc!j}krkbkJ!+zBU&?Hv`rLA(_+JNJ zM!UZvQ}d|_&8FudlJugtPmVQ0YwbMXqDf8*zGaM%A!9nSB)(iV}XilQj zxT*I2J$m-|Bmz0ism>6gh#W#a-J0U(%QQ6EWO7uoR*Zj=B{_$nFB`nRr?G>!eI6}D>FzugBK&vKf;j|~iBSr5 zg#_K`358saHQBVZY)6=c(8O z^H=O|A)+Ct^c3j_ev4Pet;LwSg40~kcTPsqE(7452j#l#5f7EcxjSYF#tp~)5+@Vk z2TvsshZL|RoVnK_c;PgTmh(P5wx8~3Egg8=_sX)har_K91`!LjN~E0zStA2A3!NO1 z!8TVB%4Ba1Pif(Oj=Y{-_cTY!!7LqBy!MfEM5ZyuttMI%BKBhFjUgEHW}k>T;N^nI z&JLIoe8~#Fg^3IU1P&&gp#s@mwonX)u!^HjkGT7VP_NB$6c1m_hh-A%E8Gy)gZ%*k z+afBL4$rj)s)6W}-3Q|7Fe8IfuySXGEgST;do2``A3gZzhE{%TeLL@yrucSNb)ZoI zS;&w&@#5goOi0)s9oH2=fHgvZHG~{%ggz5LAQcz`4<`kG^CeDIie2gqb|I0M zPo8~^;GP}fNfAR670BK-$wi@K%a8BDM2x&#OJ`F!tU%nPSr%b5Rv}~Q63xmTq+!NO z5IxB-BV7#21?H_J{2z~phD`8U;_#Gy4p*$i3)qr1!u^YyT{c zME+u(bYeDo_H>AQc*985NR^dG1uZL=N|z;Cd68QI`hvWT#1scKgsCmN^s&vV=W%J<_clS&_~tg)jyaY~aSV6sP&!mfDZ?{v}cJ7MYttP^dG^X1Xt_%~@z%u2iHl6fc)lFPZN zTXD`rX5fVoYP$MvqxhF&&uzqLJKfeGvGKd46){5$7Yz+G4}2l3Xl2qATekUt@M@j# z?YHf(#b))-<*VtMw@uB~7CKQzA}*tF*~q45@jv-RoX4DZsWHyO&|X5^3ll))_MN-9 z5Q)fW)8h;xzT6v(;f-@RSExx?T=T z%Qob!pW(*NPRzLBD3rDe^fy!wQXMDD?^$M)GjEitg{fm8W&X(Z2}2YDQRzE;iACoZy+)3vi?f#76q zO>BtB!$VPw<~A8-Cu_IosOQz5iiF~!XhssmDF16zAodL9-#>(LY6%h7q!XRhc6xuO^Wh%whA}2sG2ET`4F8p352;%LURF@ znmYBas-^fC;$*pGEUfA294AI3GG^o;Gb&8`s&F{N;AvwS=8=FZk{B`%brt4CRdB=p zqzNRP`r%cNgb@7zu4uujPj)>^+pqz(;-29ooA5407I~G_f4d~l#)<#VG0}p zi{ky^po-R>AT*cv8)DDZAnCGG{wA0p3(wlsAnLNv+<7A6{YR0KS4Y&{xEMyUWV);j zVlSLLd}86_y}LRi#d>~kZ7fC)Ziaa7v8FlBSTSQi&^_^^NrD+I$#vBM;=)~8j5RH~vE zqadZX0?Bd|i8_{Me-uIwJ%&0CW|>n`Mo$z@JX3WYC3N@nudz5tIA?S%t>5E zjRS;%>W5K0Fo<(WjB*|vr<$g=rr3ts zMdI+<_#3xXUcvM|j*j1?_Z!;Q{$O@nBtcVmd$YT{XjyZ+weY9}WT9%X#!8L4G{$ol zw4_lvt?8RlI!;nw!!;34{wZcS0(TDKh8~DHopU zpO@TiOSqq10n(KTT!cd8!Akkes9!mUL{m#J8IFwjQJOiKE@O(=0oNJn{F3QFtGbdq zWvPDY5hZM**Yb*RsDfH74s?;j*4uL-oVt)G5=#0e+UarT-+p$=Gb&|?gcy-0vm6Gl ziWm(_x0vugAS>rXap6HtdD%^QnU)Wsy%)EfozE3K3MHH*Day{5$_kYe2mdMk1eVDO zlycN)HDAf8jSa&TWDiZe&Fs@NNdj~p$P_SDtgPY1u58%U6+h+Rj}60uwr17YrVS;x z8i&;ZOr>M+eJ$VclC+|T(!qtq6N3HnU>XeNo1C#tkb@9<6G z3%4ZAi}Ba++~h6$9yb`K6K#qzUQnS1Y+pI1Gz;x=TV*y_Uge0Qwkv>wwj%(^@-kfh z5rG?AC5fdLCwQ(NJP|M$eS%|$3mRx8oc>Zfn0(3DNl1oc4(i-e3fG-=roz8WCci|R zk>Sw2)0%mhn!HF!A~3n0d^^d!ejF#f;j}zY07IL>u{_D>3AU?~q)NL(H5N^wK@2At zy)FCz*fQDSf8zfZSz+|LSlT5Mw{t~Z6^jDd)x(dmg@O@B2kTE!J$E_=$EirMhi9le zHTu7VhQH*ODnG{#qw-RY3CqekmQPJ5OknjC=Koyl!=06Zn8JDTE{6IyCx_TDIHzXK z-g7!~WRzuqmSrYW)-|8fL&R&mfgDz;2xKfm#yBDmp3El(*eCjcCx(!i3_z3ektROP zdMqjiI0HhLln2!)n;ecH8+JS^d#G8_-DaZzoOi%0haiOCFn`XNw*>Y%%HlQR!Z{KY zdLv2?BhUgyI89@U$js%iNp~?Zwh!VEYX^b^2L?t5651rqI_(>Q-m5|320Yz({uNKY zf#C;2+ITkm@-N&@>_R(^4{~w1t|O9g>#z2)>2|SszOAPa&A5_Lvo4w#XjPV-b_g_w zW#NeDm8=Jpi6$U=(eEdI22r&8szGcDKF0&9tvq{c2Ge(^y02(X$BOT}ce2k?xx)wg z65R3g4eJ_h^M~`smvz_UatPWH64vJTFNcccPzG!A(#$+6in4))50z_Ja#qa01BwrcbcO_dc?=TTk-y#K-oU~c?S z?W`-fywJLwLxD72xmEj~%S!ocq0IQVG3}_;>JoAj&zB?t* zIdYnxk)P7^Pn^J%stVWx({6*9WE~{taLDbg6&T26ZQ!A@=+C=Qo!|=i^I*+(N6CK& zxaD5-j%=i??{56L&UhB&Dh%>8iU(33Nb)~e z)yYoN{FF`%%?v!zUcafP8?cVw2u2QVq(-~bf=qwqi!@;9wm`5x9ljbBc1 zR8aRg)Pq*X*B=)`(2Q|(NL}gX$90n*F;J1KXahXrvMo4GAb5p}SqNeHdh}yv4r{2+ z7C|+4bSM81h6gll_YKY=SC)1tMD$^lN$IahJakiO& zhuGF=8xlIjfp#v$oo6}*fz&)^;X~i5$KA)Aq-$-c9Lb7iB+v;)eq>%wJJqbe|kS z^92w5hiAV^)^)*j^On^^Q-%iPh#qay2 z3NdQ#O3Q8RDfVze`~qdA^r}sfW$UtWcFRof)>T7{&Z+H$589`h_KI*dX26e1MKG22<120;tn*(cS zlwSbwUL3=eB!5)WJvtScA)(_jbh=+UBZR3KIF%9PMmpDQqWM|!x!B_;Vfo0iLS*Kd z%WFL!e&b!)RDYrarH-DDx8%tok9i+h13KQgfR|M2mk{PSKa#r|0j@b}ZIHB76$zpW z19w__0&1>)Ebq*LP?!7Am>3oV?EO9|DCEkFmMXiw9AH|E$`v>p6O?95-HJ=o!$k&S zMZD}W6#pP+SUvQ3a`qXcTvA_ zL8CGW?#6uY2K3X7mV^D~`VbCdV&vvPb$h?Ht=Yshv^d=jwac?#jx?POS9jVb(1+cp z>v{0`aJD2JHB&PtSLYGA3`7TDN4EBp0r{ngi+#G9igRJ~$vppbNMp@j7206CP=EW8 zSRfmkmDRsg1@rP+0e}7K{LO3%w?#_BzRrxsl#( z2-$sdIhFzrjkuI#;#$05jFR6`2beoS7aa1IzN|;5)aaM1FvT8g$F0!;C1{`|QuNg2 zELh2>um4;9dw}hb{N={{>nBr-=~`%Z>-@{gQ9{ly&zzN0`!D*FS#rDyD-3okD8Mr< z-5=ji&s_HuOlat(%*&JDnC???VeddAIXqs;H^xn01f=8Je;s}LOuFD;2fCC=Z?$2x zK@E35x)?AF2Dm#EhCZ}G{w*;To8#B)2Xvwn1a5-ZLzEZW2jlw~ZgD#t<03D}+zH2{ zJ@cI(q@7~v)p7zcV0AxPb>O%HOA>W(c3kWsK{V>UIUpie{;ab(usOl5qA)5 zvSM;3f5kMz{GX;4zrlkEbCJGH>9s83wWbxL|Ktt#^GAGN>~u|_E5`w=Mk4fBM)itE zLM9F%C;OCHP-UjFQ3kKJj`Q+$oA?zHhsAzC<^vMPUM24)CedkX>!3YR5|3F_h-w=# z-%(D+vD7Bev?9MSPseQ00d`Iz<3LirU{lAr+9GyW$MGEJ`2x~QT$VFWT{IJQR`4Y( z6^fd<)Za8TEDy3K)K?i@md*0{tBxgCizobCP}H{nYmGk1@Y}S`U)PQ@X%%pcMp4nG z#LUoVfp_AGfsM|ommzTXn(OW*ue*TU{y^xlY2aUits5)_JO*B43 z;qapCCwKTY4M}^&h~xd&?iCj274&|UI;J}|RLU;ND@c}%;L2XNn17E_bqE;>rOF{8 zm0fM*hGj{#Fb%jokWa~1J8e8~Dg6}A(J>EgVc`^={+tc%O4-#OA+QeTP`i!#a$%JI zK~+xt`>OD>3)1^u(1S}m%C_&khaXTV{ zd&){z+5CHr@2oaQr9%6(~BuF|V1*}DN5wOtQptWh+PQgSqp7)h{nBh%`JMZ@-TpXjGXR*ub?*CikLB}~g4g@Fckk)*<&XC}8TdxNW1S6Newr&&OLI8%3%{fdFwtC=_~k<3s&gG&9QqQ z^Kps@V#6><1SuRJdJ>V&8W0ycbuen>gKQekQ4pkA{6+4VHi15=S&)T?LMwlc>bPx? zqdD~&_BixzQ|~uQdnAg|^~Y~{0Pih3QIQrH*Zfkk?14xqyuiK??xA@J^QaHfl;kl; zSIeQHg{N9O3#Qf_kB!tS=ofqr*eaM8#4$i|t#t_}O>I+?^D%u)$xrG3Y3a%TxyfIV z&gKaa>debxiLY1Vrbpey2A2i476P?8adw7tZgSS%=(Q;;>~8Gd9l?f}xY<~m&*!A~ z?9QvgLE_>HFzh@iw6h-lajP>nIGxc`inCXT@{1BR$af=WBqevX#b4n-hza!o9PA9V zpW1=k{0`)?7QC(&wC?WS#ut5BPm@Dmz}dD`e`?9YfcSGh=Urf#-Rc5C2Sb>PzGj@n zCL*?357c#b$`dJl#h%X1`t8B1v0|D)QULM(%UTT zqNRtyJ`yU^9Lzmt;6Pw=d|5!qwtBFAr!oz}zRhUeMKU!wnnn#S@ghd;tFn%e@faOz z=ZgufS5Y?qeV4}$ijqYfHDYJ{ujHWbv%~=0LXpeBhcn0y3bXs)%#4a`ZOM7LH?X=a z07Z}vx%1UtLxv`!Ddkn zgl9*RgaDA0j3(iZvU<8;V8MMsFv^OdMPy~L%xQ2U?Kt7ACQ8V_O-@*B#wydGc+5?$REl~wLsga5%F#fTzaW(1xLu{)@A zn_fqU=t++hcT1?4_?JDI+gDL7upo#$J6zEZ4g~|+q|lhEwI|Vtwu+EWX=pD~F6XgF zsC)$>T_^->>NMwwx=-cU5#!6(CNs&u3~BVGc$)x@l|;DJn1#Ov;e|5N95@l1Lv4fU zt8w<2FvEj1t`*k85`q^-Yc7tu+}v)i`TsCbvw@Kq&PIb2qVJXjGFh_c|C4+EtP9CD z&Jv!7F^uo7mp07TZ`a+(hh>m^*HJ^HvOH;5ZLPMtVAQM84VWl^R%)^!%i(-!&G=?K6RY}%GgU1X)}7Ga>< z=5O^dr@MY!K~s3zHU7>KFp8J26csS4-x}y!qYnbF10)fv1dJjsD~{5s42GxA#=%u?e0T~pv*ju zb9LH6Lq%?6k>iPjVcVE$sGGw@C<*fuZ&rFy*>glAYTLBsS`I(4YmWN)Id0T2V5ghm*g!qq{z`zkJ(y7A;u6V?u@{=z<<&V} zQfq7e$!zdVK@2$&^1l;FHl9-s) zX%E8sS?rz8JfeYuTd1h`ge0sAmfMZY&o-Wa{m@vmSG*eYwKv>8LTs6|k4ee%A(g;; zr>du1B>C7;dtNa6s?4pL+jnR)nzU{B+HCM*K%E)WbaC`jq-RU2i6Y+fVNZAXo8y2< z7o6Ho>z;R9%f&0?m)>Tg^_A@-4yS zXYx|eiw)#qJ6OVY9LAgWzOR4K?h7}@SKa;KO|4H3_RmFQ;*pn#4DMiKmX=!$a2Mr7 z0p>(8X9ho7e>Lb6ivn;rlXNn(jOutSCkk?~r9eg`#o%Z1zHmBpYS)3u;?L<=|H?P* z6EVRQ5nE2>B0lpxc1PODB1s&prXKYIJ*vD`O;9Z9nFWYp``3}6qLtgxmWqR1=F%~X zD1|mJwg@7o3MC9~uWy1@;t{UcY6C3!CXEI+D$Qq7iuK({(V)tJ2d+Qw7pKfig7}04 zS~kHfh4m0cvP;(B@%O~BWm7qs{zS~KH_1CF4vFfxy+c9shAoveiz4LYIicDOB@Kr} zqfW_HKiZfkmpBJVyPK54PWc9LS^ALfod-FbdOc!&D`t8fLi{ZLcZoYpgRK7)(5|n4 zia!R46ODI}6@X8+$%lN`<7gG`W(DG^{Kg&_OOKbwX$Mo%t~!%A$V(`5O#nuplHtJx zw{)WQrH!h@Xa#O?gqi7NDjk?gdTYj)EU5?J-F+_ zGa`>?rrIjjnFtb-Od=~a{JbROKh<$a&-m^lr%(Bg=CPS7+~U9=LeGUnP|^Cqr{c8> zC@2i)K%(>LB=s$Z=Qm2ce8y#NyCg`9=@*k$ur^&jR6jK&;*|@f$8+hf*sgdRiYlT_^mbkI^M_(-}X&6BWYlLbCGI%Ce;ws zN`|nFCwW#`XXz|4fvHZ|T|&O)Xc23V*=bmJT?qc3NHj&7W*FO$rM7}PJ27{?K>s~K055Laz2MF{(V4aDk_|F${0l7} z{EreSc+)5iZ*B-XuQy?6i?9{szw7{B&~FosCqGzRU2wt)x_h{QP(c*`L2^@+P+7C6 zc84h<^iT5RMZ**e`LZkaIKS5MYVkSU%OWVsYscc32!RTA2RdVABb@fwt68;Zl5={; zU*H_sd|Eyjpwf7jSq-U~Wm3uHaRH&}>xm-+i2u5$oIJ8Kn~)Vk6^Pyf()1hb39TO_ zG01i~cqVhF>DNbF8Ccwv7?fkSD-%)dgjUuh*zG`#?E;E3idFzIhIEG>CCz*>l)RMD z&}oIkm+8QSyFOg3>|6<0)Bb4%CNKL*gnS8gr7Ug86;Dz(uW5bQ>aVrd57lZ~*!8d` z#MUu8(&=U}&E*Etvk2bvO51iDj8Qb=XYbycu2F$_Bj(%8^uTYl(VZG+aH-MXLQnhp z&v>#(kHgVOI5Z`IG1k=4;PlHf(k=u(u~|HDHfyF%F6oT0u;uRffP(-j4}H_OU#%UN zn0>bkTeh!!#I1OQFK{wRTbfw+Hkf6WH+xH1YF0N*i&=EuVpsSW%CiVoa#koeQz@gE z_jz5}^uLSF=D)z9Hlt`<4{BH^DrlxDS@NZ}`Zk?WE_LAM8%nHdtC7K;KQkJ$%eQQB zC>E_KlgQdR(e}@3zPW2Y%u)z60r0V?lkJZM2!3gi=PHv)!e$pGePf422Jue@XRCmt zRU_hBAaFR9->FkBcm!90bA1+Gj5%Q&FAS}LM=`Q3FqCjmMNrS2SenKz9%{t9UpS9T zWixiK1&kFtE(*(%3&~on+{jlscR^WBE~sUO=2Ctw<%h|JwldzS{I_$mAYqTo5+1zt zw@Yh5L(au)i)OJSbEbsjughH#BJZM9dYDCc*Z!)VdnA;TGpyhcc8nUy;&H1+K1ra- zT~4!8LT%%Nhgu5hogUO!YM=>W1%qn!*YAzS+*I@kY}3K%dM}XM(Hhr0_m;D(NMKW3 zHP>*WY?pnbf|E`7RoaMP)_)^OBFdnUZ8C7)C{wE{d^hMeKD@hZyRXc+$$LDewFH=6 z#8cQ&HVwg0`hQMS}Ct|FN?E)l}diw`m{}J za0>P6iCS3yv}I3kDHzmaH|uXzu012|E|@(t+pI09e*eX?KKFMf(F>xX&tQpC#vC!1 zUYtdiE@c{IPwIbu6;}i`Hx@Bh7BTl0IiDzhiXFTy8@^rKxJ}%+HD&pZt%Tosp(W@F znfetqP$ifWwkPpXG0kucD9pfvdYAWp0}dK5W+?Q)EBL?^dTuTY0xOf;67xQQhlvu_8j+|gMYC3cpTzD6z%8$ z?Htmy*q!l*i0CwnY0I1#;wgj8Eh0Ja(V)Ri0#D6sVX2S4 z__-*ETpFK^WJokykNb6h0<^Jmnft-cX1LWY0KQen{)Vm^ZxPTjRArxtz@7+ZJP**u zZt4$aL!?DsubiDb06jHqYFcxz=udC6r|oBeZ=JU2nWSZ@%?6pYn3;P}#nOt6Z(Mt} z2-M`%F=FHK-GVWL0&qo%Dg5%}>Z=-%Htr-HighFOe}k8e)8zi6788%TMNkeeHvQv{ zGhZ8|mYWG50=2Ybz|TwT-B za!qFpJ&qYk%2rlg`3;KVqlscfFus_`P__F{OSOkojWUsVJ)QWo9Q2b}%z<7!Minb7 zp@?xj4(Tkye!m7t@GFx~dS%}4%bJln^c%TWpXnW%HGWnx`weh8l1`!aEdn;tV;KB& zrp&}hiHWfSeSf7g0pSwnndQ5>Ry^Ay>nGuKTIs zWChjdC^XzExousJvig{)#&>s zURGC-IIV;*oDON(RP|F*zk0)@Jmn<2)9G`G4k;wmN`$o?h7S5vt~lP3gJ*hqpgL#m=h_P_Yfv8pIv$uvf zBX!a-i$HT%N|Fih8|b@GpaFqLYqJq8CqD%BcT3zt>eQ2U3N>*w&Cs4hGjpoMcE0u4 ze_s4Is8F^dfAySeV(t|GFg;Zjd7*;nRWYXb;O;tc$tjByza2e6-G_{>_ck`Jz%d~s zR*~mJ!zfqs<(p!D)dL$%TsH-|hbEX}49hP&iji840|gz0d9ZLBmGtpJg;k({S4y zB1YhbKmP~sH`Bdu>2(TLyuY?bH#crE?Hb$@+Tx{B#nLAZB^8%tmAm;zB4NT$k*N$& zT@B#Ma@Yo`hLx5TM4?A?txh&M_gdC8oQjIlZvoPqM(_k3(pqYBc6~B#Mp5%^_PE0* z;|hMFCdH;%p_d^|z=48>Q5Dyy_8D#RG!&E3Biy+zO3AJOU9L5#P+;ZS56A>fi{Wf{ zQ@?YTiOT8{Dn~^2@C=%HcAt3}j-ZyQYTLK44M@+}^jV}frcXSVfA3iKg&%i5dbV92 zR{VCL!ki>jl(dqyl?VVdenIOTs3ClOmoleQJA@<`Gd`S&K#NX_Z^Yh8?>JwE-R17N zD5DkV+31=scEd9sd+6PGo^HbaKzp7@!hVX;opOoJ!o4o%Vs1cEvlW9QD-QzY+k`Va z%LJ9zO{^5cdr5>zBl)!~-3Tl28a$vCS2EUr8U|N+Du!vGQ3#U-HuKn4{CU>N{wv7@ zU%mx{zhRI~sEw4;TwjVLJxM|IKz3+%F@Uz<5cVX925c2_YXQx|hSu}q^^AfFU(Ee& zV=7U2kDpt3kjLc(6XgXJu{2HHr_zN6=LuP zr}lvqJ|d3+hg%dLAwo2)H5WIun%iPAyTNoqu#PKUq}7}%4KyjUjghI^;XY5MDt3bW zNFI9F^#%Q(dBfYA;Zc4h0Du!(007+ozsj+Kt?U0iwK%K};ia_P{WFuzB}tkZ2aG5t z0H8h?2hR$W;79O}IHN9DI7owZ9DrzCDk~j8zH&ANwTeqc^G+SXS`h^VEdcUBAvK`Z zM%MCk$+UT;qe*3RgEv*6*YPGhGhM$x$$R29)$!+atI_NC+c#uT^o9#uFF@^J81Rb_ z=+Rz`HPrYq$m&OuwKr)xQHMLYw7V!Le$bTZe%Fl_Y4%XH!M#6P*E2qNx9y(qVKUNT zTGC;1vf*8~{T7AeRg+F<_>Vj~6Y1}^9k}ax5Bh@-W;=001Gn?ChXeORF6#TRr`>)& ztJ4+wdW_*4KdpNl@9T)${L_B#pY_&>#``rG{rgw|T|1c$XZ#p%#rtxA^rgrudi0;@ zI{28#m`Gx@AZv$Jmd!q)#QsZxg4-71AW;`EK4UjHgka4XQ6}~JQ!-TJHsNTbhWj}n zH&Lmh@uDp2w{ap_rWYUr(3U}-CNlU_co5r?$bfaU|JcVrA-#Xzj&0Rl)l42Pmhb8` z($mK*IF+hkgvo#-8+Mv{{Op)fAcF+|$&<;g;X+JZnpsyvjBI?(J3A(#9<_WF)(iVL zaske(@J5h22( zXFs%0V1o@FJLkW|q`6BSL*FT>>HI5;rSHXpl&$g8OGpg?`PiAU=-Z$~RRPZGxA6+TJ)x;tW3_hQyhP1^u6IC3w z5YVOZx3m8Jmr)5Kf{P}gQO1Mk94Ro-($0bnGbM}MS}4Rw2u@ckn(%n-%`F5sQsn$GTM%lY2tl5anZ_&Zjp{*VGa$vLIXRi+s%m?c7Ku3!N9DFP}D7I z_#;M*u3?B##ANnDv|v>QBZ?Rm<7s9%jT4WHblXb`&!kGc2ai5>xj>loIarNjO>pU; zYKh-O+LAIRbBu45?<`#H_~5}o9JxB9a7z8$>LMp1qtjLp!u9T-fn=9h1}E8<;EcPI ziuCwZzxUC1Wfy8L{6)XXJ^3ZKiTR@0P*L2v`FPRC`!dJfVybz#VK=m~A{N+uiUziM zcKFlc;{PalftbWTDO;oY6+aQg(f$@?M{ZX&%k0ETTa}9f8w@x-5u?yc2Pwp*VHkbX zS>4^dfY|wEu}cRck}a98&PIlnA04Vs>>~5PhK0t02GQEGK*;(=6vgYoL;wN(P2I-L zByfxVbzX;&0d6bbw@b)Vq+9TwmZ-IVw8MdA?AM}xq#O>*I!;TaXD*pBIVg*tNYcTLiM-edZpLNTjh0^mPWJ4qTwyeUvH zH5inL7Df3JIDuy-$8=~YZAuMq4V{A|cODBdvWb49w^9W&0g!2YdT9TE2_#)G_Kye^ zON}tIxIsNk7*uA|0mxJ@SQDC2hyj2Qb_&JM=$=_{DH4>T%^kF3$P0)q5+p>8+*mio;4gxrc42qhWmh%NyS75! zQ4IMCr7`>6;Qo&p^Nk}GIr7*X$dd{NB!ZV@i5|8@nih~`bg8Eswb9-DmbFk;_B<(B z%V+U6K*fG^PmYn)J3h_xirO-}`RA;wZzRn@V8nu_2=rTWp`%qXxuybcOyZx&8LkrJ zR$}l^B?bZ3D#+#~5W(gfdp50GW`15inF6#}w79?7QZH#AId{d;T2~rta>v(oRkgd* zy8U(CRuUH2da>ZfY>pax&THbZ;cgbBjs`z5;c(Wb6j&HY!gK)zOwTMW*+QmFt+TYQ z&Q^huwr%pH(o?yKSjt8?R+>&hgr4hoL;@q&CAdsJDyT`7uA!b znYH}q5@%)tN@tM~f;D2ZeF3e^nxz_sZdr?Ww{x9Se@<&uE%EgyVf3(k3eBG4f6q^XRkx|i-qPW}L`sI@W+&EP8ueyx?TY>H-5<`|*vt^s z9thNxOaiOw;4><6IKJTb+L{x^VXaXMrmj8UsZl@xj5#B35s5_O%!^dDZ-q)-lV|FE zrCCau=c-DjSxi{KO5|%%hI3Np#J{d=;8pgOr5DHtFLma_Qp_Q^@QK0bO`|! zF|AXRA&|8*N-yv7N~oCUbJblHSO@b?`~eP$Uy0@28Pl^k=lleBQi1Ky)z%GPNFTC? z6HzX&1maelnR>KmBT*R#Ilp%qzeC1rT#?O6o-Bx186;Z6siIUzq z$)N4s4l!utO2cT()(s^y`V>^GJto0!Jr{LQkUjRN1@lc5bi(o8RW;hSs^C?{xuMz! z?b2?Um>mLWL6hS|Q#jr&S?US&UkloQ!{z7-TX^R!IY5*eJ!Z#HJwUb^=GGEM>d7$q zB$BY^Dt5*pxiidh!0Cy^YBMD3-5H|OmZ;#JAdb*-TG+zjHU=T-QNtL9-86F9)0znf zE}T2U8ceD*Bzc`5Y7*9!%j+@nf64!sID0N!cVHj$5J_eoSSfkcOstWgXon(uHR7jP z?sOSzwPbzOPzCxhKPFY*!UPGErzbOXtD z^ubpDiB|oPN)}g<=`cSBu0>3zy+F-V?*6OZ5YPf%jFjXhTnibtkr|Lpv5$-VOY8ig z?I`|Lzg|zN=)R5AUS&Dp>jKtGAtu-v#4FPh-x&Tcyxu`Gg$R#614Up%ViI!DCh3;27jrsDTZ5<7%){UtJ{6E|O^JJ|M?~d9v zZ3C-Ut>J>0g&*ODJ^uPViGrk>`A0M9pjUYGwznmFN={2QSW?OmMlRedWPsqnC=1`> z47br0ZJ5<4(vm?=%XHO>dk&Ok0gxpw<{>-jjnt09 z(1A{l(e@T)BD}Tq-?}(C8{&j4#Ib3R!{n)-L%X%%=s)|b3lxdr8f5ZL2xGYXEn#v` z2;<$qi^0~SqyO^zpFoW#tSRJR;U~U>9`N(IrO0EwV98Y*`o3O^8CjGmL&1;f^S=`0 zatM=5dBKt@?|`5t2tbWP43%CIfJ@sBV^R>nl2hYvcN8>IO3~P%w6@vH$yU>KUI735 z$pFwL?n{-&*XgIfuK;XUF!qzcGAag9P*6R@Ojf157ew8K6}C29Swv~ZS*^gA3;#8u zxG_+{EcsfP?)k@%7C*EXYu`P*N2BtVMvalRBKOgjK0=k6Izr^S%q#V0*n2f%B36}M zgnDYQnbK0p^T`O>CFy>Suo-p4s7r zbOFPI;dFGt%|+xwQBAbIA=BLIq?a+iHA2}QGYuK_q!Sq{$Csgat0bncWHUu6<& zbCBIZQq7%I)j(Cvqte}7h|a(rj#eyx6GWxJs~3Au6P}QVo&yfCfQ_1Widx=ED|5Fi zSOH^d>WLV}pq!>_T30utawPBx$fY!!8a{NFG>N6O@XUb@w2K12hm^%F&9LHZkRa9|6hxBjB*pd(kig30jA;aWWR+U zwS-|T(>nGOkv%JWVqeUGJpwz1Ak=VNAA^JXH-e)pm=3yetLiX|`n`q?riJpx%+W?3 z-ptwrf?_pE!}qYNmtDK!RsuGn(DY@ANRSEf67jK}a+rDgyv**nJ;Y``909~D^SE6_ zdP8G>#?ch4CNy8rfjUlNK? zQZv-68U?7?PGEtu$(E+cX4+th#W=z37k5j4TX$0D=IKh5#`0d#qrxne*_tNBu49yU z+c2B9oQq=nXz}*oZ#b>PeTlc&UgJtRJVWB61AtgVVy{x zXBbiRS8`_>0hSwOt`t4a8?F-cKi+Q&X$s$f>g$NONLJz$ zt_KBiC5|3 zFIC5$D~~>0k3L>??MHlpV>N!88REMkt4KfGc_2oi$84#LLQuSkszjiuo5F{y!Ao+?|a19US!C|KIwXs->NhD$Z~A6;)?Dfw`DiDzVji(=?)h zqS@WN93%t;ZHOwO00D2?_)bD}=C%{wzq(@7a;5s_>Sy_;VgZ_s5K(K0sO<1Vu+4e6 z7$3RO`@~v|UUtqyGSSfwuGgKctt~733vj%bEyvmR)8Ef;-&0rI&qQBuU(7xYsbKj2 zczhK-!l45*@Z6EY1~;i5+{EF-hPNo{oVa0obuSfEGC()RAO|m*o-F7+3XGFS03Y8#sCD9oRgLbI)xBu^YQgRb{s}W?vo)CWEN60b z3C~^v=JfZ&{`VVV#F@TJUdK7|nzKKpcDW{W6R&h>W?D6lw-89CXbHA*zo-!7eS-UldjLhl4qLuux;~nBAUSA59<0B6W&$Nk-1DJ zR-v7@K@Lb}w_2bELCs-y#KlxTpyu&U76tq=a#(d7+k4z;fSnNk0FZ!%9j(tCcA_2h z-SEC2Hof3BZdr~{5E!GAE?2q)4$>-m*i+|c32?hNr%p7QWV_aHRB-Dq?GQ?))5n5D`0_*RSn+aj}Qws%Ns% zC@md4tlJewYQQIBog(Brh|{5B$<{%N-;yQ zWj-UTapbD!e;lo9AC0nuUdSbppyk=w7&2uVZeId&L7mHeJm*^aURmYn;k2Io?0he$RthXo^puU)rW}8& zc#c_<0TweR@wo9{U^!|yureXSvj%nFdVa?G=+-{WsL@|vjkM3znSA+}_|MF*I$wh< zt$-7;N*&%%`s^{J!F5Uw^~%1j)Q<#Fn8lhc{{X>8n*1Iq|4v_51={k>EYoqGgvb!` zKO`M&)lwbqF7zG=Otzc4Alr=DT7)X|(}5=DhrP-mz>N7?q$&${kgerf>?-hu=~jsV zmlavzANmf$O95YNC}qW9?heO`&2N>Z%U_)1D4;Jpvc4ODxk|th0F6a!z!=8%z!OvC zE+s_1tC}E~3UkDmCbAXyqQ~e z;&DNa>nvs|n^^(EorY?~=Gs~N;zt38iZgY(zQFV4OO_;4<8^2;X1%HlPzAMO(cCxH0_du#EX@@pRVzSC}cVDX* z=DT|Hr(De~gkb2a8m}9uvL`wb`wCY}&-P;*sjYjjAL%Vi9p*SoZ<37RqRjKt|4cg1gNQUZy*Zw@(w81_RcR6P}8o zd?@o817=puZB~zVlDASWmhL}Fd9boJN#zO)N)CF@s$!bvr6<>@?mf!n+=V^f{_gaX zOgQ;vXN7F5&2$R#yuh3LJ=_>?c!u$qJy?<6K*}rx8j+D%BpP&$n_%a0XP!tenM7FG z?;1}k@DN4Px%HQPAAzJs!r_Bw<4UtLSEz(73o~B~p^g&9@2-+#&lV|ngWeWFk&EZa z14eWBSs=^7Y!mnc*Q(+`h2)AKVtUaWs*Ij9u zvbYWSpQo^}?9|a+}l+UpEg>%#mU#tsF4xhpT^*dq@pPuf^b) z6p=1o^ES35CZ3vRfj8P73ULMB3g=39$08UtX%tT-NKUg}QUKGoH*ttt=M=D(Vs9)_ zW;C-(lPU3ix4|o|5383gMADX-LOf&V>!>j=0bDo1BVQNg1=t97i`3c`iey z!wFkbl*MgonL;?n$kozdUJzVqDybOXRPEp|5$Ds=U|RG#JWXO#(V#nXabl-gnoL`t zP+_|!oAih<^&ZkYDiMe#rx#94$s3=PF*+)xb5u-qWpQP0PT>uXUK{sdt}sxW$WmKw z{^W}bHF8=L3j7#1EN&0#C5Wg|P|@}VK6tNODpRLVFD$%>E}d#yd>V$f=qKy9g|&dS zv1#blGLfY#YdUTtQ?|6OnI(T}fV*mLcTgy44=+q|RUFwgUtwAt-?y1Sw%)>c`u2%o zVzyPP&T>HcObGdoXrG;4eS>)VjvN0{-Td~R)c;^PtFb;t5=DqQcL2v`L;`e;WyLzCyp=W&ctP4oW^3l6eY9J0H>P z#H-9}XM$0fY&_S9{YXC!{OK)BV_1!jG%sVNPZPMT$#Kzu$_pbjE%5_` z^i-LzWI4K$omBQV`Wsy?W#48OR|(KC6g2beaw*8#(=!OmGo_%>OgUCn)jz*?aS@xP z-mCQA{jWn`YjlF=^tSGIdVrJ>olPE9h*j7H$dlllUDWnx#%2KpOZAUDn#}w1W#v>*Tnzmhq*7$yC02Z&gqyW(AzfbKv zX-n*3ztQKw@ALmMwG%Tjv$ha1H*t3VueuzE7=ss&ut;y6#J9&lvi^%&F^(Bhq%yG0u6~!;-1#3c+)y(55qC?mvP^5P0}mZSei4={TF8Br%Bn=;G%Gou0k$~ z!ZD@_7-dt0=NN%09u-C*s+WtVOT%fP&Rqsb?A}~fWEW*k<*Q8rIWdK+)ZFsp z{%yp-A42Kbj-(?oQeY%^A7pn={8Jwjj|hVpiJ~`A+{Dw7LQt_oXU$N&vO>a8Re-Q{BDM2!}xOAt| z8G?VW$|s`XtZt5*2}rp=$mTW_LQe`I!Kvt06MrU6y*7BjK=WE-!9aT=zd3GrgSWr!rO{MqYmKed* z;4i}|d?;OS(rZE#nKMz?GevApBc%Mrj(~RLXBQp9_ z{azhicVc+5*T;`^IgRdTZ)d;A4?0j@T^iISfU8_WP+UCiojZV{C&KHYNP|>(}4*ad= zXY=37Zv(&HpYeh%*sHOJT_M7>O*$u>3y(lX#3D5!rQq%0lW^8~97@A|VU#%F{YW!Y z?hXAMye>Ma*sT>1AaJ~orALb3+droA7Sry^qS-H59U;-1CrDTbY^c2y*`PxE@Aw?9 zW=^w1b#ZA0s9d}C6tfg3IQizGCSCx>2aXge@Gl!Y#HjW07SbAUO~2mIwG}J3WfWb+ zAX%&I8ttrF^8Ebf+)B${5%2DkAiO3Qz7vj z^6dDUhjE(6kq6gpoR1zN@@hd6v`+g&&~b!p_)=^Z<{{=0D7D#g9LD3+5Eje0PJ>}MgqklJwUNmKRQA~~PY&&C z&Ft2{eTLW+!+aQ0E0qr?J%1bWSfuVAkprN?S|eFNKNBoH>08Kkb=X?aathOF<A>044uY;)Go!3s6@c!n{s!#@^Xf?>&Ru9UOxswx=wa1J3weGvuzE+RF>LMtJk z;9C4q>>l*kRqtDOiR)fNuTlBp8N;m9G-Qd(uE(xnq8|Sn8{71lYFgV@i>*{qg1yir zyY)v<*`Od)f$PBlA~*EmN?l%sN2nSyAuYIeh_BWCkzS>&?)Wa1U0LU^ABoBnbKw6r zj{Zk?NWF9M^g{UYWAgidDUtu%IQoAi|NlpKka4th`cIU*HjKCWhR0`vr4L(a6gCV3 zI60=7eO!t;3DgWEj6FGVd%0>^OEh}<)H7P;NzfW&u#vGv{3Mo zIaslcBff?iV@Oec<|ZA!VkCP=%KW8hR*<$O%G{fK_>2sfFk@_jv~q01;spjFNuqI4 z&%YV7aQKAPUw6c6*m@ML%^S54V_L244PTIn*eH1m%i`@78tGruY(eIc9IL-hWP`Z( zOAYQPTj*Lg;*lMSKfyur7?;JHCiEA^aEHZTdFTb$OE1zl#(t`9f1`R}2=NzlIFZD? z8IU}@F!H_yIgqjDE3@tki>pMM(b2aNdyr0K`f&16#+d|5_94WA$GRu=G zuwSQaWzlhQt3E%y86e54&}b6T=x|!AH+RaQ&(!z?<%yT*GB}%~nE3&-Ou2ykx6WRX zfh&ykQo#zXzEwkmPAF9-Eff&?mFCL)63kUaV5Z&!MO>{I^AKe^f)!WHa2 ziwY#F1QxfBG?|>zdI3{6ufLSDt8}v}5ypnha}mUBzCv?a+Y%IVx)M_FL!1pM%j?@Gu?W`ji%B4J`O_>ky{K%TJ$?SPq7g z#bbJ7`mlNPGX9WH+JXSaChY)S^L+s-Z`*paRjzbM^#Plt3(Cug*-h>BQ@l-PBC#G6 zN_f9ndqIF)F3(1wVI?9#0eg#IrHUDcAcVs(_Ffu~bmU~a7>%3izP+Xz31m78FYkwB z2VV}Do*z^@E4W_4-FTzl39-`RkIX*0LcGa%U9-%qPMVNkqy^08Xr5ENi;g3);TaEf(n_MtQ0CcXOw=Dz@iNGSS{C zpc|Dw(IyXRTW|WgMf5Ues>G7-epNt8c@l2sjcnsM~hj+^Rs)%$! zJ{8DFcQj9hM!SwRDo2~0vi{jQW<&H$b1xCDfT^$Vc5#F#9r9G$sBc67ZaZ}o@!^6;mHgJSFzYR+)D}}3; zR(VIhoK1&rE6ML#m^_cg8O>+}4i}SbkOBn6@aSB)v|ukE8_uLJDA|0dEF3$QHR!&^ zT-7ILT+$H5B;0p{_jnyg9TnEDWhaUfYj`RlSn-lguyE7?x|NOA>nD2n6WsIyp@{<0 zsIX3pEa83bL-Z?%WPC&Fb!ONbHni0>zH3D_64fe4%~&|pyohGXYAgl}nsV;XsJq2g zKf86ybKTc!Gk@7a{9as>RkgETly9v&SsOne6UBTB zH%^|8aQts|UXp%k<1yw-aW!k^=5}{6aE;+)IhNP{nYBb0v-Pa~>8gaf8p?yf(M9z% z+T9E5mGQJz|72CCC5xxCHRhc3aEMWRq;tk6@eX%h+Iy;2JslaFNx(9}is+U}79F_5 zKdPh+oB6>mFdzOlSZ9jnUaVEOx#+Hb1%o;=5<|NxzU<(bnGVAxJe1(_4&rXI_E{ne zg`6I1zJhl9#H%vNz`v0E#D}kI(*Sd$*(4ADN zhDBIB4>>TRaU$5r{W?)%kvinpj{qoNN?|9LgFZ$DM11shH(C-M1#U?szv9l@HWrfQ zMIHb3P2@tK-=jXTR@cR;$9-QAj?FI(=7kj!E#t>?0))mEiYn}KK@`G&djFCEFGo&q z;EYi2y(J%3gYGDhG;jQO#5jPg?-=;c^-yH>_l3St1cX}UiK~eT4nQ;@zaq&PM#zJF z{oQg=IShxsdPvYo?ujVuU<2dc1Hx=5`%B=`Aqj#>FjOwWpuA~N;dimrQl|=9{!iTp z|9`5txg*9FLTMCC$b62NA(~4zMhQ5i7xZ(MzI-)SHYu$ zEnvtsg3P-%qp7h3GOVr`r?yr^i=;L8Zj@9BZ|@E@u~^_73Ev|tP^Uin{h$6{*qI2H z0Z(+3q%IEJKZ~vFl~DsMtGEoi$c_n;y*gza)eFWLR&7WnESgn5k&^nCTj3i>o0%r4^P|czXS$MwTunjNdfCY*?eWsoRF+O&TTB<$~K0yY? zV1S7aAAbIjL4#HgQX2#vOOSr)K0+s{VI4Brj z<+6Tv<%gWRg;`jo1-YxO7*slB{s`pa6o_8?P&xuea#Xksu`}A|j!Pgg?CW!zcdhFw zlI<_b=H^Q7*t80<+TBC?SjKKtX;m4^`2VJd?LiAtKsnRthYwOCp$}?655Faj zaE890GxRUP3OsL*eEwd?-i?~7|d54Pm2CH#Xi?%gcpOweUfMqe-tAvVVIq}H7d+fG>l zy82A}r)EjofYC2I+H3fdMf4>2xu> zz`q;n)w$)h4uHKIC4dmCE$?H$w2@oaNiXuFiMom z^{K+iO!$crAywD)*6+G$2g9ciT7zNI2CF^!<%w>*fn_Rq9N}9i>Qm6!L_SIeq27QO zz%=3a=Buv5YR)TY2+68SfkO+#n~7f#@OO}zHr?OvZr~71a0or7Q&|?3{#i)nus4&b z*c1%tlAtEaE^Vj!<1#Na89CeYsu1Cdmi5tIh|R5L;n|qjsz|2tGaua@x|#D$mQ}O> z=9i{rMA%qtNz*fsd5$J^JT7&djvQk;K!d!m@Qcvdipqwl%8xbFflenSsdmL^M4G2BZ zg0w;TyvF_cySQ@hOY*c0y!>(Fs*fwWSLT$#_ny<>A7GLX259hEF#VMh%=J~4|ElrX z0R9Q`#hgMgAyhI!w9=w=}9D&xxv z`3?xJrB~5_v0D(c;E6w5Pz-;io2gqgmcz>g>snNn!>^$m7iM6)|a2! z$o7}VFQ+f%vPRP4*3g_tXFgQ3hAhWav(kX9(|Bfh6ctUILmW<~fLp|}YG}Zs4wj-X zpV+`myIVkNFsG5{NR&~l&}ho4TX=@5R?imacd4K7chiz3KXF)qWY8$7)27RkYE(BT ztBMEGPiZP}tRq)ZEMYF`#l_H*ywhF{sroj?*JqmP(b2J=aUZ+(mgg7I(7`-bgO63! zQvO@Bk?kw*th~on(5a#M#XeR?LuETHlfEHbmJ%IR{fcT+vh(b|CO;}w79mZSf*{U` zx+QMTmXa2eFM6s@T7kj?n8XpECwIk6X^F`fGlxrYi^-Qd^(Vzb?n<7N5NBLZ7qXeA z$aSTuI$Owf%_-Mclyr?K*RP_{LYc0)`oyITU`Y8DZBNmxpi!?Be33DL+!aFGsiNk% zoPO)>!Nao6y!WUhJW<%ymmC_Tvt8hw4$``#WcPdEwisloXYgOS&>FKZF zqpU_qYTXlkL%FPY+ZcuIMNaFN5fyVocKE?@hN9q;j(hV%XL3mVjOENlgGW3=P=sq@ z@k0sKCw9_=R0+)|a6H>EB~~g0rcL&U?^8W8krF985TU+Dzxm6bqBToA z@=DGXqP%mZEX4SWe4~tvP~LMVxy;ADNE{EAZ-ZihNt0gU{Zx-&DMT?q@lz|(0p$0L zNhk3@Dp&BBALvHRr21%=spHVaFmOLLhdpsoi&2-@O~fWiNmR&T0n(_bX9wb$DiytA zXj6X-V<}Z>p0L4bd{K~kXqPY7_F-y8%h0A8@mapeh~uR5&vGxtXke)S+71`T1j5)y zTsFkYYrq%Hgm8X_V3)hB#^+qkrM;u;iWM$B7U zndMj|WQ7=>KXm5G;pPh#&P))K`RYIhTr4m$>hPFY$S62S+)lgD#Z_Od*V0$jRa-Jw z0>v*NFD@Y~tZpwYH*z7h3}!A-8zwfEcXc<89T?4xYg`(hx%G7O4B#QX419IxYP2#n<{9Z|QX#Z)!pL<>S5}%gw-#gNKRhyP zM_VmTRAjEEBi4SpO=q$;LXlM4*m(M_lZO7`RR{mZ{84KC%hyygh}-!!w4G(vVECKG*+@P^wgGWWcrUt$Jch^VHgzD=;4kt2M*x)Q6N) zR_pe+T30Vu7l9$|vk%b0NKaU~PWZ<-W<_gjdvUNxDQ!SMr((aYYF+O(4GaDab~UuF zss&IHH4}$avxZ=A>%88z?t^!2FxR#pL1L=Torhh7HZ&9lQ$|{zi#80)MEh|rm=O@UA3w2X3wMhbAp1Q;vR`( z;=7#HWQMmRsawqpBZc!inI)|Dw=jz|^`82LZ3$j2p9=#H!*eOGdUTIp4k<1vtCf%V zS2U#dPzC%duT@;jP*0{v^UlRxsCxd8&Q~D@KGNjAoxvsVgP<|bvTKIDE#djNU|8mf z+Zq&MsjM18LTh^`o@7=}fVx6%MVpI>`A`v}>aoLf5ecP<2cwcq*v5tKQ&7- zca>vz_WZqz=p0`NcCCVE@3b? za&!AUB4=bDj4wS5Ol%h3HTC+=uhpEYXuGN&PZN$%|i#c_YF#DE|$YD>&w zAdBPb+_O0Z)L?PwX*$IR31SV2P_(jhX1wjiR2uC?FMN2h7S%UxU%9>az;q337Si2I zf+ntpG-+r3aJe_4%Clwn-9V^6&+Mwt4AzzHMW{<4G^*PWy7a;&X|wcXe@<dF^D)gyRX3j$aM=B1B_li>+Q8<0z59vF(?@330l z$r+sNqjR29LPl=0;@7j|2bPHx+mS9HBWqfc(kphaDvMdBXW{CYTi*nebZV=rQ74m| z8{8Q3?Py#$lCSZB0`UM0za+f`X~~0dPefd;-6I`&dgwhlFo}4X%mK_hYpXZIDGL#p z*Oij5w~p=%o*%oHkForOOtf3r0Jc!_U;a>b(=iNgmw{L^X*$M^h(jo42IN7=r3KAIYo-$_k5Q4t3r#(}T)aKFqc~)JC%!4VIHG!u%G6rSeA#%+SdRP38$Wi{k4cGibQ3&=m^J}RMijG2tik1OxK7pJDi&dR6{y^GG^ zYmD*4z7cPVvn42O{ASJ@f(z8*1(lWr<13LXl_C`?Xd^bO*aW+s373Z<-ch~Ebv-P@ zBWi|~QCx1_ulJTij`^KB)liDN{%Tw)X7uZu;vtsY{_jQ1mMc2ca0JfUT+l`mYI*;(`tl6yTnLX!L`aqO zBZ*yeD@pftuf%J!$y$`3EmV{j*|T>OSZ>7eYG*r2`ID7OuJ|EK4Y?ILdJORNH2`q& zRr|ysv&LDm67g{ss)L8x;ja1Pp^nlF91IBzB#;=r(y50`GA+}FLk&4A+2I_&EenGn zh%Epug6<;hQ`!VDomJJ;!K9RVE=;(|NJ=k9>?2wio_H<(*I-TZ7*ux_gy2@`?7FcI zu(J{)grzL(*=)t+MwkAioN@Qi0PV8L4uSdexxi?c{-S$c-%+xxV9e(5>~;b=@k@Kxno*X7tsb!167ceLyR4?#|3++z3E7+vjX*$joN zer@%J(1vY)z=H#O!0gMfk$BtEj2tlwR)2P4$iM0t72|8YBCy!m_Yj!IH;zgg;!!K> zX;(8o><@aEX#~`!6kaARahh+}VLfUkJ7}wFb%JcwlmfUWZtSa1|Hh4PaFa=aB)_BU z&7jzZqtCoZ<)$%}Y+X24sDHi2ke&Ex^w)ftJ0IVDW^%L=Mrr&Nh`LI8p8x*$y=n;_ zq=cqu{NVF5WB{)z%%8ey4jQ7nU76?8)2X;wn;vd0fF#VzzAYj#@z3=i?wN5@g-r5^ z4QmkD%SoBB4209M)r8Lk>aXSWu5P+!spU_#!b5BoPW_Co3RH&}(rP3MOP7z6U;rK* zt^rrJeq|9>qZ~xFF*E(QG0SP}WZ>3DKdLiW4PzY&$*q zyuORmq>9si5JIrcQ2yzM>6?*>IBb%%jXMIEHWL0T+4EWx%QYj%J{~;25jGwO=aKrX z74g9^<=Io$~jZ?J8{@7KraPhoUeX`|Ibt z8~7dgUZlZ^CA9AAv;Mq%VSrjUBtHeLkum5S!J~CkM|M`{S|l}V>%nR>|EQQ z^Ni-Nm!x{}s}hJz%My%!Vpu-*eT^1Y60I$^uluwEC{*bQ+orX`G&F;m^yq~)p)aqjJjT^=gLupTT5@*89D zs9uzMNsN`{t-Y;fniwtaD&(;?NF9~E`dAd9nkACQ2haxTu{?j=8D*)?O*9F&C!&YC zsnMP^nuM{=)D0knD8W+>ezoLuSE6flYf~q#Z3Wx}0tk#Zu5WP3fwJA*36nNA?)jn5 z%w^_3HZQQSG_q#tswo4=y7F?%BKL~pbUmvWF`Kg7o3hjU!zWc&`K!-$Z{AbZSu`+a z+y&zR5)QGHdwk84+BYbfxHs6^o)L_RXcNDV!H+vrby>FI&`#kf%*HQo3{kzw?AFF; zMHl(DDbfCBMyzR2{A~IDTs=KaHAR(kb>VW3jv8x2D=43i6(XQnctclJqrb9*^`_o) zOSHFTj8u!P}IOwMD;p0~MJgOQeriME`+ zt-H0P(pMy5-q6a)I7Xt)?XlwWhD(HS<1V>p+jT_(AdIuZD>XjIh^foWq#6O&gTiFG zC?wB^elpd(wx3Xz&e5$+SFPTph~?-~GGAcDba_l}dkeW#343}<5q$+f`&s0`puv7+ z+Go8Uk+g4(vPp?IDrsO}GCve~W!l26gHdsLtnM3#%i*Y7kpOjVqWlKs*)J2n;?W-F zJIZ5@$AsF#wkWI(hZ@L#);Dap_CDfY$T*K~ReWH?f$ev`b&S6%=&?m_k6y}Tb!7_Y zCx&rxea!D7m~#)IQs-Z5Gi2tzPjVJZ&q~=%qZD5t0OK$bmLh{zZRYWlYX)1OS+`dw z1bHv3&DRZ+0mjNf|Kibn4dSJx#d&u|_m=f>y>sLEQn&Ezp?z`3Qb6I;gv*X&I~9)L zDrZyd9b8c5VvXOx>aHc|3dpHW@Bt+_xRd1ZLh}(ni6#D7+Tyeo6ysmfa<_#f9=N)t zbo0HcD|v4|h{0dtah4Qc>N>yzs1PZ{=km#5VX>$Oio~q2l~C9v?5Gt|bX>HA&T}ln%A1>2BBtM^2Z@ju%=2QLUOZc(c|UeR>~8mxO8`>_hDjO zo>q3LRT2SpF4W%CNh5d*$1BisV&<`>m^W!D=v+FVy!BpxYK?zZ0)=fEJq-c;^EbC zd}9XPoqD@rYpD}d9sOchucWXpL@&rLLPuTTYoni$U_t}Y=$=j9!H=2OK-H$S$*^v3 z>6_&-$Jo$q8p3TcfhVq|;wQT?Lx2+o(l4NIQ_^H0;DDNtHlku&br=_8(tD4GHGtfvmll0o#rS=Nb`pcZ` z|OIOD@$Lcg!p|jFrX^EjRk7zD;5tY;JEz(+bEMd?qZZa|hzXs4Z z&}Hw5#I`~)Gw2--6sN1HEujabfxe5KR!c>2n7)a`N(kN@vNx|vBX@ga;Qdf|Z|Hu* z>ocEk@ z^F_qzuyGD!Hy{!>XiQWD!$J%SqnF3>ju{Mk=cG(#7suGasEh$hbAZqJM(~V3UXWqk zIg!R(*N&*iR%BK=Dcz0hNBS+3yZkgme%A%9=cz;+CNuLZNt{N%YzuL0?HCM$Rvn&- z5*(dzq=aYD0xSw71oIK+{t5BuNv568w_u)|bh&?Rzv@3F8~y{`u(a=PWsZzvJ{<8L zyUkNV6VLDW)Fje2);Qbku|;5DWI$RE)+t%kzJ{jO=hf&gN3$YpCTm|S!Jtn^b5sfl zt66SqdRjb_8FE0rb$*VWjA-rLl-M(pPyYq-7;YkPTOv-J#Lq12cMrh9*bLx`AR>cR zKcMp#n6$4D=k@(Hjv~D+HNYGw38#j)^gConTa;Gs*8^vdY`(dO3*+h16zG$K+X|$c zs-3J&ZhLcyt>@Kr26ktp;{;w*m8QAWmi{{#Pe?b6sN_XV(ISC#Ttn5+p6Jb2L+1wq z*W0Cyt2JWxkHQag-6yKwDtA>#)qFsu(_EPYuyk=hT&{y)&8`|JC&yedAu@?D>z8)W^EJ#N$ODHYm zUHnENNE_d?O2MO-#5V4Y<+z-s_E^3EqqjKr7CXoCPp1Yu&*Bf5g6pGv@_tK!*hKuZ z^s=SAe^9y~x!k9|r0ayxASyH-t0z4M6?dL^tg;`=Ec9bsh!@9cC4Gwtekl!5KIW-@ z3~g$TFR>V74^>f`HGt>Kc}NemDq}Bgg#adod!O`;yFzt|Pikd-7Y3$#mg$rx)(HGo%2=#~D zq+=cPJKM@hDC7J%47b=x-nu5ddE#nMeJzsZRtDSpWYc+68~DOGdm@OEsCJ?~?h zv9#Al88YT7$?XK^mKIN***<7=3j7{lm;7qy_suhpAIeoh2ubU6$E5^rGKQgjE&v_l zH9MrvOSB$4Iol@5_UaKFo#>9UaVJ#0*dbjninoFwJCP*e2zd!(=etI^Yw49J)n>U0 z$BW5hcXDNW6VyrimA6(PhrUXJlEf||#4u|?`S33n_WCJ)?J_VLrL`y$3ep#6PLGzs zCF!AX@ZP>}fMIsL&k6U&Trh5=6V+5We@RtmPh>!PT7D zObGpzQC=leYOT8EM3Mz3z(o>TGD(`1fcu_SYRIO^U*cb1eL%TU!_1P1&X+*lF>jH% z^$2jH?<$A`I&9e9KT3J>))$CcB={Ooys>Y~AR;4Y=F|)Pg*!~}L!^K$+a)pFW z(}$y@ceOw2C#~CaaIN63ad%hi$5o}1=f~aaTC98g)-@N#EqTpxn=7`)9z<()cIVIN zGV$^}xq&awg~(NZa0Ppp>7oU=-#jV@F(x#N|f7(rqcd5Z_)$L~3k&*Y9QC5x=BIMh9cxSuvB83#xZWfzGi4 z>`<}}Tr}*7JkITB)=A8_Ho_L2vEtdn&KbwUwK6`cJh8A<3x~SI>S@7)8m7(9i+Ae1 z#Gk^~lH2RX<;j!dICmLZvHZ(Vh76)`GejG&E~trm79VU`|1*B%!7O2e{}KIGdu$TA zA^e&>6Ad_n2S0AraJlRw@pY(={SiyDWWx|pCs9fj8f8Wds2bE3AQz#$l{tBi`7yX9 z<9&eadXU7yinQ-{MJPD>LD??o>@>zYH%m3s-l&=5$b82&?I+@Q`xwZ^r?X!;teEjy z(X?XW8#yZkg=$R%V<(7r=LiV`TTa0fH8f19Tz=LX=1Nv}N_|VLYUKbGm)(v;KXaow zTVYl660Dmd)v=x0oBw%hoThb~d>?G?inx4a3^sTTv9Gh`Q`7`EIK&wKd83rPz!(B^ zqnbU$Xr|X_pE*%{)%zcsBhEeJ-nWO0@t5}2SR2ZY7Z*II;CihkYC84MfQw`SEV6Vf( zkTcUn6`uU?>$_rnSJec~<#@L?d&5b}^J>n}XnyAkjY-?P{X!;O&ZW|@loOj!UW3V; zi)YWuy#*}62jD^FJF7P!*VUfboHAu_vwRc=lcFQHWH)4l;WvobJX5KTLsW{>N?4{E z-9HIjZ@OOi{R%FFfuJ=b-B^+=*=6N5qd-dKbeUY%sZ2*XEvJwaM7wSWrucJb68Wp=tFLUqgfd z6|Jw)Oh2OK&4I>3e^9Wk3+DI$kgXfL?AiVh(ievO!TvDb7lB$Up<&4vH2vAYkQtQ; zua<)&l6e!Mj$x4cA+}w}yGQUh_=bV=zC$d>EC(R6~iFdBcGvKxcczVH;}!}gTCB=y=W~^MPWy-qYO~6BaC)}hDppoj&6h=oCc59 zAEoC_E{m%by>A zhHA)EP^a2H6olgtClj211a%9itG8sna+2;ko>csP2M7RxWr^BvCApq@ow3gGl{!V=>N=Nb~Xz?I8k{ zPE@om>j`acWIV-p+K8Y0&zzT^G|zEBo+xC(+}7HL<%RUnP2}QvXT! z`z0cGYz_z_{dKT>4({>Rl}A6!*baQ(`xJ9>A?m3s6ofH+EU1~(;4~(wKWl!-B(D!0 zH?qQ+X5&sxBg_rlziA|{J~xt_LMX5|2$6Cw=HWlsfDhL9qRnO}^oY(E0cZNhxw-g(!oU4I{_1P|r`MR3WAr(3zz=D)tvHQ#@JkQ> znE9`iJ$zK-hF5US;4)+tH}v%HeGof1<#~@yz#fF=m=O6s=t6R;BK;zM?yxO>F0rYL zcCzlu8Y1_UKhB*7ifhf!Ym(P0&5zb1zP0^DkOUDNUGGQ*m_8+G1?V~H*6{sb(Fhv1 zI_Ha%FR#HJ1i6{^A~{L&lU~{hslVV>@uRw-a-Yf!wigMuPCNgxt?0nkip0sCPFd4T z?J8FBI37TCWqYv+_CeeLIk9J*qFjK8)aMS$b9dqgZdmM3Jxdq6U|J6Z&U^z{+wTF+ z*#}5Yk5JD3fyjY}J%?8PQCC2d%waxlrv5C8$A9+NLFox+P@Cw1$qE-qO{SmRc@s!Y zKY=psnM9U&?<+U@pYT1ALNnWMZuUq)1p;$M=1z}UTYf-|7b5>Js83w2H@w~PgVU?s z=!5k`^I|OWW+-O<_GX&KEP?2drt#(@3LLCT?10ZfPZKVULnuqDTkckvRWaC|5ng9e z7I;B(KNk0PSBQgyiI)?+%`o6ROatK%N%DIsNDHu(Wa&r6NsA=Wso!EunJLm7f+tyR zXngCk;U$r$Kl{xe&U%;iZY*7#){qET<*?#gkHK+&zv2=4ftb*(ISBQ^>&D68`DOxE z0?aX@9+m$419eDSMrD?5x5d><$VS*+^0>mEG};qWpe$u&c6w)r-muMH+B*IJR{NZD zA!wOJXLsUKP%~wQ7=LqV0};gtWxybL(QdJMNn&;$ps=PQW1B5;vup@5Lm+Emcs@Z!;YijG3Was?1!^0 z#RVZ8l!OjM5K&vewy+o|LN;$A_Yw_DD%;}zCSXR@_(H_}-E;ZMa(VhCYW0^yQnXNn zifx2dvP#m1LW%r{t5=WRC1>H!l^$R7y`i;B-G;Oub{rK zCOzbk2;;(_>#f^7B$5U7FS)#r2z^TrxvxtFl}b01S6R+hm@@8O&ZD5anyvq1(UL}=(0rjE#UdM zmU63m@*082)^EgO6bCCG`s+{cnu3y0lhYODdAQhD%8Io#W92}=S-#?Yi87u3iSHXjQ!)js8Ol<9uV-A%>tcQF(^PbEs^2(-TwxFivo zXeq*(_NWn9)imko0Qduw1aJoB%Vm?AY7pAO;ztF+@|F=o%aD!>`TW3<{PrME;<_;N zPn0Vq0_Um3A4+s*bia$BCF4+sdgu3LV9`!#gxLFG7 z=O#~gNN6?!dG>x*d;6i)vXi;T53oYjrv4JpN`{lD;F`idTdC_X=690O+5rhL?p_Dc zats@~(zSh2SR_iz*%^vu0f?2ENe5-H`)`~om$|OwZ@pU{t*}iLrfcE`au;g%U|)fJe3VY+!%D_ zE<*u+`?)gy67Ep2(-^9u2~{-ByL}W@JRjz98H5MNz2^wHxe4am7306z@3(KF%0kLwW{HV|`fN$S= z-5QYJa+2JV2|^RY$5V80tevemE$?dtfF*9c`yE+Aa;G5WY@;0dV@F`bi#`!y{Mb#R z)$k-S&L1#~=7om3Ou_a`Qhk9cxA2@aCu-CLXNFeYjJhG)f<^-yq?#^Ag8FpH8pHtO zZl7cDJ6b0M6AB+J6h2fUxvxNZYk>xKmHzmY2_F}-C>(2e*ztu2YJh)gfq&wH27!eP zL<}Az!T=9Y28EIq-zsk4Zs@^*f&NNAr}U`qWx>2d27e?JS^bXK!JuwDo&y>7g+3GnX)}Gnto@EEFtNd`_)giVpB9M^(;GaLOgpr~?qT}_ zs1DZK`#1G(Kn3;<9qnL0CqK(aq~m2x+?&ExB4NiQ67_1*CaI8F95D8~PQHCIrPMk_ zTJ3MP33b3;tX5 z&<^FTJA07tc=65YM*6$8VPdckx)&ydi|if~ydNaQi68b51-F9f{dnW;p8#YaFQ^b$ zNMXd_g2>?o>HU)_$VIPT!pcU}gB>u05NrTE#3*){Jb^I7Fb5_`V-K3!l^OVmg@@nHb+Tfl=3@D&;e1^$T!`UMg46*(A`1hY#R zHLm8P3p8jetr%p$Tx8H})MLjsmkCb6B#_ieO$7BW8~1zq^TyHNQ2~ib=t zU?HzkhdC@GAWHbScXMptp&Su_6a@btbbSR-9YNP6?h@Q3xVuAu;5^(N9H`tF@%r@A2hrwje)p{KqqN9v#~DHqtC@uJvd52$VE9`1?x zUm=bF|jkUu8EpN{Z9y+qbN zfcavd{{2A2AC5#sl{#1&fu)Lv?|k#RZGAG8D_F*e(t3*YWN`P2ai!>lM;MjVNmaW( z_LP%r9icK{sronaCjdj`u`-aW!x2KLkVW`H$a@^%rBVU`MscC*x3p*i$2BEP6!6fR z7y4|*snSjLP>NG6XKVz?`Si8>1XHz~;vT13Q0 z`xhbozB|W1bVFf^DaToYB=R)?+?IADV!s4*`3hdMX1G)kBKI{%nzJ#ISga*L`&B`T zo`j5;6Aaryy;k4^)N(%#3M%UO-Jl$N*<+xd9|MDW$?z_UL7rfHojmf11wlRofkfuM z8KFZP+%;=pgiGppL8KD&I2ZtZqX?bH56|+$&IfVFyZ?D@C%lH16mhRU^@>BUq!(K>4EtOH`Jv~N zP!ezzagX&SlxBj9mK58<7akfJ6{ba}=jMq)Lt<@^b1a^3Y_E}1&4P^Cl5DxS3h=9{ z;mi8YVD6aDCrf`c%P(OKqEQXxGJ1JG+3fRqLoM%Gt#I|~{gxYk4uhOv@@(#ZFHai% z;RSuc7zE)Y`p5mfFm}hD6S((+_T(4ph}g?^5q+X1Ml``7Li|@7cIK*n)w4;8&M3Go z^|P%GP@-IxW;?UvK7Lx3$Dg0J&q}JkDUoQyWY^#{I!{q>I#I(xNCU zk*kQlKvd*1e)!`V)nSnxl($df&H+JQD<{WmJ5=fp#SQ%RwoLxgNrAPba`X`Jwfljj zPY9;4>eKuM-iP9k(oXo5@LBgA?r$ylzZJoMGoeDOgkqcMs4tTXp~#QxO0SMThREjJ zDU2#2qz+7&@06GCNPbW-6ofdBu>w4zanrFTd$kXQj~sBKq`}tIm!xpHkv%u@{}~mm zuL>S{-(}*JEMflVZ~hdl5+g`qKoL1)4UfS$0J`G$Mf;c#re(I>K0S)SiBbf!3!rQ# z5VIf9e!RGv9JW?wn-|Fs3&td*C++j)KBtnUC+UZ^ShiW@#WOw)v053fn|QA3j$@@A z;kx=1n7v5Gotf#cIo>$vr~Ddm^FV&ujV!Gj|NH=YH&BC+s6n!RNe&+e zh#zXy;`^X0o#J*@Uzcm&Xp-^`V~Rxm3PqAX2N2gk%NFA7dnmLm`;{WvpVX4oo&88-0PJ2hBwXV3 zyQ;$*xpLDx+G%w+oI5w#*d%)oiYaz2XIe8qyn7?#*hXb4I~U2Fz=u$PBTL`D^?5|U zDTRJHX=ngEwiecHcrAIE3FaeN4tuJ#dNq(2f2q%ljnjK6z0rWTG|)=eZ*G(=xFpUF zra=MCtQbMJ99p|#H2S&=P52#9m5QM2BF2pCBri~DJTgWu#@rQ)aS>Us@7Pd4t9Fef zDY>DcTw@cdB0u4`_fr3Hasay(GnojM%PHZMmIAFVP`6py^qXv# znw7=oNW^#^-fut5*FWMvKLA+8$5=>V@?e=czzuQjk%rq?sOjo zG?PYpetK^u=%OYt{N^|3^*QvLdcfX|%#(ECYkq0qR~Y}9B}I zyO-@wccoIhAIFZBR6DJQ`9$4I!3g@Ia=1V81n{Wn(MND%_o(mDJAFc2Qf{voabgv^ zh@)5IgH2M%*Kl>>!zX`Nr@lDOv}om7bz&Z~sNJIYw?|o(zaD3Ca*ju3h+GJ24%`w6 z^M^7oFUZO!l-C)>Bx+MBG~5}_WH5&?*$=u>(7(B|Z@DgUx$*6>=|{0!n#iJ9*6I`S zf#d~8TJdGGmu2{-gXmkthZulBs`axI&u*Q{cQg#gTbbU@e^LSJ$(s?dSEb&tYdevb zn-Qj+K31)r)xrFkos&4Tot+({7P_`o4XY1 z15m8pkfS}0DX=RuUd(=k8($wf2k3xwb%sA{KOX3yI>k-yr#Z7NQ>S$g^zNr|u#r3t zttj2v3#1wR8n1S7K1SMWh;lkFhzdZpb|c`M{ri`1cJwtlUCEtEjI~9#JMzXCYH)3} zQ+I=yZmInBR@ZFj(t{>@k{q{^8e_aM(`?p(QnQNtG2^RQ6lHzGI#Jk-FYchwr%2sV zQ?s1G>7Squ(7)JlH*f4V5j;c!UnBx$hX33>?x5 zA<@MsH>AjlIF)Zh@?DZjgVtHCk|rH}k<=~b96&q_t!sTHgY8?|^)Cwu#gEosT)`tM z>G;6s%8Ylbl5UOY>c@tR_c--NF49As$#L9ghfStr&(xE;mPTU*3*2pnIyGFNuxb!y z9?Wxk`sxM1=EXmX^NfDCE{`GdEo;@^LcoFEJ`F(%ayhQx1;Kt{ExU%%slsj@dK#ne30^Tdq<0`#_COpecVvcl|o=(D|&uAC<<2 zoXkE9yAZM^p8KlQ9^>WMHYr}4D$)uI&GO#JOTw*?bER;)mashLH0Rbj>;Q6%75rpZ z0kJ%jp#EE3PxNlpTr9#7&yn8Tt~!5ehjhN&w*K}l>EQCOMSIq^rhipV;iEFYV5E_f zpO{QQaQjm%nj1HF44)%kjI57ecr^Fr=b@NEBe3)Y!4qE7vgoJ zXV3>~Qx3o0Kf(y)n$TL)C^;8q?;u_F-o4s+uh_G6jMs8*P$;v#ojU=4za&lf{oQJQ zZC_zCSN%QfTj%7xcVxib_uFBA-Rxnz%9*Wt#8Q$}+0&me?exjS%uSFkd%S#Pze&I% zgRFNyV#Sn!gmmhFlqZGNsm%t1i-P%ns z+C!SuY%-p4Y4SC7#S9(w@H<&_bF)Fc<34KtKs)PYA)Wxw82?LzcUSVqc4ll6Q`4Gt zBo9jx0?|i0X0qrg5!EW0>FG8zn%t$PT(U7WxuqKF0(@o3N}ZpI_+E#V(;aBz^&s5- z%8T$7(w_7*pVc^#nHa|{jo(FWjXA!F72%9nw$=%pCr7GS4tz{nqCStUzDU@4-VA?s zjPH*n?!Wb?>ShMY;0rp!PaLItrs7Olu`_vW&9YzuCkn%=W!*n(I|_(p7uh2EQZ7BS z4UT<`vq*zJ*O*Zr{N3~|x=%Z=xia;+asB4+?21)?{-|%3IkT}-rlqy-H&9D>fB#QgNdgUriSOI5>@p(4x3-=H-$4TQ<3V= z4>1Su?F|LGAJnQacR4)B>6YG%7@hnC(&7`wOTVaYz8Nt&NeE<3t9hHef8PIh2B?bK zdF}dI-}O(s3XytXZM9f8sc+RU((G-fS{HK&H)dYU+gj#6FY8puIy}zl9g|b@IhdAu zE>BU+g{8IxNL~p{xvjLhrk_;?nVc(_Ypm-*zvahEGQ6*Qj&Ls7qX+|EwMPn4GMF!G za+C`32xESA-%y{#x%NRa^S7W2sv#JBWD4`A4l;<`fe+kqrZmO_ATE>D@n}I+^$=w3 zmb6K2N(y@}w)+Nk1iW_>iOSLbGeJ_6Dq9CO*070ngi+fnMPtWsWSYMXFj`X%1CD&F zilqXYvDY}LJc^tX1W60RroeNMyT@?OuUUjPc!`=Ov|~ftQC}2?q1w{@J-mYS>1{Ue zO)bvKL3h9*|hxfs;*haX-F+$?vs;AmMLsrmd_v_v;8fpVuk9HdEniSAPb7cL?2~UjOts z#+Qt|&QY=+(YV=y#WJ5d>FPkeDrG>PWtKI7!kObpGHA8q5%rBnc!@89wLZ?A*IFWQmhx!;uaK=+h6JFXM6lWA1ASo$lP`*$UOuxFgrC;*f5O74pG8 zd3)9j5@UK;}{_vDswN+e^%=!JiT?AyC6c}X4XSG`n;if@9qEo6~gWSDv_DK`C; zpNF*(3mw=9oeWTuzBw{9!&|UUKw{oLj~5>p5hnPGjqME4)6xV25SgMcxkL7$G~yc_&U7tWFAk$ zNv;G0>*c1#J&F+MTPbvJt`e&ZY4y|4Gq^&{JU+rUAca9Q+9Fuw)4yob&#xqP8o3*K zXyYq@jHUWTu5T6|B_i;@SkQZ-4|0Nsz99U0HFHNCpP5K23|{VaD2r6Lk#c+JF;F}do|B2_g**82 zc$l-gF=@p1jsKrIB@z`J4CBH~*e6PHY#L~|UT0)k0lAxViAHKFzB81SdS)gVbt!4- z-pxNNzD_Hs5Jq3$#!>k0Zb;H$+r*1^Y4?S&F!vu7$V*Q@5{T+sCdqmKjbR;p-cg^2 zR~HGMnTbfvFuHOFCAnao7&-eu+^cm04x-^m9KlT{>Gh{MCZh}&Ie z3<%xjXAFqhZDkCI+zrL;R=D!T?N+%$#0`|YlEn>FyrRbq1YB9;1}a|>;0DTH>EH$` zUGd`vDqMZX4OF?p#D&ORso+8suRccyf*y6E0}CI&M?;)<#s1oS$vqqhY@3x4iAN2* ziF%C`9_;Sp7BF{oU5RrXxFP)fV^Z+z1TLHx${*y<#E>XAY(!dR{`OE+fMN1)#;DQ( zNqHFBsAL+oL`8WNS|M5l+VbQgwM1ok1lo*bFUHXVnyf@pfGgv%jQn@NHN)}OQMKgT zq9OuXS&g}@M018?NqG~%HRG|Yd>{aYfk=E*9Du^eSWuLnhz&qc<4RBboQzg%K}g%r z$XILvM@!8}Bt2>a7*cg*p*3eDl9eZ--D6}dwSb|;Va$+{ho?1TZm{7ZhbC z+9s3Aj=BTv7|M$+5NNp>Go(kak|#ZP3au@@$#+>q~Iv`c8Av+N-xvB_k0Z;~k zH37%hPTgfPxmB^c%Ejg+Wm?{Q~0H#X8FaWk93o=>)HCImBG*wqd z+B7v+L0TPES6W&fwT9e8^kj!3upOWV1l9-C6oP#Kj`?620H2yG4lTciD=KZPx+@87 ztA;Bg?RRxo0@^IbwyZ>7hPJds*5nP@QEfnrT0>6a3*+k7QDuOqT0>SMBEzcWXlSyC z)M$V5Suq$3Kwb>y1l+4#3(%^lHsmG3CX2|AY9xy&jdCZ8D2%!#i>QpECU?k2PkjKm?w_MaH{aIaIR#Q<~Mr;z` zXY|d(2v;kv+9Es-r-bdE_3k58Xy(DFLPmsTjiZLL9Apx-J-f}k)))V)oW3@*CQ|1u zeN@oI z@w7P1C9B_=t!h8d$!x)doB0KCqyaGL_r1#ms%ri+0$ zHgeloIC?CB#HYldX~2RmM<9e)PAg^EoXss}8)s{-m3PE1noB=yFKp>Ki4U9aSn@H~pbwHcHSdCldV@MRd0D%*qgUD^S_*c1!)0gi$iDJ} zk=jA^h%+;MvHZ&^6~7f0e|Ayk4O>CMvcZi*@irSI5hA_SZ@YRs~&P+J5`BOUX&!is8JW z*pKQvb-}V44s9=fI6n|%0%zCTwS5f7;VwKr-}u-`7mlG7^$x~FfwF0YSi;($*}mO? z01(Kqv4(x=VI&;0FGN0Jq}7vZeZV;pc+);oSJqiPOMvEFds2ZxPUi6ypW<(PGAQSJ zVWqYOZasYEskUxvaRG@@vzZk`Lr9^<&--6aHp}QN=3hR=hfrHHoUG|hpqUjlRkXJ_ z$|yZOmbrPZgu6h%zJJJ5Pu(Xz=NX7h6Y`a%-XHh`*7=xvD@dNg+=rpn8}0UqQ?EO) zLV*d1Y>>lbVX6F|r{IcGny=dwGl^}kbfR3FyL`xvo)?x7Oy(6G)#$QRQQ3E~);ss^ z2RGX4SS7RksJ`1LldtbcDH(0t+T#IIOjK8N^R-J`&)-rWeeT~ zIw&=ZuS}N+X{`opa_pkEB4qHHmWvUZRX-9aqPDbfw&^iWMr3W6J`6jzTyKv=7L;XaYN;q7CSI3{xYb|;{<<$&SmxG9 z46Ih4#ji>TG@mk8S#D3Zy|NqFR$q{g(nUGfejHmwp_4_sE^Et<*y)hK@l=gNSJGIS zk4}=cPxbK}VP1KgiglW6k~U^`Oc|XCK=+#~^+0s}*($rn49%(33fMRuEX#kTZtI)C zy2%vN@Apz>aRxGg?ZMQ{$Mem9ba+~M2hSxUOv(rOOmdd#d_5cz7aMS3L_8B;Sy8Rv z`(pIh`+1c_-+w7tKrGg>IcoKpxJXUC@DIL1xW&Pi)IG#rma(773vqA&H~9Xi>js||I~ z&!B#)8yQnGD{j&9Flcc%2&Tsmm3KJ0uFCD*iH#t9n(u!<;H&Ij+KbQ{z&o&zDj!Fo zZ5i=sSE>_9787-NYkH}%X_Gxen-2+I0#bHJfM>nwCp5|!M*mJSwofeX31i+v4o^%E zAlj3Vx7Ujr+i#eB=@@n^d3CT}9^~0UI3G~YGZ#C@c>G##5&e+VqlH8f{f5*&zm?50 z*?Hdn@?xJR9@f8wmNpp^XtGC{?cum0q!g@;^5SEY|lf)gM{@B)ztI zvvBcz{$W0)(KCgX%)dOpK$9kD z{5Ibe$e00pPpF9&Rykht;4?4nh^ZB{XD-pTTp?Xe)p@(0r`q&)X`$Jbsu_JjBJR9*(Ju{@1y?zwupO8u%F?H~ zB1Lhl7`Pn#4N3{LDZ)@m)6(t(Er&_6}o0Vfeg| z%U}k--~?#`Boy$dI~dG5)iHskf4^mG^kpF9yP#n|M7Vk{$sFJ@SSKXfdY~nh?R_C$ zh{zxdmOC%2E=!0SK~KFkapXIt+552pls8H!HfL=0dG)9~G;HrqRuCz(_doq$a23Ff2yf#&w zjghkyyoeA-Ph@HuT;jpe?1_SHJpvr2>Hbau$rlKfl8kp9%!Nz@1*gUI6qZ?>KmuXn2h zNk0m^yL{HQY{weCF~bHeN*L+TW2|zcXWhTsyAlbkQMGCv#5mV z5$AaP1RK+Eq!{8xsH{oyhYP5Z9N7X}M6R$HSZPvW{)E#c+FkL~SJEchb=@wr-q&YD zE27}Z*-7R!MHnKUoUCWz$^sHl%c?V^+CD9Y6FkAV5)Z}~1k?p5z}sX24v+50`WlI1)n4U5e+?b*S6aizC| zqR69WwigSkQEelGvc&2#+GQwKk%n^-T&!eDR$QGX+W7Sq6LdLxR@^!ASP?SJhSW1awh+Pn_q4&0vlOH)#zuvs>Z2$H+&L}rao_s3_+|7>WLl2 z*Ar?vD&9mKTCRS+wcP7uu8Ga{wD2MuYk!4>fDC^I?aDNaT6a*~me5+{KTOUed*s%N znfI!nXpA!rBgI3i$4-qzuEkhfThHQTuVl{f@Dc`13$1u}<=T-|Q+w8>nwE0u`c#;T_~%B7;~N&k5^jb0)HJ|5ahv z(GKRowiNyTZ*P>3M_c$z5C7wW`yUI;hsEuqalYSzP0G;Yc?9=C`$gtGu2z`3%0h4~ zvShHSjToozbw8n*$5vsqKNwkL|N2fr<DQGZG)DZ6nMNs1J!0xV5T$6KcbCK9)Cew?DPxen;{Gvm(8Kh-XcIg%=v)tczY&4ny?;3+bX#|dwH~YwtiN>0nr*BfcH>Txar`+qR@kNn< zBs7&iQE?a4wf@)CDO>WS)q9>@)gV&T(0BYAkC8U>RTxu~q?y@~)Z{^T8a>JjVX|w& z(Uu0*>R!utnS?F#VpM(YI+3}Q)urFnyo8QU4g|cjay)gZA^$+X6zki{)7}yS2Gz2> z1HnB0nR&!i^s3@*vVH`Pe~@ZwOwOE;WPf#}AL`7$wpVo6?Jh)T$}bT(MyGaz(ORc$ z%#HO9_Ke~?kTh=w{FG9GFWK=Xgf|cJEe}5$R9bfF%rtO0wy3$k|C{H(A9w5I-v3U~ zrJ54xt=oZ`4J&7lC1IDBJ~_bqf`6m#G8v5jo)@upNvv-m+y?^Px}1-3@O=z2}7PZyNAt)+Ug8Yt;Ok zliX^EWdNqy@k69!N)`9yzeyI#XH8AbOL-+zyyeGG77Z{nT!8$PnGg$AyXDs(-2h9` zaT8E9fzu*thKrudd&%5jED6`Q#HrQ5$8T|7upfCTwiPtN$t42MZin0Nn-Tt^H*?*x z0;-|IsjB0Q`flYP89CN$k6WksDM>B&Keu4hzr0hxa>)Bjl4j2KY$d^IU)RF;p+2^X zyeF;sEBWDB?5@yR3Dvf9UA~yp63&^~4$x{TaN7ex9L2hH*9-cO3fo;|V2tpvIEV1Z z(ouimk)Y@M@*kW!^@l>eKJ6p?d%0HYviMh6@#(wP_MvW!58mfi6U7S|u>qpHz*Ekf z$rYKiv#^7kM7)V(oPOEDlXNGrbpd%D{JA8Ol8o^R%KE1sPdd}zd823YQ**}eW9qMg zQ1={fp%Rc!Nfg@PPKKE7oo29X#w+1jBlrUo5>~J^4Tk0GOcV2CePS#LB+iYxMVz#_ zZj2U*9i3*pMxqm|9XU;Z4WX(9UdKfHp(L58gS8X`^b&NqpYWtHIG(hm9j&hIqc?`Y z%Xn?EqfQLhXms7>BT4D6sZ<|6-=uT7x|PuEI%TYT&)}*K#U~Y49{|TkvQevnyFrw<@?<@m)P(nd6CB zn!F!ei`N!0y2WtKMHg5(LcsAPES=i}zQB7@r-S5=q;WsVN_QoWiZNb$E57R`Oj}=n zmKMz!?Pj;*nB5wCNnf_d*ndQmc)6Nfv)1pR)^kz>&$q;E8d40>}$dAS=w(;Y@IDS4D7 zWFcTii~ro`O4a1e-1lUFwHn;?mxbB~PLS#4Lbmi_D=s^zB43kvC5|B|na1xZ9KE%>cwY!I{w93wyy`|hb|?WufbA&NW+(@i*o|YzK$SO?TN?=b9U!cF zjR3wKO0jDt>x$3;?+Wg=_N0!z`!c^=h)3k2{881{f>tP5hEzdVI~NG4rRXP@J9se48`HhK_z}8-W!rsPN|HO9+=INYPQ{LL20u`omox4`s-N_@FR(-aHUa3BM2LKE0?Ji`u^nf%hTmGdoHQw#;KY67}v- zl?G8AoPKnG{>t=0ZD!-YI0OwfluJ@rY&nT*e zaxzd&9TO{6v5luE>Vm^Z7ME=Fcz+L&nzsAu4^5=&I zjJn}*{*0ZPY$Kn|-cV}DH2fAYg~0|Vv5t0`B|>hP zrRs>U9*-}?eTB>V-eTR4xUwM@b$!`5!D|9k7*}wx^@d09uPs!2RML#wl9<2x%0ti{ z>G$a01Q!^#b~)^j@Q9WZ(k))PSG$^c!)jpFC9AVXG3)X8sU03NmYT6O`}dKZ^JN}u z--XE`QqTR^E4hv;O94N$Fnp_~*Bp){T;fspeqnohU0)=%7%4Du&qc8kWT4tnMynjP zsAw25oVCPa+2-9jYM_>I=fyB&ZxF|9QNuON2PsZ19#v%^X~O5A z(Zv~aYLviUkEf~4ekNdjmePY2CqYR>jvAREoTh*$F|6SS+nO8!_aQcCuR)SMzS+2o zGQlq(Fo7ZWUgkaqRq=0N^u&@ zM=qa974tUkg*i$Y7R|^-k-@|_T-rqCz{E#UV?@R8^Tt^=AMIHnFmWXh+FA+X(2qY4 z8Qi608EOmkV(s84v7KgETtyQDNQGxDN?ef_ajm6znCHl z#Tiz7V60aGCGNu#c8XbdjSR|U-lf=kUhjhK<{YoYZEm3}i(YHbUB-~zjCLBq4I4XW)(Ks*5?M+@!{6}sRlC|jmQ;E# zd-_euOTL&qi|ax-OnniH<{1r}KJ9Kvt0?1;R%TinG5yP8PP-FUo^h5**TwKsjk1!B1;1Mqpfz7Mm6?Z*ugDf=DUQO44P8#Og51ux44bAUS{LO zJt9ii+OBn0hw3FSzSuBWI;6Jwv5k%$|5ZfR!mm@wnCkIqi3w{b6t25RACZmc3D~== zcY~`36M+$h7pN~sl#r#$=PySnZ! zwA%UfOmHiKGfJGOv7`h+&z?$RQxnv3T#Fa<_yBAM`7JEzzwjqD7qJDwFz5^4rPV;< z;m_v`OxR^|ft1lDC_GwQIMVbe?gj5aT-HxE!I`I;!OB{*wlFy*1@rJiMqe3izF42- zp*#L^4n=oNb}mFWX5Crj^NI^wUfFKOHntC4miNj*KTmW{LqAV-ZbcWR+=1o$E!+2n z?=e3Nb8TA^Tht;HQ{k}={XE6F7QKscCyVbfHOy&sdmX#$Tj+({<4<(*WMK9Y_k_qkl}g*Y6z)E9 za_I&Avmy=|^GyA7FheHujNzMn!8F&bNbte2igbc5Ut-SlycA}ZO@nySopk|&alY4^ zUI8ZetZwko$+UEWEM@$=$Si&O5nQnHjLDAzxM1vCf+*1;sVErQ6LzdOTpU`||<6ez$CTfQP|5GO>Mrq9dl9fqJty1DOR!-#HZ=FkqEQL9`oZD1#A>x1`@;TkBUIy(S#)E+N6v3-{$eWx#FM`*!+HPEUD#ED;F<*29=S?BJoH- zq#I}Cf@My+?VeNUh-qgS-uTTxvoLW>f%Muj=5WOQ_aVt^T`eR{5JZ86KZ9xp_sy9{r~^yx&m2sU9EcTB< zVmNyaN=`enZeRdxV!>3iYF#)2jjUcFFb<(eYL%)NpD15ePrNP&S|*tl-=QA5T&+c_ zjuxRvS}zHxgis`_*9e?Mu#nP=0kR@k$mmr9s}Z~ktCZ^aU>gd~XnK{oD22yDLg3Ly zq8feyKf}5fvasl`1UafLvFZMS{#)o!4pcxNiD|G5Vdc)3O=cxQ^E8Q@|0UOSS#jRPI(G$ z;7^GM`S$4`9Ng#MMe!sYIv^Ff=P>9S+;)?>H-zl68Q4T}j(la13gEd2`UdYgxk!a* zTjOXxQS_U5r$k=DEfFj+?sHYqG;y6cXj=X`8#*9dl>PVyfkpEOHL(jQUMOLbd@Bu$ z&v;8KZ^A{HKa)o5zZx`%;x9d?gQi6_3~&(F1?9;-M?wEXdDEOz zLD#LAnWlN02(ml<$S-OV7YT|?Sf$L^FzGpeI- z2hAF9-jV(l^nh}~^Vt_?MiMw*Ig>8f8acOrQ1?xp(X`)to^$F7G`w=bQ3 zT5d9C-+yRyZuXX*tc|@Be7>^MF?yzbc1dW0UM}lvu5ivVCcvxF;pLZt_s+`3MN>1e3h%`+RVRY z@y-|5sYB8yf?vlOuToSupwj#1tSQl}e+q|f#=ekr?$6AuV_^CWCq!TfwHJOT^PhS7 ziG2$)hk0J9C-gtCkPFgefCMVcTwDk7NRa z&)N9FZS9hn%aj6RTF_sN=q1>7kbZhrhi}%{?+`9)AMFW2`5PgA-nyf{bra6-7A8U2 z2qp%ZEk*Gc-OW%3Iu%d&S0LX>!;rt9dP|Et?BhK;-*iarjegu(8EvpRMJP@Om|@mXBJ7Osh2t9Oouf<*zP|GLNx zC_N{mo8iu%oqdaxop_6qoq0=?oq9{3otuqhO+x{1O@|q*HJY?j1;#P;aQ!r;Yz%9k z$loV8`p~lm9^T#nFYk1KYqwv)fjc3%WNeDZ=%?y{oq}Yh-vY(tZ1Q?2X(ic+X~l+! zX{8R~%sp9T z!d!pBj}+@=MF=n9uX`#rCV@|}pF$I2XMrx zFgE?EKnxeG_jT`#)kYk#Ec*3HLN-D!!N)MPwoL^M5ZjeaJ;}MB#Gf^H8Qs zmiyg~$9JA?JuW4lCoj#OVK3F6V=i5vtuF!3TbFhb7`2wS!OPq-{Uk)qmsUe&Ud(%F zUc!3-FM4xs(g`oL%}Fnu&GAQ!&FO{h&b=-W7$v?)>GjsT%nh?2l|gJH$smh zZo+;EPdt7ZPtblTPt1P*?t1t)3%3m}I3A}A;J17UdN4OrE(;&b9!GtdU(ftMVR)NF zm~@!*)NTguv{q?8eqp9~9}&WTpU6ZGwB+sG(yQFgtGc^%TKeKFaOx7Pup5*&9W1qKR@o(8FkqvI^&*v#_Y~}0v84d*vvv2s=MxRJA#{|O=4`Ij?vw|WIe6H#?Hod$Yk=Z7{;Kz?t4^X=u zZmYG$dAU0h#*co%p~(7!5kJ{U96#PkmbSkcKYS<}G45v4gX4<18`YM#Ex+rQNhW7) zzpW}lbVx~HfHl0sc!^fb>r@y!^&khaEU&|OHI z>vKUk7v6V(_iX>`q;ZGFZ==^;hhhFOwJh0>BbMDxWB5Cf@@82fAzjArkzc`PbG677D5w848N( z{|nu9V{>+Oa<+7Jx3zRj(c043<@k`h4V1R>yR;YpQHuG^5bdkRgpdzj4HD6XL8;04 z%2)Qk-L*cct<9a}cppza{Ig1O|K1%s27OXp_lrkDk~AWgowkA$s$v(h*rj4nFtJpWV7GUpdA7MiLKi3)j+ zjj^p$Fy$dT-mv$zeOkcu%}m>#K>a|@UK+|;Xgy6V(FZez!4WCia7M6gPgbRH46C&h z!Zl*96X(-d5%h~nr>&F4_I}l@I|-wx7mru=4Y`Q&8!!$&DZ0}pXF(#WJ>qI?;)=|-*plY#*e=0fF+jA)T(D|B5{EWG-GC=4 zz`DWYY^xc7t_QV`%P0=KAcdF^j3_cnH8Ux9wq?p7{R}ph$&d^sO~c07{UX?gz=R%c zF22Dl#5{;^I`AU#izYy^e=T1u9(JrOD>yWrVumrHdm$f(4;T^3NEx5ZL^)8mJn@^A zPB$qgqyu?;HkMc<`k0?o;;p*u1q1%Uo!ve?8En+E>Hz+=1$w;O(6((vpaH28`Sn%p z#*@A-(FR44Ug^4}C)=e!wd1T&k!ZCS)N!d7{XQG9{%9|_74`nf#Z+;@FOH5LYss0B zZ&6~1=u`~Wh)dXskj*1(W&Q7AFe+@IICRE%;iD>!rLS`N#g%@mqGo!RAf-PEq&lHr@!NCw zhflt5ZuvG@f!b1+oEJHPa&6#aG%AHvH1d1w_J>-nccrw{NfcuP;{7nd8`OV-^B)f0 ziY32*Qy~EWP|*PZF#ZKNt?dl|-I-er${AY)(ew zF!GYq1NP(l^_1)rid^5*;Y_yI_4oJA_h&5E`%CY&7XUxg*Pako&76Y?hUx(&#*^nQ zC|=D7nh$w@YS&8x9B0k^Eec-EunXtY>y3)`^&sSC-hrrx@8z$i15ymzCx!k$-K*C^ z$>!Z6IXiKCnVh!CCpMh0VNEUP&-t)wWA>rYZhzY*BRhT6@gt$^W1$Z? zNu9BgY5t7a*T%d%W8dxj;$hz6_&@sn!b5$4^SssZ@DSI)j`_f`+t0C}I*<=z`k)cu%?#PhgK0_(O5O=q9}QThAO;hJ`u9uZ(-omVtrCwZ&+AzB`pIu!}z=u313Q`h=38&!4$wj9W`z9^ipEO+LDW`j$ z`sYf7qJN)&!J2qkQO?_j8I{0)92=-IFguaj8eP^zk)4QA+-pA*X+EhrLZw`-oU_0b^KXgrRSr$zdKCVVll&|{@}dWf?s$I7 zo-b#nTa^tvC%OZ238IcH{0Xw+>O2AEB+|-U-kMpljTN<@{k8#$A!2=gFAXntB=MFu zGTp)FCy1Q$6b2XnVUU1~CbYbdZZayVYDA&?$}WJL-=98e>NTqYfatySt#h4WUkhO?Nu9K>pY%_U|`Hf8}5?)+|~Jf}=qDW8D` z<&lV6U1KBv(QC)SAoXXn!Wo50!Xeoh25@$pGB9-2@EO=PI9NU@&E|-=cD8t0CzIt) zWGT!CIv+y6nK_NmN=%fE?33?=JUJDOF1OXL*$c;I2r4jXnqp(=SXtBRIGAsEs>zFrr$xHI+70EsVmAvL#tVyY;ut=WP-EN!+w-Han`^@92bY&QEn@iour(>@Rd&@PmZzJh z4|VWe6>5cnZ;U=^Zv-cVkqm8VgrwVhS(XjfT6*~@erD~=q_85hMw`qZJ1ZrWKcp%M z=i*4vGzOcnbF8mfuA-Ifwd95ul~qBZG@mLa?S+2t$yapt zkG5Qqj@)|aH1K6lLTc*S95I=|>54-%B{%BGSOBC_yyV}4Cjk`1vy zPuIO6Q}c8s-X~hH``U@RAzpTI+3N(|t+JkG>9u8pX&NOpPM`ZTa!WbF!fqZBp9@#XJsR9Yc4=c}BFzj14*k9Ray zFVxw$>f!5Xl(7S9sHO9$^?b0FTa8FPa+UGO^S-QyW6OT0SrvQRRy|&Jqx$w<My<%ma;?WT8j7Z0`IL6(iPn{Ey*qG*(w5bZ)FMHMn4tqa~k%}7E}_5t9? zh@Qmv;}g)7lwN`~`scC&c`*D=Mv9vJ615&?JsJ_sdBM--#-w?HH^cpFJ`l=5HSQRl zD;{H2TCUEp!0I^I-+jWr=8wJpCax7^!5k-$*$ZGp>WQX@FZR6enI~gZZtiEH$taxj?GZv7GlTP0N7XwQyI;j2BGfBnZ%J&p7*6ck8I7^O` z36FEsV1Ogl#ECaWKM7f{&+vtP&lgBSy9gU*9wPAprVJmU?fmYSD|<0>!9d2PBQh6G zDxDd-aKrNW_&W7msJs~1akbsAXd_=6jIE5d-6U;?>bs-WknuyVkPg3DghvwTo=N)D z^^*fh(j67*9}9WG#lQR3!(z${(?{O|7yGuPGwA!UGg3HNKX3GCSDQZz3T5WN!w`=W zMHbwc9`4Wuq&*hjE^iGB!jVs4TQI|J8lZg%^yhgXhuF))j)4ps1bSy^7WcJs;-5G2 zvvQ9V%fnt#mi7l}@eFxd0ymZx7p*ICsbZ0@8O7ZC%pc1)hrW)qV3M~_KMJig+ml^x ziSUgmL_@sUg?g_lz!Fz2GVJ!D7KUz>Fj?_F=ixO`ZTJ>LgWd{V3UHn`P$*_gdsKB}fJY+2SK$8eC&iex?;q5k2p zxx-r4)sng2lXp2IM!?+K96((S3~B=Je|>ey4xZinA{@La4Mu!5Y-v@$HN&gcJ){CD10d+w1#;66<(~d zuP(nwa^YDq}l@Oe`Or(ifP&@}hSRaS)v zb1@#-*zm>zz zG06}zE1z8UQB~;Jdf=P(k(+=}?-!wNnihaqprQe0Cb4Y6BwwIXpvZ-I-%J_Q#4nl( z(K#|0HNZg$3AHACNv=IGVkTx#?=+Ya(gZ|1oge%+3ahzk*KOtmN9R0^W&!2`E^FNb zdZhd=I?*THl10h8sQ5fjFqp6tL$}0P`%CY?v)Rz+CZl&C0DxFf007*7!Dj8Otqq(l z>}>yy(nc$3$RQ~pf7#mQFEU zw8!+J%|giWMVs;56>SZ263j`p7Z{5R0)z;(ZL?PxAb}g7L<|u&Uk$E8bedWsTBb!BWS1ifgu%D@!HDp){QU85rvcD8(t zWXteogxN`;-e%?cG4pItd)D#;g3xXmO4@~8wTd9KdK=Wzw<^C?>j`_`+N-jwzJ(@TtZfZ#6oRlg-Oj2g>J{D4qv4EQJGq; zXthK&^PT@Xyt0CK(^EawETV0^x{vj4i0I_AJxWL9Z?uj!;LvZV>OJJy4_56OSvVcy z6jq6gGAXgP&wP852f4mQVx7ji6=+ibvRF10vtHAzvv?xL(QgvFbjBsHLct~>js<7! z1EM*%2MIXe1-$0W@~0!WaP$=^2j<(;41HMZ@lBdBO#=EL$ofFo^hQDXV6c2ea=s~L z7rpKAR&bsJ*FwrmtAO)iTS3t( zq7M^;O*vLWz0QqSOS!&)S#e*JA%ixV&w5?iC;}VGYt!&ISh^}lV1HI&TrV%DR~YMe zuEeN+=F+X>D=e6d*-+=!eHmE9FS1UiT zN&0~e^}m9Rjg5<~h0*_pj+2PHk%|3(f+$;gQV~f2nJ1eJBf!v)9|T1J9|IRqL?lle zJr4w!Qb3(8k(F86)VT!w2w3}tLDeF;)^TqkxOeZj`Zk6jB0)+@^2FiOrPDRXv$I*x z_s1PdAM`N`F?|L<)(Eq4{37|n2K{yj1WaOD1QFh-Gd2@+c8xtTTWj!v{*leAe>n9ht^-1gb&4_}WzW3_n6xM=0QB+$LH1M8Yffk%l?Q0+D$;{CKpgRccm zLm_HgC^M)#EWolG_{&*MiybLZWjtq$Sp?Lp%N1r4f$u(BV8ANq#DNAkc8C}qGFKI1 zo9yrv#MI3sm4?}EZf-1Pyv!|QynzHGO zDvR0(<=0UxLpz(O+>-$^2OgzGhW4uLvQ-;+M&YRz+)Q`jP^Dj~C5q^?gvn@!9C*U9 z(q#5YZ5f11Pb3$e#UA)n(4-}FnIppvToIkx2I=4ILiuAr65rS}sww!KD+IEQ237CM zxq0ul7x69k*jonUn10oOY-I(a(8|mruy|cNs3qZPJ_nzOt4Rc6d)@4~H7zrcd}QkF z=19GfHpqlk^NjlLoqtu=#Pe{;$}mbuznJ0C$2G4tHqj*QQhr_{khQ%d-Cf81g8m&-v~b$IF`*V{DjawpMmjxr9FzSa1QMe`-L1s0)r~Kf2W~gM*rpqae86$P_>+;&d zGXgs-5jeWMng1D4rfYLaq|&V&6<^HvpYU<2w$;J+(9kka&I@v0CEQyc(C9%)H#X! zxv7I{NAwl@!2p`|dc%=`+J2vi;Nf(jb&|IGFBuU;l)9)lPswlZj{$z?8MLq%LikDO zlDfIplW8_QqCLho&5)jqZuNe2Mh|9*DaJW^rW6|K)*CSC+!&K&hZ!~~2^2n3{Y_Iz z=_w6)Dg0zyGwx|T4RHhc{Oo57l^mU*jd9)2=xMtAGT)s`_U8a6Nw@iWI z^m$|9(%8N(D|gSLvyfj9+tGG)7SGkXwnN9H!e*VAcy^`8%0Jsv1S2%w&-! z<(7n?F(nP*(KfzFvJ+*20XCAOyHFmhVzwZ{EQOd{efL|645&LK$3 z$E+kg`){9oeN@7CFpP1^Tf~&W;#?9`iglJ1$~lFZX>ra())cMytQnW11PkFRff}%B zYfq6O`sziJmKH_+PgkRi?#p<;2s?`x)*d2z+{W_Rntt(O%pWD3)O;!R$V&v2o#h+a z?ZrANOddZ07$HX0$dV5lC;iBD2J}73$jlP-i-c|M2G(achTFwq${HuxVDHc4D@cus z)tNq@EMN6(mgS|H@AvqG4iD>b|$*Zlfh|W(*lK&7~_^A zH&h&C*JqQ^JJNfP%%hKV5NRTgcG=))YkfS2i^eI&@Ep6G8Fz>F+8KSQTF0Y@xy7pW zO*Y}&RaFmkoNS-z(RtXAMRboM&Y#Zc9}LKejMhfaRh!Qh`=Ebk4-;6w3=DJJWAjNQj6e#1(!AUsK{7nQOBl6OQk+O>g;^y!J5HG<3Z>G_;L zT;A4AS-|iY-aOcBj&1>X36Lj0JnkQFMO7{;J_R*icq69BqF|Ni5;Fz;H{$bs3R^MZOGLL&h3ghD%Igv1Xk$i_8Xn*s$Ct zW=XYm3ROZN+`NifG>1inNJAE&{sznZ*c&o1>bny?0YkrZz(AXeq_KEFQ8vDf?J!#A z39;&L%sVl~72IpK*FDx!+_j(Fn9W$P;8MU5>rsdqWIec(gr{dH+;lxNkL^lkXg> z+X(S}m3p+=a4q(oaEDufUIN(tH1?o_eFDsWd1t)5X2so^r0DV?h_%zu8qG~>+YcI6N>Bn zDSG6X8}Z-LSC=VfpEt@|ak6x>(2@c*sDK;m{=iN;$**-Aip`dtT`LX1z0^L2wun3) zZ6wP!_#L(QYgSZxl`Tj#3=zB%DVP9JiSEg?UC<(Ki8Oa6>x!<{L=w5ydzw3p&FjqK z+$hEHkv#%G_2DUMJPn_d>upC)%^8HmInirNW(@6`)r^vkI(#WF-mU-Pt74qe zW0;y1?l8|VC?R@i1tA5z3a{tG6{4~#xfDJyQeQ>S^hV9UF)Fixex7K~y+24e0lKT= zM(_o~eU3L@bq!swVgJhGGK{8fExSywbCy=;B$+whRB({QZshpNasTQYdLxS5m1_g| zJ!1J0Z1$Vzns5BmO?w37YM|GAyf@vG%;sGc>DnY_@ldL{)bI>vAZg zp-0xYl53?`NJDofdyjH*(}AQY2+k<@;*i0$cH3TDBKAOV?ZmoA}L z;?BQ3{)d>er{j7w9_@zx?XKOl#>F8P{e(;5zm6kG)X7r}87!s^JxJhPpbvTX<=bry z$P;`o04AQ?qA=2(lNI0?K$dPDs5^&V?;DG!sH z+p9nxf3}jN#^ugKzx=++a<+A#dW|P6_WI1tj%Q{z)8oJ1-edW~&4YcV7JgRpNF;hm z&sOstT4#i#@hoewJ+o-D>QE=&$Z@r&KeGXitlV*_)trbTnt}#-3fuF9(b|9wS^0I2;I-JXhvskG8|-T`(P?gP%vT?f6tG`v&S+3Rzhc^3f#0MP!4bzs-2w)K@YRRDlzTl zSxp$M40HT`0!m@IQfkEJO{Bcbu;Vq!whoB4?)o55C8JYF9>Y58YCbo`qSY-RzM(sr@9sF2HFS%+OI9M!wctvkN48qvz9^xNBmWVdh1KX=&-i z2n*9tW+!I5>n^G1D($>sf>^h+FA@)4zu~dahn(bVu@kt{d6F;^^{9_H-iEt_(+~Cp z3(c0h#M2K8Vm@HCKn)+TU#U}0&=h3!MDHra zePwo_J$$8Rt4)%78t=T`48{&d%e?qRx~k`)sGJnYRxAc5WHuSXyfFw`$@z@eM2`bA z)WTTHDC8Z)8-+TBGI%!W%hqBY9N-s|%Ayj5LSKGI$9(-$i430g_Hqjd05I^g=)?6t z#0@9)T3mo&^d7^gGX{OPm{_s}OCNtx`MSTTY=3o{#}i zZg^;>9A!hY=r_W(gU`6Q5H#>5=+YE(9x$lm;w9+k+2d?s8wlG4;ftZ;ae~zRN_>cs6BNI5B4VZUWuiX1PNIe^P4 zT5~nik*>K8{Ma4NiX*dGdKV4ap7mNM>mEXBBNR!1ZCf8H_6P6zrgnUxQ5EuPq3E>* zAWSl-nkEb&Ju0lq7TIOQW1pyNJG%CzX^?sSea76;s70CP2xYLClxY%6Ma&!!#wx&$ z$3|6U?#4})xoHt%_ZUg=Og8h^8t$Su-;M4S!M3KO&c!y2j6#AT7Cto2-h|JVqg*ck z%fH+|Hd0`Pd)2>wR>j!R004;pr$`cWv~#ilw>C?)+Pj;w8p@X~W1<8p8{mKwB(wjW zI4MLu^9m+;?G0oIJail>O>yeDiK9bW<_vJcN=0$CoefHJK=nRTL7u(@zJ7jy>af~- zVsF{x@|XN&!{j&r$5T6-TTY$+d~&kW4A04h&r|EO+Y_(T}vz&12Hu=#*JNb12b zW;u`>V|ZS(;{!l$6yd(tmmuccq+_K8ZklNWi=6o5HA(JJIkkPJ7i;+3!4r{DG|F2M zZ;1>#wSA8+`S9A^$^~qQT`Pg08yAZng6YTwZ>69Zu=2|^<{ipWDS@siyU4%SAokp0 zBIvZEZpGg@%sXi1c;fd$YxhL)n8~wv;P!-mx#neIq!$nJsSbTh@{8>|?B-2FQSME} zWXW~=^C*~Tz?lRs8$-*#9?h& zLdt3jMk7X|l{x!?ThXr6(@lg*WuQ2Tp8QjQiN;5bXx_n}MA_a|X*YY^?tCR8=K-I7DnAA?g^E*5sJ zTEV3OO^2sz9{jsa4MXeMN(9XoQ*=ZJ671X-QZbv#nrU}}F%sD%Zo=JN2ci~CObKTT zF;)NU$O1HMQW2=n^LM<2V#~<17KRCgK@?2u(w82ellBvy2@gb-G7jKGtyF2NMM2AS z7%Ak0UFP#Q%O_s(j+@RZ5iJCyP8z_E}K0 zuFznRws}O%Bv7Aid43@jlDuwC#!3)ao6O>K);)&&^{|`>6akV%f@vbfg2^kOrxBnFYN@|CLCz=_P>@Gh_sZghx!J=Mi zluhjo@C;@zIXZiD4LAtYsXXC`J&$z=e?+%a=Nzo6-M_D!eAWpgR)g8LhMF4=jgc$Vp9nx7cQ28(Mo;D zRbxR_6tHFSOgZW#&`Wj9&fasuCFVgKUapG;6)V0&8j(O*V}gsLu&9Psb`0NcEaz8H zHs@E=qak!=?`}p+(rU^8R@XgSE#g#PdSL72)-1^i1q%rw&juIIO!))Itc`YCUn~&0&{Y`FKa5D7B64#we$JZ!y95%wkABb1~l7aih^w z#6Wt;Ksolk%05M*poy=Hk1ix)oyi1t`|fZaL!gGOX5z-GJonZz@(kihUi<}PXm*hl z`0M^(qSgR+QMpuM<+wn>gk7hDa`BCN-6M5^!VnS>ZIy?pH4o|dRWd|FD;Z(~ObVt{ z=q(XNN#BP17Plb??GfiNFL&PVA2o?sQkhG%5Ez(r2VS6zNS-{%lFdw_+L5G7X$H>p zu5~W+kxpyX!)%GS(xiv({>3UhsFw!Yz3X6nN#c8ZWkL&?$7*T19Mwwv@jdwJXK%%#TT4OpVP_x8j4%kbcLq62R6xLKnc$Hm$WSPNW z_Vw%|z+cZeIIMx;QhJp8A(>S5r9Yw~WNT+g{XC+^5#L-njOsJyS0~gT7QQo=d~?zN z_MZun{b6DGJHU!^U3^+XC0U={*wOl=P{W~czPAZ`;cT>0kOlYxVKQMcyJKSM*v+}5 zu35V;F>YV!br7g8cihTLcapwYcAjA~8z*wpKks02d zo^4K_Gz?N&asD*gos51mlB#&Pc}mx!p44v!#4wFt-Uod;Q$O zwqR1DPtbYi_<&fu6I)`bTl9$E1UqerFirtZ}K}PPERv%BuzCmxK_(ywc)`3+d zZ>&7+Ag|fTVHD{#BHFVT?bQ~D#%qsIZl*tPB0buD-f&PeJKP)oo_g7U@6{W+4zdsv z?A#{%E6bt4^;2G}iNMaK;4_k^vOq1RpKda!PaV1Qr%x#F^-5l;#ft!@dst@(gip|1 zZeF__;+s+{;8q9d>HC>B_#3?mF-|LI`+U+mf17m9eY()7gIg`NGOHv=G3||z9kO&4 zT)HBCq^4i#c-0^^;4HlwuM}0zq~vq8uCKMreIaSB44X-nYo#*&raEWLdenYihHuWi z2Z5AEpAsrQSCQ)w$5VZ4@;ZUqCF)Fa105XO%zbnrt=_d%(r=BkYNsa;&q1iJ%}D+&Ull8D6$Z{RAW!Za_0$g!GX z7O9c?q!?|^7*7(0Yw`lx`*m;F#}75Z9_VLB%JjG?qFla1xA9hWQQFsuW4vJ81aa1= z0zsI8!av`X66q-{4PiM1VLFH6NdN^PD39pvuu5w=#4k!|0gF=tX6kc#dtOFab+e7G zGV*soYi{wd9w=h=5OjCX^A2C!oc*~(X15)V=cb$|ze*~@QsakZBI?Vj6SP#h;SLD+Vg9rC|YN%|* zu}F$kWX17}#4|Bc^fPN;EyvtEwi#Y#HZ|UUnUu!HlD2u zH+3m3A6!%V#rR?~7Ox?@9K!v0c3T>)jRC3C}ghZ2Rm*_;>dUq@UAm zEq;oT9%#y53jWMcb;IWI=%s*ry&mpWTqBpst1bM=UJXDG+K}Mp<>+%@*#Pfednw}c zKCi|VT*57QvO55r>VD`;JTMs#Vy`C@s$e{v=H^2Ux4rUcAn zWV+iU9E+HusCBhKyh7utZD~BS=QJ~@^d%ExYG(JX^on$5easgD%sMPg&x$)^j!tpE zj#{ruU?~j>(G^9!`@#ig(aZyCA(?=r3^57|qE@uCc8*N}*#_FIxw2OqenFCSXtWh8u0eURHZl4opL z_boyWGL${H;DHOeIGqULbZ>^I(B!ctsgWt&5vReH7}iU&v{E8BwJvGnUCNmeML~wT>44?CpqaYdAa&jcci&mmVQ( zBx)>La%mRS4ONL=PCS_ZN*34PLYEs_VsRTW_Ggoh(=jpX>5`XfH`Rlbr_B*)9NlnI zs8|4AJfB#{GLI&`0K>hIg(>;5$ZcbaV7B_R|X9agV40;Qe11rl|R+7}_6FjI@v z<}5iN>8d&)tXil?tmY(CuLk7Q?frX%sf%Wk>5z_Rcgh~a z_USG)y1|}*fYViZAlX%V;O4F}dVSjii}ZUAA@wL$P-={pLP|0P&^q;~8?pI;GgPO( z^5bO@-K^)_#oG_ge@bm@htKz`!rIY$Q?ue*FxiBWSUTu`GKDF>X650f& zIWZ#>^w|3Enh0zQtVlxUR;oxA$8ZXU3`wIXclw(76@?}J%5w5!)|;)VmV!!jc1i;2 zsZy1}b07Y&w!G*RG3fi$IaoBv;zsMn&n3s^R86M6yebN_j>TyGY6gfDm$KSdL_^Zg zDv#qyRZbg^C%ZP}!*O&`h9YGto?c1ERDPAGO#!N$A`dcZxzW)S=lr%-?9O z>da#=#@llll4hN1>zU=dm3VQJskCV&l{v#-qOZ1#ECprVJ=Va`Ly2qE10uCLR#ysF znX3Brk1KmjU|>_kKNd{oAza&(au==|3w9jSiu(E1>g>aEhG%hJNX4<7?e_K zgb}R)%lD};thIO=Evv|LcvdhZ6T>h`u3@ZtoGyPDtK#uh*0cv&?68ryeO#N_dyW|+ zWLH)`CBWy$F)H8u392kMfSfg$q#*6$UxQ8*TX}BH9W!BnKwd%th9aZj%jyu&Nm-HG zkDoORPhIdP3ZyQuQ&r@)Zl3ICm1n|451Lx2)vrBz?|O6=C!^(WX}t%7R#WF=b8B~$ zKHR)Ko@2A*P13S~>zUy0{h_l!ACOT~qL5XRKa6x2W!Mn{{A=7c1Wa>bAI4*_^n~8& zcQ) z%5suVFb;BLLt+vn`f0sFZ;^Ys$<$szPoqLU8WHjnQwH{Fj{R8TAT^crAlWw#?yxn? zET^ivMl%lJel_6&r=gC3wBh(GcO?;O{ZQaplO(kR6&8&Y(A02Qgb+%j&Q0uSKW8L| z8J9%mZd>n2%OS)B@|M(A^^tX2rrF@8)^J!{eXq;UPe0y%(?)p1m5f<9U^q?~|9kE- zmpdHPGN;y98kMhSS?E?T=`}CL?HhDIcMdx|fc?Fnb|M}0swpWeFU7||8t$=6HPSUX zp5}HLbp}6#z-7ZZ7(8} z$k5A<$tHiN`*tn5v`^~ko*USssuH4nhs=eUlVJXEA~L9h2vfdunA-0x>M_--^zLif z9*BNT9MjojI8{y;=%MQ|^(_D1z2u0;uq}rT=RKSTZlBH5McWeE-b-+S+y8Ov=ATE1 zmnQ&s6m8bKnDOaqHG^0A0a-un`;}jxH#O(3{4O!dp^C zq={MOEek|OiH!_F?pwNM>R^J6Omsldgp)aGwXQkKNt1hsT+e3GVEX|bE*HAhF2mcY zgXaqbYYEv}Tuwn~PDyKS{+}F^%HKIXoMWQ)X)?RNYzGxKWyYUxk>1Ef*?q-sF?EL^ zun(U1r9P;=F>-J2)ePMuG4qqw#o|53R`Hb;lP7hRRO zC#>VJc#nsRBS=Z^%NNP{959bYtwV&OzPAq7235~Vd#G+{?mU!9squ#w9&NT8ZLged zeZ`vRu~u)Y?!Lli6BcnWoeT?c62xUp%!CXymr#m_7f|im6o3#?BJ2tlxkBZ9(P?iy zfX`tb($H#^-m%gm4ygaIon^M3rnYL7kc~aVVtsbX;!u;Mu3nIwP;W>zrroEcj(~wJ z$-|$&?oFu~)Nd!Nfv=p#sU=}$&jv!NR09)m-NyF0K%Y3ceIY2fL2b8GE+Swk`@;@BP}@=u~oRE&0^oEt>~FX#5uQVcN#9d?mNR>u~Zq z-gdg;VYO->eD4E>l&*PSP?4E_MwC&^6m%i5J*khIC5HJ^_fW>DRfdf8f zmO;hew-1+2jgx+@&MSn3a>&uAn2WyTZ!dkpmJtB3M!|=Ef3r{mGGmt}Z`;s}XczO6 z^h`{HFrJ2C5kGItl8=dbMEJ4iE~4n)hsT=p+g zYMP8b%NsQ1Qe^5+IC4QXzwaW%N(=J)8SA5QkT{`{65XfjI3D6Et{B`pVn(TWT}UpG z00%$nN~Edv<7rRRgv`{j8JIlEsS`7s2Q9ysPP0Vs7>SRH4u!etvU4YQyxZ#qYb^tG zaimI%A&`g9*dUM?HVaPURD+Qta{C~$^x)si5^NXQL{hQG_0kI1rNSHNqb>MFn9@k7 zrRpi}kr~CtxQ8JGujV9CAA_DC;-N)v!T0sz^?&+%#YSVIHAS zPH&(LJLe31r7FkgpartNqJIP2?E$*wDwH}WQzgzi3n0%6+){kSNPQ+=Pl@ zzW*FE|D%9vHN)Fd{RzjjpKv7oe}^Oef5fBKKjQJLq?%ew)gliWBtD|7Si8kt3R*l$ zMk1pMGoXK{^~}|;dLzA~ljX?lHBS^TYW9o#Vag9bbzpEN>+?A4nkzMZ2b|9rNWC8k z3l-OxAuJ*Im7qwWr7n)detsY!*d)Z?m@e#u@@LLcyKd{n_l4e3Z93>yDJi)}=AZEB zN~TTnr6o&L57@Rw5ru#b11=9AeobG!b2_A1)co8SCP=7%yu^{ny1C++0j0!nJTKD=v%hW zf7OFHo@1$5#_qg_%UKuiLLVdsE#*^s2+B3E^DLy0nv`st8{zz76cX;6&XG2REOc8j z&m^s*$l@%G|Hg+*X`)+gD2u)AM8w| zL0k4Yw2IkB$UbhsrGeFgP26J-O5NiYOEEWk5k?dI6cGQnpFsoEVHvO!I%rh#D7pb? z1J0#coP!|g*bKa5qO0X*ynHhJVBHPW+4UHG*P~tIRK_Rm@zl?u>1dclB5r#4@IRe* zTxO)Gh@22jUDudC~W!>q*I-X34@xxs2s^)^c* z+)UP*JcGTA;F4&>8ZC2;)du^({4Ci5jdR$+61<5YC$8z7(QRjL$nGBGfKUtKVS0|J zYlH`1;(`Z2p++BASFhOo)l{RIx>Kk}(mz5P>eVGV$wseTC9~05CIg z#R@#|MvPMNd+SQoTCsE#Wm0n+D?L%m$}eVj1ow=_`z1W=;17AEUl!M6(!n1FMKY;! zR$D8?6Ylr}>NA86H({kn94+>X0$3Zc*2>uIWn8CuGrM1Zf(*8X4*0R%XBp!~A-=uJ z&U8XXJa&fU-^uQbnTv%eHz{;(OYO1DBpH$d;+4zK((}zMkiGJe4N8#F%GucW4N@dc zJXKkC^Tpc{0pox40B<+5$zK&S5s_gssy+U$0I64(KnW4CiM0k&iqOq%=&YZIZJqgo zooDG^t?Hv%&>(?bSuH^aS|F#?0d4(8d(N;p7ep+@QI9gho!m#H&P^%4o=V+&e&^j*8xnGRy=Q$o+bPw#ZqTIqhDbC zWB1>)+TLAms_{=&BmDo%YK;F^R!b6@Fo9BrFH-SBP`$~}cPB_=rhvB*+COmR%7@y( z*o4}}W6;g@AqA9Ro_G75bUQVtPyZ|PA}gI~=XHk7Z06(b^Ag+-l>1T$vvt{C490Eo zRE#0|$NVu#fl;2po-SH<3L}k8AFFLPZq4aKaP;1X?yv^AI?i7Os`e~9nj|Er>@paXFyjlYkuZ4I_E19M^5PBhZ3;=ZX{t`S3rOozuV;Z& z$Wo+*eNcZI$(!ej*<;Q=gV!U(YQg10hU{jk<6N4;2U?%LGKon2HkoHN2|fBi4U&MGRdFlpDgySux)JB_=0 zaCi44Skt%@Jh(Ix+}$m>Ymnd$2@Z!@^Uqmp=4R${-#_)%TUFn#+R##voAUfwNuk-v zWNZq|TQS_zFlt6&$=&<>qw9X6$pkD&lsgq!`_`u#mO7dNx*3|c7)m-^ zUodnbfiVXBJ%RMylZR8%(OE>1St{umC~D}{*0{7{zkoa$W~*CTv4i(8jVj*iMbVy~ z*P+fFD-VUTswiF4Ogqk{IU?_4C}7EAofnevX*3puV^$-h*2oijvlKUmh0Nj9Ea* z^2^27_Xb3MJ{7HBqF2@@PizpQat&VcZwQ|#KX>b)Y9#oIf~)`uG>;znj7TkEw~)ygG(xOEscBbm|Qw=xbs64WmXpGs{k>3QaRo#QxAOss{g-))UM zX+Q4?8C=usewH^r&DLf%5OMc2(To&IC%A*g#Bn|ZnZE!P@iP@sYWii@2zzyIp%6a zu`T^1dK@DEaK~_sxe`5g~&fh$Rwr!8ls5Qh# z6d2%|6BOD5;5OCLRh3FcW9BUji8=2QTcmZVDmKmt^<6H6ElhRP*}Hh#5od1XQ^Wxw zI6yHJh;d@=m0G5etWgBY`!O{PF2(c(M=a-*G+eHR9?bU;m;rpR-&nS-^p6(NKjfMV zt9uu8XUn?U2ea+3Z8+j1wY!Frx2V#i=q66-Vv?wd&WZ10cKIVY4P{Urf^R%D0@Nxd z<@~D7c=E~{%KU(zZ<28qOFXX8|DD&@AUO*5k9<7#Kk>@_Pg#xA{-;?4Ze{q)Mt?1b z)%fTkRv~OLgc?TcB7b5kry=@w4wLTWdwP-H`~9kqf3FC=`^tifAef_@0Q(*IKHz5q zrjrl57?{fRe4X;OIap6f_zn?k7Ec{gC%}`FGUv}|BA*YBZ`nGCIpmk~+2Ao7wBv!2 z!l}$j6TD*p?4l6a_Q-wg=Yj4Rn@RR073at?>#KF7s(*T1>^?N@?lA+wF{f|)0(bOh zy_f^62fo;xR{o~dDnpRVfV5`R2K%HN)3b~q(GdpBzhAN5v2%obx)^Yru^Yx`RO+OM z`)=#kE6f{usYuyjsII+h0%_6UIP74@fB$wGxQDfmzci_IO-|14iC%~ip#@#$8o&dg6{t22shPTz^tcmOhx)i( z`V+-)q zkw%kkk91p^+TC=^)>6tyd(>)y@&Z(URPLiCHxzmv;}KM#*84~W5Q>Y)Wj7s2b!67U zPl8MO`%4Z1aKV%;I&rt_F~__HL|{|V1_$8uI?ps%6P2{{mDKY;eh8mCu_<1JRnU(8 z(^-9H=#7%8bTA8x+ADKkz^b!(P_Hif7F(KHNGYHj7nNTvcd_=jK z&|t5gzm+CjnW@kkTy{+7R>u_f(SIoou`@$hYn4w#v$mMZr0)`vu^&jik~a#Vumxgq z@{8HLQrKAFl`570rY#{<7iIb)M3_=ztxckI$~}0T&<4PXQS@IC&bAfI;8{o)IP;)8 zhxJHWiR7#mYucko$>m&)?ha@}y|86HiVi-CB)>qeJxF`q${qcVk-r@w*jFpKr6<@a zg%XtgEoXNwLk@Xb`dMu^^~CiK{pzFpr+DX)tS8O|=a}6~{ z2;mgd2fi(z;$Dc(GxN#p(k{=O<8C$#1~L=i@)7jr<0yN zuJ`HIG?uy^9slXApHC2N>Fes<{XAbT$pD-u9n}^N(XD10xayNa@i3qNg$j93YiygS zd;y==F*H*W#p6DK*h){~Ofdjm%}Ae|{ylY#yA90-D^i`Hol$qiia-#D^4q5OjoUVs zDEY?bxPfFLEVBUc{3%^4cr+}_Q87c$4SEj=heRtsdR8S-mxh~tCp~msU%eJ2jFg_3 z;-)7_c5f$6TIYgNH&aqAym(hMPV|#g`JA$;3;&&e`VRpRjU~an%2E-iF|ZfVd%L4~ z;9WEvQ#p~7y6_+LyeI@u=*INm3SwZl2#QlQSGmkg`Mp zq>R5tP{mSYV3}K_wFr#*A-(J8SucZAq>+O(R4$Q2IjnCNJ$oPPgS(SGtVy{GvC1#} zQrr9;QMnm}Rv@Fu+7wr_oq?0!=S93p&YAN9^_Nt1w+{6fK7iWn``Q!uSH&eqdG|={ zlX+xtwX^8}PU*mgp+0ETTTDBnFQOI$6%i$(%VOd6>i$0x(S1lPn#V_2!2C~P!TT?N zzpnXF8=90=7c)YxdEf#hD%0^0%JWf11-QIRxp5==c0yWsL?t+WRw$gzm|n97Nyw3t ze1C=Ye!(6IR&{Jk?U%0iU0MyS4jy~FzCY!MP|{z-l;eXWZ6NaK0#UIi38LO2)*}-s zqsE|!?i65Kjb<{f7CPt>_X#hHfK#14wfx9hq~-jE9DbS<&3KP^_M-yR&Uoues874B zm!wB{V<_*d)gK%iI#B9VGq{y1blyH?dJ$+y!uO>8y=$$f6=&0vXxM3GH8 zdR19Qf>IrwT)fG&X5#Zu7DYADMHm?MZ<0Ol+1;hRKE)qG8lk+0nloIdr~&M(9Pl!d z+UZ-&{EaZJ{dgEQ7SEV#12%WV<=YaCHWyg08g1%?zV&_tWofq^t7b@UyQ7IPS3NI` zoyaWN2){&pToPJtYNS5t{%I=YK@)ap+d<)N9|k+^BlF7-{)e9*0}~M$kze=-9M%!9 znOUZJ_i3`?lvoRK^F$1p4($kiP-eHqFT^~qSa0U(UKp3z9|1p~2;hKGG&~v}{M0zpE<~NaS!{(cp(6;3fvXqA7E)Nr2bEJKHkkF=jy7IU|5`M{u z1Uc0ay=!(AAi(nxyLMy479a-BhYYx%F_Ac-Pu@>Zr--18pp@_*KqA)hs)~rk^hkLj zpxm>v|IAvzTAxgr`yPLUKS&@(kr$Ku3%C%&(Dm6s@dQ71!L?ZP%hXZndb_>yE?-@X zPV%&ZHMr!as-*BxzVr~gQR`;P=8msIwM6YZZOMJ?cxPD0xQ&}y?&b(IO7ge-^49VH z?6uu3EtGx#fHw4hf|l=JTK?hoKeU{f%3kR!Q9cC-q|3TPJ%o;f980Zbd!kJ`^bcrR zFq9j36*6!1Uht7$ zoxljO@>-hY<=PCYXY~PU)C9sObSHM=HTX_CV{r=tw##++X57zztKuvhduNEx+syf< zIdpsgi(oRv$k+2|%WCB9L)Cqx9_?!XIq#v5QXp=}`vPg3PDk`#b%1&+=(A0VqzV3d zj(P3b(~EPL;ZC1i$1bKtYJ_EAw$HEecUJYZ-&|iM*)gqaFILS*5i`3xi_frl^LcKZ zNrhr8N4@Gvm*NR;KRR(aw9I@|7m7vtrU)`!VLRP}eRf{0PKlU2LxwR-uX6je3Zg zG)jdnD`JUhgj@|@^0T({Uj}($O%pj5sqYk3X%9#eb%+M!iKz)VW!2nm*ER@G+_MPQ zl#lTTy~>6f*DMsX042e4yEKoFz~u8{1*Z3l2+J^ILdzFB{Z@U!C{A$&qFZ-`lPCjrtGG?Z z&iny~hs{gOE;SUPUpwmPLp7@}4#&LvkURa7%-I4%T>U3jeLUh;ZaqsfB2`)XU)CO& z!aiY~<`k5j!M?~8>F(?hm+htuF(EHs>*da*ysH$kIa)%585F*l_xTorQmoH{UM5L& zD$mumg3EOJ6UCyNjouRkJfq+H-D`JMC&NIsH!-Qq1{?1FCQ@>6WE=#Cx#vSO-#34Z`i44OSX;+rY1b_&a7$YZRl=!mAXKD0?it*#?@R~nba$1P z;LakLbe}0G1|)b0v%1@d4)y+#*@s;`6xqT#g(J(#7@)>BIpUi|{J1J{Kv+7JqrJNR z>!RlLR#T!x0ZoR%Q-m)ma*V@IH;%5xJeBMW*7d9T0|^qya45gi*k8v5HEGz#x~0rVM1o#>fP}huRHz8&1=()~72fv_m8hk{YZXok}7Rv86OC zYSL%c)Bo)~OA@vFyKmbVte%ILd)`P<`#JyH9glws`x6HQgENNSC?BAm@io;tgGEna zd5lXc`N65Mi;j`In7&)OMO^ARREcP-Xkh7nhK-XqVwJVB@iUe6t5naQLkyqxh}=@L z5rl$>R70v_VwGZgmEv#}^vKO`XvONWmkOR)hfq!SwR% z+>oUAJ2|sS| zg=JxPFO{8TCZISlwn7qw$DX&-@Ml-f|WUJm%Y+ zqNe8b+voFd!XL0Jl^ON@4eh`cP3jU!XhB=HYhb=vrnaqs*# zo|H_(?$ANwZy)OaVMHW6g9iqJ>ne9L;}7*0IloGhzJ5rzd7Sz6xB_mjs0;Zz8@t~> zr2Bzu1ew&JiaXX+rzn0sqkwqhHyVes2{ohwF(U)I(q+s~%DI)ApGqe%B9pnI^~ksO zZAX@ws{CqsUa>3Y1PD?Z!hdK$A?Lr)L@xw_;ZgxoOds0q{}1iPz*2Wh@mc@SZbZvB zm`Qz+5DS)<5A7cH%vkyqAT6&-q413J!M7|29H7Hp8G}zD(Bw&G6o<0K?gti^N;-{e zZ7>Bhck#iy1aG(GV-zt`cmA}x+6=Q`8pu;!H!}x7B^WWg?}h9O9?LBxvyCbkOI@KV z?LaM!gVUO%U^*9mno4Qm$8n^K(|Ei$Oqt7yr@Gvev?8a%&i&b!Zp>cs9r9Z!&1Zxy`84mh zexKMt${CJnmvtw9ql?+9A?>d`%+^otw;7b09;Z3xsx2gMh3hr$muVUehzch)_A4Vm z+o*R)0?djJQmQe!^y*Q!55t|5)2Gig>kG&hQ`=cEfp`8*pAWxV>|nij#aR6Q)Jyuk zG5UEBm;GLO3v;d;Do#?+y{q1wk5E^x-3yN~yRT&Z#*ZBsab_>uyu;J@tqBj8(K4lo zL%Pa=mxTH#Kzr;$W@+BzA>=&EwJc5ByCZK5opm<(@wRIdvz@1}-g2$RRWR;Q#ID^N z7B=l-9U7N&P-k+Na^UX@8vEGBSSih(9#cbDN0^7XFOAa`N6VE$*tj;n;< zpyzRVz%)pX8HB1}nR>bQF$t`h7)9Mkes;FnUnSj;(JWQCR2tr8|93L83_tsIe2_Wu zK_<_Col#4>I=i`gyI4t^TiRJGS^NJJ)U?!(CZq<&$a`6b*M!f<7^@sq7cSfY-2?UgD?XMb747VxUFUN-ClNOG_g9Qz!FAjaBJ6B0 znW76Z zvD0&GE-|_&EaARm({Aj@a&TAzx9*O>3U5<@Nm*Qp2dUPrCYBckTC%B9KKFk*E_O%+eW+`#l@Q*~2E zJG%4bo|b|ksfcF95mzm+&8mxmFG2eyf$Cf`+6Okfj*Ezw77tm_8LjWvgaW*!^!39$hs z<((fLcEmjtE*N8DuhbFQp()EHjezdWWB!`&+qArMq;bb@i=&t(`qKN{M`6#0?^gr` zWg9ZnruposNH6nyjwjm*fLZu<`TC3btUwzqVY8@xKB%Y#zVJb8P>at@l3#eQ=41#OzaV5=Tr)4*(u5Mn^9pSoWY6@bI0YvQECjuHUB$y zsfeQWfZ94%vk#{lCEx~{CaBoE)jOzaZ=Oywo^Mypx`v2ve2_WU`vURF>5O>81|*V4|MACU zPrPS7;3E(aKVH3y{?}mm|9{&mxOiE6{9~7!tB16mx&8kwMaEuAD9z(@o009@a6L(ZZD(VrodPFfukWW{=EKq z6F<7xhEavvHUt~DPiWJ!S0pzcexLdx5U3bNcVGo4nOe(#C4Y6usByvn!@FEh8nV?N z{kJ*Yz&FmL)J(udH$QMnpNrRba|u=xbwVqmuqn%6(`$>#R#!1*XmS!*nH_JQxoQve zX`cXc3$eL1&a&HPmVWX&&M-A$R$68p;MuSbnXeNKs>B%2YD>-ZbRIAsA3lU#^VE%k zK>z5>em5~SSvap;v&c-h>tk~G?f;W+zsuF>TQ3aSPp8q`iAi2OkBKbv!u5#3xnNt#k~Q|Wq5f$&ya_;P3D($@vK2n!KamP(ClNz!YVd8ic z7fw)XFpM!VHa3s#?Mv^+5~z2?WYQudK`-p-yCkZ>KVmdWCj9Q$9(=X^d-g@d&U{tx zou9eHwj;vuAS?nZ_BV1Ijz8Bq*ULeo*!5Buk#lpsQ97@!?zUT(i-B27#@5eX-Q*`J zKhTfLPgmvt zYOuuhLN*@Zpf?ZM#!&Fk(9Q>{xB6dB@3R6UL=eJ`em!vF1W7%Km7H^bCN;kQMU&B; zu&zXLjLC@!ku8B_8BS?yZ-o%J5yl+!u62iB{~lC+dBxO{4we!nlwhR^E{7gtEyvxU zce~x%ZXxE_q8Mh+cvo8MrYigaJ^o~uL_nLDnotL{T^XQ$*emK4PoEAxnbQ%uwmE@w zTqt2WLd2XkjRSR47P=bj2(NY1lZ!9Z@nO}bqvXjTUjMv!cN{%-M&uTWBuux93|Lhp1cQN z^2)w+FY9a*FWkE>-qQhlWP)8QyL~e*O|}EUm%)qokm-+PLWpV6owbj0xK_=Kxkl=FhrG6h~IIG-CY*Zt^WRuCcg`iLZU3dRdf(zft^-*r&@B`aK&P$*@VQO*`gNNY9|s0u4I zKbsjcrL2=X1Y#uOC(ac-B8i?d_BtrwCeIz1sQ}nQ3Plz*VB}KI2x8^RXjk`d4;^V2 zHNfN&m9pu4)9@DjyinKxm74}Olv@ml3;Ok}twT&8sKQf(nM(&I8(Og8?Onk0#+_Pl z0N30X2q0>3g`i(KU9j^+n zCA^5B+X(5n3R1G#Y?R}R^U9TMXibeqTYr8q2AU2IKF#jomWV_AUx{8Aa<(qS9P6fn|-`Lau|hg z84BMk56vpX3r^H9slJqg#q}0VIXu1v)PVCMdk!scOf9y^D^Gq9Jazi|>KUHi&c8K!=_JVA-Z`W_dKP_RTO6A|A=mzsK;S_r^sT6YbgxF@P*JBVItkw` zPEGGe=?QOpKy?6V^O;(EKvw{?kTAicL>Fc-zqz|G=P}#e`O>23$tRO8gU!e(R`8Q; zZfDt>jE?INOUus4c`N8*rne2d;RTnJT<2YOv7>gdqapzPZL1Re#dhCudr!Lyz2|bo zXJdK+e&LImH@Zb7xkX;zN@ir{z7~1kFS%KNl%<|0f#LJw6Kv&R&EROTn${meu$a=~ zVfmAY&bz`Qe)&@&T++MLA+7RXuFxrFXb8T?sg@qL$qLaGpk6p<8t zLBX2gE7Q?!;j~Bb4R6GqsWqZUDP{5IT8k+Q(4>3;? znw%|6x=Hkuyq9bNw_%B8#)9(5?udZb%Mry|!Jc;j2MSZ}SHus@slsOzj+muwxr9KD zM>uJ!GPN5M#T2<8oKxU?|4=Ne^nyzfI#N!Xve1N~I(7oV*rMrrF_d_k=g#;)aFQGO z6a0zqOHfqAR}T;fz}F0bDUs7`N9X}Fn4pjrEfN)ff*O!>WH3=Y=2HBoWvFzFq^PH9 zC}%HPg39Dv+=%!!mJF6cA-gUdqT~a~=()wznu0q!#bpOCQj-MgU=%!mmffkgsqo_j3cG;a3NwOA$XxiL7gJ|v?ckLPX>?5R*?atXd1_z<2 zQHi+4oU?@bqRo?~;`B9Zmh^-8b`m)QKu4%p}o6uo_rx@BBd!1xY zzuF)ZP94%Fa7yNgLbm{UGmLf{!5!;3-__L z1l8OGXzx?0UcM)7%BMm-jR4+~W%U5obRW`^FNJpjy_j>_6&X_lx#7;G5AmFCz7xJ8ci{&1_PzReU8o=DroN@k^+;wfba0-V9BstOY!%G~ zdM7Bp*UUXLbbX(L*M34*B-dsv6n?5zB!_I=3DhV_;8NoZMq&0RvCNY&`;3)4c9d$l zqLnIEU7>W$9V@2v-SW==Ne$&QWG;Rk`8n^wzTWlTe9k{{8k*XVjDt zLWnE0Fkrjj&V=PeH0Si5QRYlad@v({;WcAU%`H5b;DJ$H@rm$BY{Z5ttH8AUPU*lv zqNo4Y56nW$*%{Yz*>XCKpU^v5D3V$IJU@WH?U*QZ;|hxk24-ewIWZ>sI)iI)^SKdn zrM%!Qo2kIKTGinW(&c=q4x>jOjZ`i<;t((W0UD53V-lDz+CP3aae3A)%JJjdUHR4# zqxI5xVm>c?Py^~U_q-IvQ)vb*bsX$zW>UGWF11bSsitiz?oNQbkt6+r~xn6`{M;r zlV!ON%VKvVWVN=i>T;+d@uHMAGIZCxGK%X+ve3+OlxnyGF^3EFVxs?Sd#yX?-O%iD zdXk`alggxLS9-6c+?$M&Mm0P~YqP;}vz<}J67ozjsag|uxewK%YT?>_g%8)FYQb8C zws4$7nbtW9I9H*GT>YE{{F>-st934?{mi*IRj{U3{#Oh98tWiFlKvvKJheC_eHa9O z#d3VcooAb2({6IkI&?p$^7{N!#MJ>L&NE29Hnc)NmA0YQq;v&Mh<&c<^_K7O#VYTM z{kMv>-x-b_a8tOy!mQy{1s7|I*L1)>ymZ}gqyVZl@1qw)-5MWJGlFwC3iUO#yUp?t zPwZhTu2~-q=N9n!Y-88j&&k`&X0>IP**B*h?qf^vE36i!)a+NCHq#E1<%=1YNZhi` zs9#TdiFA!U=54;_Z6Kq@z?nAulo!(0Pv>GU;h#k%n!c!?OM*oKO_A=M5d%zmEJ% zB=n=`76^XL9!ojq0aIelZb=$22`DYmawE9X`s(w&12`@3NEssEg zIL}~-lL*J1VLXk*;e}xxaa9luq6D$%V_FZTrkQn9riS?OM4=Wr30RNj)M}2)YVt+b z&!)x|II&poF-QZ$Ndc>VlU^Lw*bLJ9y>yy#>ig#0vzZZS)XsAu3WfIIALY$ zwDuq(BZ<|WRMz4%gbXzwnn^yRa9CZ=<_sOJW`H%XvY4FGkrSg4kaI#ucVhp011^)1 zLhy4&5L>?QwrZ+AnWh103j0@AT{Qz}>$p^24IdoqpIMDi`_y>qgl^2H4LVFls2+?5 z`bG6cv|O!1TZ^QZQ4y741*)DUtIU{1e0bd0i?e22_H?wGh7G({K4nzb`pzuYbTi~? z+P-kqoTIrs*hywyO_}miFW@y=tR!9e;(Q@8rP9#4g%h*Jkvr9Z`?_VlV9`z$DrzWR z)@oEZDnd zzKe7KM|zdYa8YLwY9Ctz?Npf-m1jd%qVPry222(j0hLq9RxP+@%7JRiZ%G-jM>>DH zD_}5$2s3uzXGDW1538jh#{>M*IHJX~K1mXc;_RFSI%9uwQ+n!#2`| zsr9S8JEIDEZDGRTg~yZG_I2eo>UHLf;x_;;T= z$va(ul)9i5Y0o=Oq$dj3#xMm`oJZ_heRBmIN5o4yVE7;kSgQTQ!KKE&{8LQDRtg9` zQC482)OvjpH{>{R39>fa?Pfp)v4I#U7OS**#${PiYDTpJTU5$R zslGhCwudG7R|1lr*G&wG#9=U(OK_J9gOUNyxcO7R;n(=4kEyUm{v1MG*&`pom%3? zOeCTV4!i8wOe2sazgvh%E$icSSw`#t6w%3vi;^u>H!XqyQeBWOhl=@0{u0BT2LcS) zBDPxQ&KgH5iG4yw>(|sNKdk&x8mbvH(dN;9|7TkH=Yg8ub^Re7Pm(MHJNs{^^9rFW zI#hY`BIvKXkB-Cz8=>;`LPQ}4EhIhQ5~2g79(Q>&JnFHvm3q5QRs!c$BoJk?(?!%! zzGPe-u9EIl4r&H-GACUp52Tx}y>tk#5^03IgFOwNLO)XfY6=Ji21k|`DRr_D%k3d# zhdFAv1)>xVWY^ax=YdvG)E;U?Z6a!dDr(}aE;LM2DMiUWW+a5L(nC}B!zg>th~jaE z4I9XoS`~JZ{qsTqBB(VFANuD}1A(jFCHO!HqB6rCn4&VH^>rvC({N*c%Z2V_QeO^? zZAco!jt1nTD{#!^9aFC*UgxJ8R&sJ`!FTNsV zn8j3oM4`Kr!-Zrp3T`>3n-yNUlfZ)CXN0;AC-uYt9p!v9XiUIlhtZ+n_1aE=-Zcc* zu8aidlFt$iD)cKOTW`c7>4^dj1yrJ^udAh#3RN;!C03N#4;jvMR1t49PIm{~j8ftP zBEQdO1^Ifa#WI5Sp1ReueXL@ad4ya7bO#I-SW^eVmjOu73#6|WS5{wa-z#ZXJhjV z7_I8UNDAnoMK>)Z6#y!Ke6n*ACxsK~+(J<81^Ei|>FsqPZ+kfz3)LRr0(enA!!RkN z46udJ&CX2I^%h9PI!&!m&MHXy z8A8Z}pF*Z&MwQH(!9zvNbDC)=TM^1ZjKdRvC;DZ5tdK4Q9)?YI z>iyucn_qsvF%LAxf9{BSrbr?$qH#CnVDC~|r`#&6D)P#~MtCP>98zQFZv+Shzvsh}$QR+~TKs@KIHDT5X&wPQ7!mJ8Ge=)W` zHts1d=XdJNk|atTQ6_p$`Xt@>e*K*1^o(;Qjh(M+1zv=xnMu4Ld-dAbA!yM8)!9j+ zjJPnao7TO#A}RAc>0BL+Uk9BWb{Woo-=+0etf$RzzpG2+V%|F}Vv-s*#G3Umjwc~m z!F&=SQM*cyju@>f{JIL&JDGVlB${NGaeGefUs=Uh6;&)mJjtqxJHUm{o=EQqi9ROx z#SDaDw<+Zrg<4B!(LkaonFHf#h=YYfxVu!FW~(c%>8KiFJOIPH?6GNykkwMag5T+Q z+kgpOa3RP*1ucx@V}sq$f8ium3TS09!kUts*eBCo;jqPnkdTw|C7P_Ru#qDL9)(nf zLf9W3n>1&cbJdpO5Ccs?yqwGk`vR3)AciuUY^!TQmeU?DWe_gTa6qBPph3A3T4Az> z=J!nQVeG_adO_@51FUOOG)=$>Li|riLH^(oPk0%oI+|pcA|tDF+|5r*;KElYGrCYb96vVzuKYq0<9++`{pd^EP;0_T)QI^dN%VIQ6A#A93065&@#qFQFKAgQd>y^^-TmhLZBzdlq(HE9Es~i zStRwdZkXhHfJGZLL?#**fWAe982{Id^)HG_Eo2WU^kTWN&>c4=66*{4a$u!cL~d^yf#OVXmds0ocjUvS21~=f}WC)DP(H#2T8Hbdsu2 z=tB0yYB>(jaUG9beleVKh~L^$Czs z3im`5dMSz1>1GX2fK@ULxS)VAuwjC0O;#*?<6Ry&#hMS$nlV~%W%==b$jV@h=VU@e zl2!6-!m*hWXgiv=qu&>zADap+NS}9?AV||)5#SoXQzQ+G1dG2IeT$@>dc%7r>b(Po zE}`k_a2YW*0o1jrJyB)h{7Qc;dbfTmO_&p(hKSSd9WDIY4~ zR$^q^sak6^P1@M0tqGL5oGWX2F$0y43` z1z6!c?j8z^rrXOLTvMiwRa%%A^p5xJqK_#r940UO3mLHs@^>CEv{FunMMv9q5Suuwe)?)vL7LrKaP(LjM40PSMZ`_ zHAiK`FvBEg63zbI{nSG(tryPHz$LFaC($jhAt45-rFXX%RnTMIwlj$Jju0 zF~p6_BJH!&DJ+8D5t8orLPA(4?l|UTg<7H`iwO^%^*SC1hbq;Tw_~G|WQFzzDscy7 z8(Eoad{gcZFz!ciJVkVdaYq>x+2{0YLp?}elZE`Ik0swp+Il{1?U->}at&y(KX(~e zYYrMs;oalIWQ$F*KD|MH*QdB>&}nl*j{YT_y|(vc@6!w<2-1PqlI*r*T3->Ik` zTX=V8`hIk*nn?&2q0WE;%;nZkDmG$d^=BGm+X*6r7r=nVFp^g>SKoaII7Yh( zHmRG>sOZ#7fA#LE~B`(LLft*2N zFob6B`}!T3C4;{O(=DjEbkjnV$cG@2MSVLI+3RhJIc=J00$>x{CPRsKD~P@Vn;Eui zOr3zCqVkXqP%^3l>GeN#Zo{i2(*@}SDgk$o2_Yr6~` zvp1=aTA${ogCxz=M)opg_s1nY& z$Ir+$YvSaG_Aq%W^@OY*9TMOEARj^HP@?*}KNRLX>3p+9TXLSX9%Jw91C19F!((Ay zVOeO7W*J6WIlKs-byA*An9eb>HE5WS)RX%9`W<(C*O1Q9^wgm^2^(2mPW~w)O=^cE>=x5pA`gn85+U+(FF{gTRf`3#iu`1F zrjdkuPK`>)l+C+>rmRVVZE?-MwI1skTkFY!r;!~kI+Sd+CHzl(QwQkDT(*wtiUvV84j5Y{H;?Wiz~ao2h@{cGW+tO+)E0`<5}~q4{;E zHpfJA0t$1alJ1B3NPfJN0T%yDe-N4;NaF{pTphOj%AV289a{HLz>Ym}(znTmRoCo` z#|OGEa$DML(B2z0=q^LEYJ7+$IA6tm=%oLStpHBfaWMO)*J*Jk97dNM$2P#IzC6y% zs*+SBYbhh6p2n-~-p^_plZzHXg=>3|4@aREa$dzDT$Zk~ca4& z3HbuTgc=rd;bokPih*LzB1+GS(C&MlyEpp2@yeG1YzlzZqcoTE@}N@nV=cAgDq~fd zHGAY4>JDr=7C1ZRnUZD*Wq`M>np2UPFFf*=jUXt?jy+P6`r#8`YhmDH4fu*7?c7RZ zEe5btjErx7SJu1~k^OIP{gF=OMoWDjws^Nj0vFEu;|j z6DtEOQNv+763w_SQNR8+VE85>G|jv3SJEW=A@ny1&z|wUH;s~S?z>f<*mSf?rcZOe zur&Gg1<|E8FOmPQ?W2pt-d~ilhL|zFPP8;&O=^QSKk>L>#X#aRE7a;A#*2U|(At3t zrD{G#eNk{#@}F3`R(Z$dtHbZ`cX4B=ZB+VuoNU1&8T5;=6z4D_+Rx0*(Xz$5C=^AZ zMWVlu_4Q2l_o-SBG2oGFjQHB_B=*%PT6I)xa{Ld}ZY(AlBbJc_wdc664BMHnEZtph zFyw_ZNTojKH9si#uIywyjVbIz5L!9semcV#O`1`WY==5&_6xmoL&X`JBi*dv zDUYR1-#W@ij29ba1fvLGFOXg|TqGejP=^A(YBBeD>BHBkYp`l>WpDg_lJP;)W3+r) z;<(~NSIy8Mfak{8aPnC6Un)%{WzjC}1B}EfH{j9dxt2{<8g2g-wE$#0T0FQ0dG{f2ar4c3>lFx;ciCM$?@o z#jA4LPi&x!W>}gE@e~d67!a}cJEO5bTP0}@CmAPs3ec0n?&Wy_5X?!Gu+cj4JfQQ3 zeN>Na$b^Vzl< zh^feSt=MVH+3!g(l;#*y*zf|5yElY&e`jH2&WPQNy!!gvS`(>^Qukv^Rt5>IB5AAR zbixM~4a~7Us*rCDEl}0|(mLbO2=9r`azvwcO1Nq}*-~-{c-Xodq_0GUQTm!|Td%gH ziq(PY)D_fPAmq)c48z&bA2E<`2t8i=^jFqaaFrb-bf$(I_AGW7GCLW}+%0CGT$ zzaEtA>`5V+uwi|ewXd4Y-nA>WBk~*x9b(71Mh-c~o>(44J;Hq;Dzlsti~FlLL3XSc zM;U>BaYg?+RLr2t0)J5tf%f)2ZI-u)EBS0~w9wETJ}@>9Gv(t?$EW2^OEk0PH>b#b!qjWEtWLLe4a5a;*f{Zst9PH7Qr+*vCOERKPX&bz00hFU(mo7^QZ5$1rz$ z3)Nn!^j=|6S|jEh`z=c5h5>TfigXcTEES?JX?e7cbfA};%W>?T#zL;6tAg#q^F(MQ zX-od$g-N2^jZj2^sK=0~b0{-%=e56c^y8BK6*@BqAopJ;_Dkx-TNpT(G-1Y! z8GIXP|7Y*=qptLQ9-ggG3Ozg&wGMBL$ulGFonaQ>DvG5M)XR#t&o4f!GYVMG2( zzR^%t$Tz}r>0@KZP%cm|G}t<}9{N>jD3j&e@#`3a9ji1M@=fwiSWwwKgMGp->u{gJ zzQ~S9OVMvI+cYDW-_37qp)ce*tCj3_Bk_y zb+AsAMGUrqZ8TVv0Zl2%BZ3JvYC5~Mjo_lk28*${;NslL2B(vW-5r&68*CH9^Pw(V zhCGMZ0J_`>@|;*Rlr|+~$WO^n+s#Rzv&yJh%!t8~3iL6>dSI#Zq4hhs+Aj`*399br zB^Ye8@|eoD;LvP^A@$a&tk+=2D@UV6#Qwk$=X{$XKQI5&U?;E>4R#XyK5Dl5%A>NA z4R#95oBWFWs=-cWry1;Yc7`FpCckdTZvl+SZzGHqrTe%%nCt{TNo8jm><5_h9eJN2 zzb9X9$RA+(59N;x`3ubcB|2YY>^I;j1RY877>W!Lih_<89UnR>K&L{{r(scd$#)wH zLq~^C#lVOH^bNvvgV9%nE1(!7N-%5)`i5e}Fm#5aGXkA4%1A>QtBeLJn-{a?yB@$$ z#wmV7nSf;;g7uUuQw(J)eojMYy8MZu%)k!K!YXFVj~mJyjF^Yce9Uo}{5l~0>h77d z4xMEvi!o>kM%JLOPQG1bXBq5=-hC1whH@kZF2Zh9;cyo?95|}P0e{%L#MY7$eOLx; zTpZYG=VZB|9Ih-hlp~adfd7}(x2WuFgZ+s8SY_uJ>?iD}2K$-P1Vo2Jpy9jHca_S1 z4uR|!Dm&L;=P8dE?0oi1L%Ep!N@W)q>_X*egKYyyXBT+^et*q=1LP};L=z2(4E9@Z z%<#VBh2?&+a8&%AKPnf3ROQ~5aV@kjm9H`oLpq9W#|1GS)=w;+@>{AIe=6=5D@@3ieppm68WoHI zwyO_rH2uk*gy~Op1|eyu3EoK3AI!`mktqpr=LqJ8RQ@hN>XDc^9a$)UZ@kAJ#4-}S zm_#B+LY=Pafu1YJoA{AzZA3NI) ze9acFcA8uP*&C~($v9M%-8;KOoxvo})@GV9e-aHO%&>n;B-P0iO`C@5scA7mwndjz zJiWpPZS1O8o|f4MG%Em{X3P)Fn28ww3WHtAt}@uw>>7K@GEc)9$};&`gI&w6lgPw@ zoyjxUpV;*Vy8)0A+re%$*i8t+VWTjt6vEg(SdH?1fUvwTAichp-C|=ITktjHdl6MXfX+X_@%`NQ z3xoX`mzWFtwVK0L{icy2o zr~qXYgFS{g=5a()Pp~Hq_7t?8JmeeGwb^ zFXb`30ivo7==n>Y!>%iaOZcXSmbdk?EJs+((| zJbw$`w+Ni+l17N;gHpgpYE4yhLv6#dfT6sJ!1EG&A38m2KJdYYccOQa;X59JeLp~C zoxTjL6~?kv9K|u%2g)PvBU>Ua%|t41Vcv>{xIgafm-wx{Uw^P2a`@A!{rs>(SRj}g zGiDp|=kk9H_94Q^M~DLoGU~}`lR$k2`xq#f_ZsiD2KxkP4g1s!e9LDzJfAZt?hE!M zE>a*d6IaDH#^PII>D^zyZFPn?+QOtT_J>TG>hDRK{z;*1(~gCc{PsC$K%t`$Pr~=+ zNZ5paC2&{M-({a0_0E_XKmkJzwgKdR&HgKq2?IIbB@tkaO@Ekg*ZV`k7)R_-EJx*e z+72xqJxNdmAY2K%BS2Vsk^M7Ns^&TlD7Zuc&{JDmBWV?(`yQcmxFP>l-j}g#E&C&beFJc= z6I=rdK$~x_Z=T^LULQIVng{e_cx&hqKpG_04BdkTj0O;t-;f_xby*_i1Gn2Xlrwb2 z(7n13u%@o!CpC1{v)qV!e>;9N0lanH&<$LA+4Rt*{~NtOLr@q4y`bN! zW~urhLob9L>w}SOOa#ts5-?@}4}M|&;NQ{-3`o$ihT!l3oP%Cu=*5_?1RU?#-t#0< zhdQhtJcS|91jx@D{q4a>6#1Jl*T`FimH`Xo(s23{CQLEks{**?OWMXE^9+3mHf#=_ zHt~n!rr?UK#l{zq-~;n7BhMr#$nRR5dD9u*@i^2-^DFpRRp3}vaAS4_O~bEUDgV(@YmY; zICjp;jw`s$^z+*Y!~V^YAn$%IPD`V-3X2570@G>(jq~RpdRXgBi7;zzFOGB|$!b|T zZRT8%ScC`Z3=f+<3v#1pzC_9fdY%f1C1jaz=p%r@>7~E|>LYRf6g*C4D6b*4QJtez z3`m(DuXhRnf*G9tz~vr;hWdm@)khinXnhReetoQ=kJJ5z_aQD8K}pzjmH(pR0Yhfb zGW3IhWzxrc&jeJGNn@OY^a@_w3&4T3=1t;X=(mz^Xy7tbMPG&Cbs^9nv3wA@)r@!VO7OeS*O{^g|4NqCQF0 z%M5+8Uasm>@OLUKjXN$w6gADzEA;8AKEu#w>a&2&)Mpz?El9ok9Q{zBbuXQEr9`G4 z$gwfNS!wwLsjl6pN}SrZxS$Bs}pDF^Kd@rBfdEd zol0QP^ac9iAWQatc+AijasdRG7`tMJ_?gJ2@+q2R=tt;B8u}u{XGw39;cWy*uL3Sm zUkr{n1VXd#VBZ8oul54N{l0v);oXk3!V8R+_bO-N^E z`VvF0@h!>FV&yxE1sEiapew{EI``?g&W@@2QecMlWfqd0nJb$0dG~=!^~E)BhQ1sJ zv=*3geFb7c+SJ_G(g*?qOnxeaMo7yW11*Mk1M=QVQzNpu%Iw)Q<{IoGeWl^;^74BP zBY4C)TLj{FA2mT#hECql>u@&fadj$9RV~Z$c$A&8DVXXs^ai~V5AfwRXg2gF%zhM3 zOtapi>Z=TWHP>V6YYhEp_P(L7<@4Ro=_g2GL5!P)uWZ%rpn_ zfKtx*{%y;U9XJLNNxMl1^;=cLroZky-G4EMW1EZ>2r+`{n!xV{U? zdmzftk43be&4OfHs@X61F&pRXdxo+=IoR-?>^&7fTMhj}t5*e@8=C{I zjd(R+bz?nBP{6vzW5BMaQD4jK+zPz6d#xLK6p=@@4{$>lwl1c}QE?25f?1GWG3!u6@76aN>{uPmqNkU0NcBg; zKmczBB*fO~c-R=_uF%FxpgD@ad^*sE6bi9tc&{|PPl2OUqgHp1yce%58R&rv1l1nH zdlQQPAHzD=hwGaqGAUQ$N;5WyMceVX5U!lzeXuydO*@u%oRzbMNk@EitwzIpr}uA$ zzQr3;^{v>VUWAiV4E=Z^JnG(koE>EwnYOY05JK(RYU0LIwlvfOy#L;vQ^wW{!T)eE4jE{n#@_Xj;V7;b42~)2dn~>L=nB$Qv1bzKjfJ=>6{x;_ zlEH5u+ZLVacC6L?w!RZEKc~xv{zI((Y((Yb0VC)?!p|S${GNlppI}4N^wFAV)$ z-|0Z7xD|UVo{((C^RQ-XOx!!+LBNuLI!m(*WhpE|?;dhR1D{Mq9w|no9$OIQaEe?jc5mjw0%hp@f zFEjMZ_3d~?I!Jalf6n>#ENqmPunqkR9WeK;-rEfQDqt=3tFg7$a3q#AQH`C6#L#H1 z6)B>@o?)j+1kv*iny$oxE6(km`Eo6F>UR&G{XNXyCRNQ-%zXsP&e@+2*5 zGCyWU5U5gez3dOIe`)>!^GK38q;Qnu+6nrFY#Dz(0zg0@MJj;`0g@LevNi)*8A~^uKSr#6j!NTw)TY>-+t}$?b8{T{M zU8=s@(Dxv<+3Ve5?*}=2kKr?s{NHTo`}A7?%VqDz@v|XK;sPnW;RGSt(ElvM(*6r> zm7k&CYUsCN>9?bEhxhVKnHHI8G=xqE*(Wm${Z9R_hHtWOis2jU8wc=wVCN#xj^bsB zEchSJI$-mG-Mq^;gYQv`WPazylML0P*yae#tVZQpwthLM3d1+Y>qAE}^t+Kce;5@Q z_pnIwL*LA z8grhwY_eb>xdI-Qf5@4(CrpzoU(tRk>F8x3wu zR^*EM`3<#H{Q*P&2U<#8pg*YU4;lKy`Xdtgy{lJIYySQ5cK_l2ibMUDVVdYt7w{sS zDd~w#gB)mGpNQZ9@W*6;58^KqOp9_kBaN7oyy@0>L_nlTrXn3M7nzcNJSsRTEI+gF z6^3^>vLuh9^B6LFj~n_N{CGkE7VSy&J%wcXY3Q4;31@Gw0*mGuRCqqCKWF&reDxAJ zsJz_oI+ftJP6PPGOC$dBau6d+S)F*?#GkO<9}x(qk`qOIGH4_VSkEuyNivRA!Tciv z=Rub2iv7buMU~q+{ds^;CUhV;$}WJmC0#7ZokWl-WHyt2>mKXuB(74d!#g}lxhshs zo=%%?UJ?@zWlRG>0cXKEjDe!H!8G8Wk~RzKgJG!jYakdit<6krL6Znre0+|9OM?ih z90w8#<12PW95~X90zC{8mH0VLO8S9i#^Rw!EYk|*6==?fq5o6gZYYKF)rS58pfcZ4 zILZ59l9iVb&-B9?9SWG=wU=Tau*kog;tL@>y@(uM!vOYB?7{}Li_%X!=ito<#G{y^30nx@9uh8Dl7zhvkyBRlvCs`+Goutayx7@&wdcv5;>#@vb)Bi>Qo z(T4u2{+i(nBi0M!7F<8=n1}6n-O%4aew^ctthFjrs!=y5;iP;#vVGtYuxmB3>seVcLD#F-xqe#g+?{m2ZIOAi4ZiU#@SQ!k!q7j$ zX)3|DP^w#6dCOZ{1fRxU*FQ$?4SHrXn+u^GL-M2rkoW|la!Q6mvXk3Tr}dHI$W*{O z#e&Sq8M)gEeH@KY^-m4`GelyaBhzwFR<2du-1aPLIvEZ9KbZOp{Yyjt3LN=Sv><&< ze%z3sK<7zt^sn{*8u~W|>32aMmWKn&+ESlk7?SV0+*KxYMfQ0V!|)h#rflC3w<8;4 z8Hy#KUL35Bs%sU(d@DEbStt?JdRGugub~)**YFwg4f6G>p&AA?fXa-pE%S3xPk;TG zsT#~Mbi**@KgrkkpMDl#2%`Y-yW3PV{Ss~NfZ%;Fcwc2*yrTmJ&q7>6)9i(a>u_*J z2oD;>gIocH=`}b_tU)7lZH>*+-l1-Ej{7Y4kbJjp*tWF!P4Q6z_{uirc0JRWYcrp& zC|x#=muT01Ud$1&?QS@X7aGc=EpON!Ghfhp<7C=^Zuv{!>NGmv^+f4tnu^;uXW*SF zEuE2MRnmG?XG)$6fb5e28QtC5YhC5!996~ZR-l*GnNq{Ps7SoF;;PZpQGvAclsictcNa zOV{THO0>0+p z6&R?BZEVM*xfv6dz6ZTX(7p!ud~Yo4rz?5dcObx<*@;1!M`-c+2d;BcW9HTrzeENP zg4e=~nwxrp_=f1vJTp3ZU7o`w&ST2LXmJdl?y?S>TX9MEy}a&&FI*#)evZTaP-}7S zrDg(gq`&raFgg1&G*@Y^Tc48d(uSAi%ZdlSG;y05$F%vV7sNRvdSF;+fb-br&1u<& z=?(E%vvph-iWeFhe&-IqGS;CuV&+TCt=#~Q7`4(A5B9)#m-jQ688=atW?WL0`FPLJ zyb*YnLNHk$PuNGhk{thSOAFKts5-ML z4aSI7KD=yQ9}rd8lQfqEd!wi>5@%(Rjx`6jG+H;C6^rY}Rw2o&3U3A$KEbaX&o`x5 z8D0t1&W$ekou3@tRpCQ)0@F_J<7tF^mkaWt41#=t6U#W)2@;ms2cxCzNBi=~23hjWSz4nDZ_Tk{kxlBtRPZOclbvP^} z>postDsf{B@lx1o>pr~v83y6)OwRcd2smed9nHV^zU#SkKjefLjIEy4Bya|*K5gKe zmdl&$mt!c~&z-UECamUoXJ8Y8iAUK>*t#0gz5APW#r6IudMUq1Gle&ZiRX!Idq#)u zB;B_X^9yCU+HznwVq`p%lzx*V&aas$%f4nJU%py?fVwz01`R&}X^P7XQH?9;_6h{X z74E+B7mKWObvPas0x_Jw5!>3**lKpV|>;mv&5nUXe_@BLvZ5m;V7_p3j4Ki-F0m+ zzxp|arxsin3AVJ_d*yyU0~g@X5aK>U&5Fa^taivDp_V-Z5@Usmb4)}`)MKQwPSmf z%W%1EWF^ws?-R!Z<2(C1uCqXJht8oLiB#k=BKvQ7!`(p{Z&c0g?@En)#DW81I1T_H-U!BPoLA?9fcu#tydt$H8WlmDi74im!bF2x z-8YNndq?$uWSB>Zr7SM|ORMrNo!HPw%oUiv&#Z*E&Z59osg|uZsP&_kWj23>G3U?_ zP?lW8kWB##@eob@;yJCg4NGc{M$0#9(=&0yG_AdOJoU$`yyz?}9{~gLGoOV0U7!1iQ(M~b0pWdNLDkkXF%Cfw*!keV5EKd+t9x-ADvz|)fL|A-*cx3Q-c6@$b=Ob3jxu!z|a4E5T!(L#?tJd&*G z>Q41GCeqA`xOH%dcv(FA`Kp!wBa+KpTl}4XC4dIZt=;%QUDCa&QsG7e?l+J6QaB;r zTOR4?tlAumM4dYsi#U_b4=_3xNevc{3OGp8y8R!f1#e@_)IW+qd`&)Tn%%j2AZx>- z4?eCR{joC=sx=WPfyKM|hP-pZ?13w`(#3Yz474?32F(K;f;W%C~mh24TX3Fr)*Fan`WBL~A#4Y)5 zE;I9lRk(j$Q|1-QeJ#=b-(^-RFjDq$K+cRG+#grR$Kud$!N2k`#J-zhJbxC#%j6RY z=cz)#=uMCgRUu}uYk}(kl`9yQR5yM_@j8I47T8pg*Wpk!pe^OJ@yj0;ea1m>L1daSC{@jdYy`E(R#YNu_FK(jqU?~LpT+0hA9%TFhPAf1QyxE-xUQe7=MQ+wT@kz-3Q=1v-npDN*Kp^Z32R3^lI#-C&lN@Z z12&;lwAWF#j>_1QfgAyIQx6DACf}r=;FfG%tc3ePuq1ywp}(6;^KCEkd*SirF1)cC zdy@xvP*SdmM#3;?u1nfcBbVHt;sYh`yxE53-#G=M4L*FKsSk^V)dFWZ@Pbkw4A5x2 z-Zv%g$VY{dQ){)*itO9j5hn%FzMtPwE_5>mJU;z;%&7DeUg_sz9PE&L z7kl>5BTEwuhnr#0*O`fUzFoEa;uv;065~gJ`IweEB4#e3KrUX`3pnq>j4rF*AK4sR zmT#-eMIuJ_9cvr;M0>ho)*A-tfVyCtna3b5>jV&R3*x;PZWg>O54B#`KibW+xy912 z&>;I~KfDaxb1&%P zHe*3yQBz-AS63Tot(`f)K_We6iwDw<6}7c1R(w~xY>0fO9tc;1Phmm_fUNP*dUJWDk$9r?xf&6#G4-)g7HpcUX_yx=SK{Axl#HG@DJQ3-LfY8H{0wUwu z_Num|c)==&J7b}EcW;*Ml!Z}h^8|76c68a2{h?PRX985ma(d!^(*?T#Xx%oEL+(TD z4mQMNEnDpu?N)r7y%U!jGUGLn;@ogc^<#euZBT(_A;B&0`Ncf8iSAPP?ZGCd0?vhn zX+g2HtZxnIyl>MHzU6~lT&}us`L`dKY!F8|B>nyce-FcXVvs*7la3tdCh)qvyjJD6 zR?4onpZUywhsB%hj^d(O|1I~X`)<11mWZWy#jU5{qFaK!N$U+3*W)ZGxu7L29*Dq>g(ALjwRA{I&YS^3R9As65JqR$>b&QgNgSq0rz1|hE)|LGf$Zmqa6S; zK)qIWBs%@GtLw7N#QIc;r*T~|htG@`CtR=diYz$~Qk3=?iKH4QB;&M+{ZN>dbb30H zcYaKISVFlESy<1-_oQ6*!Mx_?o>%!s@(%e%J6^g3(%dBP9 z_h&L%{!2Qad@H28O}^dvz5~AROvjTS5r)^EI{E(w@ps90gWr(v$tZUuUI*=b{~f;X zbA8_r-w$Mc|HJkDApAWfKkR%z0)LM}|Iz=L{5b!8!uoxZ|DJ}ADe&)S^v7FgedtbB#m_h9R{ zNc0n*RN%iQR=Oe9_fRX{Fza`?^*h4)EmcPH-%-kF{yWC{9?QRr@kIr@pUOe-H(oiI z`zKiCA7a%%(aJZ;DyPf}pUm5%;8P6zd#aUh8vj-BHYff)UCa+Y&*0QI6aHpd?VK&( z4&Q6wzlXZg&4s^tR``6Y-ovc#N~`<@*6-oULjHS%^?Rh1evvh9Ro3@n>$ln}XNmP& zV}&oZzL%xpURe%*wO05Fo^GVFGQEyHH$ixvRZqRr0KZQVNoiD?zSrV|PN6XGq0 zl-KiQ&EWcY;Cdy13tl8pT9j1?rpjt3^J+j87&jF%%XblmKii3aA5qrs7A5W?zG4*| z@Y7vH+eKJ*9j&f9raE=3QI59im}fPx0E*D>BC4{TD57t!LfT!06gY*fRn}RBtcQl; zS{YY9Whc?gv8daLv5gc=xs4dRNCA{7?IeS4aEcv7WN-Rn)R1`l=`d@PhBXHCm4Qkb2&H+Nc;?_rCSR*^*jia`+(Sxtk&%@~2^m#98mQBlU1V$}#jkM+e65vBjQ|E| zrSvXxNU3%g@t4waNa){14yt6OTB!=@{E&`8x`WniCxw-CJ7MT}D`}~EJwV1HawWNj zjOV{Mkc0W}E;0({4u_(RjDP`LNxV`W(WQD)BsG$Qr6y7?9YtnJ0kTM1PpYM3$WrN8 zQY*ERCh0g5l-fvK3X{{Mc5;r?K`xX!$(2$!xklPRu7lqjq$s%&es@VRvPVkrVZM|M zCe;A??MersWGM+Lo#4|*Ejdn!01LoK6IrWlP&N{s1j%wG3O<8e2Vl~r#2^PC3ni{} zgKrP`HUV*>I5kQ_Npkq!r=$>(a9iE$sx+Z?ZgKeM_)t=%lDCq zYn9z(8iZqsQ|`RJQkimRsd6iH0S9j>Oqxns39gspNSObMNt}ytDs3jJw1o_kwvxfp ziDZ)WeNrWz43l>nOx`JEnRF^l;2ES|I+LuG&L+o6KjITp4#P5uj8;woenckAV1=9t zgNrrRDyIRiMl{l4t=ki=^}^FDr$Z`3IYT)U^5D|@CA1EQWx*a&aSKswL@&isf(03LxN!<5CAfF!YJDblr`hJ9SuKXBr4W!x*82cRMCst#VkXnJ?qA7dH zp%PiRgUlVhi_AM>%r(xaiY5T^kgg-C8RV+Rmzo} zq!N7#&^a7{a^c!N^|*EJ3FRKRrC{ZnAVIS%%-s(Wyme z1*TbvCD);^9-W4A?@rQ)z9ua7sPY}8c_#^=zXd~Ap>K7$XD3-xK7<^-ldQv%)??H$ z*Pr3O|nFK2Nvf?q(%A!7UyT=d(syqBz;9X zrEf@=$3qexFWKUuyTfoClFjprcpd(T92g=aFk)-#pt z@Klh!o*CpXo>}Bh&m3}(XD)fbGoL)-If6XtSwx=mEG4gdR*<(n_2dK38uGbk9r@aG ztmN?=C#jxx$?!y^BF{!?gr`dyhdwQiwo)e|1p3|h6o^z#no^8_Mp5IATg=NxG z&yF-9m6ka)`2uB|SZltU0bep$Rd@V9Q2Q=Gt$YtT9tNjWxtplPCjd_ZY~qRKqj!>% z%1fc+-!CC27oQ^dhaKcpWFXe?VL-;fheOi*Fj`agke_TLN5Icdk=xltepacLs(Z=LC9;i7K;JJUU@OiAuESRf z-1B*r+O$$y3QY9*Yqo#$)OOMixUIar_?Ke#a(M31g5lnYJoy6bk!K2q|H^X-nb2Q) z&LhM0$v6m<55nT|QZLTowBie(EjXOhiZA582&7FST7{qD6F6$s%8O6HBsY=B-PT8> zd>T&KwB2MI4#h=#$gg*j-(Wqz*+qT})J^y>iIx=*YlC|ndf8a3(qIg*PhQjlIL@e>iLhS z%=4vZn&)fJJkNhUN6W->ob2_Ovg+9=Q_m(@^PC_v&zZ8}xlk_fTr3avTqYNJu9k;* zu9t^-cFLum+vHK6=jAb;SLCstPh>yL+yvPxA0lh=M0t=r3FdK`JX9`|hs%@YG4fQ| zFHe)l%M}nZL!Kkgk{8IcVFnNnyDW41}&XNz8e_y_f9sklV;D4O2i!{PQmImo;a2r0w54jc9H!q*!qm z5JULE#Jk9?H#i*VL|8&ZZXiW+6Y?ykonm+V&W35XlfP~wE1~-%_mIEcMaE-S_mNxH?jv`t zopu}f>uz%QZgS6Fa<7K~I+~Y`{<{@@pDTKV9Su?UJK=mx&qxp6Ea)PUzXxpeab$!X zB9mp494fbyMRJ5JlQ)o~vyU8CR?kYLu4CEpb1}X9y7|1E)WM?3+wgz$p zIZwG3*?wmrMaXkm19_eDCktNOimSa@dI)(-u1dp_6t0KA8$eUb2L zNUgc)1KiyC&LRUGkh5ta{dJz5|8aD>q zIPgX118vn%bpxO9*Rq>DoTc)Te*}Fv2PXEXyuE&2d%4rfa^50|`>;iTG4XQBJheZ9 zwLc1fkMY{qW!An9{#NIy{TERCc~JW=2VDCt_R8`Nfw~7n8Kb2-sa|T3xMu0`ZDj2Z z^2FLo?;Y?10Z;BFPvHW3x^4$~#{FHtgFNg0ZrDMdbAMMVrQSP%tOKj&y%QLVDR+C$ zwOHo5a#aEDf-QtHwvkfwL)4dh$yeC>S$1*v z_T6hS>qqffSM6D!Vz-aa`BeLh&-gU^i_bT<6F*B;KHI>?-C3&NdIg!boit&Mw~A{2 zTl|e=vvaD&&Q%&$KnsjpD+@|}zz##_B#yScm4iyX7~tJ2Nmjs>1=~rpGS@rQ%g1%h zl%X)|v$z9eE1GbI7qN`!&%{h9w)$g%WFdlN;jQIU_DI09FPnB3@bA;Oe|f2L7cqc; z=U=rqz&aaF))Ukge-Btm{Jny_2LkqX=@RKx=?!2$3p}-+I#`xOJ^5bpq5L=Uv3!^0lkb)^`98@n z-!Dy-{~;}qAC#8K4@;}$$D}U#3F!nG7)be9={)&)=~wcL(k1ds($(_I(oXpm={EUQ z>3;b&=_UCM=~ek1=?(ec(wp*|(pU0Z(l_$^9-sVyr$GMDGfMu*Ggie*f=#l9`=* z@7!}|&YV7He&uH=zwxEY@BBQKMoi`WN>$_6s0zPUb@4LQ!?&w`ev9hmw^3Q4hWH(7 zm>*Ol{4pw@R-^nSHHW{U*5RM2b@?x9fx^@Vil#PH{Ayz*qBc?T)Mk=qK8`59M~)Qh z43@ww^?tRQ1i@|?rwV_sn+?J+^+6g<537TV)Q8lgbl(x;Nutdl)xmz23s;0yJ1Zp; z@@c3?Z4Xo1wZxMjp|$|OEmb2WqOp36RA`NGq=EXV`WSS6m(A@oL78nz&XxM=^^=^^`SoF^zpmX$0M~& zm0V;$x1}(_Z3GWp8b1b)a52`nRjfCN_Q7)iKDq%wR}hjLCsK% zIl`oh*|MC2`LeXQVNV1J?3Og{t>7ooI;tj6M{SD&wH=zN?a@x{h)!xJbW^*aui6zQ zYB7mdJupY@iG^w(N9byYuIlsZ3-rFeXsN!ad?fkvQir21RbLXqe63OXcWRXQ5=%N_ zqvIy?RWW~=7#p<*F{==fyf@16DP0KAg>uBH7L>KdR13*kU8;p;%}=$6?4U~NDF&=a z%~3vyQmMf&VDptQ7`J&7#N0g+x#5VY;=(SBeQ%BUc zlaOEJ5^|kF6!)QuKd#7erJ(9jfid*%{3=#ZMoJO=97I1G)cib&em1Q6*_wVfs`*); zem0grLorv#&?J}FNT#nbJ70(9H2Q;~x{Dt(AnToYQmzPN2~(jylP zOB@$PiDh*p-7hZO(tVSxDarFBbGbr#$S;S#uF0C^s!2p_Q#qP zG*oAqtd%Y8woJ0tWh9hXt+86ISv~M-b()tXU90&>!otPL^Y(kk+d%^jg?e(FB$ZI~ zKF>i*Q?Y+~58{~`)j+ys1k+I;K~Q~^2;pOBKqS9L#Y_3*xj4)|%WIymd5u&_YF_g~ z=4+m!*E~(Hd5&K5JiX?{EU#hW*mGMA?P;r_KI(TE4Gtk@JVUEdU#31^Aq;petuLSL z|4T>r&zxST+H=#$WC@cM+P1@C#9-P8q!*=-IpfvNn<4@W)HjKEyh9xPU4s0Bv>9n+ zLmogxVoYs{|9R@Yyg9WAA6R4hjJ9PoN=er47}R|h9<)#4!7x&nO{=Yg)5b~&k(!VQ z+OdSlUTI;CjI8FWg;GSOB}V-cHBKBuy;vg2IthjvAZ?Cy7C(#jQ5O}oj$?6!sCO0X zQig`adQU1XRP2_nqhp8Ba(rPWE2jJD);6{!+hpC6kg)n{KHpub6YOxDvLziN~9 zN>s7lW97T#TZw#^Ivw;CfhzRH^67r^Z-4oBK&q#Ksh;-Huy&=%??VFdOZb@dtUmTc ztVa_X*{^6Kz9BUFo{;88TBbjvqxxTTR)3>~{s($$D*Dhk_th9mHIC7mf^nJ$(={*V zXnxGs0$8jCaV{wb%d~n}uI1t)Ee{*Cd|ag!;6|+hDzqlJQ)`Nsv;^MN3h|!S1|Mr3 z@tM{ZpKI+{BdxPzawsL`= z<#2~C7SZbZQT<6;5BjA@1Nx{x%g<;|YvY%U&tU3*oX=Qpdyku0X2klUNU~v8L8z?` zv%F%$A+}HYsdG>ddFhrQZ5#}3G6LEZGdKqK+uC` zC(r|~{#X6gCT1IHRZ3fk1yep@X=#}Zi4vd*ca5Sbv`~faL3~L1w_G4&HSoeX)kg+FLFCC za%+Zddv$9r8B|gGMQ&T->OgHG9_R`oY6+z#LY2{iC(xIVq0fy=8<(Xjl@do9E6f|? z#9AINOeDwAT*R*B3K73=6`Me}%6oG4Bs=X8o2bzHqBVEq8dYpkF$v_6jHhz-{3M&4 ztCKiCC0DQc+F}}DXnUY)dy%KzLyPMG5ru>3tW^?0sKUwGy_l%oN3`?-EYzy8QhNxO zYDbBNKH|{D&NxZ)5Y08jcRFKrg)>%HIAe8%HCD3blWJ5RmS}$A;XniGUnPpIXN+Xf zp0fFNTugz)8N!&-LLz>?!~3Nzy?Af&GEO0<9a6l~3LTWy}z>TN`B6B*! z|9^mZnSgkefO!3Hfrx14UjPxcfjEsuOZzM2eJ3p_=^r7ltmO#xqt+|yIJ9JyO*uO| zfn{v!G1NWGrj3t@`XP2YLnWJ@WHVx_sxYFVaT4-fCGn#P$>j|s&=$hq&_R|Kxb=lL zqJ2Ze^jjjP-=T^2U&ORu(MkI)jYf4ok*JFUzHHEv1eo~HlO%JQm1HwZ61I)Dal$gu zvNHsUnWfNJ%_g9PBsHu6WD@OJ=ES;JSeV-HjHy53O|% z;<^`YsNP-=qO%@C7d_$(bev|(k_`$FR*#Xip-?X^wOsY69O#oA23n-m&lDZSnM*c{ znoBKWpu+@QFm4+<)e=t-$f9Jp->)4WCKPFwrY(mRlTVb85}3cWLsQ@9C~Pe zIRYj-OG zByu2;QZ&ORJKJREq(sO>b?HuMh1H~*(o2>e#Kc`{+|n=OmVW7_|98N(G;W=-M3zf& zg)Bw8V2+|)luL27EU(2uSsFC8kIL)k$Z{zjk>#U!LY9_0Z!+rAJhXwKw}n^lfQa4^ z&Ga5esNsI*ijwIdxr3%vSI9fSU|G6aGC#0CaESthmT3GXrM2)U+Ub?Pu z;)B9CU?7URq!$#B$k~eYgt=IT3miRRBwd9*lLmh_4gMTN^-EA!KNI!zd9-#Hpt*iF zO~gW4zl&%h7Nfhq1ikd77^t6%x%zS}&{trYelaf4FT`?vC2rMMJABPcM6szYv!^8g z){f-Az`m-GsM|_wCguGCtkuM}3QnTzMyUe``gL0t`qe^fX-$ZCG`+`1xYkk*ywWpe zG|_X_o|Z~i$PuQMBIgvVCR-(cmZO=; zR@>EFlU-_8i59G}?{}GOEv-`Vi{3uDSp9#5r2sn{SQt=>Jz#`O9y=u~=ut1`WT^N32O& zC#$64h)FUk#BAPN)3jAIg>&^Zypvi^4I|khCQ6qK;TCJUB7dZozKkeLA6@y<<>FbB z-AcnMoXFP37gw%JHtD%C7BR*|>}R%_7vJX=;h-7c=T42SaHGqCak)~~>|FgImI@`S z_F&V1+;$9;EpTqPJX*JSioHY8Vvq2Yd#Z~qGP=ua z@z{za+eyo#itQ@a=9U`kDfq#iHlr65S?QSGaRGI8!o}3Ht&24W1rF9o1s3Vg z)hu~3SzWN3m}O&pj<48dqGWMmr=o0!-;`0xjmlP3sEV4WHlT8fdc9hX3T={hu690^ zU+W%S$j>CHk(>s-gWg4!{q!UHQFcIoME_O)BPCk!3$cx^T?-co%FBxF#Q`oQU8|D(|_QL^dI@z z`cM2~gYz|p$~PGrzuz$U6NZbwW(4@#Mv%W}g!rdMgnw;B`AI9;tYrmOcFGu3B|Gt`%jS?YVnZ1pqaO!XII zk@~x_SZiu5)ryUCwc*AxZIW?;cCK-;cD}JfTW(yaU16-$t~OR_+l@8a9mZO1ud!a+ zZ*0&WGOpAfGp^F!Hm=sbHm=n@Mw#w6HtRv-I=!)Rz23~YQEzE%(G$jYy{&Pp-ody< z?`Pbp4>xw}qm8@t(~P_I8OC0HuCY&FYTTn=Z0y(983*+%jikQWsM5C@hxFTwd-c7> zVg0aipMJ!6T0d%3>yH=@>CYNR^;eCD^>>Y9`j^IW{U_s5{a52D{SV_`1~Z;8nj6w$ z!A?R$jKj5BD;W;@4Z3KpwHQ=ZXh#*Otd|{Cps@~iRDsGa!Z%u6m{-`%ct#WZb~S!6 zrf7wt7iGI0o1pWr@wnB-|G;6bjkr&3l)9?kl&WdV?V4K~j%iw3^?bO9%X+nT^sKJl z%UsewWsq8IM?Gk7qrbdQSMKMtwD$77NB9h_gLsEN9E-G$S|`$6M`NzmSu3Kp(=b!( zqMZbtR!N*{U7;DI&1l6WL~HsZn5uQtx(m~Z(K4mS8ZEUR)E}cen`k|y*lie%v|iMv z)DpIPJKE0*+wk~_MY$`}T``4LTb0vhvO{snw`?cPz0MUPPKQhA&wb^BIJ5i9(T4Q( z7zwl&%)Y+n4gHOk*utU-ZVeS9-^N@ z*KO&L#G{US70qOdG5Jg?_J4k@*#8m2Y%mpbFpnLvHKrkm(9pe(kntv>##?A+yn{Bz zyXa|rheO9|z#UGz$#E-gEgj_o6x(w8JdC<(| zMQfK2?WkVl3P_N9LMK%%S4Pwb<7^klGSWpGq}G>8TNiDxa;Ma=yJ#m5kHFQu2_DMNYCuO9?L?6S8z(VI_M!ade-o{3{_%6KX>2p0u>v zhSE^qh;&;~#?cn>j1S6#;c7%5)r3B(DGFT8(a6;bEnKb9fw*VNJP<-1t;C8SM@Q#_ zI%=h2iPReT;o1lbcx5($9-w7$2?6`W+94#3vSJ!*BS$!3pWK0mgj9OJ=z_rqsle=lW#KouA5F ze>Lg2FXok@Ni4^eWG~Sz{e_s7<4&@F$8x<%_Hr!8lVq=u$X|g%A=?QsH6i2c70Ayq zwj$j6$|!qvP8EAy?l4|$5NdQ2;I}c^o7P@r@l9fXXBB(PWN)W-k{BX1QYwxz=<$v+ zDYntn`K^soV#^bOHqA0Fz9TnHJ5iwRQcnCb**Lz*Lv30wUKpoUCsu$u4E;ytJp}_)$BCawQRcUI(CNZ1~%7K#+JCs*~PA{ z60dh7j8idQJ4HskOu#5@q>P)HhGE($YV%+g25P4gZSfKnF|^U@4!ZAIKpUftrCJb= zYUAh$1HZznjhDfE1JFR5pw)w$B`{h$O$P3@#Yk8>9{Uz!M-6`^B4l3XwLykWp!_SRCQpQvI#NfEt6X{=D(m8+>8WCSdg;x=nP zTcOx8C*y<;v!BNo<_kOGFCw76F@xJnan4l+hfHCxy8sIxv#2G;Nmjq!^5Av!yXGgkQ8d&h~Ddu2t|B zH0ft*b8U7vOhobs1}UQ^rMRF+Ht&sRxQ$#d!s~ho0oN;O4%U!E*hAVpD<(*rubpM{ zq8n`KrjtM?>Up^cq;rg|oH>yl(Gx7K`Mafm!3`g;<(zT7K{N0c5t{di(7X-5>m6b` z?>mg&kLKC}ZJ}g3ogCOYX^X5~-DsyR7UNS3{g8%!G9lMr50Do#z$1iM>LC% z=#q~ZX?&!HbExT@LzA4tkeq`Q*;n?7HT57WWH3BoLrS;y3f;Qgip@!5a=B`$eY;!U zUTtz-#g#O+L93(CHaE)oJRQ@CRHx(a$KbBd33tCh#Puby?r(@pe~YHB?+|l+Ph|Q> zbaVZJUatS5pX)cmnRL9-lLaoD>j2JVm-zo1(WQmm1AfS4l2)v?GDwR2fKk03JyYHOwRe zD+s5+oClmad>}>qsAdsAj{CH;>Au>s^*K(|lZSd09;8nl4-!{<&>yV|^+*Kf`VnqO z`>&Yh)5KK~@GHcnL!1P*gN#Vi>Qa+?G@Dys>3HcU_p_MP8|0WYee4 zbdSI&Z_JJ+;W-(uYxmh{eqV2v*p!vp#dc@Q>^P}L!c%#e%^EKv9t3Zx;7t3Hn_tk_9*AOynB6x22hp>oR&IwT`tF=pQ z7Sr1fzH;5e^WsUKpAk^xzKPzsC5^4PoOii2YhNnU)@qm8UpA1CS-d@8CQdnk<@9fb z+;VvU7mBqk(x_z2$LTD?`0&riA{Vtv3R0Dq$bMIa||Ig3sY!jx5pg} zrw1IMbF>XKF-*3-B<%pAZKEC8kfU9$T_J}wM-HSWYhoaES-X2w+;p><&x)@jm44;!}zOLS*xh7{&{V0)zq$%HXQP`CWWgW(U$J%Fsc$ z$)(AFH!PEmyoqHf$nlh;o~=-c%npLS1Y>Fvw~0gwof-X*VWe(h5-ko|G1<96R!}ok zN#3Y9v=g7_dXMIY_R2dL%T+V(2=2t=;*Q{6(IszOhLd9n8u37qHz^JYF(EgUL^RY$ z+N;C4VUstNTkpf7U6dwoCM&_*a8jD3H&pTF628aEq?uPh-!L~QGE#+dL&sp|h9U=2 z@!>%cA0DjEyg!^9e2}+r?l5^v$!SyO648<9k*IU1x;P>%-jV8JlRltT8Nnb^PMl&5 zc$j|F@y+ZKjn#=JdFx$faUJo!b*gE`hG8rz5W7fqxCZyqjNU*TP?YqWb)k0pElcrx ziIk-d$nsvcOqMQeW;8H*-QVB__YXwlf5Lt4 z|KO*NWrE}kIk>It#l zo-iBiiLenQ=Z*2yVY5B;*g{Wzw#1XqR(lHA22Ue)ji)gy_cUeOJ$MxG=0kv8tCi6z6b6Vp9NGGg)LN!Cdo5F&y_TtFuVt#)Ynf{H zTBe%4mZ@g1Wva=wENkULWvsQTZ`5wGWzingm!JacSg}fic~@&g5|7=AxL6r+Avw^0 z@k*W$vY*Kd2}|W-Ag#(%tX7b0E#!#f7*tTCDMfmL^|VhEMVeZqCz8C4iwMt*D&DqO z6&r90Y|&i$C7m8+ce!c}>5~>aPaKM;5Qe7>BA&Kr=4pp^p7!YC>40KSNA&P?L0?ZX z26(z-u%{YHaK&D9wQcxIiL%&*pH?bLSJ!1hHd>tT`?mBFauUG`G-qzuK-vw(VD2(M>JTF*}Q zL+uWA#GeD-H-2>QKLP#{dc`UNe)Zn~f2WhgGRw=l{lk}SpqFi=mtB71%jgxmwY%&k zI#Ak6fz=`z86!5wyOxOx6Ol2!#danttk8I|fbQYNx07OCcyuqRaJ*Yd;y8N6V^zGn zs72+ybW6&~9h41;)X$t^t@a(P#M-r_7m97`iM=!g#l$RTus*1Vwzz=cY9}I-sJs9x zWtp~p$x{ZE*u3u90>5V~f}WcRrEft!&#knQZ%4vYL96)=6nS>jYTkq1p1tVr*@w}d z{g~!Cgc+WLIKz{~*`6va^&G|}p8K81!!r=l_6R2lt?7~4-O3>;>a2E_#cFM@T)$x~ zkvkP?1?+44w0mgvS~)i@nNg3C?A#+m@bWy8w&ZlDZ(Z9jB-5H6vxTH<2k0Hv43^r) z@^V&UM}G*JW^W$fhE+7&gY3QSd7_>t_o-VB7wI+TJ;lTYMZ5L8S4jnW*O)hY6aB~& zF+;r12{A)|62wORg`__{4W2Kt$wTbj^S$GU z7)t7saOx>o;V52;Akd=G2!wvvE1ps^Yu8eNH zSpm4udAOW96a*ttLz7N%%lsMfqjwSG=_9h>oHDbET1TaZVm&UFwj?s9*i1^&N;6qD zM{8MH?`|Oa^wx#pt%r~|7g29M>Uj&$$lDOjy^S1)Og;Fu`=t-55lK@INFP#Ka$c=k zJ7N#iC|fUXTw{b9CIVe~-gK3pY3yb*b|c0}zwDPezrE6^h2h|@p*?)Uo{*#3BQ|ZAWmES{S*a?GeuIxm zhvr~svr}o|akxle_+C`p2@yP0$|RjW`IwBwIk_;k4N8b;$KfN1sy~qn%LeWdaVSOqNg0WGkuv&%3K{cWhGlr6VW{(Yc;zrb0TidvPQEp-DeycUTJUQnk6WR zh~wo%TuS6_iNV&!yuoQ9uW11h;j}a5Q{|7Xt+&wT!9*5_Yvcyc;I%+H+D<5>~nMaN?_%Es@yR)}f1))vscEOSx)i&)bW zgv3v$A#Pn~QPtI6vMqf7c2Fea>oWKFd7sbvbuT-bOZwNX&V2agtY7y^N=)D_r5_3S zp@vKMFB4gW_$lRhQ6!-fiJnqHwy7<#0h5oEF~Ak@ntW8TsugJo5s3L7M`@v*59zeR z94pO}An(V};vROg$dzRC2qV`Zz9F1MLyKHH(La7P$F(M5Gr)?6?s`{f*KM|z9KIx*(JF9aMB@*eI#!9s)_XE;v$HnMlQtzvOJC_ z@eFq1WxR=Zs5Ed1zLeL$kmZ;7R+iQvuR&uPFe^{T5xl-=nAZ2lVm&j3M6tV3ha2nB@Hpr+a_LA|J5S$8f1n!<{}i4*C2z z?hE2cUj)ziLU_&>#S6Z=c-fbWH+}hd$5$Wk`5NFOUsHVPYvwSnMTp96!v-dyRBjR0 z3BntsU0Ef8YP0sLv^G3PBuf~Fym-&4)x|TCtcp#&Pie2Ik4c8`Ll#lwb?ptCS}w5p zO>+l*_}JqJIEi@qSkY2T6>UhI269(#BWD<;bHLXQhOa#Wz7ELsbw(p!Q5xWnDfo)BE`_(VKAdU$_VvvA@H<%-;iZ`m_s#n7yV`r1vO3Fra`@lK z>hEhGIQ9#ROo^0{XA-*|$B^XXGbp8RR2o$ZI8-U1zN~#HsnSQ<$5}q;%uKMxX8oW~ z)Nv;;(E~U)6NZWZkcockmZiCFZ2SRC@k|qWm#H>Q)TY&VS)^yjHXHtD`+8y)c9rLMnme8$Cz97lIuNebrpYbh+=DQFc z-$khFyBN)UtC8@nK@Z<$80uSxF}{tMIW1`qDlzC0l!@+&6^qe!boBB^pW0liQpN?=pt zVzZYFE{vOek)7t0+GS21Yj;+;_5F)u_HU8vTY9tO&i1Xw!sl|fvkfysH9hsDxS)q} zLUqI?_8`r}61uF}H`2JBtyc1L4&uBD8MKe{=#HgA6sh9pN*RzZbJ9}K-RC7_L~C7> zpKsOtCchw&mitEJH&4HKUagCKId#9n>i0rBkKt8x|Am}@=vlzGp}w%Nue@2h(^hVQ zH&&437geBc0pBi>ekI>7r~6`Rrk|ITVFVSciqvo;Z;_Uxid(Aq>KtuGk)ES(L2HNg zUn+NQNmJ6A6C!0|IeHaeo8*^Su&uLU3yTq27w!!?Mw1Bm_0F^ioZeuGRvWFSF1MdL z&H0&9ajWze+)A;h$N;Xy)sNf^x3oVsaPdm!qZFe)v)a8j5FXZAH-vS=GB$z!W3bQ6%lBC%elguhk!L&Rn;5u1BR(%6qCzDl(4-H&#@2hiE~AbR_b;S}F-B07)ZOyA=~aGt{j zzUQ&h_afH$UcwE&m$Ak78gBNzft|j$Q003EZ~5NCuRfA_eIK!)?_*Za_bE&GK4YDH zpR+!`FW6w;*KD}&8#dbaJ)7YBfz9^)#OC{cW}AF}u$%k}yVI|-LwSX z-_M@&2iZIR5c|d-WahpW$!8=lEOmbNn%WzCXb)^ta)w{2loke_OuR-;UqlZ_mr=_ZEK<-{J4d z_xOu>(%+pQ_V?nC`up&w{e$@H{=xin{}6@whba+%iIU?VuGIIBP@4HiDy{vamA3vd zN(cW~rPx1C>Fb}M4Dg?(l=x3q=J=;83;i>cbNsWF?f$vSZT@-69sVWC9={b}vI8MD z8iTa2g++u-Kws?}A(XP&=%jrsyoszHR%_o0Cl~vMRMYRJ4W)`*tozA=A#hUX%O<^QVvW{ZV45*rd$ z%U-oqPNGe_Nh#x7O}E)+Wg!n~G*=Wu@n0eL7@{=*vsLay|h&NieB39Cj=G#k#gCwEq2D0JC*L%INV&rl?>HlXIGKj zveDXtaj96`<(QXBb^MN?iYDJtTahG!tRCXGaEOCJ4xm`wMsj0!xeKptu_m-Xt-4qj zS-5JnKSR)|AgQD&?a$bySBM-5{8lx|Zxe=jqLamH_q^Q%a!1U>Yyx{W=F4&^mSZJ7 zwg#8uDktZIj4bqD0q(zwhV2@(^lw5N|7NuFUx$wVGIaIdi2nX9DDiK_IR7?G^>4@N z{#!BAe*m-nw_&Nj0?Yk(V5NU2F81GrHU7JCx&Izq<==~IsJzyH5ZC*Y*x|22h5rzC z`5$niVlTFHNf@}sskOrlTTSbTX;O8QS=pUr7rP`bGn&#e9hoi*RdKL7U0NTSiKGu@ z6ZKU!>%+q`A3m1tVVyZ1-aZlUCSX(|_Y`&x@T&9q}=nsy9UvP&c`n75lgxD`%;NcP+c zr(!jI%2--FqFjx2vb+X25NX|oTjU9Nsjy*r;$1*Pvw)5k0Ryc9UK9rW=n@E^cOZzd zfjXEF2xDR(g0li9E)3Me#eoD?2Xb*uAP+YL8sNr2KDGoJVOyXnZV5EUu0Sj74z$3Y zKn(W;+NOoLH_>(JYusX6UkrJsomFdrjkX=871ld;m`aBhSL#N_t|F%DS+OY7&>HBN z6^mRcBLcgZUMiydj@kRE;>TeqiKDyKp7A4SdjQLeRjYDgv1V2J7VEi!`7E#EcakEb z^sGP!L3#^w)leeIcas{>gsR0>wXXG$&@5J@GLH2uC_{lvmUSWZQ6_SZ3x|d5Pm@;- zk$hM@ndEnglW*v+OKe+ri7h>5u954ao1Gg4yv6Rs(Oh@6j4BF1WS9)%YFUc-Gf^JK z1G22fQPgChw2+_+jKE3o2D%~`=#FrpC+Y`!p=qEu5`n%rDbNo+0{t;AFc9+sCu3n? z2rdf@#rnW-ToD*S$Z#ql!f4za7>hdtQ{1F`<=%$`Ht9ZTzPl04bia%mzZnhmfE^`y%t41^deAc7sIII?Fd`EPW@JGE zu7{jZ@_KeC`NuUTVRj6<$P<+0d#X^cBw@vqm&OWZG`Y#|rvGYU$-xfuz2iw>-$zXS z0H1tZCbc-oC(A$&KKTfrC_**wslWv#e;sjNT9^0BCuRRf8^_7wUm%&6(Z7J@2#~kZsGQHSpt%z;f$dD^l;$Bel04=w=FEG?8V`OL+6CmF0gNP5gd=GxFpK znN1I`2>(^DxXBNs=gw?wJ3Nk|Zo;nG(W>!-IBTEN2R}%>ZJ3B!!8^in*6$EcG6-XxM>7q1cgx*mfZmn!GY~!j+n%CwY~1PQkN+ zF?mX@v$YK2@Qz$i;RFhr{1818 z+2?1pvQ&@*Hf}i?RwP!5Ychr7PJ}DauC%ba*d?S5S2ZyYQY8|OwBaG#4a6N;!?VjR zD8?UrAzwlbQ+bl#C(A>e7zw|RKP<~9`SbiGRPfjNyZi&XZXF@f7b76fXf^`(5Q8~@ ze8P`Lfl87z4&mg$y(kUbhv9*0k}{5Ba^PX28pkm+@E8^Z{)H8RCvbV-DU=1CCg$=i zb_Sj!YViW@qqc_vFXPd`Yxq9!2L1@V&D?=^SpC4etZCpqmI%DhItM;rJp&)IL4l9h zh``5eeBcu{J@6@;7xDKDvUw1^Rgm%iLC#Bp3ZES`_*p?0Ul{cB zB|$eoC+Oj8gI>Nq801$6L;SX2geQYJ{7|qtzmLlMgLQayupWOhSf4*1%;zr!^Z3ib zhWzzlWBzWiDgPkYgnvZkC&3oZ-qb?0)uS@dA|Ji=9C;YS&B&8^-gQ#jI@pIcT#jxs zI8|joqfoXP><6^d>*#f%v--@d*Aub0{2V)hf`$crke(}z1mClV^!kD|^ZQB9Jx>}P zUbYX5@bHgPH9`GsPCA)yv=jVI=Vh?%U_7fL=F7_S zM`u3VDXZX@ug$g9hx2SdUP~*wQ$z|sZ#f5EC`mksmSu1ygu6R&gui%zzmyRt9PAG@ zH~@NZFwEc()DI3t!(eHe5#GrfK{d;eU?Qp)D2Hkr67&XoL!=T*$}HaKUkenaCo5JH z4{}=Eb!|}Sx2*h|Bu{TbS}B#DGXJU&OZyg7@t13$l_#eKN5UUG6~W+WM1o_H8ytrw z!SN^zo`#OWiRc`h;)Hk7`yI&p+mMq=U_lO%h_aEC;3DXtH_i;jR-0v=o7tIjGd=6v zI7tJYjax=cWH@~~V>?lBK8^cXe;FXe^rm_(!TWf)grC2``WDt zRpERBv(L=N*KR>HN85^~IhsX6U%Q1g^(24Ym*J$~1?V1JfnmXmaa!<_wDF$kjQ2#nxgCErQEwqPUIkF9x0I)e zMKM@!B^GzBuWYTy@Mo!$`CA!2%;5SoSLk1+PNsh2wsySS5_Pc0u~L^w!xcY6n4{yB z{B5xpVJQi@v&BJ2hxt3>#hzKZ@UF-m%x8D4x!kaob$s^89@>J)lH1r?lss%~@QLehz-lhph` z9J@IW3m_c!XUnn$){r_3`gesa)52_nTi^+9r8Tmh=4uBT1aC!);BDv>tU%x39T*h6 z6QhH7VPf!ZoF3eZIl+B6H@F|Gf(LPRunN})4`EC2Ft!J4tXG{dTuY)Ss*RYP z{vxM0|11+RKl;ar*(qyIZ~pn;=kyMKNmS!&)D3={w(0SI&go46*g3uVX1N;|Y`C>A zPn9WbS+Ur9b3)E-v4i|(lH^~L{Kvl$@uqXF#Uz6riRyn#+MRQ(kx$-ED(H8)noPy5iB#Mb=u+&q zfQS>H!PVAxK9*qz1vC!1;g)F~gA!bs$iw$Ih#2MS9BMow< zc?VjFJOyxtbofGE1VesALP0bOh0!4tL2)Pt14DIC5~_>Qp?WwyR3EcKc~}_A$2p;f zI6u@F8$wNSU8othg<9gaP%GRS>V!R^*4P`0qcW7hBcV2UCe#*hg*xEfP!YZhb!BR( z8}o#^vrwo%GebRCPN)~l5A|k+p}wpgwRH>)VtqnG*r3o*Cu(Ug$!bC)b+a6j-{dh} z2(pu89&Qa0)>-c?cSbd1O*P9DLWt&US{t51RyI7fGO2bV$>`+d@V>|vE}Hxu$@nZ| zzi?;D*txdg;~0%F160%2uY&kjV9-o*k!Nzi!vX&%>z5OaA@ zgt|}IkXW07avTwUWr^F zSh3gw$2o~O?tA#pjMnUqT)mS2a)|#&oXuznK3zyPi1Pnldz0wmH(I@a+l4FD1wrt8 z4LEW`L9Qh`{ZWCSI2*vpG}~)}m2p9Z{u?Xc=0M)}ak33|)!#p{sFH z=o)knZ9<>WX3PtfVQJ__tPI_R)uFApJ9I1dhboW^-G-{r?YJ+r3r9nD;_=X3crvsb zPgD6^Xdhk)9l+b6gZL(tB+7JLH|9%TJP zN7>1thgoUp5jHY(oJ|Nl%BF=LW3xm5VoO6$vK66c*d?K7*`=WuB&M$>ENxBeS*Gek zAH?;Oq|tV@U2|b6y6Ro!ako{@eNU61f1W&*`aM#JD(nrkYaEKUMlZH=AFa{533s%t zb(gA!sP#~Op*5qhRaWxBT5G7M-pgLd74`vv-BQNMhzD>SjMqDkmAvVi8YkFqC7-e>5c_85sjj@u;KdY2eB|iqY8ZqcjzmE^c!O7 z-=kjWM}qbzvq4@@jwUSf%*V>_At{2>Vq=EMkV>6A$E_=&@aO}++icF zKabO&M;^5x`WvjD>?o^{cV(V?6Aq+x!JICbK13f{J42p6OfRv4dy7C2&W<;J(0MuQA{4BH$BH_ zE1t+P+Q=K8l_trzYCx5TPlO{d!X|>@DC&mmqG>o6ZNqu!5-vcWa085^a&owlqa+lg znPpTGfI1&GMK86_!k(fJx6i_!BG0{6WKEoVEe^RD;e?D%uoHc>s&(#l>`zX;R=gR3 zq~WGe!_Cn$+%nA;(8_V|oRalDH78uh{^We?6W>G3J)EHTw8{FOk*W7+EA24K!!iU` zNeZKHSR4qSGc0Z@K51A^S=JT5m3aQtB=2A<0m~p<`;MS>$AUkB4V>4a;hb?x+Q*P_<7soAdOSl6c1ToaRbjE$jBts{PhqCHHdZcjy?8XC3u z{L?vVn}S>6wW~c>tAvg36^L_O?HkP91{n+ zDh>W@WS_4Y+2{XsWFO5K*@o5_yihYLjjWdE|8`_w$QaqQJ{o81qt?hi|IbEtjMH!W zz;+R>*1(R*9M~7K4D1Uv1KT9k_I%C2j*1^rnvxhR61ynPoTbkifHcc+dm@Y-5D9le z{cvY=4;K+3?1DAnldvP)6%T}q@oKmmehl}(Z{eOy3-@BKaBt=d_hog${aE90f7Y7n zZNr0E$MDIlb9fl*6)t7{!^7FK@G0z2cr<%3JeEBd9?xD6Phjs;`Du6(`!zh7{Sh9< zweaaY8lKMc!!vlR@J!w=d)d?9}>e34>?S1WnpHA*6UnNk#9r}U(Q+tjn92PLd$`89aL zy2?*ygRE!y8LXf6EF#KIeXLBtK?K((#;QKfA^M~2K&t|4KSDjJ>L|@-#*#|&OG!Er zLDD~DY@rC>PSah1df}bO58s(a?F$?u^>}@P{eoq-VJne$so))iitbq6r3W!V{vJcG z@XOz0NCIj>HDZM=Yu+d2ukapt!gnJSzK76jKN^J(qFJ~K@$jKE(IMe**o1zX+>p=o ziH@m!oc)#hO0J$!Pte zZF@YN<=iHvb^5tYO04#|O-r0}o9bETHW9aq*WPfxNMxz1R1y^^D4}^OEQ6U4zD{-b zcF{w7>LF2`?T99&&Hr>nlaGdNBBt0!GOd(HHJvTXb8((5Mf*)sxI0^x=VG}mS7N&? zg@Jd!yuMVH=VGrc_Y=1lWm>dE_<2IA7vK&5o9M{PG{NtpRrq}pus%TN@F(aO{uHN# zKPMsUOH2&^h$-Q(Fg5%Q7KOjXx#90|UifD$k1(vH@}lrB*cko~%EQ0orUb7Gu6+>KMQMjO9sUQ0H_>FLL|cBy&euFTm28@@Dqu&V8>%W@|M40OXn9y^ zn}z}LN~N91MLxGMg#uqEj_#AERVeK%d7`v1G*tv56cPpQz#wR|-I5j>TPXbGN=J^d zJ5g4F?Y8?{FpaRfWjlt5pJB_n&@X zrcSkmZeh!}uI}C@tpJe&;&)ag6ES)3}%H?4rMV>vO?BD{x&d#mB@BkvJ!TR z{B5C|Jd!-(ff4Z{KjK59NDwU}ArwdIqh}-^10n?&8flC%ktUcFX^PpAW>^qufyI&5 zSQd$6btHkck(05W%8ijiY>KqSjgfZP5$S-6NJs38bVg;Q2=7LE;QL5V{1oZK)JR_z zi40^pk-@BGWC)8zhOxrPP}VMa8OldRb8E;Q{PBz=; zId;i>y9fgc7S?*ZSc0|OD(Q*BB+rb@BY@6A^T;9^f+cAN;g#=L{ zjEzX6x0(TL>g3dAHn2@j@TsV_%bUQJPKeBbIv|Dhp0>q(&mL^ebEKL%ne0kNHc z*zpey>Dhsp>BNP1uq7fFaVrsFpAmczx&6fC0=0TNBX!mSdkWSevu~%^pTp^z9ag%h zak{)prAHd4(-Sgqw4vDGr6!f0mSi(l?I~i(g$19apuFu?=&+eOw;{=I%}eszddBh& zqPU<8&0{Q2oWZ8_5@)a}y|bR%)Hts^O`7VHE=`GUBtOb4Rs}y&tA$^|0!ksEc4-7< zF@Y*_5NYTo^)YaeM{B=J~QLU%?x)RBHBxM2-+fKL~H+D6O=Ii2^)@){$q> zF7hloMqVVY^AdVRUd6!3>lhq)6JsN9VPfQMOpm;Sd6AE>DDnx;iF}IdBVVFC@)d52 ze2x8)?@<-`5r-rH!2^+>@O0#7ycGEruS9-xu%kHwHWwL;;rcAgM2xo`jCot1ErZ2V zJi)rZaR$E3(Jr-TxvJJlq}D9QkJFk~`lhYv)U@}jE#UM&aoTByTZn+9GMPA|uXUtL zG$Dmw`Xyuu-TKwhu?y%0TN<eSgKN9(k7Yb5Sr3|(Y@lyZfM7j7u z^sQ|R7O~*{A;}D~vQ-W0D!eRI?Cs%{Dm8?1*J%XRI-cu+Hp?&1NxfHM`>hvnP(4z3{Zz z+o5|!&MYp&Q2k8F3pS&Twnl`l!8vDC)MReWn)xisI-hfC)v~{|$C`t)+hf(|rRRa^ z^GLP(Ym=@y{Lf6fwbRm3%X|l(o;8W?4x%K()@+U>@iaX}L0Ymq2e7lKFXgWRoAg)T zmMzzSz92h*b29;)N&rs#8vqwN$I}dSjO&6{<|UPrGgMA<0aSAl(Y3|d4ea`&%$*+k zVyE}*v{c3Y6Rq7iBWt$l46+uUSETZrw+$!NoW!UM5qbI~B^@d$>99XPl##xFUWSxs zE=9yV7mdwj7-O!$Y37A#aHofEoe1|5{cIcV;dc5m^RQAP@`i7yR7!`%hV`L70~l(Yb<%&6Q|mUX8eU z4LX>c(9OISea-7Iz$_zzb0fx@H(`Rgm59z3EHJlWvAG>f%^kSJyv1P;arD>El`6vk z#GEaHtDKoyb;1yenObJg)Frlf*UTP5F=26Q#zu;>NtEG*iKBb%1C?ZQmwXgJoSoBH zmg$(Yi@xa&M9tmEHTR&vyxWo5qi~eHV~l7)uq`|@XXcD;+qP}nwr$(CZQHhO+vXY1 zoA>TZZthF&m+vOkKX&ik{bN^B)xD~+mLwU&k?U7ilpASH?k$?mOcBrU(M_>>vr|fT zQDY28NT#qpMQO%_*}H7H!U$BP)kI2ubja z20Cp5oVklrN7f?*Q&l_He$eCsfoG*q)RuvFDOYLZ8eYr^P162hCzL&gXMoZoL)g}( zrm=Z_W)Ijr*)^#VFCP_2c$#`}kUQG-^hfwImmmKLya7F|LA*Oss^TWeBU%k3u4uYD z7V=49+osooy*Ts$-xpAObQxlanu;LPu!wj214gtFRO-cwJrMW+us@=~(LWP4!K1JD zVDz?nhGFD2!<4)}HEMe~qS$v<#6YP>JB)dB<)TkWFaahn%z3eS8nMJNLl!RE%tm%O ztRqjw9c(xfu1jA7m(9gqpQqZ+ZJr?-#UB~^|tZyCihGq+z^y!C&+tX}NmsZ|Ex-x(0!7%r$hq zgUlzeMBJZJieI=}M&BXVC%A3I6Zd9HqnYxkJCPoD`b&|wg@7SubLyY+T-47XAkOze zKJi?sK_pZ4sB~Yy+^5gP?-ZGxIi{7g&Weawyknygu&&7@F(@0k)C>@j+w$`26wDAh zOt2zMxIJco7ebgt@wZJ{X73j8zY4lpR`QVxfDH*;=R{c-mRZfZvP8VaFPLD%C8_#} zjjnFmRW3ZR`=(j)#ZyiSj!$u%>7$wL6!x=Z9E&(>0|n5#kI*wUGymzsp80We@reetJdJQ;)LxrZ`0ga z=D5Oxc|iiF{(;(!V_lWy{5^z=*@JI;{ ztAf?ddEOUJhmDlx4Uv;thH8CRcb~@5K*#ljjrdjUyqqYm{jm@ZL-+ zq-nEK+t_=dl^GW{R`@n5hX=tgTNV~+=4MO-4xdm`*Ud1&D|@#1RGUw=7!-Ck{FIzJ zr&=T6^{6Pzk<428e0+7K^z@P)!gpi0&DtN56|f))bP6DGZc)TYoSk@{A35p3t?N) zK{F5ypa82XrI(E-I zhLSqX6nIsf>Y0dX&1^?Y3npBJoK$0j2gJDoS(8<-C+inGTi1cy8zLj*ghFH(op-t4 zmN?^Z(+z&(@Um>`f{dg_;peOn=+iLV(;)-Uq+)ve)v0I4^Nz9_T{}7T44iFa`t0uk zbm^avZ{KWfcPk}fw4dqB)-y-mKuSC$IH4k&=*(pc0umjf2yh`h zya)$n8~HKiR%@dnkKxR??aFfLJxr{mh9}^ zsgIM7o;Q;dOs%yWE6LK?FkT)~`45o$(NwaAo&lmuu;+VuSUcB4I+O718J{w30%!Ap zhXG1jRVt7yJ+;sK>CL$QTFxzj^|z-f#aS%OgFi55qMfe;^Cxv4%P^6&7)CSgwvrQz zqQu#2&m1!iN~HkcGgQ)+cAX_Tf0S3~EynB(auAESd-;=}sV%A$Yr?7pgqZFLGqeqC z9DmIvQVHp9d`7EMH#|mXWg4~eIOK`-gS(*$m&X1iZ{F%29n4d!dtomufk9P+yjG5A zJhh10izgqIN3v;O?f?U3wID14B_6zj>>tw?6Z02T^gXV;-j@W%32Tx@Z|5C^9!I2y zQvIw^^UsNHpXIk{pX4F{?;9@QkGS6l*qu9)n1U}ukOKKPub!htoC5>OM^fSx6xNLA zuq9yd?fp1VI<}gduH1ChvTh@?THEk5`>h@D_Zp<@JahA7sYwjmP%1N?=MaBSRa+*n zwVzWajL}doKA{jO<-t?(jT5&_4UxUX0TyzGia}FJ4j?TkzMu%5oKB1vJFx0FC7l9{ zU@?{5hc6z)@Z|yY?aCt4%i3*D57b;wy>F@auK)>J3}6G9+(%1CO_R&0Q?=y!k`l;t zKuMXp$kbu6x{WPH1bXy@V&lLLGtT9}7)%et8pJc^NpqW^Iph%Ya~O&`zZzxvWQE?i ze4BL4u(rb%@fMq{4im4LqxZwB6ss? zXY*;~kT7V@#`dN1jgwBw@w$8e!od`b+(>JS9_af;j)=2tX@{vC?bd<2p$dR!mvEy{ z=g6_eWHSbaw%4+h_qrRV?sosB_3djTYS$sLcn^ur*7&N+qjQMp#s=00m=rsz{u`Py z53IWbk9af)5q*lg3jO4k3>ji}0ptb4EW$kX&P({Ou*)c*>%xvzcv)c!SfO{UwaSpy z;bov+2~;0FK2R6F4i^!^#Std6$*nQvOJtY$Y`5)5b;iauxw0t!F~r4G@)@Zrq38-B z!Ky)-R;WRH{6-V_u>)ht81|4!bWLL?uE=FeTGAvusFa{4gna9?eCagB@?j+Nh)}KP z;P5sKq}Iu{*JA(s!iZH&M^89Td3h>i2H303L4ayJ-ZWbB(EV2a(5lGFRYilc3+@@P)q!n)tZavnaKA|BtzS9Kr4s1lfP(}$a#bYxxt zf`?qN!OivtFWAlY33<`Y_W8Zza=F-K5_|95Z6+cJzUB4pm8@jLXSoTV$QG`OK*<*& zuR5PWjb5cC-bLYI42xq<93T1!<#?CXyx{BouOO<7{`*vj$5fby=|fB`X!0yj&R2iA z#wP0hl=YA+hg4L8O;{kdt)M*C+1{te*(OI0u`>O5TnJ|x!>5cA)xwk;0j($|jW@N= z?O@XLgAWWRvQ^0)YaqC)6!L{5z=ufR9~F0?kgv#A*@78l1lG$4J5ZyB)su2XfO!wo z)(IJ+Z=)Csph!AZ9WmAfS(qKLH!Ku&j^-FbV;s$z1yk9a$^}>1oC2i>xxHLfs0V!i z$VvVIh5!Hn0|T%&FA`(56pE(<1OUJS0svqH001zwwWhUpceJ;nwJfoC4EsyD5vbg61n~EP9!H;wPIMF1H#e0uS8=M*K>xK1evk9 z)>he77N5{LlXY#Y(Y-@9>OA6oUeprL=eby293C)7TpzyDEuAWsD3Q$BmQThARBanZ ze42qJtwz(NUU0^;V)fl*8=dbwPUl0=tdMaNRY-(8LW26H3v|jQMW=ZjQ<_*0@oj6s zs2Tb1kX#kQ2@)Z&m@u&cD7Hy^bnwnHS{cwEK{TCJ_t6cr%ueNa>TuCiVNk|@=?AY9 zq#;zq|LQQ0FQeB9#up)muqV~-6Z}6NVD;+&cO?Y>0R#YmZ5{vs^8YUf$T`^B89O+c z8$15TZ%@_$b;BBU?nySEN01IL0s|rvtD68e)`X%)U2ibNg#iFZh-ULkI_hY{#!A`R z7UJX7>gFx877A)l!)J~c37X}{z6(Bve7V}1MGob#WCBud~byUpCDw^NN6*TdkjK;|? z_4Nj;D$2tzT%PNS%VCnXWV{75hhAkFE@fFZhdXO+d10XeA9RHToArd76wsqB6%eaR zYT#{~&njUsICCpK7g3!y>p0f79q~6G2A$<5*C9|1EL9u%+L20Q$Qc=jAr7di>e#^( zHg{VjBlu{Ew4|RJdv%}?OozkNmB2b&pq!i`!marMDn&heM6OKI54DyN^}bWj3L zsg==7Y_7iPrN$Pq_XF z4y#2F=ZBw%=pz<3cwFm84965LLebK}XPw>poY9m5LY zRP^->tPAE3Y$(HL$>Ih=I46j6HKtAAL?+Tp%i!^|NW9WJ-EG>PtlNhL+odZH{juT9 zyU*8abdN#es1VJ+imp8zx57Y-IURdeS&(yD3YC#(D(#5DFk5sLv83}g4{c-WpQZNL z)8x=8-?|XlacCVDYsx!tgDhC?P*+ilgVoX$dob?>B!0{C?^xhiFgF<$ZZxQdf9)d} zpb&ISvyU-iEfyWE)0|`Z8x4i%YmpK&eqX&uA~7!TJ`N$5NHPj zi#A`cN|~B!=BVz&cIELDTIEty(=8F!)=+bc7mYvIMu_ zw!sh`-^q0_C&DR^msHk=K3=PKnWqwNQ&_L^_!p_FyiA;yP9HUF9qpaUpD3Ru3T1%v zM17?hAfGmpS%pUQMtvyK=snzJIhB35V+5L~23e6Pwp^508fe-%3|;V(r-Hl47YsJmvicoZi+aX#q=Z=uYo=|o^tm~)9WdvIGzneUX<+5;@IA`n3rih2k~ zLx!WDATUsp8gh}tg>RG)eOI2E=BWBZWlc6nPGXlNzV}yT(M#p82`;ic2StIC65n}Q z+=4uP@g@TYvGk_k_LPm6m5J7X-#fH+lI(kq@D^DtxB@(4kr#=WyHp%Q8s0GjKZQ|1 z(lGEpOY0$IqZ*I&B&`B55TSU6aDroaVG5FnBw?iTI5Gtm`68SGG4}uS0vSPg153Wh zszA)VfUGci8mv4FUICD>h(<(AJt~d?4d0kiV8SFQ$s}lL8jL&>UV(ft1sca9 ztrM~Ksd$GpLhHW&GX?m6)?uHp31H3(U6h6=$s&@6k|^Lx7g1%1p)txph;ZNQ z=OH5~*qLT@I+L!;x`fHS2sV136KlY3mvQgcPBg?bkLh1}R2|Tsef!u8;Wi!WGj>)0 z11@sPXMAJlPqQ7TE}@qPBzUN|%B0{CW{YDNaZTbgmY9x?Qe;cRu3S`f4h;H)u{ed- zk~=qKq|PzGuL}DyN}YV-(jDi6SFB4T_6fvs-kZAw8RY6OhAu{r6_G$iT)B!FysZSb zB}Tf=u;YhUhs<8tEC_w^Z;TCU0ieCG91orM62e-3D8~>BQhKhx(IKnH9_`B8ixR2F zg~vc=zv!2&VhkigFC$Zw3EW+36*lSbJj*f;n;aUbQV{%;I;Cp}% zZfegeO^%?P<}-E?XGkXKM4Nb<6RfWL*0DP4nh;g^e{V(jVVv<+kG?;_Q{B%l++Oh{ z4|jNIur4`HSvWBkqC`!f&=pW0gdEhd4{VmUSbw=MY^mgo6sZ6q+X(_c-S{GLp3f?Lo`M;JAL~ zj6)ia!dIAmHa=|{%8;iLC2hqLHxNy{0+nAl(4xz@-UTd>el8%f1B(M6!hiCdytR}xr)(mtyVC8ct-xQi9a9lE|Y)g?YKjMFNH zJ}*&V$wazhsWT}LgJyb46Ow)Y%~mRr^KdIVEjYG98#<#c>cjz;815E*-;w6zP1SMqO}5Ij^_)^}J1jM8PsuDLymH84gCRZqE;jvkNbPRQ zgfy!)q5N7#srhQZQAKLwKS7D58}Beh%&Y_Fnf&qmZF^=lf;sc;k?&sQI*9$q7Wqiu z>v;bg0@;3fy&4_pwO+dJ_b703KAam!60{bYwcM0MWTjREM#e=lYurd_@8v&@QVy|6 z=o+P7`4wZ#fq6~B+Lzc@AIm=UxPNyUBV+{4@}W_VY42b?GG# z$~OJsvFsl6n0vyyHGUA-HX^tla_8t#r+%8_^;zb9o}*PvFygdKy333L`uKkRs4%T9 zZ%T)l26eh=OeX+_R_qtXSzqV#EPNsO$ot;8^3gKbeV=H-S}^?~YbPTdyd}f;CedNB zo9Bg{>!m7dB7?vfpT#)XO*>ip>$#@Sez0xbjy&8e#q8KEM?Kq`(th5RD@(##Jl=R6 zX^J!7x<1?L%ZNccnX}>SYWp`;kF7_I()mt-a%LAt9 zBZ4X#%C$Of*`S@8D$dh3>>CdEUVF;+m=KcIe| zd#qsYVVZbts1H12gMD9jya2x-BHmLd9`0WpKpYU9KRZxfV0UbGNY7b*UXXYBeW8H3 zFkQ&cIYFO-eTsdeeLk2I-b8oub-Wm_Xs_EaUQ~DXeVlv$-1ZRtc%eQJ@p-}3LVTdq z{C%+4{9U95d@$Y_`^e8`1$aQS{>}iH?z4tIocN#S>-uR0cZJ=i_@Vlt`nv+%0_{M1 zG2D^&l>+7d_2Rfg=fiA+sshB$1F8YI>{HHz>;mqBdYa1>8DB*M$n2x+gA?lmTLY>A ztOZ(?yzW7EgQc1U=7D^*+H;hcz5Y0GuloeMd($e}gY=^f`WBAUh4K=wC`ui8H110+ z<cM!$*t7KKh48|@d+uY+gSHL&B-zXKw*~A$er-{b+<}?o^t+XcKI)Vk z?exF(KlSv#l}vv7PCEHRJ`Jjv0h`|i`-d0k(`@3=u?vOlIwup%rW>*%7H+aX3 zwdZQhbCP%p?Q%N=Lm zEl@A$C-|N$kT1lm_nzz@-@mVoeYtHhiV@OZ);1MCI= zq+avIe7NQN)*kBxefx+119-$6^eGzmgZ7Zi_pLbQ`}b`Y{|Dr#H|SF}?g!&xm+xEi zsH|78^9Sd}*Y67#{|E8NH{_Ex?g#mym;c*!&zJ8fH|_`W!B_Abcj;em*$?R4PwsuA zgvbeRlo#|7DBsQkF8#`%=^B0Q%m%CAV}9~U=Q_W7wM{ulw8&=c2k4UImFSY?6__zj z{M!I8#G~yvP`q1zE->_|;SET4+zU(*?+<)jKd2J}>>w|&UEGm>qJEFhzityYU^{-8o0ny93~h-7AVQQw=(9~%(HJExdL5e^0W2WSJ=JSp+BU4 zbPT2k9AR?yI9J@0fO`y;@dIzwB=10X>uCi3?$+M~K=l}Mqcgn5JS&a;ezS21!71XRP zxV|ha&#pMnNjgct^G$j|m{lg2$%@*}6K9+mI z>#C6}@+;=0;r{O+bJhX98>J5Y^6~B!$m3Z!>A85xZ71~plcDDoLgJO82OzY*2d2}6 zhIsOwe@&tSHPA_(-zxB;0p2 z(NqTi>F4CvQ5K24pfzAV!wA-tdt~W%P!sWrAJVLz^0N{YFR0)rLzl4)6Vj({feixu z9ZgNRG(kce6koRprEoa}b;NA{(qVNf?>^EOAk4O4-s6DZdcDWfuylheW=y__!-ddv zJf^*L;cbI7Yx;vOG6Cl9J(Y;L>?kKZ-OnZg_3Z0vtoBoynm=+2I&tT{xNs12Ie#BW zTZ=R}BeFSjToN9(l`Az{tLuZi_O}<2yNW>Y$7HuA1nVIPB!YnqA+Q@}ADBLMj^b_F zw62skQqZ$MB3)Dp!LX$JBX|_;m3T3MAmtOh5y38oG5Lg`;000Uc z06_GA;4%SQTPtIIoBsrt|1Y-b{vWO^R@PM96hZo4Nukysn%06iT4-wbmp&lrF2*kg z1i?@QMSx-oNg&vaBos-BB0>~1edk@^jZ5WfV)S=mNR-KapF5X5w>^8h(x6AmLN|H9 zyIwDJ?0L+dtoeTbw|omwlb^GnFjw?m( z%!JvCkmqFRGRJMYysh@YKY~lJb(VXwDYgAnv!*erd$7+0odat1{?8(Kigf3U;i+w{ zGu6-6ATQLtW{M#QBGf+-hs=|f^m^&igmKWEW2F(*m`a&~@faFLvJlM^C~fx1eaB~u zc+W_ac@k-c)0D70aVB$IisZfeV@4?H_L^zw&^3-OB)Px;xLZfM^-}p~6J{8#7XPuQ zW3(q|PAj>7QFAt`)1)wrdQsh&Rx*DKXwr|OdsyUinX0@MWS;utxls`^P(4C7+OS@r zVl*IExTb#)&sKnM$!#BM%7lkvgE?!AL%9t7pW}f4WC0fkKrH8jCZ#@J5bYGMm)J)A5>ka!;2y z4IN)dimCzwvfeb{G|WVHnCWy5$fzGe%68v`(n4OpP#b87(f5+H=FI3p6tT6;Z$F6LXnTdpyT;%8(#BfI`dE~&^Pl&mdpR12)f=JYV z$OcWpa8-y>nHg7^;7LzCHhFkBsLNr2G3r%{WP1Z`Hwi>jQvY~^4gs_fxlxlZ%k`<; z=a`#9Wep#6i|n5<+1>9sU$emq`}_GLYmb&7Qn{x0W@0x!O0mdp1<=jzvh7tVBN$iB zRx=8%C?)6{nKk5o>0|J|$jQ7(q3+*J8QbCWTB2uGyD9`cSk3u#{{a3G>gZJaFMw=; zG0F#O?j7fgfdDN?;*w4#{)9=KmjIvHyZq^Vw@;19!&nSG;(63p_z3mfK4b@6!yo*< zuwOmlhQ;fShX=UG2?rHSUJTV&ud)nQxvoZaAta zo(U{}6DvNCg+Np=9Q<+F=>Yz$*y1Bb&7zDOPvMsEi^#jIk-~YscR{?&#mCtzxCh6& z_yA+sgd>?e#V1ZvQbTCXsgbZ%=Wx#*0{6r_jt2~ey$Xs?FhsM2w0hwH4?)9an?FH` zTtd89uyStV@Ufe zfd{5MIXxxqV9&t1#R=}OavAtOq*|_KmQPJq20}d%q(LWaO}j${U+4i5!bC(8pj;_L#R&9OJU}o z(a~MkLv>n1X*^bU;M1u02ZgiQiVkRcKO1r|bm;$@)*$!J)MnnYDv z?Obie0*IvY`?h-3>ln+2A%rx0-47dQG3%Jh@ST&HqHrXrGB>!(VD4}n{5pyaR!}-l61?cexWFWNU%02#**|REfuTd{F|ngvtoiyOkQ3A)p5y zO0pyWoGpeZH1bKGjwt*G-h;J)Br@R%e~hm^1TN98ZdazNv#@(&;ERVUl62l%(j^*X zOS6>aJP?r}-M6fC18d;$bJkH*sUsgd3b-wvSpVHNz6@o$j&>AIBRV-vM?Ap}*=CwW zA($@9O1%vMb1u;!w3ip8#U3{HbL=Rz!Z317}jMFTKCXDX#>z!FoI z6DL%wbnGNa89+>BO||)D0&5u3J6_$a3rvy5qmgu|}gB9uYcTHOuo8JQ`>C_UIE z+DMhmz%GUiEhV;*!OtzTesEg0h*pG9wd$TWn{GwGS`UcJa`1=8s_(-)Os^Z()vz75 zT1rK)7}hdufa8=5rua^ zom3pz*xoW1CCUT=3Cj~Lz?rAZpB3a}86;ZBOII$Mp{P2qDjAu{BS3uNihk-l1uwZ? zCND3Zr6y1R?|ESp`B+LZlkdl6KnJoE+IU_L*uy0T5gBW|*Xe<9yrtWo{r&WqGzO!(EQ|+cLCMG>Y3a(gV#nPQiFYSq4p~VD`GGq40xxVNejV^49ipT?=k>1W&o+`C zx_k!z9xn#FL-9G0Du$$kwsmdw%NvHLb>o|*wL6B6L-!`nu3oMvQE!IV0w2)^jWMJd zXi_i@Ul4>MnVy21%wK2Nc?dEgT>N)qq{B+2S9~Y9(NvW|607(T)&fRr1vjxp$*dQx z#C$$^2#GR$5Y;mJU;>gGIW`d4vDzXztcOm8y9P6HvOSr8R0uZ(GU&HR#WWV2S&9d6 zteJ>YdZhy}Ahrk%E}0)~ZhsFfLBtqEkKCdp9^qBr3>uFB8gGS>ox~VgL{H8Zg^Hjp z>p~)wF>Tayl!w-M6a3h6tNqUVN`($CwHEA*`gx*(35&tYl`LZ%P~Xf{AW3CEx+`NB4! zQHj*7!1KamA>*Jpf6BR}q6-JbSzl~ChdNcs1i7alT zNZHS53;Y&tN4))Q`pbh}np_4u$n#Rc&C?YEy*7Oo`76qLN8DLyvzC25pnEocO6ty> z)317VuG(NC3)n+)`w#3U*_)*7inrfn_)+)29uotZ%na#40RSxE{%4om|J^5LYV7de zofeB#EFCeAk$rR|Uu=@1tI1IKRj^RR>Zo=TcF5?Z>$A})!8rTH@rJC`B`r-6%~jX6 ziR~jKH6`--1lwBp@Q+!%$gY#n4~#a>j}zB+yOp%lj z&V-bMr)5Lmn2}AD+r0iMy@D^<$4qCP9s)^H-P^~<;#Rn2fTSvaiVZVLeX9-2sy&oK z_>}CigUmt_aW6JUP1r9!Q;qVdu;JmsfLo>8Sdq_yBP@Fi zw^|@iI*B*n&E4l2YkvCx(yDSOrLu=?>NO`JR%w{*p7U%3$1w@T2%#^~hZDr`@kf2*$loXK>6sd(t&jbC z__xXKf_X|$qMumBLwL}*t70EqZus^+A_C0HHpa2bMtQ=@0j+kvhQniGNfO@3+d1*f z8$)Ll6Juvc6X=a+yPi_AL*Ae>#|EU%DILsK&6F@<<)f_0+he@WdGr3+-TVU!ooTY; z_G}17Ih6S`g1U9~=C{oU5TtkIj%8>5j^@Su6}q&*j~p8I@t!RLXs|ViPj#CVj^-*@8ZC-i%~ec2#SqVM=&AWzlrFs%<_<4<8u zzyv*(16t!%H!kx}#LCulet@oXnaMSwC$8fi@{1ir8z0tFCPE30Z9^t9#ns<9myoS2 zSmbT#>e(6Y!6K&hM>CjHHABA0O3p_zbQKiXs~!LR^ey!{6R8lzw4BarZRFl!qiOlS zkl*BfGjhmk393@G2UNcy7oEj#h>QXtZaY=sWp^0fakTtU%U-zZ1Sjy`gD~8e)(||h zyT>l3y%4#MH53{Rcg)I(6?MlbW~CaYf12}sfk=8S4Xc&h00fbM1mA zoV4TZGx2%xiXyD0SiqcHN4}EUMxNuAx)g%_MhvI2hL1=A*v;-RZ8j5ZF#C*%6p=jM z8JVaKX-*tf_7cm%yv;I` zt7A_lFusT~ZMT$)nuP#g6yDg%pZ}+CIcG}Op6M?DKo&FrfYAQ{ypgiCG5zmT@}(`3 zGSbhsODE^HjCto=%CUYaSkrb7A72o`0!l?E4bqvQdzqB0?PmFAy0J-1abAHi(yk94 z{m4+Q*Fzw9QyDyNcw8D8i4Q%!#nKq=KImb)Yw6~yhQ+JHZM*3V_o=JT>6Yi|rY}!7 zpdRH8G(nUgzZIV=Tr(S02%!NRMF(cZIzN1PD>kq{ga&9Zd+H$MAcY5==zJW0i%`cftLZa7+?RPmF(XbpVh?1o*8;rO0b4%cxr9Z zg>D$suNfRWFwKYf{M9W@K7ul~A3O?WDEzZ^vkauv2F&RpgnLyQeMbuhoVk$FO00sJ(e1Zc}$i|fkDJbY|g&z+(L(~?8 z#jI@ux!$lj)N+7Ce}1hw{HR86rIErIq9=0;%(rY+Ih#7`;GY}=E_W^Cf;$+2PuuGv zij#F`zc5~7q-$40_zPf@) zBkOSl;#mdNe!(ELTl-TxVhx|8+%{HLHkyWpp>)Mx8eyL$Pw(GIF|$u4_&h+x!5|Xx zE@tH(gTKW&)ht94!Ls@{@!(+)W6w=)W-?sd3%jxV5VCWXvX5ggZrEPl_d&-K5_`}*`I)o zHnszyC@&46@866RH#y#9MypCZ^@0eRv&S4qg>Lt46rfMb&f;OV_r={EVihgt{bNpV zG|Qt+n!VdORV~K-bxD)eSWf$Q>%@++ktbTCwy<*^3Fe4Zd)IQHR+mLn9~fzCMi&%b zA}pu1w3ZrbshKDgE*0Oej-jK1>Is|?$MIukH6I#|MnKQ>fQ5Pm-bUN&}+3iTO z84yA;GvaD73OkaG7Q_X%#h>A4_pe62R77~*GjA0NtFS@jPI>yFoF};$pG=h`eN6!d zF}7l(nQRM`0a*rR8Mn)d!sDKB0_4nLL@}B#^{OUZ%O`xvtAZj2`zI32k-Vr{nHSKC z(5)~k*GbI^p2d+Oqs>N8_#`y%0osulSRmB#im!>@ikbq6dXsR7IE5uR#V0)6!;12f zT=ZEbh{jl8kJtmqt|-Bb?CsZ3X&^o*|16Sef!#PJHDV%c8G?mDv)dv6harT?N&tz) zCjrCt{*HZPSR4{hKq3*A0iE!rx)btOl#w3@z?bHz+I+dS;{!^kaNDGNWUc`3r{-)U zTyqYiAQ{>L+#*Ca5<*2X58OazrVm=3Z-8O}2(7M9{1~6V$7@Uxg8k%4aSFxcN*T#t zifZr_lM{gWsfk-&ko_1GH^{GGPQqkD9pqI|)es*wg%6QouP)Ha@Vm@PqA}XT7Q5w^ zYTTKd-T@#l(8n%_mh03}b+>wrxAZeMi+B;=~Ks?>65MqAK~)?Hi*svT|Fb2X0}~1&5CNP z@a5K41q#~zGlFknov|Sz_)AlD3q<1hNEvv>Ft|^(G09~E9$Ga) zKBCAU$jeu(PIbKShQ9f!+wpm=h;+$rNL5G$884#cnZT6Z?LzN&ZL5Xe3FQIoQpk8T z<7{Cn8G=O10|JovYkZB+$N$e=aSbEoDCM^xivC+xkoX^DC23=8TL*VVa}VSHE;m&x zNjhQ*!+o1jn~w^_6c5YP8D`#rwKU^P3~Ykq`wW>Jsv4}rfbZ9*j7)4S)HHN5i2DGT zQh-t%C17ghN3fB@V3h~(_J>ozv;!#1+4JZ9GM$D~EAYrsOnYrEK0Z77az73Z+V+6h zA?YJ{*J;d0GCHIkrAZiIFk&@gnX=E=PuU+Ori}(@sU5M+-ouQ7#6)7Xvhf_%v8QOr$ODY)h#}bXhtAbk9Wn@V!1WlWq6Xu#<#g&r)7LRVSr_JD2DM<) zY#e8V(T;}n{Jic&Q&3ll58B1SdXG}mqbX9pWMorr+K{WZVw;L(*=dn-jni?~Ij%QU zWshvDRrL#ptd*%EL0v1xP?}gI6YtM%N*d$C9w3v!W;W#Cj-f%)asmp@HkG-3H+MN| z%jwjR1tndo?^Z(ac8$a}jGe@$T;stVaq}qOQM6Aq?@6$?Driw0xm?)`=_ywnpW=#2 z8jmRvav7=)b)}->uSXcH*Cby$M_Wx51WoMx@^Ri<*w8n$tX3?GQlA%qLG&ml>ti_i zAEF2q=@=b?a3T?NpxL|m$iJp=c9^ddCgb;?PaXEC>Z4f@%)bC-^=QCRR2+v4q^>>2 zN;0<{q6{yuACFVBb%T(SWwl|vyWk@UC({Xrnhgxw*{R~ACuF|xg$m{a!HZ1YH@|1m z2$xioT%(~`t(1&+sS;k;i?&GI`j&gC-ALu*{vpR2f+VlnLo;uwFk}v9C<}^OSXD_i zOG_HO2ooaY*h1n`Qfvd7h!Yp3h*62>S#&598#Tv3%Z`_CZc1R19m^+LB@t0@`yf42mh0*dlDn3khd9SAMLAr(abn*j?}Ce zSI=lVXJ@j9H*Vpf(YgROm|#%ZcNKoPI1DQ~eR9$?6J5W9s&<(R^qH zzBib#Bwj9Wm&pm_T`G`r&K#o}qDYERe2?*J*2EwVSmX*Pht0g@sfLjG8N?=CL^IG@ zHn6(8KgFib7{e;W;Bp2-mZG6WbgV?Wu#kUc9dC0JZ*vvTvx0x6cK|~i0A{-@d}@&uGe1Bu&vy@t-5*7kvaso8Q5pR zX=|0uXHmf|ubCV~R^j@z>|!)oq!m0{?u;j&m2jJd<$3#mQTEkAbp&6R1b3JBaCd(M zx8N4s-6g@@-FdjXOCUJG-Q8V-yF+kTe&6@c?pAHpepNGdXS#Z3s;7Ex_uM}B9MX^0 zP6BtN(j)%9@>qa`C9zEzOw_-TY+fQCB7rr0DOrkqGu1~Zm!=5_-oXM0&qRn)x_i(1 z1IrZs>$9cl&h;V%slvtlG8LDwaP7We{H;Nw1ta{8SaSU$=F`F!=y$aLGg2lEIh2I* z>HS1Ly`RMY!2783o-eta8($#-;Z|yR*%oUkp zbcy@3^XF1Zrbw>|&qDWtL2Uivg+}I1uw%SY z5z!!lgse5s*KJu3npZ_*74M(Uzw@$qD6b`wIt zyPP39wXzt!^vDkiE|>-#i+w;4X^KStY8+X9>UXH}V`wV=$(T76my1YRB%e z;MYG2@d8QuzVTlGpfbhz5794%s*HL>0>GWYVSoxzJPP% z&HK3g8>TZm?23ZuQOI5|jYVkR;U7i<*j)X##!gUTM^tWQ?0h;mB*YDX<+ah$cI4%x z(&aVVWkY!y5VpR1fQ4lf`x)BF$sHP>r#3`OW`a#b{wq$dlXd8TrXix!`ju|Enx02? z3cK=eB49@aQ2KCBN@NiZp!dYG!$=2DD)p;zNGr*St6*EvXOxsFh}-S*@5l^>C=Na} zC@7Otnh4@1@>1`t^s8LiQh9){0+s84s$w#CQW3;-GY%LanTRTm&npp=k7QKx#C{}9 zZuS%_&Y5Xb>9BtQYPa&=FzF&>vsh?xj!9{h*`jncy9gI8esx~*xTK|62$AOt1meE5 zM4gSY)me+BNCwnVuDF?stPbPlm}F(#L0@}s!`HUE2KQ4S??njEZFRYWea|x~?mpI< zrLDj$-*(5Ou5nBs=_juU(ss=D9>4#&b?)}HK5VH;_ZT+`NQ=b&8Qfms>)X!CgO{;K zLuf<5I2H`)Q4#)q%;b_`ee>bxKZ?M@P6`h}0->~21 z>yD{Ue>AaeRz}3zt@b?_3)vIW5}UIB@R#-CKXU2u^fj&kZ@IZzT68f6ohnGw(7D5iO? z&@YKG>4+1?(%&FjhCHtsSE|>D< z(46s(`|MaZrucIQ>`5Ful#&!nr)8Ov?AWv8OKgWU$e4GS;&U-C&hh+>Rm8l$(?s9= zIMfYJe$_OK77+QVMNQC9-7ty(nI_}Kf_<-IZ@u3ZVg7Q%?YdS1q>C?`nXigCcOwRRRgGFV{aTOR zKW+47wi@}@CHtVM%-0>~G`~2tOlsOMLT=e@m#Z9TH`(Jo{%?8J|ACXDFsuJ#GlPK0SN#IP z^#9*C{<~AOcfe^9O3p&?f;Q^spr8Wv0)oj$XCfQx%qWC0+2NsS*HScU@{&{a#{DVJ zoF@5c9?l#u-ya?Y8%15zG&I~aG=@BGro1jR zu+7S!Ok#L9Zv(eI;^W)W4vPt=#&R^$4%HH~PCTLs-v* zMtgMTd+dF^io_Hj#u9>_pLx{&z>x7P|VaIC13vwNrCI+{UfPv#_BVa86TV{My8e169iH##R zzA3$y26SLz$s)07G`KlV+cym4ghL0X%YnQRzw{`BY%TssMJ}5Oisush z4G-v__@yt{y9fN1UW+OU$9h8rdOgyc8rB%M6tM$Q7=S4JH*qC8jU*UAoQAZ+!+vSC z7#(ozbx}Yv^9Cc@@!_WNaMnU1Q8>23ARwnFAMhy$s5ibGoImkc9}-WJKJ&@p1AK}A zhOzG20eF+*bJHCFAk?904Df3&m}15Yo1%+-*Yb|IZ`f{}8@FSKZP(pA%YPFK_!I=B z$$v0CQXix{;!BS2O1pNu%NeBQ7@bRZfNe|$v7InVsF`O)Z#n@M(j1sUlYP@qU`%ss z@kfW)xr{-GL3n+%sJa_DpjCda_u|8xG--4 zMCVrcKrE3zbS8Y+0T!8RLF;(foq__3pshx1!U02a?$A9yMriNK!qTtdLy65A(txpS zyAH?#0YVDw+P&b?=@%9WIM&^*BcF_!fN_7+N5;?`6K8Z#j^rg0SOm@+ql1MFkqEl5Jd;1}j?z&L(jEnKO}|hV_N4{TPr7H$Y>&IcbzHLZ1_CehAABV8$9(-a(SRXU zNKEf0$UePCmgd6s@5rLLAl^`5*)FnW>$Is-4{%y4-|Rx-qLf_%ph_3)EK$mK z@GS(EEIexxP|leWB-8@F=t&#UBo4g+X7^~4+~KnFCf17Fc>=Qs($G45fY}q87@kqU z>^@DQLB*+BOo>BwPXF2f0Dk`w{~#=g6IxUhxRJ=F>TV4vyakGe3`wxI;+as)@I}sa z012Wu*}y4moVXpk06qT;cZo4zrvGLHSe-SrHTJu4LqhGyQMPf-FEF#IwRX%iduEJM z8>lg?Cyx=t#t}6`Kj?qW0}xplI$&$tAAj;ifob+nUsFhX7+(doAQYEt&D z2~+qLod0Zs1k@W{CLhE#DT|!Z9!$w|`{bShR7{dNX`#FemurKoO`L%yW79fQmI5Xy zJpE(%K%E#R27ryBHI=6Z8)9w6Ok3#8KDg5C^VVyzGdSS$*i9F3mFXG8-7`>cVA=DI zldUzQ)_hR$trk~eiFGk@69o(zPwL6V-pXPE$Bx^pNKp8~hAUwgJo5$=B^pLGb|x|* zI{E_?@UNA>b7ecRKz1Qp8$a?KY|LxQoS_~>mAE7Wi)@ymuH=JZ0er|EVW8FCWsD<% zgc zo?He3M3RSvsU!fR|1pgqS7y&ClRMJENy$rf2|hp@LsfHtC@34Udz?+f)fs|UwnHNCe5L>8ryg<*P%a94a)mr7Xo!3+@DHQVf<5#kE`XOms#XCg`kxl%Ong@PM^$*p`VYsm z%luAvaQejLgKfEr@LXUD>8h`DEC4VcbrweGi1{*OD3t$F-{U(nBWTivf5s(u?G^J6 z<^{^{onzTxTs7_2L7L$qka}XKQ&ig^jrZNXd-N+xI7kTv-&{WCU&SGe`9a{%f_RGq zpt*0%KfJVF^IXD$449UpT&-a_7LbqSdinU-*f{y!4+u!&@g2ehBoEpbNRNb{fs3jW zzJN2djSWV&@h?ZH{jYG_3Vw2|%dBCnPP8CdwjiUH1A8a2DxO)w5TU|!p3roY?^66R z>AUGX0qIy6E?j#~m>`-$zL0bkwh<0jft8ctzJZorN zAe|>S-HXl1PV8&<->+lc|5#o6!~}k(1l5MJy=34#sziJvdeXNPDHl(BGLHMB71FB{ zC=~Koj|QrksWduJHeY0~XO?_{9l1nW_HRaZIEmMU0ueZk?;jxc>5h!6jq6T~e>KF- z{E6aZAlFJly+Pu)xIOh{xPXLhiQ*6JUS34{gl6p*x#>Wm%E$UIeu0nm7=Ebzx#;f= z+X?_b^2fOtq0iRCy)Qq`MF{CV)+6|F?oQzXq{nSvc>w8U-OZv`hj!!q*y%jr^f1sZ zyg6|MSoDb2oOoi~B+Y{n6l-#DJD<4P{*8c_FK~PD2EL!u z1(ssFHAc!SudrT64R!%~m7Hh;r6&lA-QK}PEJi~a=K{GwgcvhTBeI4R69MMc2>81j z)fxINA145nU?){Wtt_%tOznoWa^o1yt?DYQ74ms~C!6ZK-DOd?v&Z>taq@n&+8^1a zWTr|@jmCC|>(-mP!BO!)_Z4IxC(-ZU-$%&&nqBHtZd&4oW=98;|J=V&77=JFwHQ7X zlov-WE-WlD|1Os>Ak1iMW+Y3}P+3sSLBG(^(CVsb>@2ai@-P!|HWD>^x_K@iTtILT z%tQUP>!6m5g5IV+Xr|9-7SdPsT(aIZ?KVn8i^nP)Yw}Egx9%}e=d23|>Lou1I zj^h@y%ne#wg!E2reO5hMRx25y_(rw#_02^3r@G0 ziQ4!5R+!|dF?H32#cC*rYKW4>uZvYWt?jMaYBGA5>Q(gBzx#d!@H$E>8?<@T&D$CH z(PFRY5?ym?NM^j|m)py-LYvW5+eS8gw>@n{L;SwE+}>&BsO^LRdsg1~Z(3^U0D6F7 zum5MONOq5z-gH9^+TLw*@w>fNGtd!g<|cffD9#NNY2ba@+^=Z^9iEE|nz!OiYB+We zBfkQqOdPo!&>A|~C|_3Z--SYpX76~rmK_iiIeY+}0-@O(fI{|BB8+bhfo`e4jA7+u zuVD)xoGRh24DqjLogPwt>T|$*5*{yraJKfd$YV2f<9s?77FCg~=}=LVXoecICSy2K z`_3 zV6!_@iUA&~zHW>cQeN^~OQUlL5f3wpHKOx8Tpmj>o*}*3@zS2%DmpFP$jed~1PtXY zF1*_ysS8nntDj^Z4~FtM+5Hy+d=yo$?|E}uXP0*sqtnj9Fc6q~(sUd;B1gmO&gL%!0)KB~5VZQsu*r(}vv=c3 z^Zp4h!>%lZGPJIW_E2A4U>)giq9&uE)JHX;7-U77zT9JTZ!5<*A-IC2H+qgyTR6IRfg&7EYxw#YPG;5 zaf7ud0&s<}jg27CvwkpHp*lkRnfZr2X2X$fN=Dez0l}?`iO%?so_qr<7MnH9K>F#s!o2 z;0m2ddOxk6Pfrjy{lz~W)pALgdGk`16IzEW$p*6E{k})Brk*c<2yG1=;cL`lNZ_FL zt^m3uyc!S-nJc64!uWSV{sk%nllx2S)<#= zc=W?6zNln(0YVvW6Vhfo|yd35dGjYGeX-O-?l_rMu1GZ}#@w z=r$VM^F=5qRNGQoSY=Xe7?KGk!l1NyBt!RZ@_#6j!ZdKaJhx>J_^o~4r}26*irnof z3GMIl&Yhvb{baKOFv?EKcl#!uA%*LOR{2n&Z6f)Ov|r$xV2eys-CUfnsm#AFa%{2;FDtXvjLc2x20-;9RcP?T{3Zv8^l_r%vxXDyH9W$6fe#{DUYR*hJI$j;l>t=$LkJadE$Bz& zEkJ4cUGE@k2B6f(jQX*zyojKL(DHB$AN;DblMNUaMKIdKHo?_c%A@*0O45+($O{SQ z0@FioTXyipqO3YlH_ zrqJn3GyJYD=`^DvX(z+FE{PTivc}LohO-iYy4P}nlT$8x^4yfxr(Q0h?@YK1hMF&% zNbh^LFwsj!BH%m2ng6uJ+}!+QQ}@*=pl=yf*l;~K$S|;V!tLzVorR$$|LeC59N#n@ z9w<{koukH!wDy9)i&WG=EmLSxuZPv{lmIXvS5~f=+RN6uKtoUG#WtCAdmR z=i(rI0)nVBOEoG22|$|&eQ!ptGwQ0AhHa0+#}RiBuS!8IKQj^K;Y zE7;%il*rbOD)9Ka7Ah~wX*r><=ryD@3Z&Dhuy53c8^MM?bJWvfFT+-$a2XG%*{Y=HUd!fNX3(%4VFx@vSMky#EzeyM7- z4-EV+tA*qGJsnM}z+ry7fk82tpF9KAw1pLb8&1lH+V7FYq}ax5%?2;}RYWYLW<<#i z?vW7=)*c-8z8T!==JCmyYUv)X3-1GO3Qzreg669}Mi_aN_`eV-YsqdIJxP14qfT|f zUKbujyx%6aJ;JeeP-||iVl2Nj6^XeX#kQ=L(XEf2rynz+o&6Ct~RhejF03W$PX__>MQ@YD~Yq9$|jb?e?z zGNaLCgzHm{g$w9uwtq2FS(&HKC{M$KeZ)p5jaua;`brNb`RxvY(z{~W@b5=oL8(}` z$Sw@w-uT6sQb40v>7KmB1w5BV_Nm2?R_!3} zXB1o1RqjtH<;XVFfN~%*SPiow#3t|*>O9XXqj2EcPG!JknvXSKh0VX-BTT|7mMifH z$2i#{rbeki2#c#qJKBm$9ejed_p^JHMQ5SCNwJLwDCwo)Xq4jIDssEQW8@Lcl~# zB5GxY+0UwQeF4RKHm5zF!u;#n!f&`=3B@SS*Zo6#n>RC{ST7!+Jk(`y*$wA`nG%vI z=$6Rv)>d#Y72{P9(J`{$V$`;g@jye=XNdjvxjJ9v&-h61oyACHgR+Ec2}w}m6^pQf z^+^7zA(hi~N*SdcioCVl4j`cq$}~`0N+^wSoEr|a6;DUs9wp>NvLe3=#oZN?4Vi6dN>Q@&Hx1VL@u=Wrrkgz+6+#=v z=HkXYzDZOlrpXFiojS!t`Dp?JT-)%7?(RKZJkFjBxy5T zMvQY(^({VRxq72}LObj+}YqLF?so4amPAl!(^Rxf#YDkmon6kdX z+iwkAJKB#*Om@2$nX48Qd@d?y&Uk3a21*8z)7k^( z+uC)(0V=1s&gG5Vn8uTQp!@F8rPwfTt(ei=V(m@AwK3foL$CCyx~6!A%3`Tv)z2bX z)ez%b0&E!K#&R_O0Iq2^vPL;nrx!zZF-WXwhGsId5)JPHF_-W}>m zS1XlfDl_vlXU^K?l(fZO>zzK%RRc$-j2OM3V#ApcjN$H-%thB$tM57@@9Levy&pzv zKt^jFbECC%rZY&sfnL~vB8h;RY}QKq@yquFF{QEf6zzj&Y71h)?n%?kwRCGIz91W0 zi-w8w@y5?(zJb(6>mlVPET;QNn6Eg?(Pyf{fe5kUDQOdo=uLSxcobVQ{A*Oue}Ck! zUEsE!8|P=tc=sTaFrO_NYT2WXU=vEKTT)+t)#KLIcd1Qro6l9 z3c5HSAM9ZIG~iFeb#YGlS;%%_^UJ}`g5$r;!(?;Q{$NM8?Rp{dzIuE1NMsX8^V&5K z$4>UQdp%uGK@$~j2UF9L%`frXD4%Bf_Pn)Pk2B|&P5FjPn-(9tw$%q$>X*$)>#enm ze;wJTTWivvW~GxW6Vuw~p}|3?i;l{=bot#i^4zX%<=s_cZ7XHa|sQ~mOLPU8_} zw|qMEaz_^Q@37I8a3X{bJ3@_FB7~DlZ*cb{H(3ox4*u*8A>f>otY(e| z+VwfOTRs#G`QO}8-2M73v$g&#Lyxgefb68Yut<<`o9dQInnzB|-kZU&b-HSu*Je*rA(N`Yds%l=@ z=ml})_;WFAP$C=>$@I?sTzt*z-nNX9569TFP>E5Syb_1Am35tgv{X|qqx*0`8!o9| z6mxPzvNGqtr3<1C5>C05D)b=naW@7g?bD`#dhDgZqokgF=RRRREax)KDHox4*7?bl zUM=d#+(#z~u)8~HSR2tUfu%(ts+++GnB*Vvg)Qv>77F@TCIKS$?nwwS;*+`@sXt!v zWp)WYzz^gwFb3E0MJs)Vp8H}b<>r}y!Rabx$gkAi@c%~{+In}!0 z`gm?c(^JdaXa^aDzm!3|BxE(ZoMLHzZ|4GYkMmFChjRr-tDp8sn$qA|T9Y5XBXU1p z(gvE9lh-^EKV@UtfupH)cs5m!RHs?e{rI$0o5qL?NC|5wid_j4ZXBevJ(L$}PTs2m z{u`CIg32CU`8K7uh)rTaOjyTVO(XGGc9HF2I%A zQpvlR`xwGJ{v4C#U#N1mIrhqpdmqXDzW9W)L&Cge|*v@CnDy0!RxG z{q?3~KsK)0EWX~0l@wo)zHwXM_+&H5%gF4w23Jk4skAcTTCQA+wz_p2L^G~z7iW)) zzGs8x-<0enoW*KnRqWG_5j;SYwMTos`(H41Gll9>R0V+B>g;=~v3_9!f%ZTnlK%=D z3unV%aM0gnN~}H~LigU4D?!&E;QgWqVnEYbQQj9UXbVD&sT?*SxvdrqM9$WZ%htM{-2YZel~mE#OYdDdnR=>zMgk)3RzFjuC8-L z%yQ~;#b(8?R@Z5=e_j)a4|X8&PxcbF#oiS8bRw@mRnUemhSomBjVqv7dIucl*hlSu z2niI*MLY%g>u(+r+I`?f)E+ZSb!^6b=VHQS$`83%+MK~0g_y)sDOoOl_U5C49ExbZ zK6Cu#(Yz5Qrp`*Y%+fiR<0x5?dk)LSDdw}hqTWnYI%s=CCsD5+p zSKF6O$P>OsP_+aJ`^OyG1e8pKk0%<91iu9FbGC{A-SX>XK!Ecyx&!OrJ?b7hpKM^n z2oWMEmqah!NzgWE309(OIDFK@9KyB6R1{?7hVX#zb*nZpF8~+b- z#7l7!v#&|rXS;#v$PR5Cf^~m1MwFK)yn_V9(bKVFCuOwO^GLFj%cZzE1xqZv%8aak zRwu?t7oR-;?n_fGsG=KyEIUJu)8tGJu;)~Ze}cuB9I2!1Ina$i&cSdE2P0&mh#iYx z1*QaVkXi8V5z-`;xHi_V>mLA@GZ1*^F(g8fltgvvi~k;Wg4&S>6e>;qB@MEF{fMBk z=kQB^NmLFx0~^|b&5dTMUW*1n^pfQ(5%rzoTQf-U6HCw1NWZ|pSy zJ#5(2#+-=0QgAqPt5$sG=ZlXrDGLq=!FXS?-8nqs+NwHp=lEM_yqQ5X30%?X8rHiJO;Dv7Yn=gl( zmsXwzac_gE4(gh^`R~XSj^lhfZp)Y34!rB3v1=28DA%3Ag0NKQ4Dkz5RjUcP(L0$u z3$*TB*e8Rqr>$5q>K3f{Q&)MDXT~W0zmq{PK|#1H5thep6$Qoe+zwXpa3E|@-#0nt z{T196T-hh|729~fgs=^Kvr$k;Fjui8yGHb05%m-n{&iv6hDn;@~6Wy|O@uc3Ia_N`Un=m#RJk=%U8re73 zUz+6f8-mIxTgAA zD)d${k7@N(4cgkPoO@1`rz2TA*Ss7SOXLFo-DB6e>ftVOzu{W`D6S2|7kBMG`ltr$ z>=_K#G)dPf@hWMPRZU6WG(va0Zb`9r(V20nRc$M)cqsmo&o+)P-FV5o-7^(+-WnjE zGFOU)ByTL3m_X(n|0IAl_KYn*qu!r=Tan!iFEt+P>L;IyKir^g7O=L8 z$E)e?AiiR67uTJq-0Dv`MYl4JYM0V?BnU66HaVHgi}{w>btb4QvpH2nTCX0}E|SwU zTv0}5AZoLpP}>*qi)xPoUgl7BIMZ#AYZ%G8qaidOr6$#1=*qDwcgET*{y`}s@@pD~)1*!HJ#nPp zBqt%CrKM9o87nSBW&SfPIgBT0l;}Dtz6my^YatFrd|Td_P816M5wF0WCxy17vp0uq zCdZR&7eB>X+fEsvI4v*O_<6GNy#x8O^5&*b>NVsAJ>iDDLcG(tTED4Do9QOG4N}%? zV1eAA%?;`JrK;UvvSyeIXqw{sruJ6Vd>1H)#LrOo9$ykfSSEFa9gmu*~ z>ItW@gaj`UiJB>2yi*kM<~{eGNSm2*dVH(!?HMWt-mzmOx5y@ZE5_0(CPZgXa@;!y zyL3rm-jQ1P`YpKOz_cLQrYA9$LnWVIh=Q(#{bGWz3HNEB!=|Le|1S9juVaSh3 zrnY-d8BAztSk{{fvOP3SR;G^>zt@-Ma@iUxAns3eThs3pvR3NbKuzk9vsMa)%#KIt zvEdui3P`h2!usi^&dF};#e_R?thNF=htT4{^N2&EKUN^qneS!Xz^{Lu#RK=w*{389 zdF9?3*NI<{YE+C0$<ekq z%r;%T(VVBoBT~0HenKn$W?k2o!GfRxW+Ml)m=x}*BYO-G7uDt-G*4pAxQ ze`n6kOU1)lGB;))hM0H>y&~HUiaX?NXE3A;S~1w^p3PgtCC#O<+vG+|yHyx@M>ozU zpEr5zIP=yeDWcOI@wH-?w4IT2`5H4y!gSiY? z8D1H`n(q*|FudOTitY!!RRD@_*Qq<&=Z>0mY`WV+JJfOJWGB^t?C?2LjIC%TNp7&mG}w&V(fe^M6;gs#hBNpN(wd_d zc+Ie3-^_o#%v!C60qOCy8*t}TEDyenwXe1hvR4cU&FSSh+U9F*F9G1k0pDL9DXL-0>7+3v|_b4PsAIKP2kMv9F3}Wm#h{lmp+oA-I zcQJAGwyT=g1^J9-l0Oqo$KdD~TM->fT5W7in>qW!EEH=iHZ<(Lp4gD0svHcIkM}K@ z8Cw@S_}q%yW4Gsr+EaOwzUvRqdpw~KERj%DI;$yo?<#F3zFagAv%@L`!guvK4aMCDwAZ1)lV5?|o zQe#{_*?ei!wXM{279HeF@=YBs_~wS3%96_sMRu1JeZiNkH~TXJS73Uh`(o62AX~xJ z2piGN8vPL!r7RM<;doM8mtYdUmz%=={D|3ZL6ak)c7R&Q$YjR#AwouD^zY{3PwqCJRT#)d=?+hdPFL&lvGG*6fAkyMMvnf92)-rgFOT zYUxb$N;=wiX|2-=ttZPo2FCbtHv(NY&jpd>JPL;j;3#^@!bz8wMz%6*kGA5_KFdjltzx7S#41?OC!5?{b@0Zq%)PhCOa zp7qdVr0OOoNbj-sh%TH5WcI|&(>?`^)md5 zLU9;JP&U}rmISH5MU86u{hJSH((`|~S;*t1bc?eq1{5AHF#OPV_ zg6V44*|4`KFi~J(CaA&OwQDp}zY)doA(tpV{eu_L`O-XF4Qy^%zB^R4&~(tx4yA=peg%R^y-CA2VB!7vn9nXRMj+ zP;T3VmoT?dU2_Yqa!R8Z!h_RORZKayEKSZWlT(;SwYV)gSA~pGR@8v67t{ypWYNck z3aGiuuSHv7VK`|TOEs)rx@ zd%|NfrJ*#M=7Eq>AllqZkFxZ0drUd|a?VODRVTp=e!bYNYt}fk2qfLD$ROOQpg$ zn{y|oTbNt%@H99CiLk3al@sr~#sV%9kLbo~+i;S!q+Fr-&K{C6IkiYfOl8S^NX<8= z18JQv!^c!-9SC31^?b>u62h2n&3*@H99g71(W@{01h~~dwHCAFAL<+s9H@_ZW0}d| zEpc*aALuN{3*aE7q%5e4nCjX16rN(DYDh(6c$+qp?|T`h4Xvfv8l_yOT?W3so@OH7 z3XFMgy+X)^ZSwD2RJPEHSo-5F6;ra;c5^MD8bg-riwKUn7%;O{nV_A)XKh%w6XUiz z*e{twmA;iJBnGE&)Qhs?n01@qh|ysP+n_tXD8)Yrm(2;o z_g+`Mf*W9J2CrTxu?CEZ z6T?UA#d5jBv53sE4d%=M<^heLjfC1kn>T!khJlCp_Vp#cjL;1)$McH((o}RwIi@Pd zM17}QcBMwv5RdG*N!4w5(Gls)?k6;gBzmMy;pds!yR9Ta&7_p-$Ns8A zUitV5&f%;s|NFmx5X=-8iwx2DAKFL#wH@y}EFb)22A0`WR#F|-+M$m{bm3n}2;Dj- zw6oR?cXKVy`wXsd4j}PzCMT?Euc)sdO+IQP4AKS$5W}8Yr0aX#`F+c!yp3=`@?!Fj zH|1OcDME+lEGX8;{TA^peFgQ{VRQXXPIO3LBaM~c|RS`ZcA-uDk;Lg;hdchorxYPv~V+U!k6#4g=wAn z%X)`im&(G=`}nntWre#EbidGzxd6Dw9+2dsgQsj;xBTg-cwKo=5!CEtvY~qOh%Mi_ zmiL6I^(F6(cA6W&(14f8OEo2DtP-&-!@;D&Q;$>B8&6p6d;=9lt-88=d3(kpYAq+kGckfa~wM!Hk3K4O4piZ03J1>YRf%c$DEr8c7I(7W(`%xkOJZL zWc1ERU6l7P?uOxQONbA=+xjf)1i@Z~_IBi4P7k<_4AX7Vb8SSuZuXC)jx^2WBrCrj!EK_=4~P$f+nX%waKUXV&1i@ZWZUnF{No#vVvkDO zg48=CGz#_)(ik5}_8(O1en<~i+kzD97BKHldma~^q&o(bEDjH57{21&2K$cr?gZIk z26)$Y@DJa&J3qshxZ7@Gk9rus3eA^M-h${?Xdy50;UAj8LKqjNy>D{OxkwL4+rD(` z)xj@+?7J{7{DRwL_dY7&{b<%NLtcVtw_?d(6Yc$QFIalt)S9~xeEsmYg@RvbN=2`g zi9@eFiQLp^1oVA&nH^?#Z8$DYdhg+v(3!E0gm;AhuDlonaB&YV5<{-OB7`L-^#H`(WPTF^K8bm3oPo z*4cWA7-nO!F5Evgg&+l$g59t#C^3YzlI$YGbLp>25gwhlFPLY~$$CLzt?A_avVW&= zubsqRb+;$6E^>OaS=Kwmo;yNxsMld2^_h><;hU7Z@n*%>^%!?5g4@KpA24kHgjZwS zr64was{QrqQLlRjERn8DY%?F)M;`ulcQ3ZrKydqGzZCwui0Ed3(UoiefOmZ=_6V{4 z9MY!W{Jqx(*H*Zhsn-VQ0(KiVq)n+A4v~v;opU=>TtGssS+5xmq3M%5&z>)2jcWaS z?*`*KQ|~#hGaBx;sMw<&xpx`ugAuuRvwbZ3MLeW$l6@@h1zWFxdh-y%gL{BmpuGb2 zHBH1buU4=E#>KDRw>Bxi40{E<3m~L#34AWqdVPpjjDK#FkxOa84ui>68xHIcLz1qz zT9U8N&{lETt{d&@50-rWR=t^yoHd-ju?yvK8<`lW5h{HoG7pG+!njL_XLP$Skcf5~ z?fN8PcP^yj{W{<{UkBqiA}NG>RN>+7wd8M*?8^bjWSjZ$bkQmV2g0FPm+-;hc0C}K zy#!wzTR$Hz+3rrLRdMIjzze^h^P;eRS*vU*wLdn z`HHB86z8Mi^>9n~@<4mq4oA9-_80P$+3bz8c;uTk^`?KEA$BbcX=OzR0V2d;dk-xG z>0|U-5)@Gb`h6oADdC~u&fZd$Cz^;9oG@T>*#Pg;yz3Pd?#$xf_Uj1yUN3pZ|Lk z6p!XTabR2*S^wX-&*ToH&Atvv(jzG{JqV)xD@TrN;-EN_-FCu5Qle^41>xZcNJwrP z9&Q?}OFDR-uQ9i7aEBZVUY=l{un-X8aC-Rzqf(beR6+J`_=#>{0xw#?AyiHGUcu^# zsmqspeOg` z=>yg!6kYqdGbx(#r6~N9MOIK4(J)2-OPOV|Qr1uwy{GQI zU_czrF3x*W&@Ic!8<$80weZO9zB?pM`4K}b!A?q1bA zjjKJVoaey+?^mTLcMtC$4%=C`9`VoD*l*&9w8{~A0uYvH*lGk+0#b%(uKjG37|3O! zFhA(>P_e#WSqJcDX~ZcIeWAeEiP?LKiByZ{)h7L4jD1sdCQ;LFY;$7c4JWqk$r~FJ zPHfw@HL-15Z=6gfwmq?vlkfcNTzu=Ci*wb_s=a$xcdhE~TD`04iEGy*I#U@vc`V=4 z5QC@g`!-vbDQYt4>Ovli*@>xW&!s#m6K~<@SPLwLTUPZ~z>NONCxEtgJ5_lMKcSQ2 zWgA(rIh9u)(^AyADQ_%%U*9gyrr358z{Sh3IS9Vy5R(-6sdnTT3rfhn_Bk8qQf>mxGrL!k4nHR{PqW!Zdz5~A|%u# zYTZ4cj#_!_FtDd9I>15#i@U)Zy{)?M0%oqVuuTMf4XzGy7|a|_Q@U>z4CioCayR?} z!W|8ak9#&2k`KBL(LXCOrK&^AzO(puu+th*vpa$#cPlL76In>bK;@lXJybh?e|`Zh z;h_p@nEI7UoHVD;9}0;}ser0jMNXB)pHMgTg7@5cp59H1@JV6~4W**_A56)$Y(-_I{eAhlO!hNi>uezsL>GU}BSdrbzQ^Fc5GuavT3i;yPGb(u z!0zhs{0rn>z(v@W0PE6}hJ1zhXX?*p#{M?}=F211Lmum0JoZ8oqNn1%sUgwqA9m#3 zEZhSVUyD7=%1?ODt6XrFFU}=?=AKMD9}{?~06isme<*(8FwA+6BXXxs>Pax#B``fl z1mR8t*6LuWWF4<|h0%BM!^6#KTfkxROU`V#NfXHenv;1%oP`8i&6w9C!KxBe{T?j0 zo#$}E_iNWEVH;h_NC;m=QglU#dOMEq9}RFvDRMFo%m4S@%@)SL3E#LP%8~%QuvJQ|W&QNU^n&j2Oofr&eo!mY{dI zyic>blDep@|1`EwRrWA$UkQ&~Io51;>iOh3F2j=Vq1tH(1w#0os|ZCD&w5PfMPlXg z+&uA{;qmD`A&R`ok$$8cXU}2yF^b#_fx0b2Y_X1(8+~Bzw z30+09eXo@3V?hPM31$fC5gG)hSw`5OAC#lL5LzZ^V*zm|UBy+cDjWvx?2hjo{F@(x zHg0!zj%7lXfWrSLI5!g~{a&{i0rQw5SOey;s>EauyHSUQVTVQ1FfF}2nnF6$sw!H4 z)4pXewLC7eJg!Y#x(A{^9>jM{u*Trf*a0)dWkUZcY}S~8L-^%fu&lg4A>eIkV3)|c zsZ?tas}SJyu$mGGRlq(R2y12Mk{vADdN4I`iwLykFAlP#W*?|3eE0H*(|p>gVhByd zK3;v~iQPU=aBHxNm~qT+Htqh^V9T+mK@6}=!+SZn)38*{AzAkc@y`VJLV*mG`pZeHA znS`Fr{`!#VOCyFngswTXqxYnR1O?rr+a<}ah5j2*rd>QGCE4Vg~@&n2l3{b z)=i2HE1TdM88zF9a z`n(0<;nJDmwxhtjBOnc8xvDjw{;3%rHy=0AAYhe5KEUihn_*e}u1EFgq58fBGwD`< z&lvg4w8c__ON+2l)`jvRgRsb?7HXkE%hp_(Y`WSE3Rp!3)vr#0idStw8>=}W#8o|z z2C0KsrxH=gg{qVlYPpwXTv_E8!|{6)&06`PKUz@g?G@68(?IL6uM8_?RL<7_;aIk1q6OO&}JfUT_*?_e5L?5)?6;Lmkt7 zfz7CWq(Hm_6aj0=qwc92;(7x997`qezLU@YevHR{X*6m6;8|JPBRk_SHt9A;fp@2q zsVvQ~z9SS_<;P8Oo#`HW=#u30@TJ_4Wa0Uft{D6MbZkzNfM=RJCfj0NSdk@{vJ{Ub zi7i89+K6pj{jV^SF}fpwFGIIqk>=B|HPLE$Vc+wCqkWu#vNdyf-_;4VVMRW0E|o~)#7y41udnDk(H-}e@ye;@mnpr;Ok-Qp^tVd+QMY!#U-yM1(+>Tl)9#fmf9CZ&tL3qF*yVu<{GN$u zYM)VX7Rx)bESuqC2gb|sA&kt{1UhyU_bH(QxU-4X?O6mGwuwFE`zP+60_{#@LZ0vb z3|!yc4LEu#?(lm0?vULL4BVa!hq%qlA?6ipVEKyF-r(P9UrBogwMK8AZ^UgL3Z!qI z2*hn3bcb(VbZ2dz`9uhAZ%B~b9L!01?;Y>;gxmoPFnw0tpnRs?SbXMMb9zoY<9aT= zVtNj|vU>JjQ+l>q1ASMQlzNZ7Xx}@opzk_+){f(R@(O$J-a|k1ljT0?@Jp>EQabea zm$c^cJ#FXI1$r&A^fm9gHd~Jgx(yt91nb-b1&iG41*^D!$1w=XlBjr>3-&ze`?T&Z z-2sM$P8VLE?>Ifl?${?*k_vF=qR5JNO#$Y;vKeq_*ssN&R!wen#L;t#;Xg&Yf-L7I zjt|g8Cs{*i@!LH3njY1+io1n;4dWg}=n@dQ6O3udx&!sgY1bc7S4qCLA+##@cWdXn z7f+H^O+yV(3!h(OdN!fjEeW2^3FZp9&w{gApm!_1n#2lPgqDt}h}Zr|1+N=pD{Gf} zbuN8aAuJsFwpHlUqw;EulJ&1FQR8cgrwQVVN{sF?l>yJDT7nwo$fG_a{~6OJJ-E#p zpVvMX;`_{ATc$ZX=#o;p7?A7*fpYY-EQ!RNIbDaKPW@fGY<^Gayup?nUd>gt{NhB4 zhi7p^YtIj@0u4ZnXG{aoprGpSqcW#xrfYXBZm-0+@*&{;r1_3F1W=hG>M76-?yZut zawqATWK0X0a&Tvc76BW@Xc8lcl@9Wu{f_*rFl7@$umFqh?4)|TP}a|su{&n7=2&L8 zD`*oibQ1IjMp&DMzhwV%wkN3LrDrwaG#6^$Go%4aG$;hg5gL%%YiR92-mOqYe z6aL#%{m??;`=7%1t{ePeE?B51xdJ5kv464fv;%Xp%|HUo9YQJ+@#V4~K0M*}DZ2|x zw2*hrAPXNqv>k8|gHLxu>1L7YS+#66@sHFKMi8$w<}8=v^`et9a?zTwcL%H7iJX_= z;hAzO;8{1GcmD`3kxoLE2$!-SVianH4(db&|HKu`B(O}?ldF3aJ;fY;Ulnd}!IZDb zKt#S*P3fOy@1uoZ71nNt-s|nhGhb7$`j$j8Px9n!)Lp*@t(Y7wSmd20UwDV-o1S=Q z7Ft0Sza*?j*C?!)OnEt@d@Y*5g#3Vc( z37%Q37UMV&x(!(?CD$rW6^6F)eS8m#{>^tyc8Xrwt+P(~6N5xI8bBzm1$nC2HNL5` zvfy|2Qq+N$=ZA((Jvy9`=Ah#s&3P&!yGP)mdq`cBurLJfJsA~{B=V4I@^>~Nszf>e{dp1Koeib z(i_KZW-r1Im|-AZHgO7gGBdM&Pgm2;fhnDVev`My_00wPU{Y$R7&UbxKE%~mmjs_r zt>{xK8m(^Ozzo9Dut`y(#wbFOSQsL)AERY#$@sG@I#?xc^w2M4vO@1aOyhmqSY?HP z8AT+;s{WngLdx)`rL;81rSwN9=Co-i=5$;q=Jcp1M|4UjM}XQ>ofN$n2~h3Ja7DgB zf#<#4BKnKzsrx&EONDQ7$B$mw>bY9=$E8}eth=*6@xI-j;l4?piM|P*9llu|YQ1{h zBE2fzVp}DfwU1?Sr)!I~cb(0m@5I&OTlq1wSBuogkCvt{klHC9zgy(}q;)EV3OG*U ze%ZYI)K2?ob8Y(wcJ2Boa?SimcCGnfw#oWva;^P{eyIDXdMNq`Y?1R*ewFZxKzlb$ ztn3vHJ*iD_cp)&U_@K_H>=gsuyY;Vo$1yBz(Y&6J#H+uH&FA}xqWra^kUBPqFT9@_ zt2gw`E%uXO`qL}&UV-uh2JkawN7wH3S4;!VhRBuLOW7+u=84apZ?P~(a$&pglv+0k zrzVWi1BT2Ao zztR9uyCCK7nEMiWLloE8qz5wM*UNnfb>$4xRWBX|Lp~e1YR;h>^Lc&KrPUO+9#49m0|?GNa!8+i67)KRP-6j zk95FVFk5=U_8o@5xLZ6AI!`7K^0YHZl~9WxwZY!qPk$WK*#N8qOtxhiyqeVfUzX&r22XQ3-tO!FVGCd{_bBJ}|uV zus&S?ABONBq<{|s;2QwrO&R#c_46qSx(DTn4VXYfMS8}v-&!>0RZKpUOdeFvywlYX zHmNwgr2~5IoKNJEmDQ&j_G1nelG{Fl{HP#iHK)l~EBwfnEfx%r^^FF-vZBX(l#f{z zlRpV-2jj?~XBJC5{h%9w^cu@8f3g9-#T7kEQ9j!x?)o7e8u9wNp=RWxY`l#OtQMVxTnTvM0 z70F{4iqE|PjMFlSyVfbYepJIkVu5}kSf5swPRn$bC|uIly$PwGXb+&L z-;Ppdq{*^<>P3D=L-}Q6eWC(BZZY00F}!6zlVgW#i^ylcPr;}KP5b8xKd@VIV?X6K#vrs zV_9c$9N~x&(7SNyX;khyqw1|<2!W%BqSO|IU(3se?NM2EeaZvenMzXM zZ_)OrP4TPwq!NBAHjrW)2)a+F?#ju3SNQ@7yK7$xws|xnd$j_4zs#c)=@$;=mxJY} zWVt86kL?lEbUmF$PLdPp9gpR~3^+=JR=PC=9C=NI5?%bcGa5~<-U4>Z8;~kadgr70 z4*b-bKZ#;ZTflvTin`1;Bs;K$Wpa(ZBExPKNrg;40YxuoL|OKQ8t2x0JIs*n@knLu z}QYo%M5ib}yd3;{9RlADtCRZdML^WHj6zZnnzkOVw?wsTvd3mCBoXV5BY zrptPq2M;$azud5Pi`GIhA(_go!Xrj9OGFLQnu8HTj-k+QY+!nyMhFx&nC%uuLVu{x zJj92z^>$j6K5Wcyc$+w&mTSW^Vb_qYQw?m4IwVM^a2K!)@}vZW1*vZlN3 z$v;$xG~Fz~N^hm3IwS&pcOro6lFInCSv<+vN^g3&A)De6*D%?op=GmK%btNsdvPcR zB0C%e)gSJG;14N4GKYnrYOphwJm4kE=M=rE0ovDh9HkaZj7J7ESSCHvr2j z`$DJeA?tp4|CfYHC_v|)&XWqxyLtC0MO67;J>A+4VWdn&8P%P4X+aajZ)mkDMM%tp zWa5T9ibp_|a< z21&x>_88mu3#44vLwDK>?XJ=_v4;%=PjKy1-`0ThG=NpgyG)^Dpkt;ZwHD**xUwvu zDd{MM@D|#%?74w;*jpjPvL~P6`^b0bB{Y0CONAtqkKhB*rN_QC&X)<@Hg?nF?&p5TMS%9Q}8oW2MPH3aq1)30bSYwvrVr_1V8ap1k0+d2sj6 zz*Ns)iL7hnKOf{tJ=Af`vhMwha#0A6|15N&UD`w%u&d!Je|pMuGX3UCGW>wuWn=yp!ztgxJ#d6 zhhyo7CesA)juGg%G%ah00bDI-|}HHJJUdT9t~*D>7>g=|OH8Y3d7atn)I zha%--L2U1p8Q-9yXyuDvqd;sIE8f3MNLa%ho01Fp8{m`)V&y1B*g226{G<}yv~%_Q+_Th0Bvt8WP9 zhBHo>)`(yH2TQ!?vgL-%5eN?$Ov`dA&;;NuYa(^9rs(HFMSSbF}5Bt;yuM|}b zjZT?e+W4V4ro=X01&k$Wk8Z^gdQE+G&WST^0MCjph?ih2C#hILkA|vMOcKSKaboIk zWMZej?4>UrPhE4Bb<1C5pd%`1Yy)E7c1rY8(o#U^TzzIOKlkd=C8}3ul`k*hUa_v3 zflG(}SH}he)nivQ;j(sWR<%nMsas{!F>^ciJ2dS}RJZMJtBi+_&d6C--$6w9QXX6|18@>CuF!ZD;cOH@x-$VcQ=#D;tbdTso4rl<@>9A)Q`D z`wxi;Ysg~?U(XZ@pdFgkkajs3^sH-G zxLx-8fN`7^yVC$vWiVnb5N|y;a1IG{oMLsf3Rv&a8oM~Z2ifYg#ZR>8J^oJaRL5)Q zB*mQ;y(9y)$FMqP`Dd@e=r!SesK_dsJs%OF?5}ek7wi+KCN`SxD}p)Fn2|kxvb$b6 zaHd#+jc#@S&2@W-USWIPb!4B$3$dVnCM0wzz|xav8pkr9MQ*30OBUU)aqN{4FD}DW zFh5+z$RB`{I1wX}Am2!4;^jWE&&|+k{8_!VcAEE)e!leRvuWOawqezMwvtuXp8sbZ z$Fsb#K3>Qce}y$VRn% zXNrzZw_+O6PVIhRZBb&!O|9_XYlVY**f0Fea_#X?JIqa&zYi^U$&aAcRt^CxFP)(M zhnCdw3!CS0rbC+6*5*J6QL)eC&9Q%@ZG-l(JtV{oh<>qGTM;rMOSc1Cf5@}*>Uks^bQ}?guNTmnt-7W9BvJAbLNtp=Am|dZX0iIUG9DF zZD;Xmnzj<|JnoQzlheVKupkZ;Zh`nl5?CujhZn@rE6LSTZp}u2HYgrg`#Ll9BlMl< zyB+V)?DoD4|LmZ#47qH}fsD&Rp5QnF#>dOo>FluVnd^nSuT5q%LHg{Ybj+^FXZ9FV zd59m6q_=rv&k#;wmo4V0a7SB$bI%xgLqdlwRRR+?YpHLwiK+BNQPWfU<+1H#S*o&! zhmEAX@N)+SI9f2z_>E?~Lk9xU6I|&W3jiiBN+y!$A?S%ps8FyYFvp%@BYe^9+K}5A z)FZw~=Yh)u+p}Qt7fLDKmA}g0Zi0Q%Dh;#{!rr_>?_5P1=2d0YJ5cvwgYO)~jNzUW z$b2^9tponB3eyRtza{ez`B}-uUin_OoXYClBiRr+#a`v**GLWYtZ^)va11HFhw&|L zAzM<%%lQ;|5f*yI@pUkwI|hSXr+PK<>nentv&uGa-_g7TwjQ%+@7A!SSkxaYwy_6D+UVbN`L% z4=FIO%gyMGa#t}{jzZ{ducaZT=(5{{s|ZV?=(67gh9WpxWkp&F?O=;LO(aOj1m^_4 zuV}FUX9zU{_s8WrbGFFj+!0TEQcSrt0W`&6QTtBl;V+)4cf2^HvUKeJ`4oKmma>iS znn~C1Jnqk?T*!Y3Po{PA`gb9i6#N_Ec#ih)y5SvC;g2LpP?nqkH-9N2x+1fA-Tk`9 z?EM59v`xkJk6zC@YRpfDhP7A0FBymQ!rNS_*E#!bxYpkut)>6mv($192>XV&!K7;t zSdu=D3tv9sNi&_#qjDRN(%{}!kT~?Kuu$sNOk?Xh5 zzFkpb4DT+yV0hR4LYlOkYqPJwKWvhm&JI=6h4=wS5g8(XXW&qGylKX+!(Fn0k}_u* zJ;wt*H!h-x89fb%R3zH@W=nHiqUc;FFSpGuUMlFAY2>V^;(QalcN-pmSiuOs%`Q4^ znhpZrWk*+3A(`H?1U5Cf0i*RJvnT!ojeyad8hCR!p?IC`=0NL!HugRv4;3Hi-Ff-8 zzk!{HsCzZyx-i={Qo3?Ors?)J&`Z<)ouHsj{Kj*fu?7P4C4?^kYJeDT$nt5ZYVM&P zuTLD^-V7FS4vAWT=2<#DORPso-5O)!yT6<&4__3s1#(5GxrtTPwC1@CS0FRF#|?Og zxcEB@exZ5qMHS=4iKD@JWNzmv!{ZmyQbrU#HvEo{f$R3dlC>RcUw$K@^VsR`G0Qj( zh*$z**+`Vsd;()_j&>5+d7|&?{}_?x^20mPe@cYV7YtIVQ+OLMq6_K%36&q{czL0I zt5V5gwXCuq!JGEZ$(E-RRwUXsbP@Amb38>mg5UY}5Jtn(x{cu`g!Gqv-+6@U(igu< zYaru-O;ay^ftXu~JS-}=iDnvNhv9AqiyXFQN)nf%l-}`p)!I42KKF6QSxiyTK9#JL z&+#VWw!!|5341HDah6c}fP8;F)C$Ct45AufS*QD(;&eyk4oZj0RvT-_RKiONZinlP&SOHqpZ1uW|}ai%5n`a2MLi2PL|vp2_1gtKi1RxSrmg0dC+`pNU~ z=@T_`!W-qdNnY$0@O zv=4(aFT2i%^|XK76+ZlO;E1+Ydr~J$(zr2U-!r!OM~YHL`yQ!j()}i?X_lSz%Wzdk zn7wELY;KzPK`NyZjH6_G-}@bYe*on|NfTmXjlwDn<$^M&p)U5XsAzEgX|_)Q&j*1iGRPd=mNbr=eDvE>pATd6#hpgqyFWTxgMs%_56J8r%R3>hk~ibU#JA$nBhulda_R@ zsdetI%vLZA7`MG&4Eh+F!q026#v7SGiLB4}ub}pez>awL<;4{d9Bk1Pbs$Gwxs&Ym z@B_cfV6sQQK!N-@CE?)SkN)3D5pfhWklfzpNmj8YXr-0*9e7{7U*@ci4gO99jwPft zQQQK-Kg-Cl{-BuCIU4t!#AI8JMW7$q?%Z+N1Bs@cd!J$60nH5p0veHHL$-g4ziCVno(; zC!@5JaWPFusqtaRH^!rASQM;8G6iF^J=$vcr9D{GxEH+Dk!~F_ywK*IsU7S3!g=Mh z+Xp=6!y3VO!UArw9C3Cb%s7z$lJ78ZBK^gjHWY|Sds81YyhiDj7}Ju=E*@Y}m4Q=q z<&H{d#NlomG!P2PMjrBz;Ff@iRiTmaEn2l zfjjVe4M2#27W>M9%|R{V>qMIKSvi?@-0vHXTDIM<5=PPM3ctXP&Hq;EJG_HMR!V07 zKyjqD&rUflvO~yf|8Za+>2O_7#ND+OY-MguGtD)?V?5Tajsk0CuBlVjUO1nfj}@kW z!k*Trx(U(!3hy<#$XMq#8saoC+j)X=#IgUQ&QE0eSGJ_vfVczx)~Dx9s-fR=mu|^q zrTZsEl&b4GvDWnkyn~nO@FNXBe%aFvl+{r?n@-jF8p&>|Y~0#uV4HgT^`A!G+_ZCd zef!X(ksW-bekMD(udUtEsNdW2esVBa0z=N3mKGxU9v9TJs@o&iNJjh-?!h zm)T5R0W$TliRAiXA-kdUEd5%Fz^cLU^MLSwDe3p_w){{uh3>KTNE*h0&(q@;khuh? z9!?DUusn9u8pqYy*q$9-pOxqSZXU$7we!2k(>Fyl0w?_h{1dmW_8uQ8U-B8Tm9=jc zPt%*+c3`^$II6xJo8k}`t>6}z#FMY2vt8g8Y)o?xb8TF>u|{?+OfDlnh>}NO;$f|C zT|sj^!gH34*;c+>yky-R+_eSm!Ui(_4ZY1&wsAfR#mQwW4qmz|r~yF^Uf$1knIjkQ z2SR_M)-Wgh!iO(pzHsDPT*_xWzKqYHXVol|dLtr2&~QKybO>O$LSH1GNxd98q~X%`&n*M`5Ka$jZx)towwrbP9 z^;T{rZB+x&yTz^;2q@ltpZ$dD=ux)fiRwz1Z}*QbZ(foS$}9I>0uZ2GC(cAuN?yj! z7U)cf5|$+T;~Vx}>ffFlZ|0ERN&cG%Z1u@?uluhxP0D)6Rz3#>2_Mn)#QB z@lWRei{sGJ)JfIR$kxfs&e7(72v~d++Y_K~`x6^diOjzheuV zn%H=4Bx(-_Al+#lN`7yI2gG-!b*1qeJi_|JuM*=EX9nArKxPmpEB@8a37!^Bz!(WK z#nOdHH8+|B^*cXhQL`UuFez%4nVjaE*3~*r4UgeF<@`T)H}x*Fg&46k>93nUgP9Qx$8vKM4{D!tYB77GwUI9lpr7#`$QxNv?rEu5NY24y+GU1KDPw(K$NU7@Tw)t;!Ro6+=ib|YJ3WAEqN z8}v3DGq!5IPDu19Yc8#Or1|>FUdfb#)PNKGE7I!9@qp{P%BY}I%=NPUH(8BRq~^I< z_OMhweowFIS@xq%T&1`!_Y$2I)@bvqZ`!Grnk2dtoFg?ZMo6>)DKrh=9wLSNu^V&{ zuDPQJ&x7;V`MONdV8+=EEz*q$vkjQ3`{y61mHXsqdT{kTC*ohve#iSDsD$b*DB-;9 zTD|bhA1y@Gq9$@rb#cp;3p_8!{iVX9Z`Xh6e~sU&wiB;?Dpa*t2Il`B`5ikzi?GnA zv};MX6A}sOtX9@mS`eEV38QiGR!ggJyOl1eco>k!V!Z{73uM1H1COX|B&81>pS{?~ z`M0xy#(U?c_F@dqxXGHM-PKKaX4RYUGlKK0m#4_hCK~I2>?hxHYj%&4IvJF+>?1zv zaS;wV{}6>J-dYwE=KMbwU{8VuEysiqY1I#OJCo9?lNJgKpS5xe8!u>OP|$@!yakIn zrGCaiN|r|tinw$6HSxn7jTy~V)jjTiyMncc1^g)-7+4)T7#Pj}?F!;X&PK*YPNoW` z&PM;ilq~<_6FC}Q?yAGspHmw--ELgC;fUZGP~=4o9(clV-_SU~ojFjYA+YKgxxRkz z8Z~mAZ-xwMzcgI|Z7v|Knw0{J3sf~R&;r#g`_0wFW#uZ#SLtxR623k}ybf(KZkE%% z_g@`nCV9-KvmY}Ayp3jj!4|IVxN5}YeRpqujw=lWVN_|I*r?@bP1-lNBBLo`_Y#{u74vqO-0kww>Y(BFDZglhIPDfCKqcLV?O zdfV%%C)A7T0~X)6Y)8uR`6qT3$NEvf$(y+EWm;aIEC`aAKRi!HOXzVM_o;a39VEv4 zu04zczs65Hq>f5FV5e%m@J|Oda zHlxAMDy~R!$)^0Wk;srjWG6iKakSPKWGukB?nDJ!v+0ZtN;SyCdtugTxI9u;X<>b!&ObI zEvlO>S382kn^UPz@w_3E=@fz~$X>}6H#L_BzSn3xr6oUV(gcxddnRt-%w-+JCvK6O zK}Hl${3Oo}*Sr>7RJGar70i$#cv)VdLlIbReS;#Ng!pR!S$R-)Xe|BYT`Vm!nKmZ9 zzd0zRY(#!2&{$b>M6lAYsy4x#HUL*L2%SyQJbcz7RF%@@T(UDZ>qo^;ro)pq;#-$> ze*%}}{2+dgaJKR2Or45U^E9;-=IXMlaeY-iwFJhQKc~wS2j|0kbPp%Xaf;Zm&inye zXYLqE%Fdk`c_Sj&ezVt7gg^()QMTiv_$_K}7yhUti}p6&-+LZi!bVzZ6x6$Rys)0T!atB4WFV%F)LtHOoq>^GjtL+u3WB53=G9 zmElg_%|XjZh1E$4FSF^g3{J7p*PC6xou*i}C;wHmOnH;Ba}sPKjHHU6NGATKNUh&>;A#Nd*IEr_gLtOM>z$xl^(d zD$xKmsvon_iCK-W6BQQ4zf;g-A~_c^sD1fi#bEGyG=q^?d87dsGkW9p61`%8!c?F( zkPFYWa&Ap#33)K9|q*bVHwe#!V-$$Tjo?|ZxBuNZ~WQiX5vtW8L&#Z^_`wa)>P5u!mqkfp>5 ziYt8Mwd4pd-3ypD4>IaMggp;JEm;@)!X+v6MQR#e$yat$KU%qxWfN-91#Wid5X8s{ z*?Y@_#?NG^s#n5?C4|ie4^HIuNKZ{O*N(Ms)e}=Pcj&qWF-7su!e`0~=fp0LPdr$` zSlT&%&gZUwq-4Y!N5I zjXK~poaE?>_WsDu$Z#BkfU=xkjhC!OwuHb83;LL_XTw?-t>g`43e-3}xPq9VUx%ie zIa-I7%8k1UWUDpgdO~?s_3vTwbO;m*)UgyuRh;Kp4@KzHS1X9LkFuN|ndjidC!D9U@6XYMrpyMzFbi!r4Ff5L6q zd>{db+|<1KBe&F9=ajRlB`#M*qm=?gwwH3-fVrH~ZsrE9tnuni3*w==yyak(>=hEi zLbJ?d7iw3X6TM^$S*Q3GLYmSQ1D>)yS_W2^7Lv_26@}KY7=`PP0orpUKBKbZIi zw|<&Ghn*Al-@Y~NZeP)7=P9#)r-2ZnQndfJcwn-gb#C2xP zP%P@U$9+?WG_jM9d!Xu#K`-39rA47`jO}5K*ooJQnTNQh2@sS}#a>%Meqyg?Pq(HJ z6jP;fcEzYP>g%6Qy5oh~`Qdn6g9dd`F5iimqkiukNIVHrW&d687GS<94NZLci*X4v znQ2{;qeZg%O!?Gymy%+Thl5p`uBLKayn-<-dSC^y8Zy;?+ww? zq>kV3kAD9hE`7_$Zf8IQ1H;Av1Ec-_375YApLhx0U3C%r<0|W*JEJRjJUFrqT*PnXwa`%$jbrQeL>(cGTf2BaZ))|se450l^)TAp3x zOzXNuU#s47Ed8xLc1`Lv5%iXeSU(CL-^SP=hp}T!pw$MYb56Q0vtZ|qJ!DT>*wr5F zZllgf41%p=;WwY%Mk#Mw*FA{!g6%NdH@H>=idOjPIP7(%5k9Q-@@<;H^-4nnV%B5a zibup>!u@&!g^zqid1d@o15`Dypa>hJ2JsN>qM5&7x< z2vV2yV#NwEmC>v}VY|Yg%7_qQ{i!u2#DGw0uP5w9hrLX@ZVKG$sK@BVl=WrC`V<*q zWBoX$9{Zr&n_qXn?jD;@YjP?xB~Ph?+}OxeVs-7z6@(u-dT*j9FIVi` z;A#2{XwH>2bVcEl8yQGI^v{;6(VQ`?l@o_wl)0DGHAuSrwUERp#!W-6ZQY&9KI9#5 ziHpYKZ}b58svFERO!S1CX%w36|0b*Gn&0X*7BdU0+~&*xoEQt|TgII0RG>gF4I00Q zF!>SX42(~X!^U;zxp#NA2^7}~&nL|x_pQcRSvMBvL_Czhvb6CGLvJ-XXAw=w|DO2g zgq-21vEtj!Fi_68k(i5VF$rlwa{Y(8nR`OEb2Gts@`|x@0_SLIQ|>txA2oObP)TAe zE>(op(s>~t?=TPJcamGUf62aP?eI5i0NfRP9P+s3kqQj?4UX0Eq%8msF+bvh{+mB=87wW}fS4wqcPs^Pr z<#UqHr*N375Px3UIA7rE)I>-NtYkRsZWkfiS+5mIHNfu@O_aRC5fC{{$s@iaO8(4= z5$NVj4Ywv{J|2j0W-X{?6=%nd>&a#tCI*cg@?*$_!xe^1i>ry(R9f`&Vq49Y z88c?8vQtzU3+Vs&ijY#T-LRQ=;Y0+cn^{z!g9OZgw@YD6NG}tIl)E3!Zppe2OVw7k zC^eStZB&2IkXoxOH2F&9ElS)OLCV5I^Fna>|4v8L{q&sdCFEwe8VXtjk2S89y1vRi zx(ap;xas!Pus=tvSoJloVK!B-aW+f(@VWK@N$aAod~}=GyH`79k)PYN2jj2Y^n2-% zd))cJkYB2JKQT@K*ugOatIQZ;*E%eowi%%FNs$RtR;LPivq+GxNzwt!}vn7ry z_*V@MF3u;ll0*uIJnSD8CR%|OdPLSJKxZB86HV(x5Wl<;_wA>ga0Pat$Y7>3gQS#s zNHRKsmD-`H1YOo-q^Y{7W&WqkaAN6l-r$Nspx z`0+TQshrDn?dS88y3|&Z8$+5cY0YCg4nI_4)HdEtc^iN7LU}`kh=k#h+pqFaan`jD zz`5=~G6y78pv+B(B!9&tdrKJaZc%aUuI0dAF?DmLbWe71E(%mS z{G)cU0V+m5Z;W8j86}BOp>fAmt-@t(1vvcBK zt?FSq20X)+YZn^2142&TD2jM7WmJCSO`kM$^LHBXV>XUk%Q0GGDgi3jLm2I&B+rqC z6}ksOeFH4=vb8PFUY)sBBwYn>WyCBUP0O-{gJ{h40O#bLP*P4RXhwV;yn}zVeU9*n zD;18Oo{G}y{xrLRvN>wtL!I7;YD|tpWSjE5Z+EZt0lv{|0>sxq2#cc8M2>l{ar_fJ z2@K8`gSaSCBMN03c3#VDeXVBHs+(w^c)E5U66=)pdejHdsW10sovTl9kKzjz)RvKV z@-fD$%H}Yv&{Bi{|M!wYe7EvHWV<@QG&}&E4x&?g9 zm4Oe;G-zoN)veDL%!A-1ABIqj)pZ6-&VnY3YUm|_q;AbB`)?}5D*1lJF@@=O0HhL3 z2zW*bClhKPeSW?tm;@5vKkw$BU`bR^$&j?0eb{y~LM2eT>nQ{_5XpTVKd66tvKYbah^(3GWuI zNzg|KU+qJa`jC?jy1<+4MtRPj)*7)FSYV6>L02hWVxb}Pa=~4I(S3U;oM+v>Q#T#0 zxDFXR!@#JTMnLci32d5mo!>Xd0NUWD|7|}!GN4jD|G^37OVA9=}orY5V(7(mktIa1V<~E(gN}PQ<(LbZz3K!j7g<;O~on(q^Wl!izEaI zHg75wnT*M;x5ta<-5S4VG-cWz)E7xV{mz&Jem#OarXnnQMH*7^k6o0UzTuoP-NoHX zoYC));U5~~dNs)(T-Yh}4$!E*6hbK;9{vga<+l~Ry&gI`q*P8%ws=Q2bKPTor9+pld;D2T)YZD5 zl(q8A9i6hDbgr#H{`3$s@~MXt=Ami6;@?gb0xN!;Hd?V&yFYmahdKj}h z%eX(a`ikziqO%!SXAGvSI#HpK<-hJw)|>n{ThSHumGQqjZoq8zA>}_#y#)3@cHIA$ zP^Km;J1#1rjeTRnKxjZLP%F5(4#DRX0oyTSk+sv2rnG*Vr18_GF9MPlXE92BpNC$n zDMqoH5cgts$Gsdljh&g7iuq5!yV_23vRxhik!v6Df>0OGHD**vP|kzmMo`Dec5)+) z3~plwSXM?;;ZYJ%?lnJC_*jG7n^QQ?1YErLx+}fDO=cHczj59z&Wn=-*j(GYIQv$F z7y0mcg;?U};d=Tp907BvQ&{_-73Ut-tQER(9n3gxa*R;MQWv!YR~#?ZL?d@5<9<^K zD<7XhRUDqr%kXX7EIt=$)}HKhu03OLQKh{1aIV`ZKb8XX%Bf5$@=mZ?FLY-K>>syk z0p!@;5S|UyLIV&GFZI9zs8r*Vn`5*s%>2|)Z=z|@YNlyb&E*2x%0JOQrL-j|U|1Gna8!qI+dwvtw%}S2<4pl9VF%Ns^9K#RQQkAi6(6Js#=rpbO&G}~PiQ;J6B?Lks=#mV96@nyv(J-syw(DZaeo*Ouu#}xM9(jwU(?h8CSj<62{%Ta2 zmc**tRu5)S;0~%+!bk~+^FEeZ(-Tvn7YVY43^rZ%Fuw$_a*|;~F-77)kU={p5dBCbBV)>dOt^(o-m^HN=wRtUwYa9TTGMGM zu{CdDta4DNk!g0UWxR)7|T;m>Y0z4dS|v5jW!{0{2Z6?ijPrYvQE>_Yu4vd}H%!fW-5B!BtSm8R>Xn z1Qp?=HKuAJK$0Lia-I=h7Qz*0$;L+;w2Qb;c$b3}P_Q2wmn;kzd&t51RD~+Lo#Qb; zN+3LcO$7Oh0qMmW?mO6Z`|OHKck9LzgZd_pG=Sb8dyNXu|EWx)_NI+gb@zZ|FcN6< z8m4s4UO0Gx6HxL0A;+K0kbMVi-RQ%cuPsK8h9)1l%%5#>yXRh#V>fQyRfjL2ACUOp zMTh(YFX+sl%1B?*)jOC~-{?d6Be%ce`u@BsjY;x+DVF={jE(V-V$`veGD}-F&Z4PA zRS07k;p7^3B4}FbSqkTdxmj4zF-F?1mlJU``Ng7JRVNrvKUtVG+P0Ec|7@DlG4HHR zb-@~R|7UcY-GoxQ#9TEYzo9Tj5-uW~9p|p2Zy~r(^&^HH^)JXasY{pM!4<2tqbw5Q zQcEY@n0`u$6uF}mE7}_x_L{vqrnFSLt&a|Ww)q=-9aaol7 z^vH)Hc!K+g4#%M>QFN9~MWHFB)>Nr7**S)|Z`PwaTuw7P)dr&%6+w1%dYFgRJjNfR z9Ez1C$as;Pku9B$+MY6bPOz?v6~M0=g1_yrBQ_VYf3P2}BO(&azGA8U_BT;KTgC&LmZiK{a_0GK{UPqr^~pprM>-$5*S6Y?VxL2sgkuce zW&ON!fKsx>5+!O>t(zwkiDZHrRH#cXy@|)P#6!*eH#W(TTFvBoRC_AU@PNnka3$GU zKM*cwk=7UnJB3%@UcWWD-fF^z>Tfc2SCOF}m3gLr88!OPi71}hm3?U_rGpw&tB#hI z=+};;GII?ciN@@vsg!N`UZV_ug}z+x;P$Fj4^DHGP5ZxV^fqm6byu@CsRpL@Q|r{U z3g?c+ObYLNI>IWB9x?p{k$#|1VNs*3VP=U-%_*nQzwZOqP$u)XZWwN?427a1qY_J_ z%pfzfi0i%+2w{&cqo4)1*qz;D~vWonvD;*0D6q`bXV= z$~9w0MiDdoguVL7GjDA~i!1A#dUyiL9_PmsR%leN^AmTD1Si|59(G+!rM{!Fvev>? z)Z9OIfWZtC`_e?iu3mQdZGoFb#WWqq4uupF^LUy!B-Eg^q2ed4F=`kk5?&^0ZkBS*a5l)8YwpLqfZ(&8dhrB8OkJAMFbv+Jc z(+4;Y?rcTlv!Y=jgO58reJITF0S)XrI*zVYJq*Rp^bgw_rlnkigsPU-)JR-A<}MXe zSvU`LT^Z&r9rJn_2~qZ<;heX%V}cc*9|aY^Xd<1)SVCaLYDUvw!!)33l|yRKUfOZG zsAel6qoWt~nhGdtXIYCAZcFze~t^Nc7g(mS-}dO1&5Rgbi)(oI_IatPmPT~fpxVwl6C%T}$+ zn^zy$RZw4-wqvegFgRwh`aau*wA9Dq*s`y)U+RR|i{P$^upUxyZYt23zr9b2sjET+UrVIJ9u%W1g{iI z&MsLN)y2<+>^JJkOVtYKa2(z>@xczOpqFH_c%LK5s;fL?p(N_ssyN5LU<%Qkp3Rz3 zAUjHR(oSDHEZ_ndCpNaAV9z~P`L2fE%fk{0z8(@|u3$hy4B zV=g?EdTJ@~65nDM#q;Ha5eJ?$XymJWrd*bumUleOJIe)9#EO)SfkB?~jr#!POuvFY zU@w_;6mCfo@%% zQ53Cm8+%Q5)A(x^xw|7+L}AVz_1=Z*>?!{ULYZv>k5=MVog-S zw#>YaV0sIw7QftEuKT z-3p$mGp8QJR4au6Z)aKy&&()uj|los-JuD$8X4^dc8jgjR?ee&Fw52r=uPr;OpBFB z53Y$6b$g!`6ES3Jwj^FL^e#Hhr-|c!XR#eaVX=bZVI8#43bbZXzO)#nTdXYo<-QV? zV95*vt?0`Eczn^#ahMM&GsMYIVnSPC-t9eXb+*YRnLoBxW^ikTSlJB_LInjv&66NA z4VQRxv&*c$tSvJ;a{lbO31@xi(o%m)Q$?E;T%|Xf!HmpV5rk-Bs33{b#h1a9CP{vQ zDNT|5{sBH&N*LNYcUUhkRm$jdOD(nFL+4CPAVmu1RdwMEHqg5C8_A8p3{u#kxJ4v^ znN3ymz;>VvwM|5*=LPC9EoAS>{DU}m7-LlkmLv8jH(p9S@iJ_Y@u=|;^Hzj2>tGQA zsi8<13qSA?XyiXP=Exte%%7oBC=f0r#&3X};S4J7R*+B#IRHZs#2>U;z4a=9%!Xvf zJov(S?lh_+tlP6}M3e{?@D=F66c0xAuiPr*lZ1V*_xf1~6Q*7+$<#}Z#~lfc{-dxz zK(B!M-dIje%8CjF%5XgSU3N?!2gOxb-7L6P> zeTrS9(6`=*k)exFGS$Uih&xY|J5N2%GW9UO9B+i}zKlnJ5K^(Gmj~Xv)6cnQ}`++cpi2)D{&m81z zJiRfPwuuHumk6N&8EgYZxec36n|A|u)!|FQ$-9Uu8R2tuMoLeH5vE7^9sd@gv=am2 zruGsE?G`o`jRC7T7zqvwT3rEYShj@T`!Cxo50hD;fV-PYR>7i=soTp)6{)w;(Us6b z3~-xdphtc+K&8WgJ|)?|a^FpWhElKy3C?yPGZ=lJvQ2fqWNyq@DV0m0#{{LKpOQ{A z^hUMVEp#Euz#E!HCx`j*J9%CUanS$u_b=9N#8$sOxq8G_5?EXee$z-AvC_zQ4h+uQ zAG9AJ-spoC#Bb#cTsWbfzaZ;B7tS8tL=FA`(N zb?+t-1m+28k;Q4wEk}b^YQ&$u{4-G{3|7leH|AEqIxc@WX|Woi2t9+?2D<{gQXjK3B2#T*2S*%l3)rjM>|v9o!k)Rr;F`lbcSGuP92KA2s2} zVR6f?)qiRNogX0+z@2tSt~GmVN^cmXVem`-6UJ^I*7$Cu{!RU#uH4Cs-QkeEJ$dbb zpcfDE7JYrDXniQVKD}-@z#yW`i!|=e2k#W#E3R(z!4Kcy6!(_Gair^0XY`d~v||Fs z8#jBz)b2-olZ8WrtrxHCZ4KQ7D%}Xa2diS^+^zkkLY@VpOZwF@XT9UY)g?p#sc+Qo z@K?WM8dje;%)M?2UqBaIT%bm0%1sKxX?{A!Eu+-b8-q1@pRCP^r)iKw@!XwniR9bg#elD%N4!8OpITrM_6CAUuGYWZ#=M?Zy>Pp@=#DU@3@YJ@!pW8?!l1S@u4ln^L2C5 z_j7F$@{_Z2G_WfC?Pl5eQ{P?SyXW`tu4>!8U?swLa%XJ5hW=Nt5AJu959D`DXG~zh z&WNB&-=LsIA4cdOoON)yVNffyANI?rcE6&t@2r1gnt(YBSW<~xpN$c`)VHbN@vQ$b zEs>>;b|AHj+?HS-bUoKhI#tR~%9AM%R8O8=ti1cu zh*dRxhT4b3VTFkIp?pz+M|v>z+8Xjt23*eDfKuld=%)jfP|v?l=D%Y4zrp^SzU1Qj z?sdU{fM8<&Zv!#w|3477XhM7Gjv#-%XfGyf%%#zdNfR_1$;jZ1P#{f~graS(6Wu0? zQCKHoywmY-%D8bUDiQECzwv?=>G-as53?3N@ zn-r52vCGaPdKJ5xn*N;>{(Bw>HUsDULE_Al^|>H4qm5&+YEgz(Oxh*j3{i*HM(Q=- zcK0$O96O!3S38{PS6zc^lkey$duNoxFGgnJO-_07de(`YIHQe=a5?w8g5NDT9R^-< z+SRAqxbOVqGGBk83c3LmgR;%+JPthKXg;OjJR|qV4vume#GKP{1qU#GY+sEkHmJk> zWoZ=oCxzUE*bhQ|fzsdw-%yD2byF7Wt4wyYl zil6Y(8%2eiRoAi8nFM6RC1<7ERyAu^q&8?1tFk_|=P{i!c|nLd0cK|f zLELRwk=V>8-@%4Q7gXS8WwK#N&RmCQ)RHgq!^tou&c}vlq{%>6+-NF}yORW4iyuu> zTl{VC_$p>D0&trmhtv>b6I=RZ6+!o~jM{>;3(YnfeNalm=sV0x z&4qshiVyGLHoU^}i1BU~04W5}6gI{!p^oR--nXJe^4vMw&Bk%LZlCBhu9>7ywiKK^RIEJP@GZaof zVr_=vDkLATFKm&`v(?xtNYwCSfN&WMVuUMqL~(M)EP8mJ%-HmDWJ>$|V3=E?QDuyt zN6sELGKoF@)RWV-^4lm-+AXrSIMX`BO~9jh$R+skU5lmLq+1G}d`UvfF*+Km67Ooi zXaw75EH=uCE)&SwypRhR_mUY{@{$ENS*Eo@8nQOALK98KQotO-hN7_= zZGy=gdSEe7x+O7Cxuxx%W-`xlD$AY6wvVa$eQ}?xjB9c$*cxb{8JZd6x$0feDCdL%$s2WeF(T)4wc~Bq9+WxVb|Zv1Ch>lHft> zj(EY|Dr`EPbJSfY;AuOfgDD8t1EGEe+W|_lIMge<%^^>IDi7q>OAh4Ur3Lrxfk6b0 z?3#V*4+!2WLVTmd1k%377kFb5svP6`TS9!?C3-bI!7!T_+g4$$p;I)Vgl#A>vhr>N zxX~zB%LerTOSD+W*YAJ|U2iYrd%m!aOp(e4mCRJ?>7i~IT1x>ME%5_w3v`(5VH$Kl z=u;*5946@aRDQl?tT^6CHJN=*wOI@{M4Bf@*}q6qzi4I(g~?iT)5m|VnZ!3NV92YfRH=0waP&BJTAH9 z%o?fAARxTrw>s=y1VBY_?9$Gs^2j&dodc^d9q$Sdz2f1_-Vz5%l;fz%v1=%%&(%zo+Ap*e8ZqPp)ko~`NtW* zNUm@#nhNwi+Y0W1etWE@Vdknyg^^}(PJXg-bB{KS4qs*C2&3}!7usOSwoYZ(D~3$3 z?06f-(T}Q_hFU7PGzAD$i+j@~A>D=SZ^7+YP700(+l6No8?CUpK=qW^VI?ZD2gJ1Z zc@ZkWbs){yqhLo;<8v&m}OX>@auF%q+?OHBdH$QKU&)Obd^EL2a3zw_mwrjlc<6IR3FReox2A- zNuShWf?9f^e4_n>8B0}T;Nr|8izXKAPro6>Xhk}JM(DMCj2+^D?xrnfo{4Z)FvsLf_=a{{5OA*sjT)o>WmtFTwz$SmfTsaC$os zKL!L=2f&Er06h?0(8MGQ-2^bgHSU#SZQ{>74RcaAS^_NVs8?ppdSjiko?AbHP!>B(^yG+|!Bp1V*Lj!fOL+zSHQdjC)&7kXiq{ouExPdC%Es>Fg%;#0BjJ z*m91{#o4Xig1@TFrE`^I#PcVt(d0LXDAD<9)@;=RDm1x$uUsi0RBs7C=t% zz|NIq7^@QiAM8hu@!$^i?|&KcP29(I!rqOH{iLuv;XG6bfc3c7y@Tq5kAIN&N^=~Y z`t-Ow_B0~wLnXZJ`qShDd-&;~G16qmvpahJ>d^{7WXioUg6>VOIeKY|c?+?l4~%@e zi`WS9!}LwMu~2*%Tfg{phW>=END-u#KUS1pdRtnA{=~Ls2-K)Nos+iz^sb2MBceZL zlyUw_S{^b?RPl>%j_#v3f2~@?`O0ce>!YqYtdqTX!(D{;t8*jWwe0zXRQjd!>dep! zK+zbP4VCaN2gqB({}I9>u%_9d0L3>bWu@e?UQ^i3SSySn!hCM5nvX@_TOX?xf^(i! zB&>%+krMIq99a-mqV`Zps1E%>$}b?Nf|WO)^eVL&<$= z%zh^6U6POqH961VzbcLEB+#2Qr%V!fTx`HZ^#q#4lTp)MrqbHU^e;rLQ2U5CJ&*#z z3By%fC1q4Px^|%W4-m}@`3kW_2$!K%!63L!=b@y1`ga$eWS5Siuvb9wJUTgO+GSN=mPg z8H8vRw^Ct(Y9%!4YHx~PD2q*$(AqrO42CN+kI!x|k8XiW{DfaOb%9_`j-!cSTS>&b(vz?W{5>r3Hd;{LxU2F5=^pPlX-{ZdAPt0r7UtIz)iR9&wZfdax9B5$2irAib}3V@HE)H`y6y^sBY;OsLofu& zw^X8DYOGayjHk?W7wZ+VHt^RBO~i-RdE?MiwkDBM(25tF5Te~wCN`@?6I|i!>ulzO z4L2^>X_#vddBz-Uym1^m#_fv|oLj|-)-&kV`_@Tm zgSc>0w;VKHfc>o$O1zn-T!SH88}=}ZV@am#gZm1RB6`C8vf%$Cj!A@wN#ESVA0 z01z314hvq<`juIg=`=U2v_I3Q?_o=<_~N>2(^pxh<2Te6O5y(m4z?KX&oLEOvb^hddz(Ky3~)eIMp#64tVt zT(CbOgK{B>bGq7T+{Q@@klX`vuS!uoMu4&SRjF-FRryLgy4{<^LN0IhT&g(zFBXBf zCFd4Vw9JgEEV(U~xjHBHvj(4)GI4B?8m^RIsw<)6m$78K_mZn(hv2pVBPrRlBDbUF zw?ZN2K63sXg)g@0{9<>vXssSMC+5g}493!G1ZK4N=qzui6{i_X`kegEu}TEehQ(Rw zRT2U{+=ezpeAO#+01)^?v%FkbMV$UzZTZk8HTt)r`X`(sm6yths+Z0Pt5+Imvrx1Z zc~eDITVq*ANl^{U($ZEFz3Rr!c4}=(sg4>SCH*&^FWRTb$ir(%w4rfbw7-||K)}Bf zI&$>B(J2^&axVy9szVlCnt+h>3J$C^bIT9)PmDg(y-a)ERyX$-vumqeIcW!a3hj}b zJJ4TN!a_{-6lc?+(IM+a2MK71GI-^$U|;12>Yq_SO%xCq1660NK#Ry3_@HQuW~C_I z$7d8B#boX9s@Ves7QN<3jAMT#FMCtc*2Abvi*F3~l=c|Q!3t{lCtFPVVe*SaLpt}( zMl70B9I1HKM_udKYstH>8i5}0CxG&PyI4us?H1cplAeI%c!ffV3cG)E7}f)x{L629 z$$9f4p=Mr>+7;xKpbDCGF9~C9A}F;nI~XS#+1KJAM`Z1pd$`=fY8{8bFT9tS(N<(R zYC>7RZM8HdJ2)(qinZKCT7UKu99Jn^Y-Ef#Wy8v&ywcHd{;qK#P(y#w%`d>VxRq`+ zH1B0tLwg*%5_8AhVLDB@z~=<>P> zxe@dr{rg$zE;djzU~F(-jVT%%$8fQlw5%kDY0c-#Zk9LU5-u&kr94T21(=k7?DV z>5fbo$^KvknK}`IsxP;eHZ)|)Cw=jC!XSb~mH8(~Gnizy@xkO5@gxay;PF7ZOe(=> zqsD8j$@o{D3v0NADyUD8T5=x<>m-6&QPe$ETqpiJ4wM=h?tE7;XNQ!4i5IjPwage^ zNDa{+WtJK_CCPOmJ#k7@tt_n$C^AUC$jRM08bVzBzn&aP8c7NGf9_}->Y{0sxlt$& z-2R-UHj-v+0DXcOrf6UT*`@kB1rzDHDu19Sq2akUk}hxJ4H7#bcFR>Q#?%W8O8rn0 zUiKEd5;xT6+mAtW3NZBsesXd2M5*(l9N)oC#_bP|Dv_x5pZ91{p2ql;^;Uk?NsPR7 z3J{+f>36$K&X1t(`g7lH`$Ia zQvLqn7m|!tm;72M7&tYl6-k11`@j?pOZ_ipvmenIA`sp7)wcXJBJm(ln2}NF)N$a* z(KMwmr0lJ0eQtN?$Cm)Y1ELdvaBTBa)URJ~5IO+V@FD)r@eBHENN|Mn(~xW8JI?V< zPz(DzIPBGuZd%Y1{WIT=`g?Nj0|XdaPNw6G`sNKvyCA`(T8>#K$?HG?xE!Nj7wdMp zcLk>g2G8GNIbSG^4i4`E5E?}~@+A?fc21sj17F$nHoB0ovtQ2aJl~N1~aukvZot zI}x(H62R_rGXD2WdvouAP}GkI(U)#0cCaLWPCu=`>y3b2{^d{R_kZt>6p~q$qYdVMIhVj$6?gEQ?Q%y$KzfLhvIc; zA83!hcR7Txcio@eM1qWyJsz?#>1daCri=y}x6%1IKI#Jk5Fgln{5CcfHLWG!qC}ml zSIV@il{?DVZSwLrT2p(eFlo81*w>S@x?L)4HNQ#d-F(G{*nH^2wY6gbH6=7v@~T(y zHfd^i>$zDiZsbD;R)bQSr60#Qyvg=ald&}RwK^mecIuNV-npf=&pr@!%xL0v#+9wc ztyUhET;yu}OEdkXoea}XGA(q%T?BNQE-MviX(#KJS7KZ)KN47v7O&v0>l4Y;EXCOM zmn|3V2kmeMHl)fct|}`gzHSS2MTSAb$yIr}!j)W}kaKLWsTjgHIDO}L`47a86fpES zk;|W&qxxDIi979Q=BXJ8 zI*D?dU2?|eDy{BI%2sZp2O{^MrRzAqJ)*_ZV17jnH5=$%%&YU7Cec=n9_EEyn!k}gY@Wm>>&L?>cw&o#*SL53v+-yfqKn{;@z9~1w_;@C zR=i>k?YoQi^y6M`1;&2(34zEbA;8e}b`+MhS9DV7=;Aq6I@rWvPN@&NMaNv=;F>Id zAVG2qBz^b+L}3tI@dlK+31jUl=q-$BxdaB7A@W`P!Vh5tPG3PIsFqk{@eB`W7gyc3 zrCObH`lZ8zy&hI;;A7?QEYDk&T!uD|Tyh4PN#=^h3VK#$Zhmqp93qWj;~jFv)N#-5 z;|4QP!lL<2-Qmx&qQy!6Dw2@s^qM@BdF&SV!M^Sa5gn_yf}xcOh^Qw$a~NtCcZqSe z19BtmUI9{0PCi6cce=S5iB3J_usUaz_yT@u2^JETa`TXFhz$xx{6OX$V&?JJ?XW|<&zxj=!lY>URKN}%C&J(Zim<|s&fHlA(s$#8{w zoSXEuES-07lX9VQuvDtL;wmfl^aBZ+B!BZb8Lq3nS&_3*xQ7~I$)a9#x+psS-rA4M z^DGdbMcJE~cW%hI*nm@L2viOM70Fmy*C`ww!jmQr3FEbm4ycqx%H$S$q_hBDO`okq zB@nP9wScTf5_}$WZaMIr;`!!D8C#pPt(}v>n0B5T)fSWHYpI4iX~|rKM8`(}as!U! zx#$tX+(rfs$9vp(I%d0*mT(XHp_a0|Bav!e2u~`Eu*>5PNwik31Vw5!=j9B7DE3L* z)44=0?RK1r4{F*X>Z-mLl`W_ceJVs*$>d(M8j}=h{Fmn8kM>(4Y5QfLa(yL@0O)Eu zH|W~Nf)AAY$>6v2J%*}wz$a|nis<9h{Ke01NW^5mY`O^qbuCD)MN%zA)A*$6l04SN zUlNrihHQ-~I-O2Uyj>bZgaJMb^kxl>F-DmCcWATJdi>xc@(`s`aj8pV>`;z&Ao7BP zZKQjBfZ%tfAVd=#*>XNx4*zu@C|0aq$wF4lj5D@H0VF5HcojxQwn!lH*0D&n2~-o- z)v_*f27f3w!*WC|kQ6P0H*!z;R>_C}T5?_wIpanS(L^|v_fK#1ZM;@H=^uoxTu_)!7faOUfiZP1G>{X zBl19W#C!k9hqd`h!-&ycF-E~4{!g&(0mK8YZ>ZB(V!gcx=P<$%#!uAGQNfX$Pu9_p)zFp}$ELyZuy;Z@9ntKX+zgl0|Jgbe$Ix3?qv{GTko}h5 zZ06X0Vc)jRzL6FDJ`?=yx*G%wXL9`Eb;@v><2&2Y=Q^94&XDhe+%M9NBLx2(JtuH? zhMq5Qw?Q}z(=9!kjn0P_3Wxx6x{ZA0!x_}QT_xHHZ;Ofbr1B~&xPjT<_KF9*{6rr3 zK#*`xqQu!};L~EE4J0^s;)PRp z{FPJ8YGs$aS(K093JxZ<#o^ap9MHjn(Ln@3EI?%ny1aH{_5DuSkmTY4mYs`i(YhtLe zwP?*2j?FH0SSx9flPFU~Op`BnCkbEVJFUjTE%9@3Z~}U6LiF#F}I7!~AKr-{{C_;0lSiE59+%@X=pxW7AuahV-(t zCG_{asWsmV&s_99%)A2`nPO&g#W>kv~7~$DcL-Df842hJ7Cef(PEN5U(|qvRz9-hPnPG+ z#JzW^>PnjzH`qa%m$&zQEI$0n#^RBAki^6zH#6}YEj_I0@6>jUL3V2rVw`6MG_5V= z(^I&R?82X*X-pRIHy_r_Ru(c*+*}QrQD}5Z=3*24bM@+ffWN9iVx&i_3W(uOvwDc8 z|HO3%+?2LkU)Do$)Y0r~GW)wKA4@I*)E==eJooMQG>?#>{C*|gZxw;p>N z+@B-K3pCDPmXWv5FRE*?uZf50j_x~f48FNx`6@ifZ!bSEeC1R>jOEzAxU#1GzMwMC!bNi#IZr)N=MTc7uc z@nxQKoKL>Nq0Gn^CW}!ddGy67Tjp@cXrLSDk_+^R>ZvGe^Esw;o7ehex^ZZcWO=8m z)aCHOpn)Qor6q1iHI1wk2j>NA`>S>-H89_3|3I$Um+ksUyUq?3iCZzcDr(C+!B8m# zChuq+Vr4n)b1mrBlQV0u5xdw`wjU+Flbcw^G>G42%M#(1a1fGW>nTgrCF&laQ!30p zxREirS>m^80e&eH7#&~S2`u=zGHw4tc}K4g4v>ExG+yxf0bKUgm$_OiS^lLjvz^Js z|JX->OS~U|!t3?0@W zQUV7vnNPY1I(sA@2giOuLq~RA3*GN}l0#=h!IZH^EK;RxJom;M3xcTg={ln$N2>&H@PWZ3~9Xx?dRK zza7yG-6P)66}D$_urlQy+H>^#5G^;*n27q}kduJv&a>y^5J~0v_@t~oGH-N- z+pzZWsyo77sPs3J(N`3W{`5v{KWy5=sSOl^q19XU>Zm#k=-#vvFZw2L{EOqKOQ_xc zyc6eVyxnnw6ZuP$-D!hk-F4gUF#Q8v@+ik-v|dq|yDOAa-V%}C&6&c#Db%?c;koM& zgly9yupY@TkXo#7-#$3{Myz)~CoKp~ADL`NaQ7{3Z{hA*g)JnV2$SZK3&6b~uKol` z9ymDQ7H7KHlJQzMN7#V(xR)>yh`qm8!|lpyZ?Nm3YapY0<5Sgf#TN^S^tXAo_b=eUWOUCWz@H0RQ9>_E;)Rc>PjP0e^(~!oXa(up}@# zkl-?0Oxc2%xpj??jA^Mt>#-sRxd0|07%vbrIB5~twWNexWh`?g)NtbJ+Um49Se~cU6Nnau;ridlIk8XIPOd>0sk$D_ zUR~30-tNlr4w1bg4CK|h>VnzU^j)$|Zg2eZk209dLHn~1vD-ohHdINxYrFG3SZQ;u z1#CJkB+jHToGZNN!aQWl`f@SKx}34y!J619#7pO^i=^PmCqB?;%=!9QsTy9-mr==n zzo#)=B=XZplU$TiigUr+8iMO(?go)Wn-%1{3oKa&flH~~)*C%Ih2|3gsH^5sB9bfD z4n~%hi{<&Ndi9FMIiS{1i>uO=#(lK4i}Wg9=}^?tU1)kJs<-cqOO7~+LUH>ACl&`b6YgRR*_1LUX=-d9BXw3rCl-I z+j{G-e?|}?6Q%TjH+`~;`-^A{(q$C(=3sV|?kE&!yktiVBcgp~W@8=3OGMidU?BB(v5RN*~S_#L8D#0dllON^y5Zy%Fut z)PJ+!-a=vlP70dohkHl>wz8Tt!l}AkLA8;}h-HR~lkkYR_hgOhCjsNeAT`?G6JzUf za`bd(@vP^L;3}H0a9f(*er(WM*gse}r#y-y7<@7%?gN#|j#F}QOx0b#wkY-dbWuGY zr|Tc$Aexn75MX_~N>16T#1adR&YUY?*F>$I6+1sLE@5krl}l04u~ju9;LuN+t>@jd zPR`Hi7yP@d;$3P~;2pjl5JVEX>&LCaYs#PvXXv}I9WqJPIu=nwbzH_t#sFgB?*M_~ zDe#W(PQB)?k($(xmIYcNYnNFS&8?FAOk#-MbOIa742o?5drV#Ymig384F zn$Hw-Rs$X&8k+9|_LYoQ5(j3*H>^HeW zwTcw)LA@OY_CkA^+9%)Ux)*aS{wagRenqweKDi{3aq|U5fLJ~;aiG#G*s9-ir!WBd zNUlg^IA_#yXel}I!Vryp_Di&H#9tvvC&@tluNofA`n~HPpfpP7(FOrNkvgODU{}c3 zay1W4NE1s2qd;mljvzKhf*i5prA>}7a=0;PAbq17%+xrz;qnW)LF7Bh)Rfj8j{|UJ zrkN*Br0AOknEO?}yY!9-&Yuo?2sM?gGu2Lx{p5=cFCd*TDx;%&v>L5Ie*Q8QTdrcP zek7@DR??(P43XoX|F9pMB!t}t5BO$8e@b)yK)W`IGgq}rTCF9vxDl_$NlCe3)*H!H z=?1JMzXo92O5GZk^^YwqV{<_SvfX-H)?dl8E!y9hU`5oi4*MuV&Z)fOXyqt_XmR>( zWhUDtT!}xp8Re6L{OSw+`GunvfL8N~wR-;^3ZR;rQ+V>!&{6{>?sC zAYuM3qEp;#->BjtZNSg(6T$=AFXY~RLRQ4@l(#o-jD1u)a>k~JSG1T1+v;pXBk6!B z_f8xP}kYvRiO8x<9=nuQJ#h3=;0Dlv?C}` zPJ*$?_CuQ1XfCKo$XSRF@o6Jhn~Nv77;#<&W`h}AI+MK|NX~X6e&qI)73>S>h(|t) zzW?5PQc>Uy{D%B*J~8k!RdMBCRc`qot1{Pr_{4=P>OVfAZ(EXj)Z%{#S?k46XA&A* zNK9bTKMaKpeh)UWcfe;vuD{7rrEl3X=&`hj^m`ssK3jx(zF4#jk#Z?>mMJ8+FgGpW zK=h*`pJ(ajFW7I#nc~d6u7F?m8~A*OzSsZ!Z@5qM*7)D2F#EnygZ{pHL+LsjFod{x z%QMtX9m98YV~=v^DLFF(hyX;5C?~<=ki@}QNrpqla7JWevV}NB?P#MI87owSNip>4 z%>Tsyf26`ykZSo<5Dpqc4_7jRicDDK-g`?A?9mM^t-9?pc=7hr@T=w;TuBT)#G-z| zv#`-6bxvx`(ywb+Bk)R8^Ghf{V%O5*#S{v#+vsuV$PeK-%(N>E;0O%Q^Ua-0%Woc* z1n`>jGJxfqGj>5Vv8z*c4CAFui$WNmNJ~H1R^;g0(JQ3wu;@xYZ0Omh7bEHR<5Q=2 zT$-+TrX05K<7gL=b%xoF_m~Oj)x$VML^~#IOE)e%*;^Lu#SP0FYaKKHq_@@{jLMd% zAglAQGMBHgWxmuBo+}&}IR4T;4~Eg)@sAUZ+Vmb!N~h5Rmg!Byl|>G=$8n&Uf{wRvnO4$b z@M6Gl!x(E*@E~{NT62UnWCv|N`E-IQChH&?_oRhA@tCYNOTDwQy-vzxX*M#;04_c8 zeM!4EQrf0E)7iZlBX|9g^cjiwcCuM%wFoF&qIo*621ADTenRzc@mTCODGEEi<&D!w z<{{)afNeWaY7&9|PR-FH1~tx=9#yOpe#HLZz9-V`Bok zlN8!Y2j{ux9`4v>a5B>)Y8J_Oc($q?xS#DMDGJAEvmS?!<1u+WwO&#P(Zw#-AUR~9 zSJJO>3n1&0m9Rvq5bHKf7mht+7~w8mVlQTVtaWp2yWX~}dn^=iVo6l^gHyY&OQv~$ zF8QeMf41Xw@Ven#y*ayS!*Zn^$Ck`CHSiWhYoc;?tUpJ{*Tb zeR#nU{Ak}3vzwq^quRW)n@hp$1=WeAf3FVjY9Ff~ILzeqqn?_(EsTyYCue-B2uHvx z5$LjjC5EpegC3HdTY$o9t#*!XMu7Fan>la3@0nG-NwKP!SE6-4SYZwc>C$Al2(cBw zru9(J_V2~$_z7rWHa^BS(5uL;Sp*NR<&OdGEH>sOa&g4XJO_KrvWzBZS;4}6(9l*d zOQq!4EB7s@?`+uWI|HM(^kTNVc_8`6OZgQP8M!BYnUA=X@BKuIBwK9DPAcFoXtTw( zE6KLJIje1@Yd=ZKhnH139+&Uw{xc$`kb2m0%}eS(pv#_}MjCuO+4= z0k&a>aPL%`m2DGh`px9-kdF7V{kXOJVcPN8tXg z6ub_c!0+P@wgfyER^Aas2Gs3UPFhV?uM{rc&$B4iucM4yAc_RBJdJCV&;Zp4s}P3M_b6-&k5F0 zH?VT7wjQV?-V#RoET#PGzvmdlyB|wI!g**1Eknq!NK)bZ&ulOf$gFmSW{q`-NHU2} zRLf7v91J@%@C6}fVJ~8>?bm;*-*fD_2}N@ZJd0QK3MIBx%`ck2_}!s%c-@L<9GO{I zeB4x&4Ze9r)Dp5n^00bX#CQssQ}y8$`3mr}Ee_mW+@Nc;L0bM41p8^1y|e#sVaAp| z+nPVW`-h7~X(UH@e?J z%`4YVoZl_*E4kf3&#Qp*h-&;V}lsuD_R}R-4_y+7x7uO^`{nj_^OE|wIpV7ukbnX#fkrUs6u&#c0 z{O0sNhptH3;Dmt_c2NOsXO~1*8r3L9< zSmfqvpdnvKzAt)Uc^7IYJzrDob(EUNJ;@i^{O8_y5 z31C>E*LO56)2vB~no9ZotYAu5dFc#-PkkwB@xLU@N3UC&X^$pA?-buu;HO}#l3Jfg z!LNyrkN+^&R;zlQ)&6zHbN(+cML7O%XHcRB>5a04`O}lJHi;($0gtXN0vVqgk04Z7 zjQ~eTm_UmSv<4umslO^c+OK;F7!gUZucJ_<3S2{rr_*aG6|4`^hpZr6wY)yjqIp%q zb7f$){Z0e)5v_(*3sm;&bD*^L88}hsOny50kepA22awAA-Rez9-3O-DHHt zs^O4=t5mlZSyi)IxR1q!)3zMSs(sS?)Ycb?UDGB(&_fl^27Rc?W!qPyx@kJJGB|z( zw;8~t;=L8wd1=3AOIW`ZYV&JgvWE@yUW##zIM6zHYeVhIZcl&RxbMrzm%q>DnwW=# z&oxvx5xV6rf9t0P10S(xfVzYH@Nz{lgolb7c!bC`UcVCHbBf~qp~78RI3Y{!EjSqHrWelehp{9YGF07&sz>3a`wE2a>pyoT#2OKv+s;c6MNl zBIp=0EJj^LK5it$v7#Ta1Ws5!-XzarZE|G=MuR442?`mFi9#iTEXbgo4T1HTT!=bG zJ?J*bo`0|w9Q~r+|Mgmws^1buAA>FbTWQQ*ky^w3-U2tpK-dm;^lD4fT~=)Ov0F4l zB5Sou>r0dwF+BK8+tP_dwdO;M!W!x$5!y+^eCAv=G=Yb^e%4D74AL0TlLv)~%!DI| z*i?AzaI2$HiZXgiK5m9-o#IjE6LLsK`OSZ1;xNNiu#^EQ2q&t#%;9Wa($T1kG!ce% zDQ`YtnxmTB(V-V1!qHSNyOvgV&Lz;>c&Eg+RDnlL+KmN+FmTK)(4l;EsZyK)6UwV! z25iknJPOZ_y?|0d9O&%Q;3BuQ>Eq13ZdeAE+ z)f4%IN!a4-XtX1x3f8aRndByljQAa>s^60clbATw#FG$LNz{a4UvEK=;f-i4eWx4} zLXL}R%QbhGut+)Vt4}=J-MoNwzIZ=AbiiG307uy>Jr)zobe{;ekwHs{w32yoS7M$W zq4XB!te<`2;2Vv&*vcJBPDwsf6A4sflmzl4#umy^x3n~6jK6Ly9I|4@+#O9!nY(O{ zBDbvVcB)1zafhLEUh8V2wxYIbs*Hx&fhDSITNfHjx0ex?9!ezcfE1P9>J?D8pl#;G z^H>F$7`t{)rK@y53`=(;Zj?YnDReQ9d5En-dH~y9W+3hk8I^D8)~Tyv58YjJfFAUb znz4&CwDpb*b3OX`h^R~XQ*(gJJuNaRoD#ODPYOj%ikjtDHMnr=^(ipm<*qk`&+-ZB zw|tBKsWPy08xY!afDe~1a;vr}nyo2h zsYE}+a=A8Bif>%OtY;T!4owJOndc!&hEYgG@#My<*NerA!P+AWO|*u35^y1>x3SjA zik8QJL8uD)tm`$OABgbZ;RYPzp%$uT{vhfA2=B1I_sl$fM=*!OP}V7f8}~_jRuMN( z3@JQPNbl)7L849`>36xMLu8|cAE;O$%%S2LtV0p)?v`TY}a&q=7MGy15s5JFTLpBu9 z`MP``&K>6TFr{*z3b0q|NP0%@bUu>r7p0yXzq?OSZf!)2zz#^MCLc%9m{dGvR3J)_ zYnzp5v*yL&ibotD$DpIQt$`=`q;>A3A$SK$>gJzC_fB0ZDJlMUAZ}#d0dehF2JWT;7$6XNb#3%T&o6K|{R(rlwj0uNW=4 z4AMSqxC~M}9A5*Mnj8EYT{F7(w3sa5L%M}5Cv^w8LuNZR0@N3TR*+-I@5{_*VuTIW z5Uvx%K%ZK)T==NMvfgb%II?sguin@_Y+=rK=mc0VprWL>hhgn8r!NM!XTA;-CD@1} zR9%}7(GKxVs_{05Ld#u=Fc>-$*_K%d*@KDOhtb@V#e$%HK$OHB?kE;C>PxQ56XuwtlzvYnL;O>Kh~8)`7J+%tcw5SD80xs)*?FQE&JKk z!aHJNIfMujRTDf?XT2zWH6roBHOpWiHcDWS@gL~pbq+Syv|cm~xEa3boYq2dEMa$X&roZDr6k)9QRG^kOOxP*88*7$*t9X`av6S zsO#MYd$zoYt52fM0W$;eyqFIUQblh#P7jt2cUZXlD2Mc!A*IcrB5yq16Wy)}t2?~f z0Wohtqpn=o176lddc%V^L)CtI115Lktf7;7tnO%!SI6TcPOafAb!fI#tnSnh52mPl zg3jo$RWLl0EcbMqV?{aYf z$!D^i!R=$U`j@w*c?#bc=1e{6n4=Y`p-(W2KRpVXqjrg@w^=2q-c?PRJ48AYb}6>I ztx{TVxbs3?I_J9^#X;VkkAORbKBG4&q`rCFDL08`_gnYc-}zk$Hwmq`a30it!oI0) zWAqOrC>i*Qj;{toeR;~+pOixbaTL0~$`uE-6i>g`=Ae9~%nt{W{ypW@d-T+Z-<4|t zy1kgIf;Xh*#ovxFX$OilAu*rC2NS^y>L{{KON23|H@np8p@j45&uFPaVsu`5SP?0U zj4ZBYP3XSNeF0bZco@QEyLfK~%*e)laBl+DL=@mJ6I>N`bVU%7WAFt0@hKk0m{n6g z{}%OE5T^fD6J7;E7^I)tk#mv=7_7&9GpBG0hs*Y}m!K(BllsU#k9KJ+5*uytc!Et8 zPOL{p=Jh7aN~6}OpO>L-$hH__vuv~1A(5FOT}*oLXihb=YJRXkch< zqULB|Z*SuGKMlKzmJ+cF!uRwcD>6{9y-vzTBoY!qR8>_XhDm@6W8G=LDQInyaj^bq zUDDX^o0|30%jWC<(H~TWB-tvtLSFUB$m?El-`8-N3zHOYoF=F@{dl%;a#8znk^Ol; z^TG#^-q!+zx$@QKPujA*OL|mhvKE%Y>h3TQro!u+B)5IPR~pU2w_bNWK+DHjM?yTc zv(eQ>Ya}#GmUY80+R58>GV<}-8wL-mjc@ewz9J(q6&WE5NY{x=537@ep(A_A&8YLE zgezoKmM$rVw!Ab`L25nHw9*kP_y>Y~%Dvafq1w4=2Q6DXj>P=VT7t9T`kz z)s6G)ds|}v^=%J{1jL1J>^-=O75#E+eiDUx4LR4mq=cN?fRaKS%V^ zC4kyYa<;HHf)r?B%H~?_o)3VXlrdhdQ%Mzi@qF7J+QOnm+tW1cyzX8Dbz;NPqO-D< zdJ>_bqBcXcyKQMTrjqR&!n%XfN05n{yaCjU2r|yoD_wkwb!4T}l9aTxJl&Xk>sMA= zKcEGE$HzHpw5PW)A*$M$dIEW2)5SeS3EUQ528=Nv2q3pR1`z7r9*lXePAv)8<&_k!TBq3jtC|e*}@sKAoX-_!a-IBea8mv(ws(jj&Ijl%?QNDr@rg2*)Gza=DSKgzB}w-@k)XbJG&C<1LuvdHQ0r%|Jw&{^<+$}$ZVkU z@hGx`2-O|0AG>76?N)-FJ15YPT||#%)j}Ixmqbc^%+hROdaa50RLXeHE>>0c1Jt9f z{a`L{&jDAISg-$pH~Jgot#_R-SXx-MEhGt*g5?joMIeF4Zfe)9B-A^fxgIZUJ~6j9noj^+?2%I#Q0ij96fFUYMV;m?>z8;P0lT36 zd3~K>d!=D}79;!E9Wkzh%9GP8`e!^}0UdWyq9Y zsDuK8+jZIr+IWKfe5vWbXw3e!Mst{Y?~W~BlJ+E>lM}!8`wtBzYG^jC#4phK{pu)L z{|lg#ur)Su|NjIWNtt;3Uz|%(xlqDZLHWUL7$ZAV?57T#2SO!XGgq>zAcCJLQlSZ1 zmq)3NlW7PsN!@DbJWH#5d(A*=MdJV5N>t$-qSOYy* zAL=^ou%c(oZaYuIeL2nUgw`pd05r%1{k8iKSwzn==xa+?mo2@A5GRYj5r6j3GW-^rj?$S*mb%WSAbE+1TlH5TLd_yP zL@FSBgM%l%!9NSzWoJuqMjpwm6EL;1d7~BdctFU7IRvA>Y%y{;!!PFnj8(SQh9Y)8ar>8*9vq=*PQuid6i zm_U~ZcL6i1@7PDV{o&NEqy89N*1l7p)^v={Kdk?0{)%PEgdEdS_I>SxW~9R6I7#ga z^yowKTG736QWTz_jlqNchoO8I8LC#FPZ$xVOcOa~g~d5rv1hO_;PosK`E8VW{qlpupqYX>94<uE zz0@Q!t|7RGbU2)0&F$$B?3==@EAz)eToEE>w!s!wn$!W>r$ZMmnH zx@?i#S{tCx9~iEAuJE}|^U{}DiJPJg;ob+HDnW+WENp{jWqe|Ry!;T}A;@f5RaPcHfei#Fo(J+K8)jR6mF^Iv%CdV>4iAS4=Sx z^f|mqgxn;DPzIV2#9|VgZyAOuUyA<}cz-d?N4Nh*@0tDD8FTzM;N)!LXy9z;sAl18 zE@W+DVC!Q4KPy#59Vu)96rLpO2A3GD7|j|z8JP*uJ{!tz^HHIqz&ff#{Q|qj3w<(c z(}k^w)0uN2%Etn}e7;I|vkfRwLIPl?8y>G;UAO7UOI}_NfOl^vi<|M1=VU@tzZR!G`gNLjCHm=i zB}iohz66PI@I->gpX`TopmN0(KLM$jAq9@rBK<r1kvdKQ?W(tE}{WPUHrnPHKd8Q!kFW*U?+mAlgF7Oidh3Y>iBeh3u?dY;6B0t1(Au!*<~}t8s%wHmTzf2r^h|A(grK zdI%*~zDk?|0+JFXf`9zT;((?vp%H9DfXdDr2_7s0oYy~2aFP=e7BIOym7AA|i^*%+ z{bgjvZU+!&*A{A`EkzWHC8Q;VF?mhFR4wBl$s~y_lXji<88}|6iTxyaAmPsC1N^3Q z+hs;gZ==agJmEzfnj6+%CLHk|ix0pMQICOMS83FOYUPP*2|O4cOQj4A-uF(M97)Gq zcVccr+ButBe=gg&0tVEqZAK?FzhN#on?g`Kn;txt`ywK0a%xMCFDfxT|}QJ(Cwn)@AHW@4XrKBi)e{hl0UXGPI463z6_ zS`)`%?uKCuofca^qh(A$~gzbG-nk1e4&xb*zDi9 z?bA`}q#;QpH;n5XuTf`*=~14u#}E;6E>)$^ai>hf96H-b+cr^phd|G8(o-~KO~FuW zSDcxt!3V0`DJq{sMo(yp`E?UPz0<5>yQNjgzUW%@KdwT9(f<$}icsJa7$h|zrYJ}S zN%)jZVbn(dim1#)C}p{F7HreY_e&+;L20?mV3dnlSG7fABi2%>)Xe)rr9ci5HOXG? zBd!x9htHA`!m>f4kGxqG8!KiMj3;zJ{nJ9M-1lV0jeBM-ycadz1g^rIc>u7UWTQ>}Z=VIDMn>p=1$7wnD4@?=6D)hs90F zh+)LT^R_!iXwEpVIFY`o1B9bR2h4sb4t$y!vyi6N54X0ry|y{Z{@r}U&FlbF>(j!a z%E59Ai4FvZW&U-nr z(@*7*dlgA@<18G|SGjbZu*`AW?p(Ggvenw)-gVhVtQF}!dJx3#?#;i!xkiH@U(x}y z*)y+lRIg;D>A`f*+he+REeT$dcC~NPv}PNfG9S7dv~5*E{|2n>d=!Olt;uCTVMNYr7f!B1T#|pe3~OLyWI=8F31P4L#F(ome9l1h>Pz z$F1d%i31lN$~QI^&}-d-=voS*_1Ic|_wQ#Dk5I63^U=CwSG-@$^Y0>INJvy-F_xUD++Vl&@T=wKM zXYUKy__pV>GjIx-4v`3xSj$eh2Z%iQ6FVjOqO8CeBq1H}jcF1`F+R}-@)5oYn+%`K zxLM$$zHCSyo^+E@?gv|skdW@5`4L=zU57@_#dA`wW^THc51pTGd)PjGaQ?WmR=|gX} z_8*9CA`JL#xeRP`4H~RJxQ24##tRgx)`!Bh@2TL2kO|v4sZUf!oDQ)DB)e;0B%GHY z(Slm`RzL>q*X{;Qoyw>J(YwwQ$&{XLu5Isn6<%5tmEIVOxd>8G0MmSX^)++J17Xv` z3JB7Md?}AS8BQhY{RNR_t4tv`o`i^EPE-nqi+HpyB}ZNaaj9Y6S>f4+a-%P6DOl(` zqL0h8>|EN_=v9q(-JcX&-z}O6tyOM}hbp|ZS%C{NImQo4h+EmT`~Dr%1uebck_Xp3 zm)40|iw@a=wYXoFE1Gr&94kjhpv;r~X|vjA4wXq~FDWuMgh`Xp?n{nP*<7eM-RE_b zOj@X)uDhLCDnv;o>nEeZm)98kW8xP{ckLZ1EI)^|%;RE$MK1^pogO z(Fwid-AoUD_X=RAt)yHO0|is0RB`MeH8)`Z!b0QxCjf&rW^G`KU(N6UTi<`lyB|{T zW3D%fAjAqKFUuOR0`V&+(8?y95*AJ#($EesZ)g*LR(I|YejJyiC5<7{B2yHdr|=f} zM1TzCgAqkp;zzn6GHyIt6U8elNiYpOBq?2Ym-0J+W$-@Vg%w8Yfk&HC!LAZk^e90^ zqrF1#gaOC++yteJ6DaK@RJs81Xol6WE=!}pAy|Wbc*l?~ByVK@EAs6jE!N=wpnz`p z7`eeNrYl5JYqf6ozsp|bYWPs?x9nkm%bxSUfMX>KTQh4DC1=Oq-~X(98N1(J!6$2# zk+BrkW}Gcq(0`DU1+`qTureMfg(!pwg#xKHrt^2)bggGo@dS{?Y3s$`lP?A%f%^pT zMKN54Eg?Znu(WV9Gc()n^6312yZC?ym{6Z43d$mb*;G_jkReSX+vqI}*nknmsP0?l`dceJYPZ!SoP#02C5!>1wkNGblI?#Vu>Z?s?96RvmD`a~Q+s zMw1IZ99QkD(%l_n2~F7_Je@NvkpZhgvPDce%R~>4u`MGkJn7maKNL*+$l|_V^xa)V z;RyB4nfGx3P)Z@%{}YW-ZHW+GzW>0EhSK~eLeT&R#$|{?!|jWqH1e#_(1Q26-B8QZ z00CQ_h)0Wi8-XVyJE>4J-uixMo?YU{h0mrbgnBHe#%s!d!dBSC^e5TxY)o|so%__5 zNtxW0fy~AwxgSe~>B4}`aj2urIU5^HQ;`FWCcA+Fbfh2Bm^Pi=Vh`#VcGj!S4TlBu z8m|bHDE%=%@qETIY@Z2*tcS@(?*Tcmj^8g#fKM(HtQqP_p_QMmOgKMB)(C1re>C9< zsDi|Gn(n3V@}8~Ox+bpa-)h)%2%I9j%mWN_<_^LlT}ihH-pwd@c7c=RFpY+Ib)&NM z+w>lHO{H)Kn9>2gHkm`096@!^0N@}f7SloN7@>w; zytCvnibQ^-S-;goN|A%n?{~=>?RJ81{e@W-z z?I+J1ScjZJ2}$#X{Y2xO#R8jg(lk~FBnTO$@*>F^ca4oIV`9DaEf%7mUs37q5WRLb zQM_kBm?LsHdOSbS9ncRDquIZUby)>vq9g6&?6>1AyW{GfuagHa0Np_sR4U!rJq+E5 zeUw81)z0a9(%I+TN{hB{-^YTMT_^#U81J#o^-dck zB<#*%F40nBZs*g=pYo{v7bRNaf0f?jv0SlZsrP?^REoV#8zl3)lgI!8Yl9TrK zg);G0zsFO%(=v`r{Y#&=W?Zjfn{ZsAjSGv^+=PKVh(T8cZtdrDZ-QgBlsl#sOWDmj zjGLKL-*)(}){VwI+e8U(WoiZq8N-fCnK}$BGzv|9wt0<2iJ=GXssj|$$gd8MM*IW$ z7>R}${r-Wlux9ot3=d5>!8_1cp^SnUzS+x)xALksot8}X{4@2EOSsgTa2G~spk*@s zW5j_}ZKZoMT|--|w4?^R5}K}?*1Q3Kk-%>Ddn6}BF0F*nrewvT_FFWpP12m&M`P8V zwAhDs@{M*w1%vqvs{ah`tB8#@R-c`LiT6as z^FBe$3BL-7E5VAtJJ)5|@-K^#_)*7+!wNqlwl}9?%kvr*Bgo#nYv<4Nlsn@KJp!1W z5}KY#RnPy1s6If)izrW%969JbG(dPzCy1?TMM#s_kvb-1Ftz&6eDZYD+R|R+2}(Zv z02Z>LZ-;Sfnng{bwGSW}NEHth)`=KM{Tq4*K{5Se*?)vZdc>7ocoCn2Z{z3NC;B>M z#J3W)VbmLDuYK+G*O1mvOn~5==amY3A*#B2Bp%)K)cgTxP?qBh?x276d^fz-Dazjm^r_ z5TJ>4V!shO(?x(=i0cL(1P0|5h&v@Z?}c&d31@F?JDsB6^N3^h`<@M3i2nxt-Yh zCBY~Gv%XXqyP$cxIg+(Sr}K(T>z3<640Ld0?(?a`l8B%92mSi?hbabvQOd$zcKb`W z6JMU!4)*u!$BG(&=Uomw6z>yp6bJqLzqSi8aNdW7y^~4W+Y|av^MJlhq8>+@Z6nkq zy_YxZh;|dyGL^#&oxK5im24#ieODC`@sJ^F1(DS#a4Nh8Wko~-O;yCFLZUr!PNr0G zdTH_zawesSifWLZrh0XTvK9Pvq^4w(jFS351-dK~$T{b~ZCF}5^n5gfs@Jr~hAYvL z_2$V_4vmHkJ7=rIW9l>Kzv~H3#!Oks^2VVIWk=P(4PKSX!k6j6nuy6u5M1?PDiOG1 zwP-QXYJGJn#(#?AT2hDgu|1^YMHi^kqPh4f`Kc>4h0WcPjsxDb*mft6O%rW0|l*4u=o_>1Ui$LA(%zU z=wV9$xdB}%wJ;J8OSgHIh>oERH8dv`<3cI8C&-0>ygWU|m?_OjcQMTkqzkWMA{BG! zExhN#i#d49;~%)k+oX+(GEeFh+Kmsx)5R2v0=cLUdzlIpa_Bn>b2w8794_**4V+dV zRGn&qjFKg?M4$^qL?z~M4}<25o!}u|8o5(ysgx}|sYrodJh70Z1C`3nivikww&~P^ zEU?#OR2DTga5(xTq2PAK{!v)Af6#|CV3WkJsxw{9mg?dFVaptr*HEtv zsm<9(%%1zrPhblO2gRN~vP4Pa$Q}=4b<%@G)E{oM_~-k_P$QSM1`;*28J$oC|6cJB zh_|)584pTEuXGI94U^8uG}A${X_buCfj4z?W>kbP2>!}KiCOwf_-Dr#wL+yleUBR zOXAuqYSF8IqEF;&DYx=R@&J6XqQE8^)eWi|v{GRq$2@2GwX=q8ln6`VwtO8K2%9^Fppc+y{2hk4t1W);hBn5!?e#0wv{8O7NS59`Pmcn^x$nDZHrPHx(Wo7ApguU9!Ya_R#sft`k-K(~tf z272x*Om`zNc*Wiwi_H@K^$~Nx5_4v|HXKw;E5AQFXJan+%z^O@PhkOd7qPH;BN0Xj z)6-kv{J4~FRo;9=&Mc<&@s~<~v>|4IuOC^N6|b{6@8``5S@bVy5%hhTA9b^E7V0ZUFq14Hl|}TIN+$ec~h|!lU2dhe9Qp7nZ0tZ zuy}Wjt_RfDpk9KR@VXGnA7Nzgta%5efHKM}-Fw7hL`?LtmVA}ssRbOj_!zEHSs(U> zryBv+*!UcB;~S&~r{K%}AAZ%4SPQOt*!kU)u$_EkU@@J5UMFVjy>tZZ6#gWHIOscK zHv)=5Q^MR^5LpWPxkMLGO_z>gEq2Q3jjjOJf@QivCClApgt$d7-T443TJQr(&5~B;60OtP&wSVa$VG}1KM+^I3e*1rhaW!yvoF&9>v#9H{riS8X zQo;>=Ol&RAT5Sp-V+M7)SAI~Mwc#fF4y`e(yywGC9z(8RJVgTbVEJTu96^LWgvwz5 zSsY0qNCd$f1WBL*FeIEvCcBsER8mCoM;}ivJJW5x2h-yzua{l))-6bVIE@f?I6jC2 zY<4L{Gw4tG-E0QdeKCXVD17K_^4lba=@C%JHhDO7$j8t-rBCTy!vHD4Hsc;g*%bHSI5sI!uaVlccJTsefqGEe)G~YIpsvx~`87Xs z4nK8w1p>kjKjDG=P~6pb5d*|Pze#S>d-Fi?(A@=hB?8Joa?#vHcQpb|KyuOD1$ISH zS6gIuNmKYfeKdI1e!7WnD|_|&-C=8`=ywp@mEND#INq{wwvpVmc5eu~ko!A9iikJX zEXuO1TPL(c@+k^Px~WoaW4v0@PC^eVj9WHroLEt(8p$OlbHjciw{%P-b+Ts`Ro zNDOtWeSF}l<*^Ic4MuXV)g22Kj@&Ut?f=lO8UI;MFa~vk5X?$*-J}DfaP(k0H9fcPKP+{x^iq9!pIkqzUW$l)tq!>q5Th|- z+t8Jshtah6Kj7Tv?oZ6DUBo+E6qmhn3~V7t(dU!Q#96T&b9Gxid;V-uyi<4dpt&0L zh^_E&b%QUMm8z-NiPg(wAncv;l>HO7k&E6i5wcb9^45lKYF)dQO7{8cOfR{<)k1xs zVci)qU}Uio(*fy~!#tos7@dHrZf>@3Q8prVM@4+z;p!>yCv|LA9Z2lPc;V#y>rr9YY%b`P?3(+MEq8;zvn=ZX5z201B^ZG73 zISX=+C%3hv;jHc7YJva_{`IjmrU3AkJ#6u9cK}N`B3TQKm1Sk>H|M2JbJl$&(^_t> z@_HjO6Qt)x_FCf${2nkc{ysjTxACsgXA;13K3T9I<|~L6>?d{})+M?PJD|@bh zQgK2B62T$IwdcrFajh2ya}3A>mX=l)+LWEa)v$S|z`_yTVkSp3&Lm805Xr?vWj(TN z%SM@s9}I^8@!gcm8%@p#&xf~F=U(@!gtIK`HNSq*O075fJLiw08R zRe0%@nAospOSy!eL4Z{2#B&RMk`6bmg@v`J%+)O!V)kSOC5pgvan8`0$b)6u{uYd(VNW*ZRv^3Mk!v{;J>Z#+*EqV5;@pb0Os6+0^C4hPC zo3$^b{Xr7w*nR_IEnUwJX=BS{_(Y5AqML>ScZ$ouuD9D*cJDEV-G5MjTe8Q^v2nL# zDbqx_UL=nv9sb0`UM6hzrAdK9vJ~wKi?#CV0+krqmNKOr$4-dPNgGk6G#TMERL8?NNf8fk@X>csxE#OP zXI*ngZ+I(xU@7(o>QLNA!DFt3VSM07M05Z3>KJYklL;%DYT)ox^ItlKyvsj^HOzsR zV712rcD9rxn->@-NuTXMnpRId>jx?v85au(lDsCQ@le_^ zS%6o?HiG}rE>+_XcK-_pf%=dDWm43nO0v418M_jaD0Z&mvx!$a(vYId*oZn3Vt8qu z1O}=-??w?{Yhs#hPYBdDSNYM}D9bj^0DoUaMP$@oHpqDJUON=`C`T_;eiWdGg;mS4 z$^d_}Oz|!ag?4M44C+x9Pv!6<2R9zV-0RqMEb zIK6Ii;C@ou`Te%Vg!L$cXvTZ~PnMW^|CaCGd!?yVZu{CFt%u2hhe>Ffhj4Bui(HRN zla?3|orAn6gZv5FMjwzR9}e<49)|#` z&xJIFPY31U9>#pJ*8{pP$BY~;*Nq`FxflvxYxUpOlksb?oA0Q_9_e8*(t0t1+7U?B z!|K{W5^Zow_B^F~qLafi>i)ho!vvZR*r|K2-O|^`QKrzcegE13UiJ*R{bk(a)p&ye zxhLnv9Qg1?h~0r|cO|-_%5HznR8_g9hTH?FZi!@irI>N)7qq(srEaNkLs!fxxARfm zlVV4-nxO2Iux@5E+|#B1g5*py*CsaL9SQ5OC!!8`|RSX`)(*syXTu;R;H#P)ADPN|jT3Lr`X& zc(IyChIZX*vGSi#n3dKUgib-pJBH-~b%jozPJydMZ1EOcPLKDxP>{- z#Mrr&h5C03=WJhA(#MB#shg6echV-&p2Wm=)AMD!(qv!or&BHSnr{S?C$Te-FHFta z9&zl)l~ZBkHcvV+%9D0LJU)65vragT>|WF-K%!SNHK}wajW8D)7WSPr{c`>l+qRHg?4=v(iZ8ZJ0T0{^K+GY z{tF&9fJpBZ?7%w$5N7v|F?rlOM@u^oRX-oEEkD&nE$xWpK>sO|Vc(0X9?Av)sBi}a zApQS8O#I*JVbBNC8%O2qH7kehp_^%KbFF0~stHGCAz7Ds*4{QzrjvP1#*NKp0mvZB zdc8z~)tHS|1Vx1Z5D7KD&=Cq$7<3R#xG!k{8g(ctkDTCJ8AU{-{d?!etFbZ3SW4>Y zgfCCdbo-g!viofqJI^njv1PJ*i#2O<$fO(W!MuY8@mMj-!6}0wZDW!-O~YM- zaMGyUo^;8EY_y)Waq@toIg*annIrc+k6;qn=7HqFI51lr`+CiFh2t%7RZ21KYe$ z$rM_~KUOVsTPh~DtTM<4=UMy`!s)sx-UsO{S{5beHNiCB4jBIou`BIr$qbM2xP?bo|L+C{w?L2BspZVhUhcH( zoBRon#otZ3H~Q4EcSjfYSl=hc)crw!7vLoJ z)5DJUgUot(R&N*Pq*i%fO>mu@{5dOw9X-=ay4z~?a2N7q=jpe^`LQjKU$$Z%(8Geh zFW974Zx{OHNAD+1`b*Fo2g6HXJNzVguQ$TvOwb!bx*otols+%aF|occtA*?i;DbbmUz+?KkE9R&WSKb`U;YIA zZ)VQkxtRWU`uV4DI$wzl@ASOrWM047mGdWV@G$&law#Af;IM%1Zw7FhlP zuHpwe=@jqR8cO?qpifS zn-&gT%%44xKrAH!v=Fe28Z9+Kv_70prq=;1N&pAe5Hh@kAT@x1kw7&$!e~&kgL%Px zB#?a?sY)1{P6>y85K`UH7iTa+`Gtf~wx!vh9hCmKRUnwZDbO5vPPW8=kki^GRy_ut zW=Rj^i$4Dc^O4X0+iErs{7Ylj5Aq#4{|EWejQ@w@^auJ~&SI6tIl`Yk<=X0O-Xe+) zu|x_+m@V8zaM0#TJ)t-1%?67evM}tLgk})TvN3_~pP+R^vr>HjEfKXX+CHOy$q-Hz1G=YX~C@CyY199*#@k8psYlNJqto4k_FfM0cX_oa5|)ZnN@6 zu{PLwc8^C$M{w&UpbfE4gn%C8jvp=+?A}uo6D4&gsNNHOu5C*gqa%<;eRdCspf-kE zHVIzQA4c(HfS?xC21eS_rWzi%x-O#F6m=1<>#B6_+2Os2hL4O-kIWX1ebx})c0tvD zBtu{e<^Ub8CEyJ-XhUF2-mwb24~O73&)^1mC!y7;yBUMtKOFyx62J$$&qQzy=ulh2 zM|j0EM1Ti=2NG`Q|4J5a7r-Cw4L+De&<(xsMbHhuPl><>a3_Qy7xao4jvw?28J-vT ziWzRk{|O(S7xW4mt{3=<8m<@g3L9=Fzzx3dfzShb2Nb>&@T!N<1AYgN;0JO?6wVj$ z$`qc){|P#%C(s46Z%6PAw~tSt3wS4o@B?&56~4mX1-B22U{9@gpOhb!pM@WmpOzn&pTCzG`y)$s$#j-9{1JqS zk|m0+5%74{hpyKE;0fS&xvAt928;t}PtvOZ09`H$T>k`rdM^YBJ>l(?kEoA055x>e zQ~EInAa&Y}qMvc41uy|xjbIN$ss_Xi&92((&{7Mj3TcjL&)o|NKn|1*V*jU?5`fTO z)t}Yh)t`YMyw}p71pv`s32+(68ORw>7|;-43*Z7^9{|#ygde`w(;pT98_*Mw70?=t z9d_5*p9$a{U>Zam&>HX*90Ncc7zW51bQLTfkR4i|s~4e{p%;Q5O&?{~+Mm%MhaXQL zM<2Xb*53)h6)+q67S8_xU>ow5&i?^$8}=5@9~xjA+Mcji1OOel3w{^L{{>hZ${w@# z2tW-$8}b&=zY2gC;+D`K9#|XJ9=5j`03WaoPM@v!2>>7T6{B|q&=#N#ahJ?L3(yv@ z4Rse8pcQZvt`2+`&YuhL8t9dzcMBj7=#{zG4B#5D4Sko_e+Fn1{+7f4AHW9y9)LT- z?gIckp!fd+KS0300pN=O4+A^`@FjpR1AGPGs{mgE_&UI&0FMDY4)6rPHvql~@GXFE z1AGVINr3MHd=KFJ08at@0N{rJPXqi2;Ku+z0r)Av&j6kQ_#c3u1N;KumjJ&4_%*<9 z0GG21^7L{9{~Oc@FKvU0R9Z{62M;o{tECiz~2D=4)70vR{;JA z@GpQ@0bT=m9pDXsH^E|HX@C;U(!t_j8DN=U3E~>d0?P)g3@krb}t9asUdrhzpbtQlYh!I}xyEU;#SH3zJ@U>yclJy`R=nh)0DU>yP0kzgGK)&j7Q zF&Bc>2-YI7n!s8N*3n=s0c$B(%fMO=)(WtW0c#~#&0rl1)^T910;>hAmbs~fC!V8y{ofRzNR z2dwpAZ2)T{SiN9v0&6o^r-5}kSZ9FM2iBQjrNG((RzFw+V5Pwt1Zyi;+rY|zbrx9L z!5RW<7_1SnvS5vZbv9UIVCBHdgEbD;4zPBDbq-j&z&aPKcYt*sSnmYuU0|IL*1N%a z4_Fs~^@tHHVk ztZTvg2w2yFwHvJK!TKmz9|P;-VBG-LjbPmb*3Dqu0@kfyeFCi8z`7l*Jz(7d)}3J8 z1=c6Qx*M!df%R#yJ_FW0VBHJWePDeStoyk+WN1lE_q`U+TI1?y{IeI2Yv!Fmj=$H966tZ#tzO|ZTN*0;g>4p>hL>$}4Gp2nEQ z{E?B7^jO|G<9(gs=<4JejcE~FYg=|Cmrsr4*QbWY(>nT) zry#IB+!2n)L#>g{NV1oJ;l6lJXP7{?#ze>3zG$dRX3MZy$J(}7XHQqu z1qy7|u{IfM?F{#|g^~o~i0%TYP|cKW6)e%VCfr3p1N&ba?(Iv2*HIQQ+g%*aPunzk zI30)Uo;V!sZug|&e6sDN;WTWU=;`i`#gmD?jDP>k$h$_lO9_~8>g`usi7fPfaXGD={5wY#p?|VaW&I0FR?*|i8K+bDz4Zvo*5c& zrJlxG8#Yg#LPsV&G~g_3Jf9g_5*iyz?dr_r^2aYMuE*^IXJ`&m6I{;p{d9)w9n0>- z3W1W{;)Ew|BuZ~*Gmk0N;DpJexRZ%zcOFlSn0h9qp4xUnn1!MMncxuOp3(HZOe`i4TJ_z`iXul7|L$N zMx!n}#gR};7C_TbD3%;L&% z#Vyf>{UZMDvkRf9NSA5_b|zPtA7%!}vcpP0Xzc#~+|d6m(x3$%UO?vrlRug5_VA;| z&T81)y1BK4{jq7&0p~ig=i@g;rr0bKW`-J@a8BqB;$=|6UNLwoJ0xVknu)8I( z@q9M{uppC*j5z7?OfH^A^RtkLyfYJxEq%MQMrIkzj;$tsQM>OrH7Etql+28zhLAqT z2vy}s$Er~29npYD+C-E)9ZO1Cf*M=UFa;<3F&U2}i>y68NEQ~&A~lWZ|d(8k6Z(f=??Rf7;vleZQh6ou!JTIp|b0C|}b*0Y1 ztx06gMfux5G(M1S9m;OO_QCWy`7!JbEy6U~`e;~V$}v5<8cHkj5*)E#+2R%dC|L%& zvqTKzIT9SH{_V+3|8@kxmh{%lh%Boeo8)zdM{q^e8PXcD!8WC@5@~cfs~i~8MtUSR znjR@ulc2VttTgshgNT0gWsv|T_uWdv;s(nq9ovZ#RR^+qMSm*SpBhNV3TCn8l#=UK zIYb7V>PAtqw|6y71^28-B341`CeKBID~3|JyqvzHC;1TC{4^KoYNawGc~#Ljh7+pp zA4{k5%2ZT%N9v^p$?W#@2yQk~<}A-fs5)*T?um^=JB$*)bsQIL4Q9r2`DBLrzpUiu zAJBX{B-%KzIa@!KOi^&R6<4pZmbatwrdXK>NaR!GTU1C-A(;)U5z&`9dptdc`q0W3 zcTc62#^SmBaDIZxBzq#PN}FeVSa~8ETUZ*UQzl6(CLt8cV}8rHl$U25)bjof6!6s8 z)}`vUOx>2N+X`G8PNp@TqwR>ez8LB1Lz_Wl)BgOZoa2!ij=N^$`m-d%U}U`D;E6HW zfMgfRX>{}wh<~XdPymjR$i}i=2RF3?>5vIgy8W)LDC9PgLgwRX@_mm|g_-P!hMKa0v{tJf74IDVIO@cm;_+vObIFHchtPD0vAAXN>d`-gC$)DCHE45_Yc z%q>SjR;6;@z+VO8Z^SE5W@4vOLZ*h>i`_YeMK?eWSY7nIyHaD@(%6vPkOwW`D~0|>bIZBiwdkt(B*g{%mL zoW|xHz!Iq*&E|3$B%JP|xlyqbEmmcJrQ<{_Wgfg@u_uS3Qkg0_huQsZx|0-6g^DB< zR|K>oWi~8%o79DDHd>%!>a07J#}pZZ18rGlFU?Hi;jr`pHfi@Pce<4mlZ1l33fe)EH^& z@iDBHmzI)E^oyG|N1dnM#_Br-j#3QqpAlsJnDk z#RwqyWN$Kd$OvTsvw)y$YxS(6`zAdO3mPaWLVzF;rk!fopACQlf4y|ZaHVMHW{z-e zE6Kct0m(*kaFJ`vj#GG{+%XM8IVG&k{P?IeylRU>qwA1zHn^^#WB{b1SUH&<8+KYt z8@+ohvm-N<-l`nfLWay08VDyV?ZItXx{0mmsL63SG9uo9;we2ciB@;f|)10 z;`)GRW?oyNy4bR)ALK~ul$C0XDwQz1h~4fnT620}f>|otD3xNn>!Syg$^>&euX3&4 z;&?a*H&d%z5T|{I69*4AEZlD-T)EeUh$@O1FC|QPWK&Hw$54U0Pa-vT!GFvS{x@vp z3f%kQ)YvZ9)G2oWg(oV0C-3+s6@$ueDb{xYZha^3)Ssr1+OeJ3jN$+Vyix$dWx>>0 z*|GH~Z50;1C7BUV$uv(1D#?NIe#eCjPAza7&84#RU<#M)2{=S@*&#>mQRJ~5sg^85 z?>s#439~47;cDJ)3rJ4_A%j5=Sh9_>& zw*Ss1(Aa+Y_!!MR<;)zaKfP&x{&Y=FqLRdX(XLTZEH$DzK9V_moTxH2iq_vbD6}XB zVi(&@d}NuB@U9eDA}dNLqaJYQ(D=r6$jpMYH40X|45TUisQ;LaV%Y{x5 zS|lO6Qs=a0Mo^Y_W@wQ^g~yK5RhcK$H@O5^Xi}SLPKm3-OBSH}zj`b?KH9oV@t(K9 zaSA5akBtqa$Ebc_QbFO_#^in+TCXmE3tBfP?3J-}3)fLHNd5Y!AkoJV{o?foW^Mub2`#COuipNjArN6F_7}C(>s-`mmv-EmATJ@s9srHnv13 z`PxbW<`g%njM{ZlZi#eitbdzo63+FfD3VNjo>yl|!_RC%+VaV2M-Xd2Z}lDCGsDI9paZoEdQ};gx+$`<6NTl^IUAlgKY_ zBL()7?h_e$NQE}kQ1=+#l^HFtLQi`#cjz9@=E#0^AAj(Y|EZ(W6RWSUN@#?I` zwYh3CBUqlF`0_+mCg)f~p}g~u&8F8-QUkG(A$l!}#1o2_oQfZ}Wk<>ErstF0L*uz9 z8Yq~I{UcSu`m<)BsshJ30li5mE_e5YPDX{6;{5D)myZi3P`iy+Y z<(5R;g-tF|vz|~=m)$v1qALQI=!d{1I$10gfb%9oDnE`>$Y=K}<~0^Oq-gV7=?y0| znv;*QGI<$gpY6P{;XZWfEb0~_08cC?iI)E`5x|_nyC(EprbMG@ll4;}df_j=JVIm7 zm^^meQDV3kN}oAFX7Ae@g+3BPsoXYcT^B3LCxL_RyWi8M%+nco+GK56=-jJDoe;TK z**YLSw|vX~qC2e`)94v6Jt0izkQQljxpXm{gN5~z3fDO=+k2`w?YlDP(7Q6F+q;GP zZ{I@}*Z$hOg(cb_<~)zjh3FktiBHlXp#g`SsFRX4+Q+h^g(|b$D$zt_)$;I2er#7~ zdPjN)^(FH7#8P@mQ^My=gv)osknA$ZPqMtOP~Mu#_iu9;O=I&5VD~A~2r)!gY9uo{ zUWmz-s3h&9;#*|c(@|3^xvFwP#rjee3(hTiM5SjXQ8l5TX>KKnxX@50l~d8aVu5^t z5mjSDM83HO^jfAeH_UuiB|P1X5vo>?rG|&;q3CQ+!B`q`kse5lZ=siVGK9I6h2r)J z@6(|WnT)`RZ`L(<+wHHKQVA|f+cSewF6Eu~Ue$aYr#0u9Dw@qmqNI$x!JC=I;(Qu6 zZos=tcl|_4v2i4uQ?nVG=!`-EdR?p2BV_y*qNgr~-FVWhNs!j`uI$J_AzU(JQfbeK zgHVkfQ79sc-8zQ8NO)u${p^KgXGf~vaZlVHIy2kT%6=_8i4GQvP&}sxylZgFx^R1j z$A?SqZ)tHce@bx)hIg0Ug_c8RbSO1%Vx^?%)H+jz>5)_Fl$NE3m8dsSlujLOsw8!3P4R0-cC3I_7vt{! zc4xCgQp$RY=mlbLT&6fHS6)U&R7fL}lOxV7RU>>3+6fb;<0*`c?62c><0-|EG8|f{ zu^&n4qNCK)N2z5|TMVgtU5UE#Nwx#-8Ik*0H6b4&^Sox zZ&gfyI}c;kZ(+#uLByiLkyaF-L zQy$GG#{0M7GPY$0ymh=kR+YcGj%JZv#z!VpvJ=_yvHmpeChq!VU*l-%L0C`wtsn8Z ze(T3{`HA&YjU9aeCq-hr`149XpT?&nOB|q;pELb+#9(pWYJ2_sG=93@`kD2NUw=)1 z9eXp6^mEYv=I16Ces1$Jzp;q_8COtz|Jd_WOJV(w-}<@r3qQB0O+8=ew|>bx{MN7d zpZ(Uat>5^qXRYV_*7MeH{niWA&+N(31NHkc+U-m~j&J==SpVzie(U$b`h(y4BO&HR z>rZ~`&(=$R+gQ+AJ$9Ao|9?V`K6NIdWFvw)<6B$zpPiO&1-(^b?XhfyonPf6hKE$ zv@IElMg2CjH9z0PH~VcLF2UAqE^Gs<*{0tXh*2AC%WvCsDbs)CxBdE$G`2~a^&_dF z`t;aXcC3EqHl(q7@{n;F_5IF|Rnbv#7^r^OiJjLsjE`&|K@YoLz3?n`Tm26D-F*EZ zz2vkI#a?3B(xpp`K2~MYE{3YtV}FgpVe^>5rUc<5KNf`Ric0H^PorhqZLw$~84pFGNxwbap5eEH_DpO#-*3<2Kk?hM?KysXE^T62M=TzWtd7>N z4fp!(!)y&}HTms&O4xDwWq&x@7Ebu>dB#P4d%k@*_Fx}@m2m!A1O6Y4y;*>9dC0?J$k|QUuO~KhUf;f@{PUFZuHxW>?V}*^jrG+ws<&{4A;v6 z>V>`7Zy#;rq?ZyxjboN4mM-_(%djCI;A!H&dAPo0Z?`->fF?#sc|ri406`g=B&I{j zWW11W4<$o=RESzg!lzVBL^e@jd$=vq73%D3kF1U)69|a*boF(|!)<->PR+PNUOoNJ71>>?cx3kxIqfa!dO}A%%7gUqXnq&6z)Ir3 zW*+j}$6Bu;ViV!ca9gsTmfadkgc}z6?c<2%R@p6n`*^B+f^iWpwkO%K_&8$v6Vbds zm|q$A#bx~S=tFubwmTkc3%B>gi4>~TPig91>yQqd@YF5HL#$fqR4rH+e)}Xuf;N{z zt@ZR%Gr8DpXl&P~`uowztjog&zz4U>`eS$;I~h)Lw^1!f6Q;DX}c^GgUOzF zG*R#8-{DVUA8y`mwcCWY=Up60|JW%CD?M^B`pR#w zu_GvEHlLP1ZRE6bmbRWYc-q+Me*08X*uHuTM?z$2tosoAuWuO64!Z?g_0%DWykaNqIa@ zG92%UL?el0qzx;eYEGhJMq%xX#*l=tlXe7m#oFn>9R%w#d??ytU0vZQ_F%MzR}*SX zMKe;|OX5LNYeCvVW>%-|pxklO^=+XxJWj{C3jr5%zk&y}{n-w|nhP z!ba2bG_s-pXrGQ6%X4H9ZrSR1C@PQ8QK>NL`|fyTeWWu?wBkn_d#tLSu>j~x4ml_;m4oJ`Kr3-0wD@mN>AM3V!~DR_UA162<% z6)<1FVGWvo&IIaD#Ia=}6m6H2kr2G8d~psE?#a6KJ0oku^(U9AUjTZh?$q|1hnZ-I zo#D6p>@(3C!#%T8wBy<-!rtPy`|Sb0owf%H_T@~Ld?J03X7;q4_!*Zet`cYib zB(fdrMA}_dxRs%vWGoUz`JgzshITg`4abr6+f`k^QF~CMt)S7i`Rxo5|wt>Ld97su9L;}&WnJ!x>FG~8jH(87WWsxiwR?kS026W=oPE#8|vff z9r6)xOZ|%F$E`}OSb1z}uz6tVs&s$L#?)qY6 zS|{54_Bk}|vbK;il_SYs+?H+>`Y4jCIwGAY@X;2HwoCh2*t`7pxwJJ`g<2C$p|%)a z5|L;ViX3%W-qadNVuPM&vZ*Z`>5N2IH&Ly&ShA@-ygD8ZCz`?=yPG;XW3hM>8r}52 zY-v+hXk!y9mL^mkP2G{E?$`$U567FxML^30@6qV}r4g?CgT7Q$9~+G4IH^iXvp9;jXY~kp~k=NV#totar5dL&QafXK zZ(qny(AXJaX}=Uq7w6|D_4NE3?eId3xv73co-Rg)tb8zBpBfpcFP>CT@2G(KjI#3c z+tB#IrJyTw5si10vB1xF>3_rBa8;gi_q5ae+@OL<%!umM&o%Dz+ZWsK^K*_Vu5+KT zFY(*&w=Wg;Wq$i|`wG8(B{>;8kewnCr2D9(eMJgQ81Y8&MjX}I9cpjtL_4Mnxo&M(cG?w6wyi-1Y;Qsjy2#3QTMAe6d~%kC4zt~lL9H&w&Awsmzkp|?&(6v~Bz zO!Y|-)+BrEk!$Vg?k3q*ndrfLF^EF!CLwMhqq3MUFm(~4nnVlcQd1A&w8=TpP^H5O zVsDk{4kZ$F++R}|bzyHe;yRQ__Nk5NL%b0RWNhvO6k};}0s{xhQ6r9xBrPN~k35D@ z!Az1il7de*fxO0!GIb^zDIOEWF-8oXUvUt8yo&hvD&m4G{Kjt5T29DHiH;!7x}&cU zSfian0qLN%0>K44L89e@_J{oThwZEV_BE8c7BA-Yc!4GMhcsqM=m6IvdcyVMi*|{Wk zZc0Z}GS-J3CYlJNDkaaZ?1;sYE1G14$w{~M#HonxxZ-4AAwzXspv**3e<3MNs7(cl zWC&RR)%8YCRt`)s*%T++hf|ViIXGqzhA2hljOgs7&{+p57Z;G|>5zbO<;C@Nqtxl5 zKpSxjHjWbat|#Lzfv7q+?&@?Fj8dbYLvNjjt50KP)QD^hUgi*wiFGjWpvC(Yb-|Y zVloo#jnGIMYOGnC8@d*rUcb38TTE^W$73koI!~v=XI0($LNO}i*2rqv+P7>KPFCeS z<-X-ORF%`Kr>lz2Safy$`cNDtc_@x%5G-px_Sj>WFI$O->k79=db(OWW3A*DV?~wZ z>Si>rT)AQ;#ZYlJ3ZySzi2%#fosJ{Q*{Q6*FdXRwcZ6hkW6~KxCAkBko*js4Afi28 zNX1APb-0$zP3@;oS`S~mV(D=>th@>*2#YDi2Ks4nvhG#NgBx8U&OZ@hmYSN{kzRW~*R;gUQ z$K;||1FgnIAP*x#DB=*Nt#3XCAu{LcEw<-vaO9gd`!5--7}@Q3zj?LXZUR zH*O($UhW8JQUw$M{Rjc)A22k#)Nfyh7N2o9+1Tq2(%R{#lMqK175gnD^WLDBRn z*g8X*Tpkri?2!6QLYpxO8}1W)zkQSSTO7o3yLuAnmHPF+>;Iq!HPTK~54imLD+J?o z!n9w1mC{FGpGPa}i26KQo&Y)J>9&2deG6)cNl)c9HutU1TlL$w+MhsNAIun&p1Y$u zdyDr7G&ZwX8Xq6YXNJ?orzN=cw`uIK1H5OTvHAnOWq`si)YeAEt(34j8boxZSf>#p zhaagR6b*IuZjz-@(wQL&=AxrRZ9N8s*&3#YuGpY8oJ8X*DwQ~S!oJpCQdP27;RaYa zStQsDMRt^8g_i3f;n+wsZEIz;xU*AAZnN+Z%yJ_TPS6?cy0EMnMY}smHKpZ4oy22_ z1QCtLM)PEq0;ry1lXg16QPG<<8;E(P&wwZp+neg}NQ1Ze;6_@f2S#@r=nBO20^~FVsQK{_13e zj)kv8fZ~q=#1~1B0hW|Fz=o&B2*di?F!2gr3IA&&l4Ux>p>~M~15-3PP98qp(1jyt zq>J{+MEfdC=8r)MYERBTVp`hhirOpOv_tAxhZv2Ml__sTG-!`*@Zh_w3;kPM3!1Cg z-5e*ENOblg$3;4bqT}l+HYgEh$N&O8`U!1x)P>a*X>acgOKY%3ZPLW;D|dh{Yjnkk zB%`5ZPn^(N6OHw4z{yAt2&W-KHe5ZE@kvP#LtWG*pQ2Y5k`%0zbZo}DmAtT30tHbo zwIfua8!rV;tVanuyeqP>&~r*Uaz-F7x}>FUboazptDs&~-EnUc@|}`UyPBf3n^q&w z$R}F3V+jRPYR^;w6ImuhCNj0ICqlFd@h}<3v|=beU&1EqV{)TqRE6$pjKfJE1Zu5%Ag4P{iqd2K^F1#U$hDT?|{65^>V zGl8=s`A{xj`oXpLDK4?qqemq?cybNt8Xxf;P`yssSRnRROW%ek<3xlU2anOa2~icN zEd{oLf&qN_8itE_b4* zRgU*i%)n?FBVX147Vxy8)Z6~E()hWLCm7v&04Apa@ zn+yRd7UeSrYOK^YslZS#Y1?pd`F7!ZE}c?$%1l`5XUCK!)S@B{p`M^e+QihTR^9oa z7uqG2pdKckLe1H}IJ}WGxT!R!RGh>fxHJ!+a8*grP3{e#`U}SupJ9^FMjA5`Psls* z2L$Chn>3n` zvRTTf;_F-}q)DO?hA|~o63J`QVz`y=Lut|n-94?H@}&io&mkoaA&%788j`wDNhp-A z1e4-Z$x)Fg(4%nT!6X$ukztagQU~!wj3j~~quo>;eTEnry(Be}@Z{#WQEd`^6t5`r zM4Txy5$@`a#iiOQC$X|A77Z87OgHbEJV;2=|rAJR!xR2~! z^n+Xj-|%84UxFdNh4FOX2(WA%+8!GolK~dNjO&7*TGZ6{SFS zrzBThj>u!{l?f!dtyh^q$j@@(l}IFQByZ@USxkn0JrEL<^pPnADWIoYi4Lx^Ry<68 zl;k#D;;qc{yg-((j`yM7+2~34O4Dj}yw4Hw6*41HqeQKcfcWx4y+o&c%@R~*UIAy07O?4qO~ecoSWug$H#G zfO=DxUs;2@ez{mR^mLpU6iPK=z`swbZrLPTY9^fi!U)X!>qa`H5Rv0-)AwG+^( z-JyQK-<3|gzZ67VH$>F0Myt1_Mh1q`(e%#ZC%LwJf67woBWK=Y9Mmr^rW~J8@_ zr?%7Bf=MkyIr{lLw(Lk{hSJ`!P^J0`Pc)lfL%(rA$PDjHi$7Cw4-Hw@skT=B>Zou! zUm~3^9J_<0oJ;2mZ~m745zpk6c|UAKpGwJ1Jel+G1AhHWeuE|__baB3?k-M;H@GLB zxIbX8ZJ2b7itJ&^FHYPy@8k(LHXz8I<@&+k_d?ff`c} zr$7YI3CrrRk;0D>0u7PyJ#pf8qL@$7ho$K3jqdaS{ot=(e(+}!c4^kc_w*ZOdA_yx zvjVFQ>X494B@tQj*l7AXmgF*=+3be4sSS(YFj{<2XU`PtSE-FtUuRJ#(3G44ZlRDr zmaI%sIG6o}U<@Sed*>Xh_o&8TYUl?~lsp+i!<*X!~19(#bzuJ6@i<5_P}( z0Q3zC_3a=7xrmOUSa5Kk{2ywWN3LnYwu5$Ci9b*4B&&i@AdT3GdSceFmC6>ym^G<1jM!)(% z&%%Slj{MdY&q;cxBV-GTX3}q0C!8xj;TNh~)A=a^*wx%MQ`;cJq|ZtBkLT0Q(b}c9 zaX-frm3fZMQorJr%%nc!dG$ev-$OYZet&43hzZaBc)n}7UVg5lBReL47d=~^k2y5t z`K59f9Y>PR$>Q3f!r3nF>0QWE)#D@UCW~@A=TZK)dmd;`mAD!DVAXo!pjj+Ok-fCHa!W_OhfFMa{RJ-cYq2_lD2 z!c;Un5>Ic%k>!VN)#nKc=Xn>$F8n6YDe;V6Ecw6H@dvj}C6MW!vsB`Yq#5J6G<_JV zMA0?>UoDnRrH;jv%c(6Wsf>{qoQ&$Nuw}f3tGxgf{13JvwiWdUig< zD+aU9S-eLcAjl@)r7V1js~D@-*oq09s;YS#mJ0AsimWH;V+FK&+(I^wnapCE{xvp- z&DNjRe}w5DGsb-SPuNWTr=I-JF#n7v|38@jxhMY%%>UAp{}twc?aBWJ^Ur$n&td*~ zPyV-^=s@7n#+oHzs=dq6Aj5(FiX>!ef$NiudosIigd876@R?)cVbF8wliBgUCvr0Lm&#@{k+PIfh zNAF;>_ON*^JjfqlwRf^wfGx(c=CelDg8eUM z$I5#PJ6Yb<%1&Z<)n_s8`zy2b*{njJ!)o=pxXOAqU&lW5!*R6@Y%$)K=tttJk7CDS zzC~Za*6Iu8%8$WaTfz)Jg9mY3TnV4aXGt7%N^EE{McDAsZ1`+U>A3nie6F+aO;|^h z6m_>dGm{|t3ORybm8yO{c+~h|2hqogZ`p^BPG!Q)r9L*{yl5BgMNNeH2Uvh;K=(e(%M4W_^4zPCKh{D6bG_nw;hzQ0dN|;O$N;H{jLUQmS^2YdLtfza>G%nGk zO+nMq$Sh0vQiUep019jr8(Isl<1l1&Z3SrY<`O!6pymupm?~-x{0N$tS_>|5oYU) z9%Dk=!=Q1|UUozxXmbrOMkDn`S(CDYE$OqX`KBmg6M5FNlTi|5CX}5OG+h?K6pz#n}*xT5+h_blBi+Y1LR&3hG7Vl$6KggE&*oHlCeB)ks zuP-Lz(N9OVKLhvrOjf0*koEgf^rzWT`XFo4x3c5)ZR{j{h_&g%tV_?bgnl+VQ_r!j zdY+x5kF$5`JJ|d5o$PY`9QHwd7rRzJm+jHt!S2`3V_(tFXHV$wVL#O`V877c%YLU{ z$o{Ecq=A01R-?aPYt}E;aqpmJ*&fChp}?q9;(9qLkQMvbG10|UNAG1TH!N}35T5;KizELYUD7gmg^R!5}H=WV=;@BIT9EipSVX#4%hk*Jb&!AGghn=9`i+lAs)~@eGb6_9qL4i7` zKghQ0pJ(IxL+o7r3+#OTi|j)EVRnuFC3d&|W%hObtL(e_*V)VZ$6LLQ;WaVgv z7C0cvZs!r1>R~rJ9B?;V!%s!ZF2mhRzHGeel0;*IU1AYl8`GJ1D3niDmAq=POfSZ_Hbgcs=QXpYn8lKPiR~-p>ge^ z!~|+CN|j4dIxzj)NVVT#LH$WKSN|?MT>l=*_V1%ie+uRK4_He7A$ynpG`j>T;5Kvs z_Ub=nKhU3Hzd|?XS^bynC3I(A)}Pfh{W*>6FKAWzAGB%ui`p#x&)Piwui6s*@7js_ zKeZ11HLX*BQ;Tz-wvij!8631BUZ$PPE3|i`AxKm{s;I@4-&gV&x*3{Gbz{mWQ|qLG zNU6A@SxhA`Wyn+#Q>IMy@bzRmV`_t=8Ls3TaTOM;!%=&QYbF@ooA_o&I$nhk;()p6 zG*~E74C8K08T@Wai@VXHFyL;F&$M6BfAY$8CAv2l;WEo;}PG6Gl<5| zm}&>}NrIoBd;nXz@4&V+j~t+nGkMDCqZuK-l6@%CahfW1(d6S>$OE0wTmM0uNDc)7L~% zqqhiDY(aA`i|zJ}(7k&vTZaZD3OlPN{s2qtW;;1*Ba0M1ijHKnKj23xS&79xd)fMC zKk6!k+{n6p&E=%80;+Dn&(Eal<$F+zVqG^MD96f&2Q2~w%J;GjG*qCRpGit=Bj)7< zuu1P;wrRKaG^RH1WvA_CH9tx*<2IA!D>>Is?`Q+u$mR9#r5M% z0yVgRTAGSKP+fDn?7uEhhYhz(Y8VIvuwe$9)CB_6pdt{U^-dXKT3{Mh#3@pFU>a4e z)Pof@{gdiV4@}2;GlCU*U^-PQ4^{-G^E3Cd0qh#CM>|H;q{$@PgC0Kaul*>2g0=#c zVd)?x@xDdfgMKH!)ybDT`E5?VVp9D|C!dmci|!ePUAaLwvbng3DmA5Qtap~vu3Apv z^{av$?IVE(Bhlz0DeSo;?Dw+m8y2}9oOU!@i?lzEntKPU<~!LezKb2f&t=Q_JJ<>Q zJa#gF7hBEGXY2TTSdzb&oxv|;DSi)UehE8|zn`7YFJ~9=E7&Fc1MCWZ6YB|0SwZVhhrTii7CjPK?JAXvGmw#D%f`3hWl7C%$hCi;o z#J{QigMZ7X@o)S5{3%~G|AB8df7*8#|B3Gi{!`x){*3Qf{tMs9{FlDf{8zph|Fv%e z|BbJYKkM7dpYvt;^S+(@x4!fF?|hf=-}|oSfAHPN|LEJpU-W&3zvR1*|JC;hf7$mv z{&x}{+7W1ZUBXV~gD8N?S&E&_w@N!}n5FqPg!#26SR2n^YMS;EV)QIbP1n}3hxm3( z)o5GUZF~q*wc4fZ0zQnXI_)Ml#78g{&>GpVc@|Su+9~W?d=yi}K2`i|)N-adPDzur}HGBuADt(u*1$-y<$JY7I;O9syG3nb( zCvTDW?t7{rQZeOt-k3U9c}JLPmfF?yeOqcs&W=EwyhB=q%Y3)+^Y}YaOrGHT2!9v) z6oQ?M*gK!JYtc58{g(38-;J>M@C%g4*2_>M6Lxn##D;qJvEeBCS6YkF^eFQ$ZX&8h zC%AD@&9a&i{zaDU)oVr*d)e6}mmR;OZgG&;j5&5bR)6ya8Sa|fVp6!ve56H?XKz#e z935-Q?-b5ZEhdWiJeCWz!1KL0#yGFpv5)OUi;p{yb9gm-Q-KTzw9Bc4Jauj}DEasf z4V8i3Yz3?U+``5e2asdW`x48x*itFH6O{tG+$buL9h;FsTguQ0DtnN<3zZ1p!xpso zNm!iUQeN|Jk`nW-XVnCFPc=XHMqGvekv(hxZa|U0rn};*#-JJGi}tb$aJ7H9(9-t2 zd8u6U;+6_pbHyVqm6O&?ewQ6Yt@U2Y8h4Ue88r8?3-7@VorSJ+H*QTgx)F5$6Z;o? z9kt?Dw2;=0Thp#Z=xyot1v29jZw*F88vK)QO8yp0d}e}opl*= zShq2Q^%+4nXv}8Yje3?h=CN~)`RsDzaCW0{1iRNbitRHNu&)@6>|4en_9J64`;)Ph z{mW=!uN%wQo5l*wG*)V}jAm`Fu}Yg~oS-c-PSlPw8nu&*Q?!uLskIv+En&23n~bn_ zy0Kc@Vyw|J##(K}h)SJ*C9;Ky?D$?{74{}NPZWXlvmc>AyHGO2pIC%ngsC$2b+$`} zrYs^z*Zkb+h7We~i>1p1T9&^LnMOy39Fk1Kag+?d1jVAk@|rGL%4FxV*H!p{?PFi! zmtxO~L8iHVT!ww9`U|{n6tc+WC|Z^K6h{^zQ}%|c0MV-vGz#>35wEJ3#Ay`h^r@q*T_#*mq21+0P@&-!MUdryt}KFV2lRnr_hk;~ zsv^kmfIe7kSnhy6R0LHxpbr;8l@93YBB;s%T~qA7+5uf#1l2g8j}$?*4(PffsLlcH zcF@&G(KIPaBqtRt&NJ9_MF-Yx`BUChPZ_G5lN561WNl5|FEJo?T^Y)XRj`P3?0?$Yd%_V zRI7j}55;ML@;(M2kzy7I@8bnDnFYdoe_<0$b22HK1p>N3RM`qrpr0FEh)Z~vg9|FO zyGadS5agmLg|VNTDZaUv-Lg0cL9vhBx|e-IipN}f>9)9h#Rt^{A4)#0{Y&$#hXR%P74rW-f12ID3a{5P{s;}&*?aVr}& zKEW<9Ze!ONx3fLQ9qbD*{7 zWqPw;lU_n`L!7;tg~>{l+(X^u7d^^GahEpkMjO8JQ8qx0@Z?-lddfRj^8G!41JG6=Up_TYFSXHEnJ6BP})5I9REgRnab2NhNq^O;9|@K1oBP zsjffB?)EWXb5+e*G>+7`O?p$&Cr~r}6jitGW1mKo-|-Tv(A39zf|;Cdz6pb&Ky~pS_)-s(0$v+>ZspTInE=6{1iI zHJ@v#LmQ-6ZExvn`&#OVW#ki;&meErNu#SJpceLk#;#|xgMmj8zvz!`ydFv9K~Ja) zYCf;(PYX_~dFTQ51w@?5oBey3(K0RI-_4-riIGyX9Kfu1!63~NzqBFVQeV(B=2O9%3g0#B2eeBE4LB!@) zZf75)=3hNv^O=poKw#!R_O<3&ftfX5mwxQ*z-&3CTi7%#oV}Ml`T%>T@1qkM}kP=hQs0kA0(MZV>%CJ6Kk;OxJmEZot&{v2UtKbYO<`o`V!UsQH!$ z-GRUi^mc>Nsh2ErYRh57B8NTFQm?hlBLO&#b`x1+53^e42j{oUBW@Q27g8{K;37Eh zQEWW#kvr>y)}z{Qcr(Q+HV4s1Mx=gQvE_F()?BTVpC72cMSCPz6{vZTJ?Ud)2iFok zt&?P7?$K@y*4BKN+}H25)XES_ZO!*7gi@#B_B2n^o2LisD0-r8qkDJDjNpu#r}naz z-RPt?Pg7;AT$Kg(u<@E7cve26=7+NC0<6jlJ$Y)co>cp3Ra-AzJLs+L)S1x|&{~2{ z)zw6SvN}b6W;)PdaHiv)OGvl$(BFJ6IFrb8mfGD}YIlPqOn>Cvx|)Y6N`sS-snd|H zh(C_PY>zCMtx__46X24jRQM)lUX~J=UE1h{*&V97uINd-ZJWUE8XSYB_eVc8T^u?P_+fugf>+ z%b@N!LI0NiBr3@#^&iOluk;u6-=nwpPtLfGzuXtY)TJ%gW3;Hr))c zx#o1%XwGJf&ADu;c^F$^&STBye74FwoSk4E#a5dQEN(7jJIp4w%Ur@PHJ7q$%w_E3 z<_dPZxsu&!p1|%lk7ZvrSFuOU7WSlhGW&^n3j3AW#-269?9XP07BnN;JhM|f!i;Jw z&6swQ*{z*w#QlozU}4}zFp>(z7Lom@ZDx!<$K8dkneHxYTu8{YkhB+*Xf#h zypb>_eLP3EioF7tK1S1|r1q4BQ@ zAAeME{vBcP9}B^s6*hlSl<}8@pT8_B_-mrlFh#XdBLYT1OfzPP8OCfe%Q#HTF&2oq z#!69doG9iQVKLuGh$D?nVu7(uG#J~(LSv^`Y~wx3re^8uSc2b#soDB@tbyN*E#~N#vYGrAzMjqXy}`c8Z^hCX zy2c*opTJbm*Pz|ZZ^L>4-!842-!8}a0D9+pFg2aU^_~0|!>SeJ*Pg7m^4v(b#A#bFXt{Ys+33(H3RTXL~ zyXDP%#jB3;Cf_^q!Uf7}eDBBy^_3m+7W%Fq8Y$c4t$bOaiLyn0g{`2)r{{Kwx3RS; z{;RK+v*W*={@X##V=;MZOiRP|TBoMV*VmV2=8rQM#u>6O3`fyKq*u+FXS5hxhKs7~ z%h+SR&+?etaMQ<3!)>@0KxnLj3>W*kCEy*aoHktbxoMtc2rM~0!bsW;;htRX&Y-xj z0oC0VOm`79aCe8M?jF$7eLW0x_kuz0-f)-u1{m({3-`GD!F}$V;9>X8@ThwbpRlm? zh@Oxm?_!(5(0~r6*MzeKOm!wPQ{~s$J`GPTwkI)Db!*1tGd7aP@X$umc~f}}kKtYbZo^aGJyxZb-a4M`GThHmR*|pH z#z!=EuHj}sKNq6;Y$se;jV?odZmfEG$>}4>t?jfkpRBqc0LwiNYP%=E?d}I*l=~sL z*Zl}ga!-a8?kQ00o(kLC(_kmfd&@l&-gVD{_uX^hclT3p%DoV|-HQ-$FGeO!XSknp zwq{q*LB5Btl8u2je5k7kv&~JGVy)$@N>rEMu~#Lk%X{g!7%UW)-{rlaHvA#K$A|Up zP%Q70G3^(l;92>7-k0u$rSb>d*&w-Rd?(iN^yWn@iCR+6Dq~0REmRCiqEJNho}@^ zmXP9;vr6$PmqKQ@9NJ!qg|nWL<*7{HJtTilC2HWLE^|_SoD`MLsg0rX7rZv^p!Lna z<)Fbf^aZ!W4!6S&x5ExMmJ)9sF2~>VOWHHOlE1d~Uq3p=0 zoI*e!K8+#1$i|tuV)8n+zs`0{)*-~$UdU1y@hP4vvkh}k%p>K+)VL>Aeo@Smv<123 z^v*mw^h3=(n|8zy6mrYB(n+tuk`xyE5jMU3^MAlLpr(FTfEwJaKPHy{UKIRPp zAHo4zZ3o~pPLIHkaGWZN(?~&TeC8oM7}X$PH3YI6fuKsjQVocyCR9=_sG&xowwex& z)C_2$X2R8KHWaD3aGhESMygd{oLUtYtLMS9YBhLCtq!}?8t{gi4+qqma73*QKdN=% zxLOB(QO}1z)Ozrj+5k?gjgX=?L8@AaylP_UXhs-zXXk7f&4wSc4W8?Mv7%yDobbi2fnrNi|tD7N8WgfbridkVyb4@ zsvm7f6yhs^*x7gxe78})f?Mg0hacsiYNm)Ha$$mL|k7o!PsJ8x>vtE%i`Sp<0sU1HTVzB28}i@A!Cmkk-2_V1ur@pR|2 zm99bSkWZpoN~vil_yFUnb;!@wvYq9&Dlye|sr1HF+xf&7Q*GB|e@wOgCj+qnTYn4i zg%)>YkXRp!1=!L=ka;ZRa4muYeCIS4BuMxm1ce(zOx0|bA)2&#YHS&GeoR}5Ld8fc z)cAsp7U{+oY{G2mvBONbk5TUB5@8KgnXUIwHQ?iFfH2=aqS$VI#FfXEdTGkfd_jpj zkL`3a*Ep4aU{9)f%rl~ac$#_lMeHQ|*28rQDWOwFEjjfeU*l>}s551vZ!R?00$0RY z;8F@rdvS{`1EYwO=U!$oh2-HII5Moj>2!ujXNkBnr!{ds+yI5~#ke(Yi^8@>IRzKd z&N~9!>PV_ZMnS%M4>VOrLkIO<=&jxdcdGZpM0E_zRv&<;)QPZ2eGrzYlVFAV2&`2f zg?H4)V81#A4y)7Pd-ZYnO??6(bq4aOGm)XrLfPtURG`j5b=3K&vAO`YQx~Gn>LS!b zU4r_nOVJSZ8FaV$EV^HP9!*x4qbJlA=qdF@v{YS*R;sJe8g(_=qP~P)SJ$B3>RR-% zx*i=;H=-ZZP3RAGGditq!4Y*UHq>o6s=kWT)%S6hx*gY4cj9{LYq){B3pY~Vz)jS* z@x|&M+*;j>+p6#2_Ue21D)mD?Xg>uLJq5SPKl3^1QWzlrLUkHJlVP0vE1e~VDM0A* z3AVwCe8|haNqxwm3h6iQy^swjn&!D+5n7{w!i<_F zXf@ZCDy%@yDwyimq}>vpQ;p^%DJFJdlRfLR&l^_M`5J_y5#NXl)bSA{WNZ_-ZHIL8ng=j>FCQ)GLRH%?J( z^KqPA_cfr0;^LkowV{i>Q`Hczuy?9jLQ8w6YD}4(D)Cgwohq5#r76s3Ttweu8=YIV zC4rBk=P@*d7JUFr^T6D@tkx!Ct(*1 zfHVMa5M166M7yXd5bJ!g%YJb+j#^DVU3l&=h^>Q|!dVn9`f;R3T&(I!;O4qsXOMl6@|* zO+rCCAiRr6WJDBD&Ojy)aoFg4*3YQo1ne$*s2Q3&0r zqF~+%eK-|rqCT5%cy9sOI|wxIZD4wbK(_ZzsO`Or+8!gItM^-~B7UGM;wWv4?_j9+ z7~Jdq*;yMXq=qaT&K@SHqbSBG0b5awQG&Lj7^8%2MKMOv#PS|Zh3!KJW0VM2(k9$u zd(dRV4czoq;odTeLVQ;Z)Dnt<#1#d)+g22+7ED$Y1m%>~6uBie1woZcs|tcDm(mpk zRdF72jK`|+q3XPLUSgOyFIJ1Q(wrBot4ax7K~Rl&j-xB`;yJ!}PJS6(QBX=(5LDBC zE76Htumw)q_!Q*wxst|_>Wm}oj3ZsX)E-Cm>~Z83HfSvbrM$F#fuzCYEoU$pXW~`6EH6C; zFSEQEN}W=}+n06r8H!>#TuPPbeCB9Tl2`Q4Y> zS094DMoFBtayZAF17D7;YtaRzYpg|CS?RlJ<-J?4^t)}#eK)w1d#~I~u zsb8AQbt$-HD)uP>)P!mirk{qFtBB>eB34Q%;)@fC*tG#Quq`#Fg_Sj^VKHiC>t8q1 zzwXU+y5VB_*Cq5Xozzfe&GfG;<`Vk%D(Fm0(HXAgG)e#Z9s}7o1vKAuFnv!zwr?iX z_B}~weDk1#?=!f{cNjYR4#5q+&*2u|*Kn8bh_fzV2p4eu%U0uuJNkFHW2g;xT#AO< zMzTqDCmX9W)uP?FQKrCMwuW^jY1nSu6jMrQ*lZ=oJ`+8fZNN|($jdL_uq3ZRg^4qA zUiOm|{QQ2Da9@LfQ^0^zz<`o#7cihyvH>DMm3tEo5CNq!1Bj#(XzaUJX@i$qNK>lN zCa+pv$7x)uKu-F~|&(k~xPA!#}y+x9%Ly_$2&_18L={L*Fw|(@hHDkb_IwT3TnnQiY3w)v9ucL%$;vm zLyV!#Q;N6 zIpb>&`26oAoi6h`;Ft4D^K7f$QL^!1d5O&vzs5 z(p0>LA8~rXBaYYRBg%#Lx!OmR`rK>N1rzMKa0o^#4U~qoeWNgx_Yakpf1ogPj@digHhZgRf&cgXn4q?r<}PXUwiD~D36r0=-gT{f|p?zQo^bFhqw+8NnF@d2lEpQh+9k?6T28O|= zz;M_b7y(BDqu^xV9ux}Piz)@~OEQhCIHqxyV;VPc3_j=JqPvt~6_{}LgNsVjvOG#3 zr3_3?!K0bOBMB$3F3n|T3IppRhl{gspyiZivheKt21@e^73KL9MY*_~qBJkfWKD{q zw5SM^ttptaEQg6!n#mg}n6#=$N%o~+a!J{m4VRfU1rDaD*-Ojeg3E9@l7h=+73j1- zr|7h;D^e+cr>K<6D^e*zcM5UZq!uR_P9aX)@;ZL!(p=J0l%!n+N>VjNN!mL+>QK$a zo^q{4*SK#e&8Kz}A6GeiuBbp+8l@;phYB=uuw{xyzOq7%+&)FscC5fi4t7aVl&i{{ zk#s3FBMJ6OQIt-OrM-e8JhQa-Yy2o9JFQ+C<70AZkdMh_P(CJ?UIvfJ?!@ z6a?>si-Pw<$KV*~6C4XegX3U$a6F6)J_wV8lVDbGGAs{nhn2zC;HBUWcr~~a-U_|} z9|YfWtb1CMjzzcMvFP?Y7Ttc^qI1K$woO0TK69hcQZ~0|1|QhgeIioIWc$obiGx?l z)$v^! z)$RQl7X-^30+W?%oLv>gwi-vV04>Rjr9GIcFKIURbh4b~((9b8M3;)^I9=*`dlTK+ zT$!k9u9BN8|Xy<5`X^c!R^;u?3?}R{XT#WT%*k1=Cm} zFTTCpC&-Hck5{-T>+wctK&_=HWu~20w z2vvcLLRFz-=sf5Xss?w2s>8TY4VW3qgXco|usKu!dqXwh%TO)&JyaX{Lv>JA=zLTs zR2Q`fU4X6*)kFP47oriN`bp;LD91d#%QjDCrHj(lKBWB_?Gj=7)P84XhYCHktKK*h z$t^ zi}+%G+4M9S>f^Ww?vcfI<(8<>awln_9+H5wR)e5k3+zk8olr2AZX*>(D?9 z@_go6xr)11zT(7jlI#1JKcdofmpzv&CX>h?j==&&Q*iO=w>EXh^21Xf(8{PpF*oC#X=Q0 zhUQxWe)b@b)nWMNLRu^&8NOoZVmsEgkA({TOTf)YUO~(sV_~72fl&tIsKECUUuB5HbHIL51W7|)C~Ng=0HL%!3%i{yF)j?zEFSoBs3U4 z58X-o=@|GXG!%Xf-3@<+h9eXjh2+o(M-q5`$6uJ*ZLSv8~8iz7N<55m%0;&>v z5VZ_VLhVBjp)R4xs88ro^l)e@dOY+vdNT9`dNwoztqeVhibHeI?$BJcH#DF3^>4s} z#?V+PV$KNA5vp>hbUz&fZz|U^R|S{^U6gJttOIh{j`SM*3YkiGnhK%zaKF-nJ1BI4 zySaP1hFZcyN>AlF2%?&>m^*PXk39!QXv&WIi1x<=ZlV2LJxe@wy;#$u-<}eCUo@|m z9lU72(wnB-;6d*weP~Hl@T0et8`$0#%7l&b%Pi0k%7OJtUmhHy3KT0hGWQA&Jj|a{ z$heKZC(79mf`XgUA5@!1wGsi4kaAPpynz1pqEmzoz(TfoNnweB(ty&Sw2SJe*OQi> zA`U1;98iilpcJt|$wf=bVYCDk4R97PyaI~g1r`>r6cm+S!RYB^B|}l^MT}eRbq)tp zZnHBSM7h1xwjINTGP`y|9Q06=bhrIjqHb!jMWWE#v~G4&-Mxp7lXs}@-V0ZT-i2PF z_u%%>K6oJXKFkPxKy~*=NfD1;i0flm>geNv%FVXfH^~mZH-~9nAKMS^I_nJ1CwG*! z&fHvcLpQ3M6MkwN(48#k9W~Qf#I=|j^W?8VLyOT}F%Q*>RQqwAmRO<7wAbgDPV>dw zF(1`sVy*5VRVi-!Kz!1gYv^kTgubEGa0GHfN1&H`lN&SN6ld*C{65>>7QfYu{+4*Eq;CpRZY$5e zzq^!uuMJOO-``$#=2SYMm3H6R!__K7lsoK5jT@+REauO^yqd*mSfSf+%>*sxUX6wq zaKw>cWFJOw9A>GJJT;GXo>57s68SUe9`2UNpWu&&LA)1*N3VKK@hp z*`NHpaDhC{9e+aR-iSWi8!;X}^;lwIemG>&#u^W9Z6ZXq2O*|C40W_eps6+mF4v|) zXKgxk)t-Rf+6=f!n+YSeSuk095*BE)VTm>eHfVEUhc*x1)#k&8+Eeg@wg7(D79x+f z7-`xPl%p+0b+l!unf457r9F$T(w;;8wCB+P?FHUJX3(a;2~Kh6JRgjNqY4WY4QzF|P~>`AeXa9??P zW=v@=hf?U7`{P{DMRs`c$t%&=9pI*aR}gR&wR?qs_Rzoi+g5Bq4-~CI!*6S`3SfS7%XCNldJJ-8N4T8AE@BcWg&dYI}67OP2sMixui#|4y{ECgNsm?Dlw ze_E586_2b!W5sV3y7IThT$^eC&>$Tq(4u8fHO%M)c!*QcZiTGhYDdAPeFt9cN6@rm zwEd1lhW0B|(M~{t_B+(m{($z{UocQR3B$G1a6g^OOb8>#S{Vp_Weo4dovF3N;6;Wi zaDy^dd4N_+0d!Z!@xZyXdhAM!x3G9>e5n?m;Hd9zJdefQrqJw`;~Sld@|@UuooqXH zBx!e(4W_UPp|A(SVLxPs1CSlol3FsioR*weUVnJBRDTGkrRWb2I)>k?bYL+|?CCDE ztQ21!N?KKlXC=AY=ag7gBIq$W9x_KRFJulMe&H(M3Ri___&mrDSA(YE>TqQ^FUhFv z>7aYhc(@yyvcuib)T6dh*|m&OiIho>Y{zZc#+F$#d!V#%iEv7CnQ%%8*`}0TGMnmT zIribSv)4c+w)zx4AKc-(5DQ;GYoH#jfeUF3)Q3Ld1~4?-D5)mKIyEuYsfn>pO^mf` z!VRO!sfmZm>nqbs_m!4s?JKhKu=0rQ6;VWU*x;~|qPuwWi_zmO-gWzeQZt3{WnhFa zPl}IkIigq`X%HAx&kIqI@@Tx-lmM-uG|Fmv&64qGJdr_Ha7*`zq;N&$blc`-x~*KM z*ETQJvd)o^M9VryLJ}?OoCuK<+n&yekQs#vO7iwbg=!vEdC1EScbw@&h#Ef;qKb1M zF19kt&w+G}xt!42E+u{<#N~>g2ywaNCqi6mMNWix&T=Be!>KEAA|$i}_QgWBQ%i^+ z0||*^AX-f0$3Ti1<;Ot6s4zlNHs*^ADn>I|3>$m3=9c91A>I<_L+s-s;#i0)`B(@G z_RS88B#wp9S`5bzh|n+H<(vwc%$IUm{ca*=I*A_Mo-7 zFv?b=BdpHt2V=AaNK#jh5j8T$^^#+PEI4&G03-H44KP+!=SJ zpS$87oc6G(64ErG(KkSg1Tkjj{-u1{?Uf6b-piYkn@pgTkm8KbPV~>8Ku8K0Z_x<=H1x zYNH(cgi2egEW`j4>k4j3q3VOT;dXIx@?WWUehHpZ(xg>_6{9&_*n03>afs9x z^NAgzmtZZh1JxTj6~-dnA3lj3fFqGloT&WM zKvJgh^$1$~4y1kOEPj3GEPj3GoRIlWnJ#16iUqKRdjKhLA*`{_cQ%LT_->M$%665_ zxfLu`9%nt5PULRoOP5|aLVx!O=8fb`s06ne4!3HQn|OX($w=qQOlP4j%U)>Pql&?_YAqW5FX@0fDX`0FLx8gfK55zN^g|=}{PW+|uPL2b%^PMbb!{@1Z zR>IWao?ekd;EH?>vB(#YA2|%oB45Ilk*}avxUQFuA>UDD#) zCTH<&t>ddRD?aH&SJL`tlfk#`anp{Sp)Qh=Bo8CLiNjB9tCGyE{$@NLGdm((B&|dX ziqXPO$)TB(zg$%6%gmXOQ{sWeXM6kURBtaS^*~-heu>pOzGxXa4Jx5?4T7N-k)bV7 zpg(cJ&BP58i3gr0UU-K1U?&MCO^@HU>rI6nycZ+Lh39z>6Ag|%PVuSH7q?6@5t@7K<8FK6|*SKM37>D0^QQVwv> z*cndme739uTr}?P=DhWsR%Y?|dDT^_Q@`Lm&40+ZRZA1g++w@n!7~wmODh>Qtc6 z%wnGD%41<6Xu=&&sPTm6lH<>7Zu-I+k*m6#To27%D{{Swq%V>5J3p=kXmXuM1{29p zBB>>kVVYdek~P`zC`cL-NkVP-UkbJ190~QZE!3aMLTx;wPy}r%SE{w;O0}k3sn#T< zdifklwfTQ4)#h^~)fQW-zmlce`rndj%Q=$jmGY$8b{45#{Wqn0~xKN*s}9$#XB&u5%>SYvnc7>;I*udhHwu^+tI@ zz4>1f>Wyi@la!#h|4mWfI!B`JwnaTvvG)6yrP_Ut zq}n5-!v8O&SU!BElxfd7lIflQp-k_bBboM=mgzsz^Z%hxd(V+j@0Qb0|5(lchcdl; zj%0eT9GU*Hmj4fBdhZ;`v`@$+|Nk`Ke<;+xe^aP1oT@LEM5rwBQHy`}Y8SKUvu>?< zeL1NP-WPSCBxD`Gz>rfheG|UbIp&>kx-xfFI(!9b0pNK|I3#8^c)FwupFU2`){?> z!E+?kp>l-!{J+&wht82uUkIVpWT6iKw_56pb0pN4|4^uZwWYp1M?!rigwiUkDZc&( zQl&)SuM$#ylaT7j|68hWZK+DM)zSZ!RNp3~`d4j=@BXJ!eRqze`u=|^)%WK}svm5r z{O4d@>OY*v{BVv`$d6@3{qN19e>_J*{ZyV%$Noz~{dA6mI&KTqEm^2_|0SW0pCh4u zwuS2czYyx@b0pL+wopC(7ef7Vj)eO4p9w|KiGNe7U;j<1^73mY`}+8QkQxJ!p;VvW z1s1s*s*z#Phzy4|WCV00BjFY@3PzKAUMkOxr*G6{7dQ&A5x4fP|_(d}dg8cAlN2goe+2ze4cL1v=`WFC5+%tvd< zLbQ!6LT{7B=p*tpI!u+sEFJ-&-<#P^d;_+hdY&mgbhg=8CkfxL>>k?r_ZvIFlXJMn(93x7#o!#|PN zB}8^hZn8%TlXs*H@}6`a*(cQ|?@JBI2T}|2q12unkh+qOr9R}KG>CjA4I_u7vE*}U zGWkN9MGi}g$(Pa!@|CoKd@b!D-$);jZ>3MjQR!>)ophZ1D4irf$qG3p2gz|cN`96r zlM`|+@|)a<{3*90f5{!lN%>mxx7?SUl5Zuabxr<356ge(x+3d_64IkenjTZC>S; zEB*8w<#s(+8KYNLChAp`sd`mqu3lYPs@G6n)bo_}dcN|iUZCvOYb*QpI?9*&1@U`LYGUg?+WV;Tp4;pS2ewntFB(?YN|JOwbq-siu8+J*Xb=>H|Z^1cj%Y8?$IxE zjn`Yd9@Q^*&D7ht7U}I>%k?W<>-CPV?fO-&J$fhC0sU&%S9)jHG5s3XNxh5Pt#@@t z^dfhreyzKfex19Xe!aVy-phTteuKM{-q+n-ztP=S@8=$*_jeD|2fD}VH@he6gWa?A zTiuKG+uSSk+ua-VA?_Xe9qxDZJKZ1aL)~BNce#)2cdL>JfdO`is6mJ*6-7xb;OIO<(MZ=}&vA=*v8{^=CYV`tzPk^cOr= z>dQUd^c9{P^%p(2=_@@W^;Mqn`fAS<{Uy&Fz1Z`DzQMCvf7!E1-{^Tw-{N^!-|G2T zf5r2qzRmN4{;KB>eWzE}cX>nl8{RbiO>b5GEpHwDZEs_JxA#(gkGG@#j<>tM*V|8j z*L%DEo_CDC-#bx1;GL>}?47G0^lsEY^X||Od3Woddq2{@@E+E`^8ToQ?fp~#)~D!4 zeVYEAFJ1rMcb@)(?|l77UlaW&-(~tS-&Oi?Ul09f-yr=D-yQm&zI*h)d=vFkzNz|Y z-)sYXiw)#kZeZVfL-B1lT)sVq$9KT+`o1!JzGH^pchU&>-A2$KF+%=KL-SWR!u|`4 zh`*I#`P&##|J6p!-_ywO_ct>Aw;5Uf;YPN9jFIDi#Hj3_X;kqqGOGEP8`b^mjT-*# zMxK9~)r#;njmV@~K>V{YhI<0%b{1)9%TsF}th zE!SAA6&O!z4U8pP3uCF)-dLt}HJ;IKGL~zDjTPE3<3(+Zv08iBcu9NQDAwi~YqVv? zT5YwlLECJ+ti5h**7g}&w9kyK+EL>b?S!!{jEq;qeq(#sGIoS389T!@ja}hp#+%`m z#@pemjNReh#-8v^#@_HP#z)~H#{Tdq<3M=4@o9LfaWFjF_$<8GI22xPd>&qJd>P(u zd==hf90?yVz72n691R~cz6+l;zK^(#A0iRs$4I8}Q>40aEOLQyJkrYeEz-vLJ#w}2 zN2I55GBUvUJ2J#L6&Y!qj*K%Q@|Y<_W}9+kiRq54G}XvP(-YZcdL!?ezR0JhKXSwj zM1C=Yk<(^~cukF@n+C}>O_Fa~i5Dj9E{ zN2Zw7$Q-jeS!&iGtIRyI$;>COnFZuMvnDxc)*?Tdb;t?xd>zcXy4So=*UkERrrAJ0 z&upmIF&pWP%_jP#W>dYR*<9~#Uaa>sTj;l&E%i|*)kx+g`c(5$eXe<#zRYZ`uQo5& zx0_e!Z&7#JpNRZg$rHGOsZdvx}jb*Ba?&H{(3Br*Xb{ozcX+-nh){ zWn5+UHhP$SjQ-{g#t^fwagTYUG12U2%rb8>=9>eIXUu`dYIBgW$sBC#G;cNbn70}G z&D)JH%{z^s%%R3#<}lM`4mZQ*2s6VRX;w2wnRU&3%%}lR_4mQV| zcbXGu?nL_kL*`WTVRN?mh`HFDY%Vt+HP_Re?dCLdkNJdoz?@-zWzIB@nX}B3=98A& zoNYzSIaa1Q*Q##Lvo0{_Tdm9mRvUAnb+x(3>S->q`kPCw+stLwaPt{!tof`p*?hs8 zWiGcCn=7pq<|=E0x!T%czGS^)7F!>iYpk!$wbpTSo%Of5KB}4E`FLD&`llTIS(cBlGK6 zEAyLJ2lHs`TJyVDU-SFet>zE05$2Dvapq64$IN4~+2--s67%QSO7oZ4HuKNeYvy0E zcg>TrPtDV@Z!Cx%vrz0$3#ZAJloqmFX=#=_t*Yfst7G}n8e9IfORYd!M=O}t-3q1k zv$V9^t#H~XE0Q+BB55smF_n_9KfTU)i$J6Uzods^qG54P&3-)S{SA8j>E zf6!{2KFw;9KF4aB{tw`8VUw`b;B zLo)NNJ2LBAcV%|A?#}FK4a@9j4bQyI8j(5Dx+inIH9B*Ob${j@YfR=+Yi#B!>w(No z*0{{qtnr!eSral3S`#zBwI0m;)tZ#$vL4OyTaRU#)|9MVYkF3`^>|i2>xrzU){Lx6 zt(jRJt=U=KtvOl!tod2DTTf+;vKC}buoh-bwH9T~wH9YBv!2dcZ7s>#Y%R@t-CCA) zz!s|7Rh*q}t;s&mTAzKswIRESwJG~DYjgHh)|TuZ z*4FI))+^aVtZmu%Sg&SJw6%C>$7Ow#6Sh9i$*?}jsb+neQ`b6})71Jbr?qt`r<3)0PEYHLoSUq} zId@oJ<~(41n={Eenls({E@!^=W6m?yPdTfsV>vHd$8)w@Kj-YRPUIZ0e#`mF`ZMR4 z^;gbG>twFm`a3sboyyI$PUlvSLhc1ol-n$db1#odxz|S3-0P#B+yPNLlEPBbm|<7j&B*U^mJgZs&F?uTui{1tgM~A@U(L0@66RCL45vO_1 z5vO_15vO^|Q}z+3dCGK!9S(8B4EqA6$L)v-iO|=N+i?;~TtlZUIMdAvf0VgdAv!w6 z%?b;hKnD%&KnKHe1iVu*DJO!;Ad956o@0YS1g4<%@u_*JD?_SE>!G` z3GM3&T`?EGn9#n&a7>BZcFROWMD!Ocy9^rChlaEi4WTKgmqI(}fWpundP84IlkRYh zP6U7SK?p`Cffjv)w$P(cCHffTN2fx==ybR=`UJF#&Vmln8PG906RwHQhOW_h&^`JT z^o}lqzR?BHFS-zJjy?^yMxS*CKu1vcp+y(;b5cR*&5xWRTE6S~1=%8udD;40+y?q2H5sWf^<&ty$Ix^QC&x!Z@c}|XVknADV z$%?->U;KLc0V+?H3{d%ZF*;ST0F~_M;dFB4hJo*`|j~<5Iv2L(8b{*`Cb%(>T z9`JpvSJKEk;f%Z!&d59A1gJb=2dK2*pnb%2Ib3E3s9bN~&65~;;=9seDHqGV?2%WW z<}j{h0=LEnCmol=PKmJGo89_cg4@$_Jn+I9gBit!pEZ~fQkInEQKm#=Q}9^o@MvQ5 zh=?(H8o?|(BwlHrlahEw%Hg@J0w`n$@!V~ZQAYfSzHQ5iYbv^CHd5M87{#I zC&fFXI?+X6D|FL02$o8{q8h4rMNYiJZir7V;|uYt;Q50}GH*krEZP0?hKK!zSBiNf z{Y$;+GkoGrSJIo_59A

!xf`Xm9L_s|A^+u4DAruQ0#9xut z!drz}%v~}gyaB64d9iRzqwwdC1=e6s!i?mB&eGfyT0>MTtq`?JYl_;WHA7v}TA&-!TA@4BE9;|216-7SRZt~CvnK9- zaCdiicNts??(XjH?l8E!4-5_m9dvLRbouYyeYhL@vJw47Rd;4(WkpxjL-p60 zl|4ft;XCk}sSYlHg@v!^J2jkG@w-#@0Ufjd90}f;f2i1Nd#p*=gE3JMNVeU21_x^$ zBC3yx4*=E(l%FMoJGdS*x>jiFC?;&QgBa>uml|u2kf!yfzG?YT!Te*Ean0bIa4uA2 zeP}hLL%Lo40B^`qzxIAd8kqCS1J_#mD-V9*^ad+H|WoR2r;--L3 z=wKKy6GI^GW*9j5i7EJ~5jdWWDY#Q5n&+rAXyyd%)sqxF-i?)LVT3?@#V3frA+4{X zpZFCJ$hqvFU-}4(4obh@XX5T6=G)F^#M`%0(9@vEK}NjV_3Jgs?Og@vN%f3dNm*gB z{8jy_?w-ENixw6N)rRg`)-E~ggYli1l7AHH;QsVifJ)D~^l3rrW8pnZPJZcbL-D;+ zPJZ*Ljdajw1b3szqZRgH3#^&F`g(b^k^#5-rbb)Uu75v)#o*L(-cnHN($zKhR5_xb zqZtef2V?nXBrO9Yrp3{H=~wFWQ@WhyX6DxEPLj~QCf#a6|Pg-_Yse^arQe7myb?%9Rc6F-#0fdcYlApw|n@tw{14nRcg~Z zTZnrL>E!vNpJngB8|3&SpXKjBJ}CC%)hUrg{jNxmW~oS!%2}c@Ve&(WFI67*eo5&J zc!3Zk^<(Sfd)Muu@}u&ndZ&7`eUX+^*d>!%GD^9>?*IfLQgJvk$(7%-<&0b}({O6C z6P{FHEl`k@Er7$OSk5*J*?mKx)63r8!)!U8r!P$RS5z&PzyjUKAP^T+)Mq16K_{@# z4^X5AkMAuvn~$hnKQ}`N(pP|Pu#SS%CX%(&Vg2sT5thY!G5bH1puP0J6q69HI|ZQ= zoQR02uEfT~EPWZ&TsrlIvnEfVK4NRgGLwAY)qXsYlGKTwdRNeHdt!l{6%dGbwFAeu z>Ac>6;dBUy1K#0u^3v6GQwg8o^AYOTZ&eV@-xSEsn*vHd*pJIq0>&9sN-gN3?_Ht8 zU!ySv{i{UzxJyAdcFD1MDQaQ>%RQA~i3(84ElI6DwEhG68l#yI; z96~N41Eg)L@chkEmQ0donm_&s%TXgLef%RaLl+r=-A=S*CL5@0$f})?Ii`r%R zTR9qTdsR35j6o|xSDsIEtdak+mcQlt!QK?4knty@p`1O3rq1DuJ(>nsnO*1}#U0J@%1yQjm{=b+tOpTa>h{eoS+h);v_ zBo>H`6dJV*Lh!Hb;IJk*@lz>iuO2J`v*V&`nFB0QgBi@?8=nB!PeCl&r5Q}A+jJw! z2P7%I)MDAb0H~&{Y4ygtPY#cB^+v=u4v)>R;)BD(N39XDY%FF5k}g}_wRMgc?YlM8 z$fKLVaq-f?@AW?+neZ)|aT|~QcPZ9yMweYFwmvqzx?3 zg7P&vq~;sx2THznAk{xpxmK65^L|@Y^)rKe%}M#rl*AC+!~mR>=A!(j{E3!rJDv9i z=#u3JVqF8#$uoqeTJnkcE^OwhGnl+)Z%R!Il0P1K`9o9

R#N%nGB@`^_3vxzlPb zFCh$eqN6Md?qzaVos27Kf1&1x73v7u?Ki$5(#QmjQP*KQr&%Sb=V_78S1nkR&;MlR zN=oZw(Y%WhppKR|%G68kWL^1Dei2tCW#OdAMDJr}tGZ609y7J`9}ydu>XKKZiN}LY z{6v&dCjabY6f8mhHwD|z!ejjc92URsw3dj7@J>i;VKRy%g~Ul6g>&mf${rqNlV zlpMVhNn)VSBc@>_%~@E1aHyC!TyErzoC@l&Z05v{Y3&*pGB|BX2^&+4ngv-lZaZ6tx?nOFJf-(%Bp`+ zx}#a)Nf2>y)hV?DQ?{j1xIKpD7`)u)~z8rMz$6jR;7*LQXOK_^L4{CRRB(1i}e0ppGf=_`DR2en$3 z7X(7Ieg%B}@W(%h)0|G-DQssLOwh|+PSKgzhAs9zbBxBCNBtJ6cZ^eD zFfNOqrW0O$4~nOZQW3}@PYz`y2~XC^N5wDpO3MbL{g@2QtW;LK%t6 z=^fI)@Z^CM=q5>@+2z^c9hKy;2Q$=@m4F2D)+_C0lo=q8)P)xZWjTxBhQd;WK_c2J z`RlaQTp6H@d^P%vjy6pvfQk#QFFRQrMV%K@8ZlqqcRN5Fb z(iSqoSLKKF!4axUQJ}q4eWhzSd47Okap4&rKG9^AAoIfX^43R0+0HbHN#Gq5YWyqM^f+zP6VS2eif{qeESm znNtqB(&9;7>&yQo^CG4yfzRKqqD6Ybc*87tLhlJ&e1+ebJi!e{VdqaT^u+ZG1ck-M zQ+T159KaiXk+y;hEZs~GIi!gxz2Hky$YF7RM1sm1(aS~ zB`xq>Ig5Ny{Uay(!7+GwID5^rG+xLh%IH1mi_lPh^Cv^HsM6TzJ@Jd9Pz_f1Ho-is zU7?^1JOlY_Y3U5~o~T7DxSg4k7APl^`=1jg()l!A3?(dRZwMvR@H=BC2*E}c_fo+f z99_vEqS$)!%#H!uU{AIejKKyrJ;ep(*m|;Ocj;A(H<*%hxR>C?2dMtZ6PVy#)BB?d zGHGs%H|~-gxSiP(%it&0t}x@B#_#Yu(pfD}{?fbDnNN}1PysV1#K9sa_e8-W7H%wq zJxV)NnVzLjaL1#&GS`1%`;=KTZXttz)cMO^XTn3zQ=+}Vu{J01*Ao2GCSUJpzf|v0dEu~Mi?`8?+n2SY%g4c<9P4k zpaMK0@oSb?e}(IYJguUe)DUDV8s6OZvAqjl6f1YW-1oV?3kYy490cB1iGlS3h`BRF zUb}%kq|ebkq=G|W_$M~dBYIHx5HZLyjBs|rHpsF9I-Bd*dJKFXP1Xtn9xB^lWKmI^ zaF%jrK@nuwHPDMhE=M>=sXL&Hh+>sIw5R9-&ucgNReaeU-BVQK%atSk5@ZbON)~1v z0<1l%L|dkLv*rBbE!9K|b?t&IGh8`Sf+1!%;5fh7VcLNw&=8X6@Myh>g$IOlrDzcx zasc4(tYN(IY4MM3uoSxX6W2)N{~I+mr}%F z*1$3|gj6@eGb6bg^DswH@phz!9M}dLinW@>7qGsd32yBPC)%wJwxNPzz4U`{q15&Z zXGjaYzK;}Y$njQc`2#JBg!84oK~_%)g53!Rc;oY85QMORDpAn7SCAC|Dqm^ei+Tmq z>#=cwBRpDy;`PhzHmF=7YLGpB1V#ine55p!spisH|J%XOteVvN@k2I>BUXrYInsb*x2fmm{YNW=t} zMe3@CKPirM>lQ85B240SJBpb!2oi0~ChW3>Z!8Yv4E;~bJ7~)lswE=A#8Lrh(zfHk z5%jN~RKR6DokjP(e#?S%$&&sa2T~#f0y%RbF<^gMLL4%aFTsJ!UVb@NTN22b42coZ zqXluxjGpLO71%Qkb=ZcT==n3Sha2LMmNX6{&^yQ#hSpFaDi|&E%AadA_ozNi=@W6&pTnI{R@g%4t3p2 zLk5JNgUBvunj#i2^JmlRJ~d9p-9gY>2b6RlIY434JU|hYov>N?FI1>1hm6{t!vQVN zB7`=qLVvs%X8 z$=ovdfJd%`1EdsvdLYQ2< zs7Mg!Wl&GCl)_Ee*1Tuk9!L>1O5nh_V{UeBN#NSC=BgAe<7zLcXLhjo1d&kslbd+< zz>9Lgizew9kvBR2t4R>D459iDY(qiFNpY3sxOpr6Ed~zS@$B#^!(nzN?Cd$ zH`*|6)eKAud_lFZ{7jUcM_^6P2N+Wpeu5?CcML|(&x=IOVCzsaf=5eDLu13ofD#?x zeI1o8`Wu;ohTEyGsgk_Z{Vcvi7;UBx@H}EZ!XKomp;AGOjg*O$jPR6zs5%N#DaEiP1s&`OCPu_k zj3}j|BpDst2?j=_LjX2R@!IrnA{9{`d|FyYWK0Zfn5EFLprN55QFId%QgTM5Qba^Z zJW11Y?8rI9^)Be<(6XT7p(Rl^6B|;5(HUmRQ%Tc2XbZS$NL5bDJQ!78OGJFy99`m? z1<6)~I6rjCiJ zaNwW*Iu>~sQBi<|LI4AUg9CH0DV5!JBK^S#2?oXv3kD_+1_oy4+9?Cv`Jx3kMTQc}Z~zPHA^XGdCM2M+qlKS2q(! zH)b&l@}cI)WsQaMksx z;$;b2UmMa%nHbO_=ifr#*=l+{ZN-cr$VQXqCVwVm2|R7w-SqQZf$NVpu+dJ8HwACf zv(x)WnL*ego#Qi)O#U21helSP$-ytriov(cRKT~)y0XqR>#HG~)&I>p@2flvap#BC zHQ+VLj<9(Y-SoZkZ4zWX65E( z`zAK+>9>|7ySH_J!}&{*D!!je0*!Vao7*msIiKGh=64xhm2=APW*pW|)iY)hV+k8d zXQXmDwQ3!L77sjZggm!i8ao|?IKR1Prhmg5E+CY)SZ#FM7Br<8ehD|kl+A1Ob4<wDy3~(UCj(Xs=qf;Jc52beeyKpC>)*;IP@oudDI%`%%?ENo=1} zf1|7W=I(TsSPb@@l@GT`@9EkDQTNeJ``%8p6OaC5-daXiK3LBhAcF zY#22ZHtkJ;X7A7JciI(nu3P*KhLO@p1~nwvq?3&OSj-Sry6{rjYBeMUwqiLp`qA}6 zv8_yvKSKk~RdY0`c!TIM!<8hQbU+0KCD2ZLJlB#h_UsADMW*m?3o9_V5Azt%oxVY zP>`Y`_Ap|Na{^fay+>4?5Sv7u%~0VWdbVTU_}#tEY%>`)vO2mk+Ip<(Z*1i;W{QE` zqmAyx9XmnJ@#C(7MYv-o!DguAhVgRoeuT=0nfsa8u2v(FM<^G6ywun<_9qE>Fb|{! z!w#zUKRBDlP6_8hUge#i%;PQ5H}-G&o$DhvuY~h^Ud-cny!rDt5b-!JJ&^~fyoNJ3 z5riyFdH)_(ja++D4-$9{$8KEWMUK6o#|wZx$p@N*4cM**!#5S9paHv>8~&dB1Iu_G zU{BJ45~0)aGe>*}aErX%gJFD=cZa#l6WF7!f3^SY8s87nyxQ|(8Gq&7nRg}_ zza;boZcW~R2fdPx2OK=3jYshP#R!z)6`s1uAPgA2VG|o_;1iy^fsgOsd!`((;Qf32 z%sFnw`ynuH#V0&|(?MA9=UE`01^6a3E&_a`7{}rJh&l)W`bHg06MiyU2812d5E>mk zOGzkt~UOFLW*` zP8x>e+E5M}D~afJ74Fy;wYhND<9&N5D+)e_1A9!X5*rKda1I_Tvlx&A_ctV_KNo1u zuC!JWQ8f`QH~Ze5*3>|5Rec&~4=5|FTum1(Dru!-djzYM;_t)j8gu2&+<7f{xwD7% z*j6okIm7GvumVei$9!w5a2Dg-++J2Z4^JMJ`;&%F%{+NgkCte;A3HlbQ#q04znVCQ z$j(bnRcZy&qaQ5y7ej+HqQ`tVPAzWMCgD0UOnCQNrPUYnb*R&qK#$NjJ6^}up?qnx zd6W4zLIl5PsLP3V+uB|AjLp1kIFyzN)YJ2KeSPmsPg*5gJ-1td)L2&rJpHzK!G}s7 zqiEq=<347CANg%f8kAk!Vrbf~%^cY}*h-_Ly)dcl=LeFP_giiFC0QpM*8JF!7RAN8 z>E-|4d$%Wne_nKy-Gs$eX;d-f!p&Me=RahnaF@zvE0LX#)Ds5OB&TH`qB0pU6`p9= zLzU;F{RsHY{7l?LYjL`qa>j}13S6dWWob+d?evZEiQ)SK#o)Y(xFiKNHc zSoz=oB3gMzR^Ix>N#Qmzr{7Qm-i3PWs-ER;B<=GO@6V>*>IiYo!OjTtT6-m3i0EYW z_Jq-MRY!Sx)X8XM>6h_m6R{u2*Q^DbrVG<#35(-7RH9S&Oj9%OMkFNyc!C8I3d29V ziW$<$F{V=dnlv~i8q*DnpsVsL6D4&htU7fV(-hC~cjfN#{T9}4nRIwsS+K66%DKJW zQBW4a_>aC_8gfJwwYKT_8aQDaLE=7d^oEPXa{t|2$WXK}HBc}mh+3J2?Yso%X7x9y z)dmXxF0S>!7z}*@u-$%pKg~Q<{Z5hiC?N^8BYrO8WAB!MZ~ z%<+4r0K5Y8@0yOzq%<9_|j$l>{#UQ`rW^?bC9#amf!@OTj$6nblW%Sfh zWNb>Ja89WYjU{wkF?pFG-J}6&B{pxe7#cyp*0pro)Z9I%;mUJAv&{{lreUD*fs!3C zO&5u^EF7X}d-DSKPp)XnjJ%6)^cWmhoaGMuye-vzqOiX{P^P!#SgRWOy2(s47dnB> zA}e@y(F_=C^ZV*yqPf>(zK7UPG2g7^b} zLnz%rC(6CKjPcOi1lxJ2AH>kSOt{B2Y8J%|h32nhMQ8)CD}fx7B%)JFr}j42OD1QI zv+$mmX(SIpK|jy&Iy9eNa|vC9lvIXe+BK}lj*r}~B@Ms$iXj~x_ka< zbR_~QzMaMom!_qrSS*vl#e6*MSRJPTW$@HU(y2`h%2N4X#Pot=U7Ey39I8%&_g~TW zG!b@Bq%BZ}7(N>=7rMmA{8;ueelbh&2pDM^gu$KBFRxfClEBdct`?JyFYU+yJFz8? zTzEg<^7{xCuS{=e3|(f3f?lvbM86l7tmEio>M9yaYkETqtYKe=y&1aD2sel*I$DZ^ zBs|XKvb|2M-&xM)`IYjAoEn;d0wuWoZEevW8z?^nbRtsf21keVXvaL^L&Mw4sqyRL z$?Mpyk$lc`urk(VTVc*}1n}Qu-jZ00QqddEN82H$r1`}k;y$oUt+g}`c}D8POjb3a zzH?eG!k4NV;5KdJaI;?0Q`eQ-OKrx-E7ZiTv>!XbL-`Iydf}5t0QAUZ1topfPVB0k z?BX+d#n8Nk#n-`){u1dvlp0SVJxINQyQn%K-y4gkgBXXuSH_uBQOW+cF34dZK&)oQ z^S1pVdX7|)GDt#c*wG&PzK>h2<=1GlS>lF+|JdG2Z`juN(;_J``XT7dA6|F~A;J2t z6B(%Red4_3dhp!oR^vrWQhZ}ki;ZrhK+a>tM?hUZ%2-XRjl9N|OmCD0{VT6`5_Z6X z0z0XV1^~zOM+@UEv>(~Nz1bjqY(;hHqbub(Y*R{|6wj%PU{0N9r6w57xw!!fwrjJa zG#;}DS^}etdY*@+dMW>c^S5kM;YH*VTEKF!p{?*=XyI8EQV7vZ3n=j8wz>$DdT!oz zZ|R@2vQ&>6!3}OkwH!M{3GPZ#wZG$cU#iGRvRYYA9=JRX^GE9xnk$;>!TA*h;t^xD zWqC~K4|T6+d^FIQij>}$_4%{YF(VPOUErJQcgzj9%|Nko>WC-M{bDYi z!bgn-$6T4G$29(ZsZcp69ZIhN;%kJ1{!7RaHno0^>P^qE5&Ti+Aj~co{W%fWj;NL7 z!2JsO5oslj#Ye8$_~LIsA7h=R;uq4tPGUn-myT6ZM)-5U68fAAzAfw=2c0Y5Y|<=J z-GsIFh7;|0roB<5b3&c3arO|{KXov|CSL53RtFcsqd2=AkXI4>`{^GJbea+%SzG6B zK#(Wv4Xm~vz`avPjwHAo?8FOo4p&2jxnxHpkiP}-+gJVd$yWgu^l$e8YhK+Kc#;xTxT(H&Gf_6S^`3L^(Ho~d2b@gZ=LAhStnpxK5H3o8eoCf@_ zDQV`SD(VO=8e*?=0zbWhBXgQYsG*VIN)sc=q(r({0yrhaPNbP3K)A1D*KUqf&etnh z+b?>K>a+t*%HOB9Fr|FXZKp?pA^si^n35m>%3#j~d76t&Z!UiJtb7>x*;5d*b*6;H zM+YgkE=(2^Gr&b?9pje#1EN22dKhPXOELs+h-dw=YZWDn_Fcn)@(?>k9p88)u$cLx zIvBQy9zglG>IPhnG+iJ?WbNepVpD5f-}>(1Q&=@uAiG<7{<5}@tUu9*am1~P=$#9Z z!VRnm12eG-l-FI70zUfs%A;hZ4@xnaTvW{ zTbYhF7hm#+au~fcn$Uzxr6a$Ridp312tS7r;})=)*f~&{f8wDL0y)| z>jNp94}r7$wCkcdMAje16gyaA6ZU~~Bd-<*heDCZKN8=*3Lk(!FTv!19C^s_nZQm#P%y`!!I}SXYuI?V=K(SSw^s&w7hQ7xM2;6#io0m--V(Lsz)U& znw)LWv#^VbZRTtS4d2W?i}0QPG7r}Yv*>nv?pBw?vAekEQi|VLqqHbZnd(w^=s6Nu zmQ`&u3(+VvcLEp^$$r~maMSKIM6MoAcqzHhd3=RwlcfEiX6sve4wI&+5wCNqWy3qh zZ@F%M4oa7n^8F~(bo__gs*Y^&IFMqVWLYiy<4-m16Fr=(OKAU?hM*yZJl`-@r7F3a zaSp7iCC^G&zZm?>_vP_b+=l}$w_yE;03_#stwi}oh*~T1-2lO{@=v3;5AIQ?x_bJd z_MYlT{IUw`X7xI&bBl`xE86*o>~s7SvxVFSyi_KJoTBt8mmpYaXWi%EAq!KB+b#T? z?6+dl(|k1^oab^i=loyz6Eao-YTP|;W!FpFKT&=ime+CQ5Fd8-*CIY03NCO;gf7P* z!4|Zb&Y{#Y_o=wID)YWmOq@!zX^|6YV1mqPh74&GqDU%#F&-GdfAdIwPCGPj2ftYf zK~KZ8tQB9O=oAyh3ba)IX)SGNRP^?jVW_-^#;++=?fLIztc|;qLvu9Hhj$w@IHps-}#+ANhjNj z+O}?7!!AHGU4yJ3;h%F;ii3Ft?|RjVNAs_>({COy0>38vVp?)97;iQQpp?EdiM$+^ zLa*=6-FJ{HZee4c^b|lpJ>?XR56*csw-pC-s>9a~^|ghiv z{Ne%vt6J^BTm zuN$qMn*TwAzt9g7^bTD6H94ogI?I=gm^TS`-oK~oJrF@BzEU`^9?I=%oAO0`d%2$$ zxthbl7EubIaad@u%40X4`>tbEN1s!GsCVzaD^~-+iINmD$MaBOR}A$|+fKLFc|g&% z%z;)tS=~8$RTQnen6ywpAz-{$PqZOc{5#5@y%l4@8!T~<^)G4-WBbpH;6qODT_kYL zABL2ZIChm5eJZxYo$i85*p74)?;f!gF8TQlVsF7Oz)OtgPVOwGI!K2x1!ctNK|*BxgQ@g2G?!t+&K|W3oqeN{hE&O9w#9j2)ViS(}61E(Mh7;!bOa zNSfO7*n_fdq>x{=qMH)DOt%>|iZY96jm@I?ZWm@!sfHriw}3sTxN4YD$R*AprV?n= z?VFv<+hEHsx-46JIL;+(hC4$(ZPrxiDFpOy*Iz;PmAA)qJhP8u9v?=%yW^=E8&koy zmuQvPDvswX0uI%@$h!Fn!b%`p8bLT5B_lL!i+#M4O#acPE#mG`eX3!yPaT!JFi^z= zsZP#Q4DYYmxmL+t_VQ*lk1_z8&#oPF`eV)1BGO+IzsHYtv%Hqmqi7;)_ndE{WE47n z6iy@K$ z3Cl0aYyg^e+_N4qFYR0rJK6kpDoBp#wf<`3zu3Qxe3(=JKBC!6h_48l47dIRe=5n@ z`xP`k_HlG6x`r_OufhmN9J0Y=>ICm)zoLCNhOweJfBjRB+8FG9sURbCc6Zh z0v6#UmFEoXsr>nOKmU|Hv>oa7Fp9btB7P`(%{!u^fS=?*Kk+~0a-n7jdZRpgEli!1 zYt4ezUb+u=xCU^;Ex!;GetzpwzMKk2vQ@mOSfp?X!fZrKxK+h^uGIIMz_CGGhPIQVT9 zbV#?d2~MNjhl-maALALU6#ObS1TxQvW$wNt1KPt9=jyirq7(BmcM&8y0=u=kur3^J zwCnWmcrh1;F+w*FyKOvpX2L0KjwwunTr95P+fs@$H*8vuk#Lb);Ov++1_ZkVqOZ^4 zTCjatNg#lnzSSUwVE$(TUzo!C55OZBeeb+UL-QQrGejR0!COcnhR`cb+h=e?D^dHe z73o!Ub&p^GnaVpH(qJBIs@Q{8NNo{ z!PXYZ z)_JuLv{<_iA=$W^E%!)`E}#G*zGDXGfJt)c*7QcNj7+0l;0^yk5jaYQJS0M(T_8Mv zp#}+uDv5eEYBuFMv@s2#*pkb#%Mu~auHJV_&I)U7ho;RBUX>OAy{u<+R1BgsA+bE6 zASO*@4Rr}xY$^9Q1RudKUaZ<7aV8vHWhiIWw{T2rNV)}^Mzp!mQ6M(w@OmQz_n;nc zM&o>le<#?t2t;Q}eesqLI6Dx#)EpTIs$VRrN@7AOgLh7fpbD2>NKTb|F{R2%-P_|# zuJst_q%dER;Y!tQ#BmX+-Y(pME6#Pv!;+-YQV=ffvcCF~^{1A{bUmFwVKy_@rtz5z zmV34+k$mGRL_4&6rGSLnb~A1lk!6?V;w4IEFYZ?*Ta1*V1xGczAobQQ%epl#qvOJs}>!=0l#{`*^iB{8z zD%>0#b3`X?9J!9U``_6b#?4|7xwMlj{RJ0)l&*~fdQ_KHFdmLUUPI{N;&u zeUxRAnV6#6EBRudt~qAg9A`dR#s?*R;0`Surx4O#8T+1GcW#=Oa7UV_CnjRRhZj{? zl*Kpn(B2vEVleHR?{Uyj5UX#*6~xe!>AS@=aqXB2q}jMpUAh==gen*%dln#!ZZM_m z3!%7HCye?WQB@pbn+cO-i#Jnm)Ng7#D2$YoENbLpW)$n-;{M*jb%s^dF5PRo^1HHP zLyy8=k%3=Kn&)36nOoud4cm!&?VL$dR}rt`-MBmFFk17f=q$k8gyG4|WQcQGae*AX zF3s&+S8A!ChbSKK^7<9tRqtLvvPGIxb+HypslvKT5&%%*;VMHhAw3_t^j;j1a_zDH zrb43->7QWjEtP_)RA5WfhEjVJ{TN$y6g}mfGUY6B)LHMcbf9u}+_gg|>j61QMp$1Q zuU~1F)Gezy4$yRG#IWUEHt1<ss4EhM%Q`P4tcV) zv0&Y;+=>nUz@Gn};IYupRXt7#t?|>6Wid~1Fwrr`5=Apk( z$VSPBvNnyTo2p2txmc)K&c|HB$6Uz=^NG9t_uuyK_d|x~Xx@8k^zqK!IalPfNnwT) z)rOep0e_2e9ax+lSfosRkbAAk|4=?t?*U42l#>iEsC&J#@ArRn5*dYeUu$-fd_oA^ zxIc6CfzR)Mzb5a4Y}oU;Ci54KKcR2~jYnVLq=Xv&GI#n)P-bpqOSoP(mSj*(wB8}n zL2eL5d!bRvkW)H6!f?6_U^`HC!(u!B`e-jH?q<;*ctJlu7UN+NHIHSQOJ6Mw0obLt z{-rOzwy)d4KkMnnb%FzXiNY%v`N!OO#P%I|nYZ;r+8M^~UA?l&?)_i+M^&|TN1%l9 zvD%X|z3DH!!PI7 z;%IwCQr|QjSWYB-Day`eQ8hDND-Uh|6SI(xyVoTe)qYWr*mf?puP1G*C(a|X5Qt+} zq$8H5f>9(kZuL`j9Tk=+O|{t@Szkt=6U9-jz8WcA49`8v(1R=1cy)mHQ9W~@K1AL_ zNYRRCNYI00#_Br=*Mou4q(gP&2TrYNe;`Ub);HrPQIT$vIpfVe!i|-q3$f04At=wL zhzDAPxk+i&#@Pwgj#Kucd}_d%4IbhHN=c-gnm6&;WNO7u(TKXo#%L9Eapg_8(2m@1 zTD2!3=&U@u(t3ryH1yPsx*zAjXMP‍`V{%|_i2OaiR1-=f-dXXhG7$>`xYm6Ro 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�@fm5JZRISBL5x3yMPnU7&85 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⋘ykiwb{AGu%k*}f@ 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

+*-@~YoW|uNasl{Lc97Gz_M1)raLuLyt2YJs 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
!2a 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“gw~pDKdn!&Xg|TGLCODkRDZ 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®+dM@~tYq z^YZV!)^}cwJUqMDoBChvXJOsD4g$QBRqqDp_Y0$>?B+H;!)LanQ1I!RSdQRFK1V^R zSMZrs)w4%;lgG@yK;{{6Jj@9or?j55Z>Kn(#1v$O{E0me;)Iw&0X<00JbW1D#l!pL`{BlTSZb+m+5i*cVb)Up#|9Y1mm%>mu0u++y=3dq zxVDRID~ZOVUnM#x<) zi=%pE4QRTy27-Fj{*1%Dze15I6e700i?oXz;7w1x60u&X44M|#QZH#HXpKeQ0!?#( z7L98NnjY5>G=l@A={g6^us_QH;n@nMBM2o?8v<@N8|C+-8hNgq94rMb9+hyk;ix>e zoHVR3V(DB-PSL@5&VFb?yU{+hKfFxep{FE5c8atq*@Lstt1_QwkHOzWdJ?`A=~wWF zNdF`uo)VSR5@~JHQlza&cadH|28(nEnIO`MWU)w>kb6X0N}dquPO?{|Pm^OJeT}>) z()Y=?BK-&XMWnw{7f-3121Od8T}9fBP8aD6I#;Cg=rWPsO4o_>UbwJtWeHrRPL?P!jEzjxm|1%*Aw(8Z1wwHCS7bwqspH+Lc`<(&6k% zkxpP6M0!6H?PE`~H$?g-`%a|avww;7cbW23mSnf+SHb(J0Sl24oJ5}YDMSLFp%n8u zJRkTHjs?Dkw*%k8hk<{<$-ocrRp4j%G4Lz=EAUVFGw?g{1pZCbz<)?QaGKOsB+^)s zNi)SoS}9)AMe&gf6ovFxLS%>%AtRM2xkAy&L?uS%C<(Ge$s>0tHA$&bmuyh#kw=vV zWSi2E>{Rl}(@GIJq%{(9ZOK2B_T*QkGx<~LN+qQmbt~u5 zkkW(JQ2NliN?+PY=}(&}7t#`CAnm3MrhSx4X@6x19iR-Q*C@m33}qCZt&E}blq>12 z%GGqGGMV11OrZ}d*U&A>RQjYcjqXvdr-zgq=sU_x`iXKQ{fBZB{Y9BYe^+MHQ_2E~ zC^t)zGDm8v%#)fc^QG3xVyUCDRO+s*koqcjNQ0D>(kNxMG+wz&nxvFU)0B16&B}e! zB4xdFyRuQbTX{%&Sb0?1p*$u%rEHS+E1RW*$~Nf*Wv6sZ*(Lp5*)4se?2&#{_A*eO zW-jFbQ@I6yF_`L4OiY}W0eot z1m$mRj&hPMQa)j~Dxa~n%HP@j%2(_OcSYv$pB;3jJr9%9658TcQP?C*EgWy6|h%1z^^c3_KN4bQh zze8X=>Zg#|mU$drSJ=9owPv~&HqE){h$%prq;tT$cSrd%pWYtxG!Zp-xWGu2|njFg~!s`@qv?waFKizG5#F4`X$dRgciRBFMi(oBa z!P?*r)&(V4A7a6VkPJ44I>7>H9V~+LgH2(0usO^Kwu9Nh_Ao!#5f%o!z|vqh+lBjl zXvx}1^{}IcLz0zP5&UkmJLxuiWp$h7hoQh6OLY{3>%^EbNW!(OJ&w0?Cm2`zcyO;k2|g@j{FN|edL9$rnnst8!_T{V^ec^om!W6z`$nE;9FIQ}-h@x%8TVw1ZXSVd!_x+sLNgzH9MNqP zqT3ckw{3`S+Y#NKKy)idblZ*S_7tMq)36}84;BXx!rj3`h;By^&5pvM;7jmo@D+F~ z_$qu9d>y_BzKQ7d7NXY)M6dUWJNN;j*T*CtJV|N?KP8QVpOJ##7o>Uc8`38D9qAJM zk@N`uO!^0ZA+v(N+tcd;B3USSH~b(B4`sLyz7m^?F47z>7HH`vJuI~3TMmnDv|MbX z&m)WI)_P!=X~Fz*_kliQaPBTCc?`IOyBFk^hJ0* zjMrhjH6O3u=5ujr*8RQdi@$57G1^gq_8h#12gHxgQL=JTzo=|6! z8|q4$g}RZBq4P-BPKH1%i?WL%JN!p>+-_Q zcyTJ-Y!UOjZCutX?mVPu!?oFPan8gQh}}#oX&?9SLpP)3JtV|k}MSP!`T0e{U#OE>Z^34^f_OE|ffownj z%Vc{pjarX!8-vh1B-{B&whNJL7bDp&L9$(nWP2Nu?Q$px-2rn#D`81!HLM8T1*M@< zB;U30SZEzQ5n2z=gf_zA&_nQAs0=;~Jpv~~kHc4?&G2(*E1V8(BQ*2`@rIrxokF{i zT%SU6eTIw-?I#mM2gt0@vt(K55Lq5NLP|p~kOxCAlJd|?R+3n=x z?kM@vWXEok9rO1McS@=dx(>HlaSJCu$M3!t{Ji=C_>D(PIDvOHzbc7)`P_nlB53Ie z$GkZQ?3?Sbw7A!ta6DqZvHl>#U1`e+J}1BTMaj2f=D^H%CcpQYGY2mq=DU5RZP^fT ze3ui@$PdD@0W&|Y=HCf@jrCnlVA)DrP*Bn{&QHm>lI@J62)KVvqxRd-8d3W{IOCiG zFY=XuN+Cy;AXk;4hU$U3st@wj08CLsFjEb~A~ga_RUPhBfCs`cTx+6dlN8^fn+0i03`iC=9>LTU?=P+O5EYHQM7ZA-eS?MW}SBN?D}BA2P1 z$z-()xk){j%vHOSC29}yjM|I5sP-i%)CPi@(u7-)~U2u(h58R}#K_prScc}M5DW)6M4e+SC5w@xi+5QB#KpZFP&oOrm zbYlGkbGZpxvi|Hs9LPn`m<`~A#yirUhqqgU(E+ZrqR^cOldK?z17L)?S5`q6K9F5x z4U5m(Zk*uUZY&l)PP!~M99^Wut-E;C1%7}~fi4#oiIWHThT*?U+-2f)5xh;*OLbTJ z(cuH+55D})+)H$4SdOZXVt+n{{kaK(>J~_-+aOQf0rk`;puJiS7pwbVn0f$4s?Wh_ z^$=X49RaqYJ+;p*Dh&i#tC=P%SJB$qZ(WPP!QHBKc7yaUbJm|v)u~x{^~VBiRw$>R$qq3>TA$UJ?^lCt@*pw!srfRLm_q8hdH{lD~>KP{Vc2jcI$3#?$8WO^Iwiz+yt20 zmBcHJ_$hvLj6LF)>Fx?6ewuGMXO6hz>~e9op!znBIEqE;yEx+SLs#`MsIGRSy4sEEYBj1g4*jJWL(kY{)mykfpJCx1&I1;%nYD%ca5lm! z`F_j1x}$Zdff*Q#(xHXBsI<+F`AB8cfS|By=NK$D08!8>14sCF2YEX%n(%Z<0_Nk|(KJ!%;e9kmRJ0;VAm`NlLP z66q-`J&oxJQxqnLO!6cbgK0=~v1lScEKwK|!AUR;iFTVLOgKqx+hTK zjazqv&ryc?-*(M1Q3$0^?qc=9wh~#Ro(g9##92m!p|n$1Ps^!GwXJjHxNI8cFm9M5 zbHg0_EC(#8O2Zs^8^>YqP!8M3UDUVD+~O`L9d?md5pe3ajv+Z>+To;c?IH>L790=5 z=?$sAD-sqwK1?>3!b7I{j!PJ9&;U0XSsr&Ghjbl=`EeIF<+&;DGEI4|in~lxp0UD| z$Hh%~Ji?U6!%ca-TnyiipL)3|k4KpDbm6i4Gfa6rXE5dQ@Vd)VO+v1W({#EO+@2@q zFy!GwMwQ((DBfwne`!eks^%bW14f3D(PRv~OdclN$xe8gUPV{YyU9+G9wK|JfIv;S zA!E2d&OH}`H#`uO@F0kVFNVDE5U3d*2KBhF6kX z!*`QA!uOEUa4C5pyp}v1UQf1%A0#`&8%TNhe)3lMVR9n;D0wfuiF^^>Mt%wJB!7gT zq$G@(AAX7k!+U8oypJZr2Wh?V^E5wvh_($Mrk%q_X|M1Lv|sooIxLJW4j-e_!>`f# z;n(TX@Nv34{03bWewW@Iev_7l-=c@Y@6aRR6Z9p#_iFfk`eyiJ`cC*0`d;|&^l#xW z>966h=&A6x5(|GX`NBU*YS{FUx(7mJ9Mm#>=*R;oV{@gxOv)`qzl&^#hUPsw-BR>> z=zL4j@1>=dqTfT0Sc-lR?FUPQdf!bu!&;&8caZ_)c_BdZV-XEIsE}dtBSrFBMx6!p z8&kZj;2JiDjl(-!UGy z1`w$OUp|ul-+=%B!~Tynf&WjZ|Ev6eGW~uHUf$o*4gQ=%mYe?n9RHt}{+_>2Y5IT7 zZI0=qgoi(+waRI22h*)9I4-T1!EX6fStMeMvHfRz7g;kIPOc#1X&oF-&LJP>AzZ_M zAkF>>;qYllMgVF@2oyvpG>=GdUW7s4hzz46E|?f`!_5&7EQxqwUBm|uMf|WQ5`gC- z3cMT%!tqE5K8UFBNhA#4Mk4T2M1wygQ9>g+2}BGMiR6&nNQ~5p#7SW!L0UwTq(dZ^ zbc^JX-jNz)K%^EK9;rjdN9vL*BlXC#NCR?bq!C#iDNOnQkYy;r@Gx17T#1-}IlDq| z%yL`5Rc?Ekmb3BfN}QR_N%4MhXM$6Npj=l@*+hZilS~Xp4w?~^k=Ew|g_IU3A}y;4 z$~Z6;lrghvai^-PuM$;XZB>1-Wijm%qn}yp`Hos$cC9XR^N;7)WcpEsTJa8>Qbn!T zh+0zzWM(?tnl(EFsL1eaV_RaWQ>*R92AK`IrkZZN-R{QB2KlRL&@`<2I(EISkPrt{ zQRR%zO%8d^bbiQv+>*&M<+&ZEJO^J|^4$HFJa@k(&)sjyb89VmZnY`T!D&;T6DgPH zp10(=y_P&T%97_UvgElXmOQt*qC7{+OnHvHY|3-wxIJxFmeeeTgd!9y)yQhrJJ!6M zA+pK*Wc8kLIYaQm#h)p7$z1Sqaly-N3tn>7f|n~(@G@t(hNkzRC4`NkZ~rql$e>|R^V&OXNlmE)DWANkUT)hna3Zxyl`Bg zZ%ENaUXi4Wwk9GbUYoErj&&sRn)n@CHWE1nR7dkj<3;0;bP&UNyqsmo)TDqfw#yCReW6SC5_$xx%W zVGqZPSa^?^*@~gO@+bk?5i4Pmv#kLSateF-v@>*?RxoM1C#()m`axa+t!oF(*k)}` z-Q&!_uCRb!Oi=5yG5;)23$V`Qgepw8qVk(_Pcu3}9gknwz&j5I+1J_y&BZjFJzywb32q)+?AZztbD!fz~dW zmh(ThI!bPn{;}8-n}M875 zMenrwDr|Ej)G31vNX+Qd!3I&c3O1}{12Hq?(#JNt4RjyFtcqUG&Nb=af7I<0Wt*gJ zJf-B{w&-wa3+)};)d+f-kETUvEz~{WX-%LV?Co5PS~#j?7>!n*l)q5w9@C`8U*obK zx1)~Ha-{rBsoCoG{gmG;@>QEpNX?%1*zBCs6Bz0saH@uCh#F7xv^jiFYyO!a{}Yr3U)65x0In?+%Y2z2^0k*m z#Y_N_Et$)_*+9qU49D1Xpx>qsMgeVzbc-m1sCJBpFSJhlkNu)uaL1-oyQntcRC8** zmNuxn^*@13H7M=o76%b+@UfQXySUawglk12%j^jCEg=+J>`1FENue!Csb+FXc3b$1 zLS9)f%ejQzO+O|DZUHdMxn##pLMBOWAv7!T38-t*MlJ7Do|+y*aXIV|p1$bykKQe~ z)h19ZZE{Gu;J-EfJg)o3(P^`x=Icm;(!d5)sFUUjRAw-lCcaY&gY`yeNRTfjMOsN` zSE8%Vsl?@kGdoJSU5ZRLaLw?IaQjUuv`uECI^AQTXPKZ8{h)Fna^QCrsc`$n=p~38 z=_n8&v$PU~^_kM*4~4S0i9Qxh%%Zf)h1n5DOKK(81x*s3Pk4EG!GltBQI0;%$^Fgp zh(~{``5>X>bP2)+Ow+E5l?x?Rr zV*CnNZ=Jq$NlRg#M2A}i;OgY8<~TfJxTdF&r-AVqi!MS7AVz(2UE1%fOfu*Fm? zkzs|t%K>%^IOlk>>l}*+m(isB_V%}vie?+vtwfvlvo8#a8J)`~IZdvVFk_UrNZLI% zH^+IK06QI{9+HZjww#h2;P@wx9kXmg$c3tALRB^w(VpG^8b)r~t-)&Jk^azlyI79GZD!BHco$i!IwC@f4zI z(JS`{B3`N6fuPB&Td&{-9ySG_-O34GNSH(lW6xk)6pe~TICdCXliY!Bi&9q*$n`N) z31-g&Xd;svRo%w0PiqNu=$~HON2$sB)i>2Fb^<26CfmtL{|!(C_lh{ga}7eL+2>^o znuTPSuD|~q!F*_Bd$rO9&uncPv{ECO67n-}Gj2zqE3&Ogb2<8Zc0M9dER3*22gu3= z<5ZL`RCDfNfrAShy3jDs#0AGCRu}MCgj`_mLZpL{3xqCO7ZhErKGb}!qV2C9aXto$ z0ER9M+nTjQng+18#p~R&@`zHVdA0{)0Myl$Wc~;T{cw>;N&>dwxhIu^q|kHE8^h}BV%;y(?rG( z%gmf%Wr4VXBk9;rW|8h8zjCVNdMVZGFmL)-g|3vMa@eQ|L#mUS^p@6^>K2X!W5AF8*oRcP-53KO{t zNL=hb7;;XPfusw&RQ#_$=Ul6u)C<2l!Y%-IA^f1h0y9M%Kah7}?7+Z<87I~*P`zkt zU*ieVgZZ7L8{HSGH|~Zs@0^*0yfgn;3_f9V;Y?!ZoN$rCD}*JoS7K94pA5ISF2QcW z_;~x=agq3)>;m048zw%Fz_{o(>3-qgM98_giPMw)ap(D&iPsbLmXZY!#`q^R;t`xs zoI`>X{&);(XF9@Y<+0iS&yQ2Uz1YZRM`x z^l94TzQ-CTPOg2%4H^|XiBmk1;cE{5u0paDO`jsG*(LuPmJ82Q;Q)$qnWAamr@#Re zUjV%4m2B+=MuVu?EiJWxC>(joQM(*B$WgtaQ=*>YvfbM0)hHY<%^Ki z)qm2EJqW!6UYoC{GkZNR*=RLrxT_0Xp=Y_3{2#khj&8htBFPWO|77w z6^@|=e;Vb2hl6tQ_(Ym_=xyvt6`PC}{c+lTZ=X{wU=J6y3#8IRYT-rA@YI?xza=Q! z!@ImR7d-k7IHEyFu`eI%(+G>az7Y1gw59Tw+NNM%?904;Ir`tJ3yd$gPBDGi+qK)G_=|t@q-;Wh6niMi{@EYNFCmG>)s?B2624|WDQ>x%GPMco~ z-<-zsZ_c_rj3AKyvE(pnIPF6~=!f!p#4efzMZh z11|XVqG6abS2?o9O+KX78-~>0MOqt%0%i>@KhPV7Wb6HkmxI$6IfwkV;QPk06wMww*LODgSt7{j!o|CJ}OK@Vf=#MJ(E&i zVwA6Pl^zAG)Ifv^K9fulCF~{P-q3*EKjpr2K*TGuCalj(62GhqFEB>LJ1nO4N%p7f zwXb2MvbJ(J79oC-uu@%pjBZz!zN3eu8vOar!-sl!uKMw|bSUhmDE($lm*Pz#=bQt` z(LNJ?=EtQeRjx@XJ~OGRTBV_P%f4(Dx|Vav)LpWnoWi#DP^ukR9Yd zCrV;yZb1>RG^5IjGG!m~HfeMfn!q^12b z>PJrMM{a6p4r=AeaYb^Zw^iYKiQ@G8p3&!dnru5p#*&!n3bffin8J;ECZ&)97^!N2@pFUp}c+)v!asnp(8}PK=e^hq_5=?{=}}HQkM<4o|AqF z$%nm`4sV>({hGam<6_2lSZ@d{P=c&cg6x|@ixh!wV&WM#E`c3l>KZ0Fz|t|!hOv%# zSIl06(qi@=d*{&k7+?GB#sC%OFr=`t(h|RAl~6F#lgvgcGq+7-2&ZDK$8$$noYEa}DOqdD|6wy*E@#MFV?kR4 zHYBvNqAfhejJO0egv2qVEiQ~+KT#QT<{DNPM8|NSOC8B|4roZSV^>|U6{p;=t}dR% zxITdz^YWT)%kMF>EzZS)pU;g3BVoWxMk$h2j2v7*08-uVaJ-6h{pgg9*sUKbvR0Rt#Z)x*x)4Yvc^f_ zW712I$D)_c#iW{E>A4#)Kzh=d<^%|;U?KMn{!rPSHBWIg_4xVEC7){0aH*v@EYg9N!)v(Jo z#d7xJO%`4y;-Gs|kB#w--#6hq1v%NtiPR<*Pxv~ycq+ts&Q3=okWTf_Oe!8jB>yd7 zo20xAl){qgi=vRhOQQcGDPr)HOnmBz7(6DPDX}l*%y>*rTU57UPmhpncy73P4Z+^*F4>^_HMqb=gc7@GaK)kvm-t1!*rv;{GuodYG1l9&I!6dOBv!IryOz05^f>~{U>_~D(j>(kCZ!gMO{s zcm=21Uniy$Ys(%DC|icW1jE<+QvLzo4#ulq3ds}bi@k+ zbGKAELh#DZcFEJR$I8#wjlL^!=QsZY@nmP{cBiyJ`ZG0%<7xojGdKpPn@{{t3y%Fc zRiN&I96d$e{i7f3{xzcgf4_}z9~oEl%<BsuXDsQ0FV4HS$YoH?O)k@{x=!q|Oq1rZbx~qNij!Wa~Wbpze zPgB42q?~`rg0+hLJA)pZl7}he%3e;Oux9{ryU)G?o(=R19L^;r7mSo5XHRR+Ds^zH zP!0KXWN2l=S!=bRLB?G)6EKpKY02Iy{!N)OIGn0z!x$pLbk`A{-jiK>ONe-?+*RpP zm=sn|T-!5*2dkGaW}8|-9QOrm#&O2Ko#jq#xpHGBC-&Tf9YOPljLxB>UEQZq-X}6B z$2GyLY$W_W&*$sCSz*|udy^svRqoJoIbX+WJc@>QgJCS8Aq`>+Olz34;fF%~Y6P&c ztif>&=L`&MKxQLaL%h@U;iyQwzapa}orx6<&R64v#s$3$Q};oF?+xi2p%kbwBuw6* z&Ui(_{x4Ls#yrPcEZY8TvAE1_CU<$R?d+#Ak2>E^tc9UR9cvr+FmL;?*rohUr-}D+ zDQ0P$X8MTY8QD5+qu9^VvY3DPPLI^|JV2nQ5CmF%Y9yhXA|P;sL9dAKNKlS%gQBVA zB#IkG0@hB5TqTqn0wr*R2{5o>BG-Q-F4$nOM(IL=HXzLru_0^?jPsOiXtU9}fWF2@ zh8i|RF%i0;#zvNu#1O$(6V^Vc$Dd}cO^!C-nr26BjdT|`O({=qRy-2G(V29U8Ag>i zpH5ufuohT7m=!yge#(|IIKrCchwJ;&;?v+d_Ke`+y^9tzfgSz9=5z=Z8@0VT*rRwO z3tl+Q>ts1|t%nx2!Cs6sENXDSX|jTC>w4#iTj0S)9|uY6O%9@01Uk6hcx9t-L$D3S z5~y|k)$5EI*xoaz=fQ%FV)jwF*@1VZVlIlP%qQHxIm~cVw83>{p@%YggH5=4nayx@ z&DpBKb!0~NK+!#*wd;^~W4pl;SH6FcKLDVN{himH*;__p%UTO|mm9qw%jJAf3_9;- zr-0_&uN6Fn>tP;qfDygJW<@LFk8g;aabBj$x?W+r8|DOKeLY8+;kx%tZ%s8^6<_#1 z`YUg-yT{fflV^4_6b?w{r6nPU;E?Zel8lNc9TSQ!;{Q@_%R)~9lzaGD{L#74+4Ark zX{!#f+qxcwIJ#PI+mHJKep+{rpywB`yAsb~^bdSA{s|#$*h66dcEHK>WBgEf#mmd* zDoYKvXZLB`xk%m+S1Rm}ohX7XfzrKW{LofyKiJ6$#Lm}fzt8NC9aOQX8l74)>W;)N zM_`u=rk3NJ3X;$X<8nkt8TC~?3gcj=$KK}1O{YDY@i@j;qfN z3y*MMBzQlzs$h5sAyyohVI3~pV4VTu3RzH0PshP;a!63^ymD@Rj}{_t^qsTS<*qfc zp{-lgEFL!u0PZe`t=$7I>*Eaw(t$GZZV8pp$?g3#{3n6YT zOoRvDY81NAubYx3o;}#@K23G3xBlSP0Nxcm5XbB)dTvBWi#%D!}-Jod-cW96Q$ zV00@8jXp5P!`lMs7DV?**TA5gS|%djnq6;*^($P6coh{3+GJuKv!2_eXonEF3S+)* zeNAmiU88-kdeZY=8~R_L^jtI^BYo|32FB4&;0V3I@ogyZ26$p0J&`}Z$af&zaFZ}> z5Uv%1Gv#reKIw!1P;bjCz6SCNOGQSh0z4p_qCFvdf_x#Ku8NIjtbRe$9gYUPpNu_U z58x)+hVeku)!XIYWuK9m$!DK4?xK#)BOkWHr5Jd@lpYXmE*M2Oj-o3Fk&XL^Mq~uj zxbFcmsTrhvghoX&Z)_n|RBYcG)Hb%^>S_evP~nh15&T z!QLj);CfSfPvesjalYDDDkk4m%Jf)WXjgOvJmVVq8@voT*+Q5mW{R`VYGusjk+yR% z2^F8%ePzh}NhNYRnBzhQg+VB|(M(D>nNUj{hYUKUa1Mk%T%dbYgW=nd?pLWl=zY*w z!?y!*RH0?}tP*?Hh2Ecf=eT|FihjI0IC}uZNB@S}Ux6dO;Ri}yi5W=0F=V3o?H;*+ z!s{xF?)ktQ zUI|5lht>zt9a^4?gxjsvKu!1?^JT^pu(7u_m8}NJ(R&pKThYtla0azqr3X}99K8A9 z8HKsY*82B<@>^oX(hGbtwD#@-{nA3DC1tglSX%1a5Ihjha5s+)28Z#twdX|MGw$=Ds$(pSVw9fbXeC)l+KP?b;FS}gW+7H&X}_I?Zjcu@+^Y?v7GZS z`Yb2=S$LBV`eB(vp9RFryB+su`A()M!}v}<=I{6{2i`NOo1%97HNnAuMmfORRzIZY z!uWTDv<>U&f`S`;%#o%?xoFCh0g+Pxzc}NPefMW76$@ZbqGC$9A~1#iJDZChN;knz zp1^#R)a}#vZiHWm>l>u}QQooa9q8f}+XCeW%`WN(B>M0tq~(53g2gY3MG~Qr5s~C1 z5`i-XBDokcwmUT=6nMkrUM64$=izVZaXgE36qGF`<`ML-(7x6;I ztSrhRXe617W)Y@ts)gjO97}m=B-+!i2%|5wpNjTEZ zd32=ndBbqW)6B5v)6VeQQ?ZEqyX7I!yJ->m7vDnkchb4Ezx-2iInoy?rDNf-Buqle zumEKe2FVEtm~=-Zq0-DSsnYc@Lj{Fn#Wmz7k_%JM#W*2_DSs1mU}CWY`bVg>rUfMv zL2b+Z0&an32WWlTR}`mR)ADeurq$qgq&|WPQtXEPQ&UuS^^?0dn;R9ur5ObQQt@1M zKmr7sFpV@`Q$|5#E7Or8H?|o~8d7>NwB*O&WmJ@k5} zwZH5onX>t3IMQ}@{Qik59uCSUqMlChJ!3|bY}oRQ=HIG*o1khiNdE-wjDVM=cmQCL;f0b#Fq>t0fP9hT2Lgu4 z+SwX53Pm~w&~)q!erio%p2K+uWvdG-h+b_5J6LBc&&T9GdorG{uYrD$3%u0^6uG`<~pR>lu2UJ?cm z&tAQr%9HH&IC0VPLVAR9{&G8oMTpnOi7W%_0xnMTS0Y>pj^^?l3}HWl)$C%?tOH}H)~sgJR$Z{2QnehN<0vwtU6DG=k5@~|6CdlR~GGCDEEZ_8<9k93d+0w!m^%17Mn37GQ z$K}$}mQ(fbNS3GivrV)UlCN=O-G_|}f6DwFrc-qrKVo1^D9EUx?zCoCb3V?rFufHVygG1_{uK64>+pl_``|1WB4y)NDh0e5@Jy+>?Zy zV%AmISEF`8*ekw-HA{Kao^zlDKs*HZpdjc)$`4tS#nPSnA_BK|!Il58eA3HvTRZpV zxvpM#=CLhafaS5RT=?+ZR4B&w)LL3ybJI~jF3{I*tka(bLr}1Qu8GfGN(0PgzuXR>^__buy zfnOtK?|(WL%SiPBI3>Xk3Y`cylzc#Jr+uTSmf(ZSPSUmkx44q&n);!0Q;ldhzZl)W zZ6t)bBz+Z`J>Z@~<&d3*yLV*l9q6kb1C{BOt&iqunYl?5muX9JJ9$#HG2R3d9nYW0 z-5>QNP1wFhfWIsq2IizACqRu&ji8O98csR(8x!jz*6Yh@eu>M-p*~YZX=^yf(oFGb z-%R5F(|VlcL|b+IomN(lmC5-QXbfM!$Vk9LzLxekBJmEwn31wLuM=)XLd+m{j7jq% zeqa7uMb;rVrO>OtmR>>B_xbo;&G$@uOLV1~dd+f7U$(1c1+zy@-p(L(w>)X&>j*P; zg0(+A+nKHEgNn*B<9hxW?OR@W=}tztiL!}RcOZZ3+8--R%;|_G{4}UCe3T3op2)>d ztd2Dax{;wkCpmwpC?(yUYZ6$ABLI;dHXcEwZe3Y($081jSDKzjP`B~!IU zS-!D_5M~24y(OBmKkihieziLw$obV|EL7$4CTxY&Y=zor$|`20XA@`UoKWbdj8J{* zR6X7+#R_#fH`6wQC+i{9jToWRQgjL4CL1A`nlXdksZzI^*EAm{X2@xV$aXVEC`{BB zr2l4-5^tu8AoG78mtTocsme(+XEVfRGxSE29j`8_>-kw3*zByRg`DGJvzv7p$4!g0 zeqV-3H*D&qM!s1a$ad$^=9lZp-{zOjd82`D_9rT)f1f}%8*_a4=HMPfEF606`Ji$P z@OucbBJbG2#8nXn)Q>elJ67#r1g?<+)7}C!|5HMzrZl%u#;ihgqiVM#`cTm1+=BI{ z>Ch6*jOCQb!x5d7ZQjs0MdK;ax|x8LJ6jE#7(SV95}wXV$HT4HIE{M#>nOJJ8sxl@ zH(iJmEX?_G^{P~nBz^KLbQpZroHoT*q4M=;q4-hxeRl(7y9pz@scMrD9;PX>>fi66 zrAphm*y(RW}v-XpW9j*D2zHQ|qV99hW`3&L2rcqbk!;Je64be%&MK zh}G9oMbYh`yb1O3qbiQ?GUqU6)!5rA2epTB^)eQdW9o!AW+iv_@zT3(JFkKiY+4>| zFuGX2HEMr$-gCb&K7N%=L1!>H(?j*u^TI&k`?rI@lc#ay{R4Z?VQs9~eQhjWs$DO^ z?$F!LYxfluSo$a|y~}6xUf6U&Mf%>Y>^XPus!2o;FnZLwdNHxvvbr0xV!I}%yE9bz zgeg|0(O%xsUSCpgAhD2xr=Kw zA-Ke&tugsW9BY!CPgg^-{(rQd03=lUU;YZxz#vcn01yxWHkKt4xfK#T)j$9M)L;Mr zv;Y7A#`d=Kww}(8HuP2|M#l6?rp~T5F3P4Zl6EepPIiVivZgK;zw$XcV;e(f=Tem| zrDXwx>%i0#zrILP18+C7G*$GZJD)F{2JtQU;mp11!qhVQ4iq)eMTygrc}X#B`RDbj4H++Uzb6i zYpaTkzTy&bgGHwtrRR`5CGGhFvo?hB4hv3N_v()NHj8#Y-rBK~mViqQMj-qqPWwkp z&$%w_jPz=@x++w7D|UjlTEShZ&ozIt?=?uU`V%_kav9En1`-Cl)Q4vX7$O_~rwTJu zOz@gOUxNAc&Rp3mXQrjb1jLsP1Kcz|ry%T+ z{TI!E5uI2Y*tBJh`bOw9uv{^U)#PCl(}(ImwK4|d$T5}jS2}Gqn5Qttv!&>3sr@{w z@)Q3Q?L{l0mh^B@uP2%)G+V1Pa7Toqw6jiIKnRxtiwwtAwiL_g$}&jwN8)itbYA85 zo1Ak@Bc2_OJo{P8gZ$0Gb=L0bi`I>$41lH@jPdHB%m?EYj!#F?-26u0lT^(S$_7m+ zhBQcui}iBfAh*g4wP$fFLM1*P(5)=Y=tWgiY)mHJ8!E76XNb@N%a-82pKD`M!>vF& zPwhJK)RI>B=Uk??K)^F}O>_#Hdu)|++ppg2SbG9GArQ{{%aQ9^FMw_cwg>9yKB)?5 zi^{RR?tq_#^~n~YzcRAD3;_1H4CY0`oYoJl>xnTiLm7wo;gCn=^wudeW*xRgN!59o z9p((o4QJOs80@crH5gt9^T-=ZGT}u&$;|1j0gb0L;?Un_WyzXFWe193|$QWi}zSfSRa*@RQ|J>wW;I8 zcyS2`NdlknJ469d(8yzGoD32Hq=bTziQ_~VIWq&Zpy5up9WB(Y&gWvgfmE&KqQOgL z=@|T1#Tu6#*R|`hR%=IBTgR>zt*+-SA+K3q_uX!pFx`iv9p_u$vpnY;&L8g^&mrpa zd@nSBG=oX_zL1|g1^iwnF0RXPlI}ck$X8T$@^;VQ?4Kv)N3zG>(n0_GeOvxdEWe}R zWIu`kca>Lr{!g^;G5EHj+l*^nJHNRZ@9pln8T|IQfNcK8ke`!Nd7jS%Z+ypFV>`Zs zQ)PZ1u>7jKP$+-3gA}N8RSZ=`6%kZaR9&i0)u%t_ste^sl}33{eyESC%PKhqMuAbG zRA?0%)kU?3BB;_TIVDCFQKnRKY7IIglvHYeG%Aczqm)&1%8Xj@%a34C&66ZKqG1L$ zwxCEo4nwKv)Ez^k&@0-NM!Znz)f`i!V5!*N8z8egEbkAjP}daDckd5K`Cwih zXoK9nha+Cd5GPx~hVBD90}GF9Eq3B|^Bi`p{F;Ca4-FPA;$PTAhzm`M7w|W6Bgql! zu?rbe8H6fm#V8gMY~V^^LXeE**Vi+nhK&O?CM6v5GtJGX>?Q`pDx(G$=KJM}-D4A> zuo`+*_=P-W?Yd4u5w>OT^^~+QVuoW{2Lkbk7ceg)7h~{Z!i5)P3q?Z4oRHdxQ}Qg6 z-v;3=ORq8^6HS^B<6uIHa)r4qJG#gi;$N=hA`z3kZbcI{NL1tJ6`aA&T;20mM$c@G zI=&F0hGMQjv15-7SXK;6v|?2va&U-@q2FUvkX?)Kdt2uLG?^o9pl=|q;Z{V28+tqA zREUuN5{ub$;Njv#AU=3U_K>Hb^iB+%w_QuUJKzqYtP-rUJ%=L|GHh%jL63PyVh;$9 zwpZGhM%_JVrT3Gxcc4~OUQ+cQCkOU(0eHsi(Vy%h>~>5AuSG`r=`7w z_=gR==sr!^ZwCuaJP|ga!h--!9s?M>Bg`xd5(Gz_7E?mhr3q3I6~;lbij{BMn(qOQ z3`vZJM-=~HxIXK^UL>52oS5QT5>alOuv!j|9jjpPO(O-}EYTSJAk@C+Rldluh|cT< zsx20f6{U?qg38KC7=!pAo>k?TFzfKf(Kp!_ z)#Xfu_}bLABf8sQL)$onvEECE))%#{k08k=W>h$=;9bOsb&H66%`Myo25YTl|CCxG1F03GFqs(-Wv26LEgxVVuljyJ*85f^K?*gT`sL>FtJbfD-8%y3t>;F&$En@<@;#r@X$=5j3Oaqu~sWVGE z3#bNm;Ig(gu0N|a&5X;>DN4@`Y_k<)lPj101SPO6*dxezukwOZXn&oZj#0CoYkhY= z=OqGC3TozBH+BGR47-k1IJ2&XTB7yX6--N;iwj$84cXn;U`FF!&pJ%W#ai0Apvv`X zi^n@@n3dh7Q3XvL>`}ta(>!+IMGPol#2$9pzTg;}(}_~j@z!#E!$ne9EJ?ms zY+!3xtab>g+L&#Rb6c}(3)05oAhEhQbdAbdb8}m(3sh|j?zJsRRh6x-_J`SJYRuSH z$CS@{RpG!qV!uY^z}h|-Y#TGsJI6d(cw0V}M+zXKAxuYWC^6PeKQ*gIR!1>R0^&kH ztc%24!T<}7z$9bp3Ut+ot^zKr8}`DbgpD^3BSGWSgH@;QmnR4yT0?{=jaAH8u^0uL zS=>}KU+|*5pcx$ox~G~IboJ#tVRbQoo&+Z+7qQRRx$)=(ifXX&ur}v#xFf9lAssBT1iHt`PildM zxh~^u-b#f>ODbSTxWd;Ds+Lj%vuEiNIQ`@RKczXZ2-w!|mK$8)@?nv*M~xu*k$XbUoDeCr}JSHO~}LR0A<`Pc_!Z7ipt`?oCn4 zoU=h!p8nn|GvxMuBnKn_u>xM01$nUURCTP{md>xf8Og#)U~ zQUjjE0q+wxT5ZaT4_DSHR6%zz_X9T>{LcQ3{si`wWh!~eTOV+}Vi)02gwzc_lXyby zK`Q|(o5(8TA+6eA;NpJ8{E?FHI@)juEB}&-|A?SAHVj-JQPO~?HYBb_TD45mYe%#r zimFGqOJmy+t9otA(rl3r=vs9};c2-k-ml5^NAYP%<*7b2&?9{mJNV9q6@)5rBNQ;1o!W$Do-HL1+ zleVS~tFY2wfcb6>9TQx6gb(yC%xw9KcPB)DyhOFCXI<0Wl0LY%_zgLzKyp}uV9w_Q zZCBdTw&1<$!_DiyzA1hln|^MzTC3>Tv2U8uV*oYKI8UmZtB;8b>_BT!DymY6sSvuB1U4|_sAy4TrLlSL{yb29bZ~evVFh_FL z7yE_;KP}1p2ddRZ(B5AepF@2qos?Z#XxAZCH8k|3I;-mkpETQ9%zTOA$U0i=kj8mV2 zM+gWn4a}e4{}~ufgFBbL*sSH`j)Oo}qedPBz2zORH;J{gJm+kX`lQ?B8{IbX$&E{^&mC_THg;ifD>M5fMCu|O&o8s5 zn#rW2+;s03RMI2pc}^?7K6mmRl;B%vDyJs@jIMPQF-He(Tp+!Rj#Dh^0 ze?bhP14sMUs45p|Ljd1hz!ChN!{7U@pM{vf5CiX zXoDxm82;>`eiU!^$gqYtXKo1e#eonWJ<}_y-ptamZzn2yU8KKAd)J_|e@+p}ufuEAw&*{;duOxdo{Wfe0; zcQTz}ztf!&=&>;=%8|+|Le&9sPNZH=aIyp5>>#KI+^Qil-3Y7)p4%bl(^oH0n=vn( z5%A4`*(X!&fVCs7UU-ei@4^%NV(W(O@RQBa54`K1?!BI0V(*)cGg7E-OsKoR3ZZQrakDrd z=hKDD*}g8{1AOuFlOheY$$R1k*L;7hWaH2gh(B&9Zx9ZQWXTl8(|m)^`;o z?EcVL3sc#TYf42L!Rr$V>yZh^4Uzba6t+*R>6lT|%@)2Qa-ZbM6Tfsz&&_pu+^fg+ zx7!TV;&9G1kGM{VX!5ZIx0S)GYqLT5f%EyKyFK&@Yj)IB^Mp5wS6H;9v`CeoY{^;A zaY$|Nc|_r`UOFiB(sJ#&C6I>)<4IEwU^Zg0GACA`zh!>IJ+PUK_`ojAk$wp&O}Y#! zq@>s%T35@^{!v%TFR3iaI^LriOPBQGR7O9_NJ<%-$$i#&=z$qIvGW~bu-T@U&LX~v zAwP9ERfp=YLJ{mO8j_t-5Y#wRSTwJum?1n8Ve8_yGoNbfepUT9jC|~4C71TP zv+3opa%*#PW9@b}@ZP6rrKFBHX>GAkk*ID`C+V}qW$H3{1r_Cyr^MlZTEwj>b}L=^ zk0@)oPjrAc^~k>4dhs@_zB1fk?BrM6qFY_hLJylrpH+J6+G)V~(#t8fsSlLLW3~-- zhz?ecynd5*SfTf$k1sXy+N6}DAznzu z!|J!29!L z{Iw2yC|!s7gaBKoBv#EJlm}cMIkM`vJiwHSPrOIFSq`6Q2yWFM%0$iU`k3z_rgwhA z$@Eij5qU{3twqK0}5GCWhu@@7E}+Yyjc)(s+_uzHBRVe-^|;)JE@4<=7S za+Gxg&QaSBL{Hl9tDcZ_mwlr7Res|66?TKyQRDYxPln&6JwSeHy#ehK?sfka^4L2G z`6C>Z?7*Oimwh( zzBT;|4s(fHp7$Kt&u`@s@i_Jrd5%N@Tb6wJxoL>OK@?Y|m2-KyQQi~mG0S_53T`a=o zMhjF|1?N*c!nWwU{0-tqHJxLf&FP+#$@AERWA>f%{zK>0_X_=g(=d#@Ub@5tzhtBY z0Kl(l=>L;_RI+#fF9S2<1?{su((=Q}+;l6>mi-9?4F(Jfc`V4#DFlEDB*DOgEP$6q zGm%7N=QeZ$1_2Z`Vx^6*T7{|w+F-l<-meZr#HY1z+4AdbQ#tbYuhsK=J6}}`U%UC~ zzpa@Yv*7a|=boSbo1DzO=}hLc9L_WD$1U>S&Ral$j0o?mf`M>04rIQ@!7;d3a37;^ z`Gb75*J+@i#$Zss=E1YZ&p|l-L3K3_8B`GJB3w)-ZYY)o2bQgcAhpY2HtJ2<^ZH_B zT{jowJWyV>>Gb$+HJbV%1)3E7tSd#60YWq!t8n85^ASTfBlhjMF@pvZo}l9a;}i8r z8*Iuxv5CunB&=F)n8e~}QkNXmaj7$kUZc>kUxkllNm&bynPY z0pwcq_9Mw9Imy)=8&RxEvy^H%RN(T=`CM4b`MC0<$}}F8xMs;>4xK84Fx0D)PGzX( znhvd~@=Zg(W9SGM^=!-G1zL5RaPaa95A|%@ArLiP^C1zprF8=;cJ;c&04YT1KrHRR ztOx~GMKnneqolYogz=?z5iT-U=h5Fm1ikzBy+KdduC=jC^ z*TmV{kZ%-23(KAM_m;rtK*+-LkY@7X$-JbTjCM;8TbAt=L`^IR_e35ttac}`pkTad z7?PkS;Cm1uZ_AxYOjp+pq1nH78Y=qOu_8gVNqZ@R=!$C#n0ZB0OQ{f{lzqe1ruAsigq!L)^O0_}8*Slbd)C79-loF)E#T2fNXN^nM{7xF`a5?dip z=5c7HOu^~F-4q|B)^hmUT2q?ERTdT)+MgrTnUpiG$mxAiM5IZjNyo>2;!mS?Dwx zJ!zv7J!BDG+b0#GQy1rf%=4YC)OirCY?W{_bblC{)Oirk&r`S=S5n_KPNrjba#=>p zL>4U5)>ACEmMh2ajTRg{+*n!(5v)lgH;Z*mES<$E7D-brBf%%mv?5z5ks?GYrlY}+ z9JTEGmSFzIxVeQ&_S7^PFT~OC+S7jVuR7}Wfs1shG_#~9os7+tl-8v)$;JP@32}B! z&#C}t@twYMU`ddG%aqlE7*?K@P&KbCwp!^*Ox}c@t!&v7eE#(ebzUmBw1^*7I-<1J z1ad5f#D1E{|K3x!%Sv`TW4m@|YGW5hx1uMoq5kSy5_jT;JG|Y?1z=m8 zJ~Sv`mEdk7;0^p6D+bT|Lzt6>qHc@Tq`cY+ZsZur8#BvvG%LhG*K$gl=%H>-Zd+pTw^~BFIaREz+`xL?BBh-w z9HZ>n3!!O5bxJ8yk)$l~eU&lRQ?@{qP)xg|%Gm6WY$=|)d5l94OwzOBhU8Q~_!Lk> z#4H~q=hO97%0z%cN>FS{2Uu{j%wVYT;;`;EYN9Z6eW;B@A>>C^twZ~6KSFhG$qCBd zMRpK(p^&lQWZ;u3E+MC%dz_6W{IEILAxUE@g_2B)Nb7lIB-)AOuMx=)ZzM^sRwvr; zh$IK4j{z%+#Fe%xOeM(UOu?7$B3#Ik2WmK@1d4>seLm5RGWjnZ4(M^r7xrb8)vHy( zi51~gWnH^03T(2Sc3^`rGwWeVTve)t!;rPwbx?C&#Lx69YV;4vW{`AlJIq}Dz7zSt zO6qZN#So0)qK$jr0xDEhfq^154d&lrRgW^zIVU4zHsTm;?M0-B6p^CHq?Lgrje2G9 zo`KaQfo>6|s*+OG$tybW9Kr1W;p-iPM2Uhl(Y9~fwr$(CZQHhO+qP}n#%fclZ9`286?D~jlW`2H+ntT9r87IBU&A5d3fWM*5~ z8?KC4gmaCz7*kE8S5d?yyGee;$=Q><7SH+J4(zi(Y;ngKEccyS3mF<{<#+e2uBi$d zEsfx)(wj~W%tBl+SIUkJFeuE7=An?-D3U0NE|o8q;M-+k!SOqkaICs6M3<+G*lCV* zNRgPEl7@o#^NmC+ZJI#J*-Dm(B$2|rI+L|B&+fB3xLl1T81X_%6rUDr6sTSy-x#w{{_mRM zM6eYla=Y`?lX<|FZm}8Fv~9D0cFGo)j=(zsr8p_BDynD&|NM*BQDa!nUJ0NLAA_)p zM@El(g{TS^qz(rJV$?I!B@ap{8?ph_n|S!>5vr8oa1XC?X;)1+TT*}waHJph7766HxZ zZYmZYXY!o}nC@rB&a~UBV?t3U`)X$m%0npi4ov)tf0eWyAKuc;AlO1B_7)&&FA9*R zo@BPj{$l-YXK|n>V;@Y<`=!H>JpHw)NlCVS>gOud_T+iq+M?l5(iD}|W%N92-()39 z4rdchk|}hq?be>YytUq@?L617bYsEP_N-P%gls9lBVkj1(E-Onb}W6cbJSqGDd(C> z6A0Q}#dcFp59I7bTsXf^l_!V9j3uqZ{2bbuv(@GA2|i0cn^fj>DpkH8WCqlVg}I1{~M7_P7v3n97|%!(hML-wPLCSN2;eC+lOZFy}{FeBVQEw zbPXoEhg9x|vaU~9U7(q;i?x}r<9ATeUc?VEpqUABU=4wE3(G*eB&=VF(99MYpOwvyz*+qmSfk2DjeY zReySSSphrs4C~u=@{)WN=uJuK8juqS*)C$G=} zEeJh*d?wHOC9eo&l%GvwP3jJ-Bn5H z*TLB9KP$$Km{;>dQ-E$^4XFI|Gt{2gW6@76Q4cd!o+_SiU@gX}0p9wO?sPUZt<2B- zemfevR#r5xr^uS_bs{TQl_sfsmMYVwD@V|bAnN6rY)oU@RA6u{<3(@_)wyac@n=;z zt0rRu$;PIVCMNX1T7xqkrnuP>AM6f)J3hNEM($Cg4iV2viDp;-~GQO8+>SCMQ3dz?R9Dw%x-8?m|nP4b?~`5=;Uzw*it zg|d1nDuPc9^>7myQON87m)(XFItD}5)x(2%gzZC%t#J6EDXIT^qNgZ65tOF<&KMg{f*VCw^?*`3k%-cOQmH*b zt9FcH-A8$QIyRN4_UKWWJ-4NTai~Y`JFG`fp75n2@nu5sUX}PZrTCyma{phER`Rz_ z^6)?6t%5(wN}t1~Dh1hAO@W;|$j3lnt9h@wCCAIDz+ur>0+7pk&M z5kCi*0TZDN;qpMN9*{P`_6?G!3$t|)mL1L3|8bvnT@>rbyFKjU^FYuYoi;G&&gc#4 z*%yH}D9vKn%bo*uaK)WkI|!v7$u8is9?tbZU_C}|2-h3b^G>H7;TM#Rf$A$1WdO$- zd3$7ZV5b`D#zd(gZe_s7nuNQ5bDsb;AWQ>|d$4t&=nBd`PzPMDQEvcmo#qa?3-4!A zH}G_$%Rbx(jLsgA&JkQ=9=h(~;0_ZH+V0NMJxMO?_wez+rWa)QplV+SHxTY^#?}2Z~z&HHi>N5O`hxwjvVH&PTguXZ@kX0d4Rw2YTrC+xgnH5EoZz4hijTw#3dL>c)m1PTm)1L#7rjR zp3%Ms^>*IaH}1{csc#)@x%Z1tvm+EFtwfB-8DLd(v5_TI zd!KxhIDdlNHqDd6qFJ=AnvL7SDa!_FIa$VYjR1Flg_pn7D*%v8s$QTR>8Yh(t~CCN zZ=B@I%8$1s!_(b|V}=rpY_gJKb-5{%C9X;nR!afa+|;RE>t_$oyrp>4#aZ!rfTdAC zy-q5(5NaH4FkhZx@gBt&Edf_niRv_)l+e)%B`2^5M7}!!eKzl{WeAsk?OcI(6aUl_ zw`T8LF_+!BZiz;Zf*qz>(fd^|P~JqD#CM$7UBcLlfQC#$U3jNbZIRjXGW4+*$z}a; zA`^4kHm9x6<$6<_tftVeFS~2UHt(w-s11%0MyR_-W|Dm4mYJf~SOIid=HF0-q*uX` z%$H0%rt9GCCD?-Jat&t@^IhKZ$!y;Dd^A$n!n`B!i!#r;%qNiB2*<_0u49tyIsYE( z+85R4m2~q4(EiYJoXGlW1mAoej2C9W9wrEnh#rHh0OM#rP^bBMZOEe?kajr6p29XT z?~vopX$9Bx?4)$uO>z<(-EsyvD{${An zp079P_2|^yU*nFzbSx|b+HZ>6J^s&#*oL`xc22llW72(GHR|s$>X8z)zn=lk8*|iw z-iE4os?E^px~q4tPB>lt)E(dYpEpJ>|GGxAJC+yh-htizHf8b8KxRjpjz<<`H0JKG z!3EjE$aO%=PYx2n7#<;;HAEHSAt}Zu1e0Li!svOiWQ31!MnOCUMw1L=7o3(1l$I#+ zs6yAFXXFp!mN3Oi83ji5O%#%#5@2>Oy%2G-bVz#bYQ^T5o)W=gtn8~lP-zZ#8cbwXLMAhb)hXkdEE-fPEOM1rDV3!kvKPCo zM#gw=c5)?5UCWHV5DH(y8@Ap5Y}u4KCCR1o3yVq61Nf0hGPNM-@oP?6tDkpZy<(no zRgRK$0Z}yNTBkK-!Uo zXHp#K*tZcJbc6=4>}d~bF^(9KrjJuw9G28$C`jB_DjhNmPItPynGlkF+=O`jxrarE zZM^Anjn`^IJq;wElGEDmTs~YaL2aWw#-TpO=>g`~$Gc)eZ5y5cuHWwLbIgwn>z6-~ zN-|WJj5MI22*pr@DVg(eCQnd&8u->w#P$b=A>Win7$Oot50J0D30-9D*ctx|OO(Xr z!%9T6#S(TREj7go>8{P2_Jg01xx-sECvqMl$@84f5+yz3(cA6IeqPoNTpf6*Kq68I zi5x^4n3coNa3V}@>We-^Dg;^;U}23pZCuum$cn?MUb8ratMihK%c(TqzyylJ^*@HB z`y_G z?f|&cjl)9D=E|x1Ye-{2jpOGZ5&mR!7tYHX-N3D2d*Fb$b9esNW)B^>MzI{p_ zJ$ofxU3)sz4F}D>c4U*8y<1BS1S^dV1;~R`a5zkV3yd;P<{hF*u*TFE<#3Vy?GNh& zU$A*A{S2fY?eVxpL8u`{)D+w{5(gGl&UA1dNn}p`!)))oQFBK~z1|yooEZ{KQr<_; z9-leZR1{e2=YNf#{~AAzPoT<2YKc$SAe6L#IkuAQ8%a@w(gaCd!LWza;G1bdmNlu= zr{_RYsWUM*t<)#Y?zc6%w&&H9Jicu>-@q<;bRp^LU+$Bj2C1D}|DbBY={49sH8|Br z+6-`9X&+a^ou9~XQYnmWg?U4ELW4C7ov(tptT@!XB91W z#PDxYr_5f1teBQN-{AMVMmp+~4YXEF2Izq7l2U=YA_?DDIp>D)vg>v*(mC(3!d zlpoI6ABXL?X^`#i4G?M2fFCSSyYWH9VFZ*VS~^DAjAA;y7umbM^QIHe^mbk`*sDGT z6pd~Jn;e^bLa6h{jF@>Kck@bxkTNULEsuxUs!&`888o^I#*lcta<#yfJ_q(l?|$c6 zZ-3_|It#Lt!^ze#d`>eec2W`-)Ar${CfO_VZCG z?Hku)F1Jqa1q&w>3ujrzyO+D>oJUvcS-tl4&Wok)hqJ$`5B3hT4wzfGVhvFD+r?ka z4`+Wx58VCv-{Fx9zwW=PfF-VbZ*J-KwPxdf_=Dy3a|wL=cFUV|)`M=E{>ITt+&yt) z#&v*jhK53^iPYA=;$kJpTy__^Yn)@duwz9pAI06;t6vSG1vg7|-qQeYx-%KJmbRu| zr?2-WJt^mEBUfL?@Uui;u?ipOGD$41aiwCuq za~aPlp_X*zsA?{+{Y6KkU}|cMBkCH@J%Lf08E>X|hf8Xma8@P78KJA&6Zl-DJd(w+5E@t|AFyA1o-s1HBf#-o`1j(9jwN{0KDe!sJr z44V@K^oo5rAOOmu>$m4Ti!q=RK=Hz;Jbyba`%r%2oHq3f6LA*S9^4IPD)&Y80^dAG z-hs}eDRLl>Yq0~d(?8p>dUz`ce!!ojq8;B<#CND=yj>>E zD)=2$QFKo+O5@h+8HRt`-vdv7)Bou3=QxNDNhKV*0R2Z$888XFr|h6kzQ2VSROo%^ z4rb(s8+{f}{`C--+Te44??B^_F_STA8cx@jM|v@C@5|;WbbAO+;lvjby&;v)+-CW0}aK_TqvzfSx|4#rG6=|3urF`w=SLU%Tw-Us(vAY}AI+g&~%n$%Yk z9|HaGhIOI3mlFV=iwO{}7nt_EZMtUu1wZLv;wXk5Kc5*GY^k>K%jc0pL-)#g{CVEg zC-bApNbgsnesG@=0*~C>4m8TjY#HqNYTEspZ2~jzeez%!i3w^^RL$E3MgQ_dHcUV? zjos(A|IGS|M(;=PYV~BM4@?vBhuN<{yQ_3}5pD8{LQ~>+Yvce|y%eRAS!+Gd5PC_` z8n9$tFvBpyMl*6H8d<9t#a!h2C$Jg03gsijlR-{*4X{G((YsXlROmUeFhzIuvc$Wj zcCul#y)5R(0+0Q5JnzTX;?`Q{{MLF0V}pr~D9wY>QNvf1_VJ~j&-mfWZ{=oI9Nz8`p9VR8?jRa7C;_cn8$$E_DFyu_m>^DjyunDMBxa zq!;H1UqJx*u2(`|;kD%@}M7TK*w?w6c{`c$LmF+rRthZ&sbHA`?DFM-DWo;%& zTd2hwAwF7JYKd^A(RbKIl+k=54OH|CLvVrk`Z`E89wUG;?@zP<%gf*FsfhQt1Km9C zx4L+wx~n{Q71ieCK8L#v6nsbS@>s3ctX<-KCjgm7VJ6h_M)^oDnP5}WrZ^6MW6(Yq)E;y&cbH<@AJ9*KzX{mKy7nl%lOfPMhroMBgOjA-lsrOf?^gQ< z&w~@QaBf^=TwJtw@2tCrDPe*>L70EQseyMI`m7!5*qxRL!=BW$E<++8t?0ek@atQZ zA+w)e^Z{PP(VJPJa{93Q0kTOUzjCC}2#5l0rEp9-`AN7XgWlT+VI@ms#UV9=Oz`jo zA+;=mLZw@TW`o2uG9P@?Fp6R8x(tyo$;EJtVeMN?Ia*r;=pk=|Jhv!zF2bKfcn1#! zYLvQgltY~cNpI>|l!>CH))+`|-9i`>#rjZfQ(q6-H(ri(9S-9|NnY+koS-Xg8=~BZgCyMt> zpzxOl#L=?f%!LfkOW_(5d7}FrVCKtrI>7j-2Tfr7%i~i|4I+QFUWceaMwlC@H%KuL z5ZzT;4YJltYyGv`RjpOj{@GW+pO#bQb6+82t)Rq%9~DCXC=Dz;6aKrSd!42bsvKqC z6hW2020k?FC%?Z0M>IXxe{Fe=Su_)O$*x?@sy` zK-dj&al(-B*Zn3g5&Df}@b&)6D(Fl`o%R#|q`n}@N?p{B0o@`#%w?bT9q@QOgWpoo z;(fvWcZNZr`iURNKYfz|2mk=~|AAp(=l1{0JA4wgZ{#nR{bZG$>S)R`z~=2%{NbZv8ZA#EbC?R1>}&WJe4VdP?#Rg|7=KP z*ZbreS8HTLg?Z==Cmy^eSKy?qICZkA64yu9c3C9WlLOmg!fGU{2{O1eKbI+hwN76m zaUi&&E8HhkG_l90H@k|KOwC56#?_n9y8TR+gF>u?}hYC znjo~Jk0OQYz^3O%%E^}p067qgCZlQf6-)@)5E-Cx)c^5N;iybWvt+B=OG1hj=_MC> zxLp_Uk^FVp9t2?r#*`O-|uleAC%Om zXwnK4EmQSlH{_+%olrQr@VU_0&8FNHNguM3(nq1x-*>~6bCM5<4M+;%Oax1uUKCyo z3_-N8`kN|>%F+nZCiNGVI&EA>eE@heSa!lukEjY$V`&^XhI@IOD26-q8F9mZ2GOJN zoqJ`R$vwBqqu|^-f`usxa>pB~?%|L1H|T$#Jt^MNz1;uAausL*0EGY7*(2oQ=w#>k zKO{nGpMJ1c-(}1p)f3f&QJcu4EJQJ2~`BQb5h& zsg_ng$d^U=D#FXFg@Gi1!;(~ytCm(Mg3sB7aUfkFx2cO*BqeDmBU;bfu4|l@Ie1l2do{?c?MebmH zCo2h(+);VL7SGslbB}jGc-`s&d57kpu?Hl(ULDwcQHLnqnz2XIUz*5dcbs|I#*lWx zcc#eD_o^U#afS@O1KW0LhiU96B`aLjKRNpZjQ?0N#|J$SvSJExVnpmn1D^9BoSWd0EwpWWZUNQV4+IZuYuCvP^n9#9VU5TQl3{7*JNw(WL7gDS*=Bl(dV=P(2 zH5LRno5r)uE!90M_0C#sjX4`H)iqg}Lge;73m#&>x5(sk=B=5EHY)lzwStg1ovE@2X6iSP(^SOk(^Ipygc%a$8=9fhSJEzKN0}XI zHi%i`L-7@VMy_Ez6xGIW=WR%UR+bg-9T14^1iE|7w7lTP%3pWg3#(Xmrwk;Ax7wb- zDEh<1P5Nv#Tc1j2@X=VZawzdsYhI?~d*TkWo0^|Hetc($>$b!~7d;ips3tR?t8LpL zuBaQ$w(}}BHGmpEY=8<_iA2ujcS_7!XgZ|xOkXN}EH*37851o%vn(&Zu5ClF1a=;x z3K+cEK+9;%G(#scO0jH$ELp1*m`#agWLloD{LSD>Ds5X{wlX(F3Q!?dSCqnsfHQX_ z^`b60FUe#?4dok@n`PAR+rl~M_D&iN$fk&y$VDCCo_&rAl9BCYBU z^+CA+u@9?lq}^&PzdJ$S)1aYkc@B;+oX(XfD!62uxtQ za;R~|s0 zrBDx31-)EA9q=ga$lrIZ4&Mg`^}5dwL`dxbb^zt!_C|6OwO1GjdvgK7qZqFzL<)Ye zoSQP)5z4H1a1n=Zgk;HK4Q){tEL9vVk{q{|Ajwp%jowcT+}m$U7Q8P#o=T&7Lr)`m z6CNmQFT|gT01AH3)hVvlB~fKj`Pp7V&)9|R9k3^MR}xrv2M+3IeA+vj zhx~;B2eqw=zu{ycrEBZHmhCl7>=Ndg+e}zv3Xa+J>1ri0dB^dC4b((Jb31l>KB?p| zwQNb5Vk60WO7GiJHvZXJpi@0tkp#A!e7*-I&iZ|T0s}^te6~;~S}!lohL=le;kr{fooL&CoKBM9MmdB+tjsMr`kp1yhS@@XPMR~8n)c?y zSR_kK;0cVtKsOMk{Cq;67%MEiPM zL+=ZqCfDA?5jAx_$%CRCHXrJ-0VbwdS9Y!xfae@o8{yom9-a zAEr;u9tjU;fII0P&R*6QQ^>ta9~rs6$RI4HfT6_+MS{u|_3)T3YHU_qON*(NwB|4H zkX8`*RZTc$Mi}5BuMkCS+YfI$f-5*q%uW5UN*al+!4^F;jNwE*gz60J_)mU;=I8?V zjvY@WN+RC1EUul$IuEI|lBiHnlrE(d@2i3)Ph*dmFs}sxD(7LEDsgx#nG!j4R*8Hz z(jz<~sC5>Fl8PX|G-46QMd_A@uauXJc*3rnyI`_TI@Fl6N|1S5gvY|Gc0u`J7_&6q z+doAj?Zq(HY*D-K?ZDMAh0?al!Zc9Wq|x&yKb^9nXiz-pOCqv`v4 z(MOP9b#QxK9iVR>S*=njLH)Qy*ClDO4!KKraA4mFh5Fwj{D@`c!cR8CH?N2@%QL$0 z8vrn!0xE5I?~tD$^q&kfz4b9(AIriY8JORW(DEH6M3O;>h(@dMk5)3vnylUwhJli( z&vVQY)%$~TlN%<42@}LSf}nFwNa)izcr^;&=q4( z8q>&-behzCR0rV9VHtHY+fh%2IGIAg*Qk;w`<_1>4KPE6kl@2m+$1-{2o0lBwWQPg zXr005E_msUN|j=Uz#$Gs5z#D>7Ypz#P-16&+E;P)Re2MXa{#lo8D6-LmT#LX(FQ*r z)a}A1hn`U3>^NHlfTuqqRrqy*ya_~t9UNWwsAP~Hp{!?(_xGU7U}t?%Av%AyKSt}# zy@pmw@wxKO2yWO@!>`McUI|ED4NBVaXb1zmKvq~2gf)xliJ1kx;Nv28+(nBY0XPnU z9?(gQ4p3n4`owG*YlS!jz`D_mWE<-#v_#`+Y)X9pD!rg17r*9)RZw z8HLsevW|S>QtE%x#VsO#An*UR?jp2xvod%WS-xctTQ32UxILAid>t^wd+D-mhR=J% zwoI3o$FZkf)cL3%b~*#-c|;GqollxdSUE%SnjBdICG|N}Is@goKjfV@35oZ;nev8* z`}9!IJsU~;JEBI?ZJxS8U@!i_{qVmyGyI1{9c=T-XZ;TV03RLz0MY+-?J4YGYhYtx z^k0k56m<`M<>#DVZ!^+IQ&KwkP$q51@?c_kevladMEJ>hY<@zhn!~ASDR+7%x?YbY zc;RaUn>O`|TAqB(sx4IO6jUj}_*VU`k(QdCt}UZmovv$JH;3CDTdHs0JujFf4(XS; z_nf`G*WO+4$CFZGNHHLX}Ik8rxD#C7}$jq?k`c zp8L_6&|K+l!E*XV$ZvoFv-Dt%5c%uIXctE9;c@G$7MCiP9Q~`VcYK@Htkm8i>}hyX ztPE448V#YE^Y)B+3}J~&aO+;;X)57Pp*iCu*EHI-!2pi*Rhq%CM*9Y3zeGSX6Kkn8 z#m<#PW+p)*=5iBFrSBJb15MT{fvoO{Yxmc#+d)(0LUoorqts;|+U~LVTY%wLRD2QgQL)L$C?}K^-WAsEE z3GYbDNf2WNP?7I>MhORt_7MB)Nm1>V7^9c;s7_OOJn5{Qn+zs2hIcvuP#hYd9t}v5 zxLS-?5zO;g^I1q+ob`;-Y%tDwPnhBxlwf#gdXP{%t!Gx1JU36a>UsO4Xo-6A>bv7- ze5bBh5<6GgXSAB3?oerR_FLQ)DXpUDPM5B)Hp<38o$zf-m#DoPW;$EjTJCUy8Vb=B zH>ya6TQs(NPV~K4d)IbUp3YxHwVu$lIAi5L|3D^HeC3l^X-pI2b+x)OQw&VF<tU)DhN$iO%#XLj zk(EsYLZ0AwDmKLc-gBcWZLc^Ia>u)x>pr4(cNU6e_pcq5j$oGSm#empPjg$@*-d$n z1gRYdHh7iiRj8i6TzirhJ>MtDS#$EtmA>DuG+Vfte16JIMO@dHcm>j5NcVmm-&7(9 zW@LY$rNV)e-G?K3rhU%=>6l(Fi9>Rtwr&O9JM)F>%6f7Czf?Q|_6c>mUSf-Tj z6ND5}%9L18#vY~%E~#V=z%wI>DQAWZ1yfk;>@t~SwDyj%Dt2bHs8kkgK+Pyv)B?P% zR?A!Da%ak|!JnXpXFzK$AZE4GuVyugG7>=LF05?!3KXnR?t}|n z8H1Lpm&{|PtS(v~oR=PcVnxQOqT%hRdk?GInX2l`CkeKdH^;74tp|B2Z}PWQz6GyW zt5vs!*(zBOu{0H>MI#Ru5UygPlCe2CyVYnn7={SiP_`(AN#-=i)K~k@&HC;v28YCU^Uow%?P{U2 zmTIL>Z4^lIQS{zjFmREXZ7CjS*B7%Fq*Qz!6ZyC~*hfncWJ4Tw01d^=YN_GZ>M620 ze!8}m%NU7DCAV-tJKvhb#TRoCTQdv=l3Kjj4^DAJtwB2=98JOQ+_(lgG-&`CLj^gX zuln2SoJ&Bgt)Z?xm6S|+yBuJwWfte&G`&9Pa93EVQt#xo=u~R^9&&Ga(w5cJ)QxMc z6N0q-`07kvHbUMXmJpoBTR%ck8Kqs1bIRF7;RW#mlqTEH;2rp7i&w8l(nCxpeV ziOZa%W}A!~b(VABC4HB0#C4^#h5$2IG)Ase(c&e^h1S>tlU#c5p&#aEU-ON4(f+L4 z5+^M_I{FR8nWDg(b_hE<%ul|kYiU(m$yp!E;9wtxXxe{*heAgYd8Ou2&1iYxRa~&e zH1BL|Sz!2pg&DTCcC0s#kZBn;)cos(!k&P1pB?%eH==D~)=05K73v~FtMJhyR5@v} z-PLVJHJE+qJ3dnf>#Wv6jlPAm)#K%Mkn<^{dKCaFb7ZX*b$crQhqFC+Fn2^NAVxyFsTCbf(Q?>UL zb2RPvf&$f$%hi7eBxygX6lFi-Q`M|@Y0F9Ma(erL^HFElyN%5$?CZ(4j?I5AE zA!O_QjBB-FPPIu6bCc+%1~`Rp$L2AtMY?|zVoiM0g&BHYQ)e2>shetH767#_IJza# zFJnEA#@eIoK9&0FgqlV)d)Vt8@C*UR5a?t=HGis|1Av{Nwz3eC&@%v^yFIotcwPR3PxiG6Pg)ZQdkBMma&5nb9RuObF5(fQ0bqv1(OtuwEMe5oznX*VQM32 z(FX(r^w+MM&32g{V-G7r6}0I< z<_soi{hC)%%+IMHL@r~CCbx1$d%7&gcc^-+)`-+kutpy4qRfdq2Nxq1s*OWS!A0vS zJ%hR;YX2!Qdpu&ey4+Vgzw!oT%p98FSWxu%Vkb)>=2#LQU5Eung`O!|XTINHWb0F8 z_d(5SOMHf1i;*=Ly;OaXqddOwZ*dRU;u@c0>;K>lNpr`(zmcQv8^Jgv6FnfA4=1Td zl(Em|j&gcO8r?3fPb=RHn{iZS>-V|G5}kRxge6ITBkzWxy<>ey!8nB4$vv`1L%T!P z9b)Sasoe=>m+^K>YIsM%9&SD1=Ruiq!5ezJ9r0od#xu0s-2#%s{DOQQcD+UOOg{?Y z@%XzP@mz%fat6O15~Laf?hG~WO(^uH-wY06zZ(^OeZTpieqeQz!$n>$p+S59mVF(b zdKlnNhj_sI^{bDCzJoig4|Q%rlY>{?z5`YF?W6TgN0sYGgnNSE9V*zfoCGFa`=t!z zJGoZ~>my>_hmVc>=7#)5^xbwwklben`f+iJH6XCUd<(yp@;85epIWS(_ z%ZKVazWU^P31s8IC6_~!;&xQgCc-t*iCY;7bE5wHcejPpmAA{VE@2# zE}n z_08VS%P63&g}%1xVDFPmNVifCF8Dww4rN(hO&1&Sy)+ zBzLn)*x~aKmoP=>lOclK=NBXa5?io!u2!sYpqK84qV$yp#4QIk4`GWVnnX2xi{)Y5$KOVTPUc&xg8n?j$oyg&SJ=44YGf zZEF^7_>;+F7l9H1#gDn6+&uv2&N!o-oE9Z77k#lQ`l*CboKGqEsfqo@r0tLHCY&Ui zu1@$f5aro1qsldimfpj-Q}uJ8^f}dZa$V|la)fs5%-omc!O@zeYVF*?V~KD$a^#&4 z>H)Zka6B9l!Ih%-!RvnqCF;-m7ZyMP0BB+VU!a7Nvw`#ftP5jQwd}A&ka@d$M>m*B zY?fGM>-ZgVT5n=d6XDI1kQX<5h6~hab+)pMiMFs@*(8R5;kfYwhJn>8{3W&EQ}P3q z2?Ydz0O7dris1LAYsZdaau6w+oVfPhXESc6-}3zYzH`E3=cNNV&lRz3@*P(HZdnBC zn#`E2YDX-nu=>ylFm%p(vLTx58qHi<4`DHQGKsPo6;mPCq1Wmz>NvOUj-%E{mNuSs ztISR(Lyb&hERm;yAxEaKBsxeDn85g06G`*oM_0 z+H*CTuCVi|QJ}vB>yjIlQdyxqKbY*WZmj3QbS?cW4$!R(KqMx*I;~I-n!6U<9a_Qc znZ*ws0O?~DdXxvn3wA18+?sj_vTU{+Zg`88^PK;1RdLZ$D^Az;=u2z1I*c}NXb)m} zU=fZq9{YP4Puk0MM31chjO~v(yG<|g8$PKnq`SyeT@07|D*=q(W!qq>w609Cp90hj zH@FTYN$FL#L^V*ht35l;+LzTN4sFX^&UzfBqD{NlWjCekB1dn^oGSBd!!B{qgl(E~ z5=E)>7@``OaTcX$xFx)PJ(r)mhvuMI?E;)S6h$lLnpyG_#&?1!-2|sJy=kXBuD8JY z{X$p|frF5V$wDD2u%Lc@jo>6C@zluWt-&7^ZpNFfGwgw-yann)m*J3eD0J{tpq5M( zO=vl}B5WLp%;R4PNq1tBSoDcznKy}QS!hK^Vy2AGpJC%HnJ1PaOV%QFh|0;QiE?DF znnSx-C7YU4tfo)5y7f#BKKECZRjZXTqCqiNl?U$|Gfzn1O_n9^etivgD^;CT* zfz-piE;92ku5WrpXj&iYexV;$i6nOpV=Wy42w1si!)Gl7+=mI=fqy-4xViTsm)1m7 zYh5KF81twM3@75p7-8t9CUAuu<_&Pi?b^_+3tm?_#iU>v;FYSDOoaEt=~C0jgJ1XY zj{fE3PnOe8hCwlKhZnn~DENyfLHSN%BMrs)I#1o8;FwZK`7OWzb4az^ij1EwwvRNw zi*i1$csQ;YKWF;J743_@NA$)gIp)2H;hQdupkDl_mADbQ;Pk{zwnTSl)wn%%S5j|LkNiytpWJWzG9^Bcgvr+gL!bnl-h?h;rLN8gF-QE&UHrkbE}|7I|UJ{;uR@pGGAUK9}qh{ zA=NznFN&MVx%~S%f{Lxg?GF)&=OqhWMW{bc4D_;XKC&FMMA}CL9H!pQ;Li01AH3K4 zKCEh057v4$vneG2Gj;NiZu$9j0)J^K-*LmegQm{81Rj}lp>89=Q1a@v--`$%{=fm& zrpJ=P4ZONT_?q9t8-F2ZBZLd_8Zzftw~O*r<2gWo5gUkrsv@tohCM^Y)C>$3r9&9f z09%!Su4+s(R68BUa@|mI5j5f^KUWgB2g7Ttj(e_)t$q(b$o&Y^a>T&#;3N)0Y7&s&~hb zgf~PGCzC)DYtXk_Q~#4cm{kHd-l<_pIq}2(Sdz6qv8N6&9;IiQj5JuM68SpXNE3;s zlA%A?Scd~&Y{-LSjfPfP2LqQjB?O|Agr00@0AkfN3W8G^8V#3AgTok&2!=Eqnq|kt zxb+KvshE&F8J8TI1x}JiE)-c?Cr*-9Sw~KmR$6DCQ7LUWGu*=vn3e8lmNWt@vucS` zq47Ck$4^iSS1EqE56@`_%pldgAC6Tug2J}Ot8A#Z0DncR5{=azLl%rj zSIQ+|LRNW2JYe5ADU0w{ad^s{l7l<;Gdc?|ZB}_jjpb`)WClGlhro9lnfGXY<-On+ z09IB1z?!_H4@f$`Pw;5KwD9h1E4BMyICHO4+q$ zvQ}xsG)1Sb5lh*%Xwp`3V}`Oz#H6kAiZx}YwvkJ@Rm8-t@`^TPr>3!na;voQnsTe4 z(M!2i$>g>2iZ^Aat`S`MC4UlEabt+mOV}i?@(Pb~tE6#E`K5g_SAHXj(o52$OXa0` zGFM@viPB5fIw<#a~ZHN^4YJnaZcqWWU^OzLyhuN(`2vwN-O1C%Ve+O z$}8nNzY$O6C28`fs4-9FC2G=q*^cs4$HcGvN-ia6QsG$oSo=6~l7_Oaa=X+~<=8ca z%bFXOVDHGzlKl0vyVpaeH?y-eGV@}SQZA=#LQhGBrL5bK0LT;JkcyMb(=!OCCo0Is zhX6KzJ34;5x8XFtwR5(gz-Flw)HA4uAb7ZvWx!>?!KbIj=BP4AX9?jdU{wWYV7J%y zA_seii%7Z^luI?{(e)`*HKemFE1%!a&1$Ujyh&XAuwQvpcp^YVMJAxrQE_D+Zvcf0 zoxsY!VG*mm{QjLA#YG0UuWvLi-r@q8&*jHc50r%x;Q{Pl`}N(CUCKG`I9tL#Glv<$ z0RzPWHKNh9Bpw;dcPr;2)|F|SN}AU+wIq#iz~BX7>gV1E4i#oA8Kpj57XyKSOi#ZM zZ~`y?wf(!*x6JO|(hq>=6WC2E=jw{*x0mJHSL*y!b^h7>Z>Omqm1p0$$s7n!U~HEk zN4@-RJ>mS)N?p6vPt*@fO!LMAQ-hV2XI?rCMSEorAL!2z(F~W`vhG-VodbR!8=DwC zR&SAxzQs$bx`$O3R+^Vp<#Ql}NO1Pcw zIySix6=!7^E~u&X7W0v&f5lPjl;z3KAvzZG^My_1og{;EgTZCkHLNY=cRg-rdg_@h zgC&taO!M<_l&-0rYY@7ruC9fC6LrUDm(Ow>r-VKZTk1Ee{zB5$5z*x->7o69%)M1q z9Z|Ec9X!B-;IMFaUAQ|0cXyZI?(XjHPH=ZvxCaRCn&9q!@}0BK#Xe)-{CEFN&z{{q zdURFK(N#Uie4px(_N|B@@Z0q^*Qi5PEU4^N_pmP2{9Y=l3)vjh0A;ht?xKGBH~lrs z+Gn5}DHxf#gFzhrl8>iH4(XP^ml9V~t5m13R_Y0C{M)YV+3>f1VzspWGoOK6!7m+D z;#LF&Vj;ueHoIP~pk2rJB9y49Led=|v+w8JRfu;Le{W~S%2`$2PY`lqtpaAQq(bQg zdNE+$Ui+rbiAVmnDtqGn_QWIvs0|N3*i|YYyDTKAzE)!⁡l-b7 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 4.0.0 com.aliyun - aliyun-java-sdk-core - jar + JavaBase + 4.4.9 aliyun-java-sdk-core http://www.aliyun.com @@ -67,6 +67,97 @@ + + + org.springframework.boot + spring-boot-starter-websocket + + + org.spiderflow + spider-flow-core + ${spider-flow.version} + + + + + org.springframework.boot + spring-boot-starter-quartz + + + commons-io + commons-io + 2.6 + + + commons-codec + commons-codec + + + org.jsoup + jsoup + 1.11.3 + + + us.codecraft + xsoup + 0.3.1 + + + + + + + + + + + + + + org.spiderflow + spider-flow-api + ${spider-flow.version} + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba + fastjson + 1.2.58 + + + org.apache.commons + commons-text + 1.6 + + + com.baomidou + mybatis-plus-boot-starter + 3.1.0 + + + org.springframework + spring-jdbc + + + mysql + mysql-connector-java + + + com.alibaba + druid-spring-boot-starter + 1.1.16 + + + com.alibaba + transmittable-thread-local + 2.11.2 + + + + junit junit @@ -189,22 +280,7 @@ 4.5 test - - - - - org.springframework.boot - spring-boot-starter-quartz - - - commons-io - commons-io - 2.6 - - - commons-codec - commons-codec - + org.jsoup jsoup @@ -226,22 +302,7 @@ - - org.spiderflow - spider-flow-api - ${spider-flow.version} - - - - - org.springframework.boot - spring-boot-starter-websocket - - - org.spiderflow - spider-flow-core - ${spider-flow.version} - + @@ -359,6 +420,16 @@ + + + org.springframework.boot + spring-boot-maven-plugin + + spider-flow + org.spiderflow.SpiderApplication + + + \ No newline at end of file diff --git a/spider/pom.xml b/spider/pom.xml new file mode 100644 index 0000000..e9bbfa2 --- /dev/null +++ b/spider/pom.xml @@ -0,0 +1,117 @@ + + + 4.0.0 + + org.spiderflow + spider-flow + 0.3.2 + + spider-flow-web + spider-flow-web + https://gitee.com/jmxd/spider-flow/tree/master/spider-flow-web + + UTF-8 + + + + org.springframework.boot + spring-boot-starter-websocket + + + org.spiderflow + spider-flow-core + ${spider-flow.version} + + + + + org.springframework.boot + spring-boot-starter-quartz + + + commons-io + commons-io + 2.6 + + + commons-codec + commons-codec + + + org.jsoup + jsoup + 1.11.3 + + + us.codecraft + xsoup + 0.3.1 + + + + + + + + + + + + + + org.spiderflow + spider-flow-api + ${spider-flow.version} + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba + fastjson + 1.2.58 + + + org.apache.commons + commons-text + 1.6 + + + com.baomidou + mybatis-plus-boot-starter + 3.1.0 + + + org.springframework + spring-jdbc + + + mysql + mysql-connector-java + + + com.alibaba + druid-spring-boot-starter + 1.1.16 + + + com.alibaba + transmittable-thread-local + 2.11.2 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + spider-flow + org.spiderflow.SpiderApplication + + + + + diff --git a/APITest/spider-flow-web/src/main/resources/application.properties b/spider/resources/application.properties similarity index 100% rename from APITest/spider-flow-web/src/main/resources/application.properties rename to spider/resources/application.properties diff --git a/APITest/spider-flow-web/src/main/resources/logback-spring.xml b/spider/resources/logback-spring.xml similarity index 100% rename from APITest/spider-flow-web/src/main/resources/logback-spring.xml rename to spider/resources/logback-spring.xml diff --git a/APITest/spider-flow-web/src/main/resources/static/css/easyui.css b/spider/resources/static/css/easyui.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/css/easyui.css rename to spider/resources/static/css/easyui.css diff --git a/APITest/spider-flow-web/src/main/resources/static/css/editor.css b/spider/resources/static/css/editor.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/css/editor.css rename to spider/resources/static/css/editor.css diff --git a/APITest/spider-flow-web/src/main/resources/static/css/index.css b/spider/resources/static/css/index.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/css/index.css rename to spider/resources/static/css/index.css diff --git a/APITest/spider-flow-web/src/main/resources/static/css/layui-blue.css b/spider/resources/static/css/layui-blue.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/css/layui-blue.css rename to spider/resources/static/css/layui-blue.css diff --git a/APITest/spider-flow-web/src/main/resources/static/datasource-edit.html b/spider/resources/static/datasource-edit.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/datasource-edit.html rename to spider/resources/static/datasource-edit.html diff --git a/APITest/spider-flow-web/src/main/resources/static/datasources.html b/spider/resources/static/datasources.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/datasources.html rename to spider/resources/static/datasources.html diff --git a/APITest/spider-flow-web/src/main/resources/static/editCron.html b/spider/resources/static/editCron.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/editCron.html rename to spider/resources/static/editCron.html diff --git a/APITest/spider-flow-web/src/main/resources/static/editor.html b/spider/resources/static/editor.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/editor.html rename to spider/resources/static/editor.html diff --git a/APITest/spider-flow-web/src/main/resources/static/favicon.ico b/spider/resources/static/favicon.ico similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/favicon.ico rename to spider/resources/static/favicon.ico diff --git a/APITest/spider-flow-web/src/main/resources/static/index.html b/spider/resources/static/index.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/index.html rename to spider/resources/static/index.html diff --git a/APITest/spider-flow-web/src/main/resources/static/js/canvas-viewer.js b/spider/resources/static/js/canvas-viewer.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/canvas-viewer.js rename to spider/resources/static/js/canvas-viewer.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/codemirror/codemirror.css b/spider/resources/static/js/codemirror/codemirror.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/codemirror/codemirror.css rename to spider/resources/static/js/codemirror/codemirror.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/codemirror/codemirror.js b/spider/resources/static/js/codemirror/codemirror.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/codemirror/codemirror.js rename to spider/resources/static/js/codemirror/codemirror.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/codemirror/idea.css b/spider/resources/static/js/codemirror/idea.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/codemirror/idea.css rename to spider/resources/static/js/codemirror/idea.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/codemirror/placeholder.js b/spider/resources/static/js/codemirror/placeholder.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/codemirror/placeholder.js rename to spider/resources/static/js/codemirror/placeholder.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/codemirror/show-hint.css b/spider/resources/static/js/codemirror/show-hint.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/codemirror/show-hint.css rename to spider/resources/static/js/codemirror/show-hint.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/codemirror/show-hint.js b/spider/resources/static/js/codemirror/show-hint.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/codemirror/show-hint.js rename to spider/resources/static/js/codemirror/show-hint.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/codemirror/spiderflow-hint.js b/spider/resources/static/js/codemirror/spiderflow-hint.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/codemirror/spiderflow-hint.js rename to spider/resources/static/js/codemirror/spiderflow-hint.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/codemirror/spiderflow.js b/spider/resources/static/js/codemirror/spiderflow.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/codemirror/spiderflow.js rename to spider/resources/static/js/codemirror/spiderflow.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/codemirror/sql.js b/spider/resources/static/js/codemirror/sql.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/codemirror/sql.js rename to spider/resources/static/js/codemirror/sql.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/common.js b/spider/resources/static/js/common.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/common.js rename to spider/resources/static/js/common.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/cron/cron.js b/spider/resources/static/js/cron/cron.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/cron/cron.js rename to spider/resources/static/js/cron/cron.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/cron/easyui.min.css b/spider/resources/static/js/cron/easyui.min.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/cron/easyui.min.css rename to spider/resources/static/js/cron/easyui.min.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/cron/images/spinner_arrows.png b/spider/resources/static/js/cron/images/spinner_arrows.png similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/cron/images/spinner_arrows.png rename to spider/resources/static/js/cron/images/spinner_arrows.png diff --git a/APITest/spider-flow-web/src/main/resources/static/js/cron/images/tabs_icons.png b/spider/resources/static/js/cron/images/tabs_icons.png similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/cron/images/tabs_icons.png rename to spider/resources/static/js/cron/images/tabs_icons.png diff --git a/APITest/spider-flow-web/src/main/resources/static/js/cron/jquery-2.1.4.min.js b/spider/resources/static/js/cron/jquery-2.1.4.min.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/cron/jquery-2.1.4.min.js rename to spider/resources/static/js/cron/jquery-2.1.4.min.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/cron/jquery.easyui.min.js b/spider/resources/static/js/cron/jquery.easyui.min.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/cron/jquery.easyui.min.js rename to spider/resources/static/js/cron/jquery.easyui.min.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/editor.js b/spider/resources/static/js/editor.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/editor.js rename to spider/resources/static/js/editor.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/index.js b/spider/resources/static/js/index.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/index.js rename to spider/resources/static/js/index.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/jquery.easyui.min.js b/spider/resources/static/js/jquery.easyui.min.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/jquery.easyui.min.js rename to spider/resources/static/js/jquery.easyui.min.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/jsontree/icons.svg b/spider/resources/static/js/jsontree/icons.svg similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/jsontree/icons.svg rename to spider/resources/static/js/jsontree/icons.svg diff --git a/APITest/spider-flow-web/src/main/resources/static/js/jsontree/jsontree.css b/spider/resources/static/js/jsontree/jsontree.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/jsontree/jsontree.css rename to spider/resources/static/js/jsontree/jsontree.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/jsontree/jsontree.js b/spider/resources/static/js/jsontree/jsontree.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/jsontree/jsontree.js rename to spider/resources/static/js/jsontree/jsontree.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/css/layui.css b/spider/resources/static/js/layui/css/layui.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/css/layui.css rename to spider/resources/static/js/layui/css/layui.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/css/layui.mobile.css b/spider/resources/static/js/layui/css/layui.mobile.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/css/layui.mobile.css rename to spider/resources/static/js/layui/css/layui.mobile.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/code.css b/spider/resources/static/js/layui/css/modules/code.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/code.css rename to spider/resources/static/js/layui/css/modules/code.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/laydate/default/laydate.css b/spider/resources/static/js/layui/css/modules/laydate/default/laydate.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/laydate/default/laydate.css rename to spider/resources/static/js/layui/css/modules/laydate/default/laydate.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/icon-ext.png b/spider/resources/static/js/layui/css/modules/layer/default/icon-ext.png similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/icon-ext.png rename to spider/resources/static/js/layui/css/modules/layer/default/icon-ext.png diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/icon.png b/spider/resources/static/js/layui/css/modules/layer/default/icon.png similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/icon.png rename to spider/resources/static/js/layui/css/modules/layer/default/icon.png diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/layer.css b/spider/resources/static/js/layui/css/modules/layer/default/layer.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/layer.css rename to spider/resources/static/js/layui/css/modules/layer/default/layer.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/loading-0.gif b/spider/resources/static/js/layui/css/modules/layer/default/loading-0.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/loading-0.gif rename to spider/resources/static/js/layui/css/modules/layer/default/loading-0.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/loading-1.gif b/spider/resources/static/js/layui/css/modules/layer/default/loading-1.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/loading-1.gif rename to spider/resources/static/js/layui/css/modules/layer/default/loading-1.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/loading-2.gif b/spider/resources/static/js/layui/css/modules/layer/default/loading-2.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/css/modules/layer/default/loading-2.gif rename to spider/resources/static/js/layui/css/modules/layer/default/loading-2.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/ext/eleTree/eleTree.css b/spider/resources/static/js/layui/ext/eleTree/eleTree.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/ext/eleTree/eleTree.css rename to spider/resources/static/js/layui/ext/eleTree/eleTree.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/ext/eleTree/eleTree.js b/spider/resources/static/js/layui/ext/eleTree/eleTree.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/ext/eleTree/eleTree.js rename to spider/resources/static/js/layui/ext/eleTree/eleTree.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/ext/treeselect/treeselect.js b/spider/resources/static/js/layui/ext/treeselect/treeselect.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/ext/treeselect/treeselect.js rename to spider/resources/static/js/layui/ext/treeselect/treeselect.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/extends/formSelects-v4.css b/spider/resources/static/js/layui/extends/formSelects-v4.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/extends/formSelects-v4.css rename to spider/resources/static/js/layui/extends/formSelects-v4.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/extends/formSelects-v4.js b/spider/resources/static/js/layui/extends/formSelects-v4.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/extends/formSelects-v4.js rename to spider/resources/static/js/layui/extends/formSelects-v4.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/extends/treeGrid.js b/spider/resources/static/js/layui/extends/treeGrid.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/extends/treeGrid.js rename to spider/resources/static/js/layui/extends/treeGrid.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/font/iconfont.eot b/spider/resources/static/js/layui/font/iconfont.eot similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/font/iconfont.eot rename to spider/resources/static/js/layui/font/iconfont.eot diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/font/iconfont.svg b/spider/resources/static/js/layui/font/iconfont.svg similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/font/iconfont.svg rename to spider/resources/static/js/layui/font/iconfont.svg diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/font/iconfont.ttf b/spider/resources/static/js/layui/font/iconfont.ttf similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/font/iconfont.ttf rename to spider/resources/static/js/layui/font/iconfont.ttf diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/font/iconfont.woff b/spider/resources/static/js/layui/font/iconfont.woff similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/font/iconfont.woff rename to spider/resources/static/js/layui/font/iconfont.woff diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/0.gif b/spider/resources/static/js/layui/images/face/0.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/0.gif rename to spider/resources/static/js/layui/images/face/0.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/1.gif b/spider/resources/static/js/layui/images/face/1.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/1.gif rename to spider/resources/static/js/layui/images/face/1.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/10.gif b/spider/resources/static/js/layui/images/face/10.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/10.gif rename to spider/resources/static/js/layui/images/face/10.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/11.gif b/spider/resources/static/js/layui/images/face/11.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/11.gif rename to spider/resources/static/js/layui/images/face/11.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/12.gif b/spider/resources/static/js/layui/images/face/12.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/12.gif rename to spider/resources/static/js/layui/images/face/12.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/13.gif b/spider/resources/static/js/layui/images/face/13.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/13.gif rename to spider/resources/static/js/layui/images/face/13.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/14.gif b/spider/resources/static/js/layui/images/face/14.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/14.gif rename to spider/resources/static/js/layui/images/face/14.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/15.gif b/spider/resources/static/js/layui/images/face/15.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/15.gif rename to spider/resources/static/js/layui/images/face/15.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/16.gif b/spider/resources/static/js/layui/images/face/16.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/16.gif rename to spider/resources/static/js/layui/images/face/16.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/17.gif b/spider/resources/static/js/layui/images/face/17.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/17.gif rename to spider/resources/static/js/layui/images/face/17.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/18.gif b/spider/resources/static/js/layui/images/face/18.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/18.gif rename to spider/resources/static/js/layui/images/face/18.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/19.gif b/spider/resources/static/js/layui/images/face/19.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/19.gif rename to spider/resources/static/js/layui/images/face/19.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/2.gif b/spider/resources/static/js/layui/images/face/2.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/2.gif rename to spider/resources/static/js/layui/images/face/2.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/20.gif b/spider/resources/static/js/layui/images/face/20.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/20.gif rename to spider/resources/static/js/layui/images/face/20.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/21.gif b/spider/resources/static/js/layui/images/face/21.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/21.gif rename to spider/resources/static/js/layui/images/face/21.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/22.gif b/spider/resources/static/js/layui/images/face/22.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/22.gif rename to spider/resources/static/js/layui/images/face/22.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/23.gif b/spider/resources/static/js/layui/images/face/23.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/23.gif rename to spider/resources/static/js/layui/images/face/23.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/24.gif b/spider/resources/static/js/layui/images/face/24.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/24.gif rename to spider/resources/static/js/layui/images/face/24.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/25.gif b/spider/resources/static/js/layui/images/face/25.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/25.gif rename to spider/resources/static/js/layui/images/face/25.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/26.gif b/spider/resources/static/js/layui/images/face/26.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/26.gif rename to spider/resources/static/js/layui/images/face/26.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/27.gif b/spider/resources/static/js/layui/images/face/27.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/27.gif rename to spider/resources/static/js/layui/images/face/27.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/28.gif b/spider/resources/static/js/layui/images/face/28.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/28.gif rename to spider/resources/static/js/layui/images/face/28.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/29.gif b/spider/resources/static/js/layui/images/face/29.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/29.gif rename to spider/resources/static/js/layui/images/face/29.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/3.gif b/spider/resources/static/js/layui/images/face/3.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/3.gif rename to spider/resources/static/js/layui/images/face/3.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/30.gif b/spider/resources/static/js/layui/images/face/30.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/30.gif rename to spider/resources/static/js/layui/images/face/30.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/31.gif b/spider/resources/static/js/layui/images/face/31.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/31.gif rename to spider/resources/static/js/layui/images/face/31.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/32.gif b/spider/resources/static/js/layui/images/face/32.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/32.gif rename to spider/resources/static/js/layui/images/face/32.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/33.gif b/spider/resources/static/js/layui/images/face/33.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/33.gif rename to spider/resources/static/js/layui/images/face/33.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/34.gif b/spider/resources/static/js/layui/images/face/34.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/34.gif rename to spider/resources/static/js/layui/images/face/34.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/35.gif b/spider/resources/static/js/layui/images/face/35.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/35.gif rename to spider/resources/static/js/layui/images/face/35.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/36.gif b/spider/resources/static/js/layui/images/face/36.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/36.gif rename to spider/resources/static/js/layui/images/face/36.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/37.gif b/spider/resources/static/js/layui/images/face/37.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/37.gif rename to spider/resources/static/js/layui/images/face/37.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/38.gif b/spider/resources/static/js/layui/images/face/38.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/38.gif rename to spider/resources/static/js/layui/images/face/38.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/39.gif b/spider/resources/static/js/layui/images/face/39.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/39.gif rename to spider/resources/static/js/layui/images/face/39.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/4.gif b/spider/resources/static/js/layui/images/face/4.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/4.gif rename to spider/resources/static/js/layui/images/face/4.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/40.gif b/spider/resources/static/js/layui/images/face/40.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/40.gif rename to spider/resources/static/js/layui/images/face/40.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/41.gif b/spider/resources/static/js/layui/images/face/41.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/41.gif rename to spider/resources/static/js/layui/images/face/41.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/42.gif b/spider/resources/static/js/layui/images/face/42.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/42.gif rename to spider/resources/static/js/layui/images/face/42.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/43.gif b/spider/resources/static/js/layui/images/face/43.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/43.gif rename to spider/resources/static/js/layui/images/face/43.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/44.gif b/spider/resources/static/js/layui/images/face/44.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/44.gif rename to spider/resources/static/js/layui/images/face/44.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/45.gif b/spider/resources/static/js/layui/images/face/45.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/45.gif rename to spider/resources/static/js/layui/images/face/45.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/46.gif b/spider/resources/static/js/layui/images/face/46.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/46.gif rename to spider/resources/static/js/layui/images/face/46.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/47.gif b/spider/resources/static/js/layui/images/face/47.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/47.gif rename to spider/resources/static/js/layui/images/face/47.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/48.gif b/spider/resources/static/js/layui/images/face/48.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/48.gif rename to spider/resources/static/js/layui/images/face/48.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/49.gif b/spider/resources/static/js/layui/images/face/49.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/49.gif rename to spider/resources/static/js/layui/images/face/49.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/5.gif b/spider/resources/static/js/layui/images/face/5.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/5.gif rename to spider/resources/static/js/layui/images/face/5.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/50.gif b/spider/resources/static/js/layui/images/face/50.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/50.gif rename to spider/resources/static/js/layui/images/face/50.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/51.gif b/spider/resources/static/js/layui/images/face/51.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/51.gif rename to spider/resources/static/js/layui/images/face/51.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/52.gif b/spider/resources/static/js/layui/images/face/52.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/52.gif rename to spider/resources/static/js/layui/images/face/52.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/53.gif b/spider/resources/static/js/layui/images/face/53.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/53.gif rename to spider/resources/static/js/layui/images/face/53.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/54.gif b/spider/resources/static/js/layui/images/face/54.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/54.gif rename to spider/resources/static/js/layui/images/face/54.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/55.gif b/spider/resources/static/js/layui/images/face/55.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/55.gif rename to spider/resources/static/js/layui/images/face/55.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/56.gif b/spider/resources/static/js/layui/images/face/56.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/56.gif rename to spider/resources/static/js/layui/images/face/56.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/57.gif b/spider/resources/static/js/layui/images/face/57.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/57.gif rename to spider/resources/static/js/layui/images/face/57.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/58.gif b/spider/resources/static/js/layui/images/face/58.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/58.gif rename to spider/resources/static/js/layui/images/face/58.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/59.gif b/spider/resources/static/js/layui/images/face/59.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/59.gif rename to spider/resources/static/js/layui/images/face/59.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/6.gif b/spider/resources/static/js/layui/images/face/6.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/6.gif rename to spider/resources/static/js/layui/images/face/6.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/60.gif b/spider/resources/static/js/layui/images/face/60.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/60.gif rename to spider/resources/static/js/layui/images/face/60.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/61.gif b/spider/resources/static/js/layui/images/face/61.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/61.gif rename to spider/resources/static/js/layui/images/face/61.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/62.gif b/spider/resources/static/js/layui/images/face/62.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/62.gif rename to spider/resources/static/js/layui/images/face/62.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/63.gif b/spider/resources/static/js/layui/images/face/63.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/63.gif rename to spider/resources/static/js/layui/images/face/63.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/64.gif b/spider/resources/static/js/layui/images/face/64.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/64.gif rename to spider/resources/static/js/layui/images/face/64.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/65.gif b/spider/resources/static/js/layui/images/face/65.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/65.gif rename to spider/resources/static/js/layui/images/face/65.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/66.gif b/spider/resources/static/js/layui/images/face/66.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/66.gif rename to spider/resources/static/js/layui/images/face/66.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/67.gif b/spider/resources/static/js/layui/images/face/67.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/67.gif rename to spider/resources/static/js/layui/images/face/67.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/68.gif b/spider/resources/static/js/layui/images/face/68.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/68.gif rename to spider/resources/static/js/layui/images/face/68.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/69.gif b/spider/resources/static/js/layui/images/face/69.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/69.gif rename to spider/resources/static/js/layui/images/face/69.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/7.gif b/spider/resources/static/js/layui/images/face/7.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/7.gif rename to spider/resources/static/js/layui/images/face/7.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/70.gif b/spider/resources/static/js/layui/images/face/70.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/70.gif rename to spider/resources/static/js/layui/images/face/70.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/71.gif b/spider/resources/static/js/layui/images/face/71.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/71.gif rename to spider/resources/static/js/layui/images/face/71.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/8.gif b/spider/resources/static/js/layui/images/face/8.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/8.gif rename to spider/resources/static/js/layui/images/face/8.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/9.gif b/spider/resources/static/js/layui/images/face/9.gif similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/images/face/9.gif rename to spider/resources/static/js/layui/images/face/9.gif diff --git a/APITest/spider-flow-web/src/main/resources/static/js/layui/layui.all.js b/spider/resources/static/js/layui/layui.all.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/layui/layui.all.js rename to spider/resources/static/js/layui/layui.all.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/log-viewer.js b/spider/resources/static/js/log-viewer.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/log-viewer.js rename to spider/resources/static/js/log-viewer.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/mxgraph/css/common.css b/spider/resources/static/js/mxgraph/css/common.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/mxgraph/css/common.css rename to spider/resources/static/js/mxgraph/css/common.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/mxgraph/css/explorer.css b/spider/resources/static/js/mxgraph/css/explorer.css similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/mxgraph/css/explorer.css rename to spider/resources/static/js/mxgraph/css/explorer.css diff --git a/APITest/spider-flow-web/src/main/resources/static/js/mxgraph/mxgraph.js b/spider/resources/static/js/mxgraph/mxgraph.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/mxgraph/mxgraph.js rename to spider/resources/static/js/mxgraph/mxgraph.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/mxgraph/mxgraph.min.js b/spider/resources/static/js/mxgraph/mxgraph.min.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/mxgraph/mxgraph.min.js rename to spider/resources/static/js/mxgraph/mxgraph.min.js diff --git a/APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/editor.txt b/spider/resources/static/js/mxgraph/resources/editor.txt similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/editor.txt rename to spider/resources/static/js/mxgraph/resources/editor.txt diff --git a/APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/editor_de.txt b/spider/resources/static/js/mxgraph/resources/editor_de.txt similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/editor_de.txt rename to spider/resources/static/js/mxgraph/resources/editor_de.txt diff --git a/APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/editor_zh.txt b/spider/resources/static/js/mxgraph/resources/editor_zh.txt similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/editor_zh.txt rename to spider/resources/static/js/mxgraph/resources/editor_zh.txt diff --git a/APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/graph.txt b/spider/resources/static/js/mxgraph/resources/graph.txt similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/graph.txt rename to spider/resources/static/js/mxgraph/resources/graph.txt diff --git a/APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/graph_de.txt b/spider/resources/static/js/mxgraph/resources/graph_de.txt similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/graph_de.txt rename to spider/resources/static/js/mxgraph/resources/graph_de.txt diff --git a/APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/graph_zh.txt b/spider/resources/static/js/mxgraph/resources/graph_zh.txt similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/mxgraph/resources/graph_zh.txt rename to spider/resources/static/js/mxgraph/resources/graph_zh.txt diff --git a/APITest/spider-flow-web/src/main/resources/static/js/spider-editor.js b/spider/resources/static/js/spider-editor.js similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/js/spider-editor.js rename to spider/resources/static/js/spider-editor.js diff --git a/APITest/spider-flow-web/src/main/resources/static/log.html b/spider/resources/static/log.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/log.html rename to spider/resources/static/log.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/edge.html b/spider/resources/static/resources/templates/edge.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/edge.html rename to spider/resources/static/resources/templates/edge.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/executeSql.html b/spider/resources/static/resources/templates/executeSql.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/executeSql.html rename to spider/resources/static/resources/templates/executeSql.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/function.html b/spider/resources/static/resources/templates/function.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/function.html rename to spider/resources/static/resources/templates/function.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/loop.html b/spider/resources/static/resources/templates/loop.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/loop.html rename to spider/resources/static/resources/templates/loop.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/loopJoin.html b/spider/resources/static/resources/templates/loopJoin.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/loopJoin.html rename to spider/resources/static/resources/templates/loopJoin.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/output.html b/spider/resources/static/resources/templates/output.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/output.html rename to spider/resources/static/resources/templates/output.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/process.html b/spider/resources/static/resources/templates/process.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/process.html rename to spider/resources/static/resources/templates/process.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/request.html b/spider/resources/static/resources/templates/request.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/request.html rename to spider/resources/static/resources/templates/request.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/root.html b/spider/resources/static/resources/templates/root.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/root.html rename to spider/resources/static/resources/templates/root.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/start.html b/spider/resources/static/resources/templates/start.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/start.html rename to spider/resources/static/resources/templates/start.html diff --git a/APITest/spider-flow-web/src/main/resources/static/resources/templates/variable.html b/spider/resources/static/resources/templates/variable.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/resources/templates/variable.html rename to spider/resources/static/resources/templates/variable.html diff --git a/APITest/spider-flow-web/src/main/resources/static/spiderList.html b/spider/resources/static/spiderList.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/spiderList.html rename to spider/resources/static/spiderList.html diff --git a/APITest/spider-flow-web/src/main/resources/static/task.html b/spider/resources/static/task.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/task.html rename to spider/resources/static/task.html diff --git a/APITest/spider-flow-web/src/main/resources/static/variable-edit.html b/spider/resources/static/variable-edit.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/variable-edit.html rename to spider/resources/static/variable-edit.html diff --git a/APITest/spider-flow-web/src/main/resources/static/variables.html b/spider/resources/static/variables.html similarity index 100% rename from APITest/spider-flow-web/src/main/resources/static/variables.html rename to spider/resources/static/variables.html diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/ExpressionEngine.java b/spider/spiderflow/ExpressionEngine.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/ExpressionEngine.java rename to spider/spiderflow/ExpressionEngine.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/Grammerable.java b/spider/spiderflow/Grammerable.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/Grammerable.java rename to spider/spiderflow/Grammerable.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/SpiderApplication.java b/spider/spiderflow/SpiderApplication.java similarity index 96% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/SpiderApplication.java rename to spider/spiderflow/SpiderApplication.java index 851dcdf..2eb2c3c 100644 --- a/APITest/spider-flow-web/src/main/java/org/spiderflow/SpiderApplication.java +++ b/spider/spiderflow/SpiderApplication.java @@ -1,4 +1,4 @@ -package src.main.java.org.spiderflow; + import java.io.IOException; diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/annotation/Comment.java b/spider/spiderflow/annotation/Comment.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/annotation/Comment.java rename to spider/spiderflow/annotation/Comment.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/annotation/Example.java b/spider/spiderflow/annotation/Example.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/annotation/Example.java rename to spider/spiderflow/annotation/Example.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/annotation/Return.java b/spider/spiderflow/annotation/Return.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/annotation/Return.java rename to spider/spiderflow/annotation/Return.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/common/CURDController.java b/spider/spiderflow/common/CURDController.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/common/CURDController.java rename to spider/spiderflow/common/CURDController.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/concurrent/SpiderFlowThreadPoolExecutor.java b/spider/spiderflow/concurrent/SpiderFlowThreadPoolExecutor.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/concurrent/SpiderFlowThreadPoolExecutor.java rename to spider/spiderflow/concurrent/SpiderFlowThreadPoolExecutor.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/configuration/ResourcesConfiguration.java b/spider/spiderflow/configuration/ResourcesConfiguration.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/configuration/ResourcesConfiguration.java rename to spider/spiderflow/configuration/ResourcesConfiguration.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/configuration/WebSocketConfiguration.java b/spider/spiderflow/configuration/WebSocketConfiguration.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/configuration/WebSocketConfiguration.java rename to spider/spiderflow/configuration/WebSocketConfiguration.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/context/CookieContext.java b/spider/spiderflow/context/CookieContext.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/context/CookieContext.java rename to spider/spiderflow/context/CookieContext.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/context/RunnableNode.java b/spider/spiderflow/context/RunnableNode.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/context/RunnableNode.java rename to spider/spiderflow/context/RunnableNode.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/context/RunnableTreeNode.java b/spider/spiderflow/context/RunnableTreeNode.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/context/RunnableTreeNode.java rename to spider/spiderflow/context/RunnableTreeNode.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/context/SpiderContext.java b/spider/spiderflow/context/SpiderContext.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/context/SpiderContext.java rename to spider/spiderflow/context/SpiderContext.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/context/SpiderContextHolder.java b/spider/spiderflow/context/SpiderContextHolder.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/context/SpiderContextHolder.java rename to spider/spiderflow/context/SpiderContextHolder.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/controller/DataSourceController.java b/spider/spiderflow/controller/DataSourceController.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/controller/DataSourceController.java rename to spider/spiderflow/controller/DataSourceController.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/controller/SpiderFlowController.java b/spider/spiderflow/controller/SpiderFlowController.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/controller/SpiderFlowController.java rename to spider/spiderflow/controller/SpiderFlowController.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/controller/SpiderRestController.java b/spider/spiderflow/controller/SpiderRestController.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/controller/SpiderRestController.java rename to spider/spiderflow/controller/SpiderRestController.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/controller/TaskController.java b/spider/spiderflow/controller/TaskController.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/controller/TaskController.java rename to spider/spiderflow/controller/TaskController.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/controller/VariableController.java b/spider/spiderflow/controller/VariableController.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/controller/VariableController.java rename to spider/spiderflow/controller/VariableController.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/Spider.java b/spider/spiderflow/core/Spider.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/Spider.java rename to spider/spiderflow/core/Spider.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/Base64FunctionExecutor.java b/spider/spiderflow/core/executor/function/Base64FunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/Base64FunctionExecutor.java rename to spider/spiderflow/core/executor/function/Base64FunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/DateFunctionExecutor.java b/spider/spiderflow/core/executor/function/DateFunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/DateFunctionExecutor.java rename to spider/spiderflow/core/executor/function/DateFunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/ExtractFunctionExecutor.java b/spider/spiderflow/core/executor/function/ExtractFunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/ExtractFunctionExecutor.java rename to spider/spiderflow/core/executor/function/ExtractFunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/FileFunctionExecutor.java b/spider/spiderflow/core/executor/function/FileFunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/FileFunctionExecutor.java rename to spider/spiderflow/core/executor/function/FileFunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/JsonFunctionExecutor.java b/spider/spiderflow/core/executor/function/JsonFunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/JsonFunctionExecutor.java rename to spider/spiderflow/core/executor/function/JsonFunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/ListFunctionExecutor.java b/spider/spiderflow/core/executor/function/ListFunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/ListFunctionExecutor.java rename to spider/spiderflow/core/executor/function/ListFunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/MD5FunctionExecutor.java b/spider/spiderflow/core/executor/function/MD5FunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/MD5FunctionExecutor.java rename to spider/spiderflow/core/executor/function/MD5FunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/RandomFunctionExecutor.java b/spider/spiderflow/core/executor/function/RandomFunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/RandomFunctionExecutor.java rename to spider/spiderflow/core/executor/function/RandomFunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/StringFunctionExecutor.java b/spider/spiderflow/core/executor/function/StringFunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/StringFunctionExecutor.java rename to spider/spiderflow/core/executor/function/StringFunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/ThreadFunctionExecutor.java b/spider/spiderflow/core/executor/function/ThreadFunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/ThreadFunctionExecutor.java rename to spider/spiderflow/core/executor/function/ThreadFunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/UrlFunctionExecutor.java b/spider/spiderflow/core/executor/function/UrlFunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/UrlFunctionExecutor.java rename to spider/spiderflow/core/executor/function/UrlFunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ArrayFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ArrayFunctionExtension.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ArrayFunctionExtension.java rename to spider/spiderflow/core/executor/function/extension/ArrayFunctionExtension.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/DateFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/DateFunctionExtension.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/DateFunctionExtension.java rename to spider/spiderflow/core/executor/function/extension/DateFunctionExtension.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ElementFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ElementFunctionExtension.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ElementFunctionExtension.java rename to spider/spiderflow/core/executor/function/extension/ElementFunctionExtension.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ElementsFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ElementsFunctionExtension.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ElementsFunctionExtension.java rename to spider/spiderflow/core/executor/function/extension/ElementsFunctionExtension.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ListFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ListFunctionExtension.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ListFunctionExtension.java rename to spider/spiderflow/core/executor/function/extension/ListFunctionExtension.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/MapFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/MapFunctionExtension.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/MapFunctionExtension.java rename to spider/spiderflow/core/executor/function/extension/MapFunctionExtension.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ObjectFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ObjectFunctionExtension.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ObjectFunctionExtension.java rename to spider/spiderflow/core/executor/function/extension/ObjectFunctionExtension.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ResponseFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ResponseFunctionExtension.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/ResponseFunctionExtension.java rename to spider/spiderflow/core/executor/function/extension/ResponseFunctionExtension.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/StringFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/StringFunctionExtension.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/function/extension/StringFunctionExtension.java rename to spider/spiderflow/core/executor/function/extension/StringFunctionExtension.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/ExecuteSQLExecutor.java b/spider/spiderflow/core/executor/shape/ExecuteSQLExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/ExecuteSQLExecutor.java rename to spider/spiderflow/core/executor/shape/ExecuteSQLExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/FunctionExecutor.java b/spider/spiderflow/core/executor/shape/FunctionExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/FunctionExecutor.java rename to spider/spiderflow/core/executor/shape/FunctionExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/LoopExecutor.java b/spider/spiderflow/core/executor/shape/LoopExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/LoopExecutor.java rename to spider/spiderflow/core/executor/shape/LoopExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/LoopJoinExecutor.java b/spider/spiderflow/core/executor/shape/LoopJoinExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/LoopJoinExecutor.java rename to spider/spiderflow/core/executor/shape/LoopJoinExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/OutputExecutor.java b/spider/spiderflow/core/executor/shape/OutputExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/OutputExecutor.java rename to spider/spiderflow/core/executor/shape/OutputExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/ProcessExecutor.java b/spider/spiderflow/core/executor/shape/ProcessExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/ProcessExecutor.java rename to spider/spiderflow/core/executor/shape/ProcessExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/RequestExecutor.java b/spider/spiderflow/core/executor/shape/RequestExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/RequestExecutor.java rename to spider/spiderflow/core/executor/shape/RequestExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/StartExecutor.java b/spider/spiderflow/core/executor/shape/StartExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/StartExecutor.java rename to spider/spiderflow/core/executor/shape/StartExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/VariableExecutor.java b/spider/spiderflow/core/executor/shape/VariableExecutor.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/VariableExecutor.java rename to spider/spiderflow/core/executor/shape/VariableExecutor.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/DefaultExpressionEngine.java b/spider/spiderflow/core/expression/DefaultExpressionEngine.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/DefaultExpressionEngine.java rename to spider/spiderflow/core/expression/DefaultExpressionEngine.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/ExpressionError.java b/spider/spiderflow/core/expression/ExpressionError.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/ExpressionError.java rename to spider/spiderflow/core/expression/ExpressionError.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/ExpressionGlobalVariables.java b/spider/spiderflow/core/expression/ExpressionGlobalVariables.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/ExpressionGlobalVariables.java rename to spider/spiderflow/core/expression/ExpressionGlobalVariables.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/ExpressionTemplate.java b/spider/spiderflow/core/expression/ExpressionTemplate.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/ExpressionTemplate.java rename to spider/spiderflow/core/expression/ExpressionTemplate.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/ExpressionTemplateContext.java b/spider/spiderflow/core/expression/ExpressionTemplateContext.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/ExpressionTemplateContext.java rename to spider/spiderflow/core/expression/ExpressionTemplateContext.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/interpreter/AstInterpreter.java b/spider/spiderflow/core/expression/interpreter/AstInterpreter.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/interpreter/AstInterpreter.java rename to spider/spiderflow/core/expression/interpreter/AstInterpreter.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/interpreter/JavaReflection.java b/spider/spiderflow/core/expression/interpreter/JavaReflection.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/interpreter/JavaReflection.java rename to spider/spiderflow/core/expression/interpreter/JavaReflection.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/interpreter/Reflection.java b/spider/spiderflow/core/expression/interpreter/Reflection.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/interpreter/Reflection.java rename to spider/spiderflow/core/expression/interpreter/Reflection.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/Ast.java b/spider/spiderflow/core/expression/parsing/Ast.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/Ast.java rename to spider/spiderflow/core/expression/parsing/Ast.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/CharacterStream.java b/spider/spiderflow/core/expression/parsing/CharacterStream.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/CharacterStream.java rename to spider/spiderflow/core/expression/parsing/CharacterStream.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/Parser.java b/spider/spiderflow/core/expression/parsing/Parser.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/Parser.java rename to spider/spiderflow/core/expression/parsing/Parser.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/Span.java b/spider/spiderflow/core/expression/parsing/Span.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/Span.java rename to spider/spiderflow/core/expression/parsing/Span.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/Token.java b/spider/spiderflow/core/expression/parsing/Token.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/Token.java rename to spider/spiderflow/core/expression/parsing/Token.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/TokenStream.java b/spider/spiderflow/core/expression/parsing/TokenStream.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/TokenStream.java rename to spider/spiderflow/core/expression/parsing/TokenStream.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/TokenType.java b/spider/spiderflow/core/expression/parsing/TokenType.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/TokenType.java rename to spider/spiderflow/core/expression/parsing/TokenType.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/Tokenizer.java b/spider/spiderflow/core/expression/parsing/Tokenizer.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/expression/parsing/Tokenizer.java rename to spider/spiderflow/core/expression/parsing/Tokenizer.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/io/HttpRequest.java b/spider/spiderflow/core/io/HttpRequest.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/io/HttpRequest.java rename to spider/spiderflow/core/io/HttpRequest.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/io/HttpResponse.java b/spider/spiderflow/core/io/HttpResponse.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/io/HttpResponse.java rename to spider/spiderflow/core/io/HttpResponse.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/job/SpiderJob.java b/spider/spiderflow/core/job/SpiderJob.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/job/SpiderJob.java rename to spider/spiderflow/core/job/SpiderJob.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/job/SpiderJobContext.java b/spider/spiderflow/core/job/SpiderJobContext.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/job/SpiderJobContext.java rename to spider/spiderflow/core/job/SpiderJobContext.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/job/SpiderJobManager.java b/spider/spiderflow/core/job/SpiderJobManager.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/job/SpiderJobManager.java rename to spider/spiderflow/core/job/SpiderJobManager.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/mapper/DataSourceMapper.java b/spider/spiderflow/core/mapper/DataSourceMapper.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/mapper/DataSourceMapper.java rename to spider/spiderflow/core/mapper/DataSourceMapper.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/mapper/SpiderFlowMapper.java b/spider/spiderflow/core/mapper/SpiderFlowMapper.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/mapper/SpiderFlowMapper.java rename to spider/spiderflow/core/mapper/SpiderFlowMapper.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/mapper/TaskMapper.java b/spider/spiderflow/core/mapper/TaskMapper.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/mapper/TaskMapper.java rename to spider/spiderflow/core/mapper/TaskMapper.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/mapper/VariableMapper.java b/spider/spiderflow/core/mapper/VariableMapper.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/mapper/VariableMapper.java rename to spider/spiderflow/core/mapper/VariableMapper.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/model/DataSource.java b/spider/spiderflow/core/model/DataSource.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/model/DataSource.java rename to spider/spiderflow/core/model/DataSource.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/model/SpiderFlow.java b/spider/spiderflow/core/model/SpiderFlow.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/model/SpiderFlow.java rename to spider/spiderflow/core/model/SpiderFlow.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/model/Task.java b/spider/spiderflow/core/model/Task.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/model/Task.java rename to spider/spiderflow/core/model/Task.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/model/Variable.java b/spider/spiderflow/core/model/Variable.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/model/Variable.java rename to spider/spiderflow/core/model/Variable.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/serializer/FastJsonSerializer.java b/spider/spiderflow/core/serializer/FastJsonSerializer.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/serializer/FastJsonSerializer.java rename to spider/spiderflow/core/serializer/FastJsonSerializer.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/service/DataSourceService.java b/spider/spiderflow/core/service/DataSourceService.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/service/DataSourceService.java rename to spider/spiderflow/core/service/DataSourceService.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/service/SpiderFlowService.java b/spider/spiderflow/core/service/SpiderFlowService.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/service/SpiderFlowService.java rename to spider/spiderflow/core/service/SpiderFlowService.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/service/TaskService.java b/spider/spiderflow/core/service/TaskService.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/service/TaskService.java rename to spider/spiderflow/core/service/TaskService.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/service/VariableService.java b/spider/spiderflow/core/service/VariableService.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/service/VariableService.java rename to spider/spiderflow/core/service/VariableService.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/utils/DataSourceUtils.java b/spider/spiderflow/core/utils/DataSourceUtils.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/utils/DataSourceUtils.java rename to spider/spiderflow/core/utils/DataSourceUtils.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/utils/ExtractUtils.java b/spider/spiderflow/core/utils/ExtractUtils.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/utils/ExtractUtils.java rename to spider/spiderflow/core/utils/ExtractUtils.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/utils/FileUtils.java b/spider/spiderflow/core/utils/FileUtils.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/utils/FileUtils.java rename to spider/spiderflow/core/utils/FileUtils.java diff --git a/APITest/spider-flow-core/src/main/java/org/spiderflow/core/utils/SpiderFlowUtils.java b/spider/spiderflow/core/utils/SpiderFlowUtils.java similarity index 100% rename from APITest/spider-flow-core/src/main/java/org/spiderflow/core/utils/SpiderFlowUtils.java rename to spider/spiderflow/core/utils/SpiderFlowUtils.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/executor/FunctionExecutor.java b/spider/spiderflow/executor/FunctionExecutor.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/executor/FunctionExecutor.java rename to spider/spiderflow/executor/FunctionExecutor.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/executor/FunctionExtension.java b/spider/spiderflow/executor/FunctionExtension.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/executor/FunctionExtension.java rename to spider/spiderflow/executor/FunctionExtension.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/executor/PluginConfig.java b/spider/spiderflow/executor/PluginConfig.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/executor/PluginConfig.java rename to spider/spiderflow/executor/PluginConfig.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/executor/ShapeExecutor.java b/spider/spiderflow/executor/ShapeExecutor.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/executor/ShapeExecutor.java rename to spider/spiderflow/executor/ShapeExecutor.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/expression/DynamicMethod.java b/spider/spiderflow/expression/DynamicMethod.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/expression/DynamicMethod.java rename to spider/spiderflow/expression/DynamicMethod.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/io/Line.java b/spider/spiderflow/io/Line.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/io/Line.java rename to spider/spiderflow/io/Line.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/io/RandomAccessFileReader.java b/spider/spiderflow/io/RandomAccessFileReader.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/io/RandomAccessFileReader.java rename to spider/spiderflow/io/RandomAccessFileReader.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/io/SpiderResponse.java b/spider/spiderflow/io/SpiderResponse.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/io/SpiderResponse.java rename to spider/spiderflow/io/SpiderResponse.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/listener/SpiderListener.java b/spider/spiderflow/listener/SpiderListener.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/listener/SpiderListener.java rename to spider/spiderflow/listener/SpiderListener.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/logback/SpiderFlowFileAppender.java b/spider/spiderflow/logback/SpiderFlowFileAppender.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/logback/SpiderFlowFileAppender.java rename to spider/spiderflow/logback/SpiderFlowFileAppender.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/logback/SpiderFlowWebSocketAppender.java b/spider/spiderflow/logback/SpiderFlowWebSocketAppender.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/logback/SpiderFlowWebSocketAppender.java rename to spider/spiderflow/logback/SpiderFlowWebSocketAppender.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/model/Grammer.java b/spider/spiderflow/model/Grammer.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/model/Grammer.java rename to spider/spiderflow/model/Grammer.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/model/JsonBean.java b/spider/spiderflow/model/JsonBean.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/model/JsonBean.java rename to spider/spiderflow/model/JsonBean.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/model/Plugin.java b/spider/spiderflow/model/Plugin.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/model/Plugin.java rename to spider/spiderflow/model/Plugin.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/model/Shape.java b/spider/spiderflow/model/Shape.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/model/Shape.java rename to spider/spiderflow/model/Shape.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/model/SpiderLog.java b/spider/spiderflow/model/SpiderLog.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/model/SpiderLog.java rename to spider/spiderflow/model/SpiderLog.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/model/SpiderNameValue.java b/spider/spiderflow/model/SpiderNameValue.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/model/SpiderNameValue.java rename to spider/spiderflow/model/SpiderNameValue.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/model/SpiderNode.java b/spider/spiderflow/model/SpiderNode.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/model/SpiderNode.java rename to spider/spiderflow/model/SpiderNode.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/model/SpiderOutput.java b/spider/spiderflow/model/SpiderOutput.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/model/SpiderOutput.java rename to spider/spiderflow/model/SpiderOutput.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/model/SpiderWebSocketContext.java b/spider/spiderflow/model/SpiderWebSocketContext.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/model/SpiderWebSocketContext.java rename to spider/spiderflow/model/SpiderWebSocketContext.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/model/WebSocketEvent.java b/spider/spiderflow/model/WebSocketEvent.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/model/WebSocketEvent.java rename to spider/spiderflow/model/WebSocketEvent.java diff --git a/APITest/spider-flow-api/src/main/java/org/spiderflow/utils/Maps.java b/spider/spiderflow/utils/Maps.java similarity index 100% rename from APITest/spider-flow-api/src/main/java/org/spiderflow/utils/Maps.java rename to spider/spiderflow/utils/Maps.java diff --git a/APITest/spider-flow-web/src/main/java/org/spiderflow/websocket/WebSocketEditorServer.java b/spider/spiderflow/websocket/WebSocketEditorServer.java similarity index 100% rename from APITest/spider-flow-web/src/main/java/org/spiderflow/websocket/WebSocketEditorServer.java rename to spider/spiderflow/websocket/WebSocketEditorServer.java From 31312128421cb1207210ed96e264b0b7fd45d25b Mon Sep 17 00:00:00 2001 From: vunited Date: Sun, 5 Jan 2020 23:56:34 +0800 Subject: [PATCH 4/8] dailay update --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 972f981..a174f85 100644 --- a/pom.xml +++ b/pom.xml @@ -169,11 +169,15 @@ gson 2.8.6 + + + org.apache.httpcomponents httpcore From fa6647320d0b9e0fa125d05f463d15423f19ce82 Mon Sep 17 00:00:00 2001 From: vunited Date: Sun, 5 Jan 2020 23:56:34 +0800 Subject: [PATCH 5/8] dailay update --- .classpath | 1 - pom.xml | 4 ++++ {Junit => src/test/java/Junit}/JUnit4-5.docx | Bin {Junit => src/test/java/Junit}/com/jsp/JUnit/T.java | 0 .../test/java/Junit}/com/jsp/JUnit/TTest2.java | 0 .../test/java/Junit}/com/jsp/JUnit/TUser.java | 0 .../test/java/Junit}/com/jsp/JUnit/User.java | 0 .../test/java/Junit}/com/junit/AllTests.java | 0 .../test/java/Junit}/com/junit/Class_1_1.java | 0 .../test/java/Junit}/com/junit/Controller.java | 0 .../java/Junit}/com/junit/DeafultController.java | 0 .../test/java/Junit}/com/junit/ErrorResponse.java | 0 .../java/Junit}/com/junit/ParameterizedTest.java | 0 .../test/java/Junit}/com/junit/Request.java | 0 .../test/java/Junit}/com/junit/RequestHandler.java | 0 .../test/java/Junit}/com/junit/Response.java | 0 .../Junit}/com/junit/TestDefaultController.java | 0 17 files changed, 4 insertions(+), 1 deletion(-) rename {Junit => src/test/java/Junit}/JUnit4-5.docx (100%) rename {Junit => src/test/java/Junit}/com/jsp/JUnit/T.java (100%) rename {Junit => src/test/java/Junit}/com/jsp/JUnit/TTest2.java (100%) rename {Junit => src/test/java/Junit}/com/jsp/JUnit/TUser.java (100%) rename {Junit => src/test/java/Junit}/com/jsp/JUnit/User.java (100%) rename {Junit => src/test/java/Junit}/com/junit/AllTests.java (100%) rename {Junit => src/test/java/Junit}/com/junit/Class_1_1.java (100%) rename {Junit => src/test/java/Junit}/com/junit/Controller.java (100%) rename {Junit => src/test/java/Junit}/com/junit/DeafultController.java (100%) rename {Junit => src/test/java/Junit}/com/junit/ErrorResponse.java (100%) rename {Junit => src/test/java/Junit}/com/junit/ParameterizedTest.java (100%) rename {Junit => src/test/java/Junit}/com/junit/Request.java (100%) rename {Junit => src/test/java/Junit}/com/junit/RequestHandler.java (100%) rename {Junit => src/test/java/Junit}/com/junit/Response.java (100%) rename {Junit => src/test/java/Junit}/com/junit/TestDefaultController.java (100%) diff --git a/.classpath b/.classpath index 717c15a..32b2c56 100644 --- a/.classpath +++ b/.classpath @@ -6,7 +6,6 @@ - diff --git a/pom.xml b/pom.xml index 972f981..a174f85 100644 --- a/pom.xml +++ b/pom.xml @@ -169,11 +169,15 @@ gson 2.8.6 + + + org.apache.httpcomponents httpcore diff --git a/Junit/JUnit4-5.docx b/src/test/java/Junit/JUnit4-5.docx similarity index 100% rename from Junit/JUnit4-5.docx rename to src/test/java/Junit/JUnit4-5.docx diff --git a/Junit/com/jsp/JUnit/T.java b/src/test/java/Junit/com/jsp/JUnit/T.java similarity index 100% rename from Junit/com/jsp/JUnit/T.java rename to src/test/java/Junit/com/jsp/JUnit/T.java diff --git a/Junit/com/jsp/JUnit/TTest2.java b/src/test/java/Junit/com/jsp/JUnit/TTest2.java similarity index 100% rename from Junit/com/jsp/JUnit/TTest2.java rename to src/test/java/Junit/com/jsp/JUnit/TTest2.java diff --git a/Junit/com/jsp/JUnit/TUser.java b/src/test/java/Junit/com/jsp/JUnit/TUser.java similarity index 100% rename from Junit/com/jsp/JUnit/TUser.java rename to src/test/java/Junit/com/jsp/JUnit/TUser.java diff --git a/Junit/com/jsp/JUnit/User.java b/src/test/java/Junit/com/jsp/JUnit/User.java similarity index 100% rename from Junit/com/jsp/JUnit/User.java rename to src/test/java/Junit/com/jsp/JUnit/User.java diff --git a/Junit/com/junit/AllTests.java b/src/test/java/Junit/com/junit/AllTests.java similarity index 100% rename from Junit/com/junit/AllTests.java rename to src/test/java/Junit/com/junit/AllTests.java diff --git a/Junit/com/junit/Class_1_1.java b/src/test/java/Junit/com/junit/Class_1_1.java similarity index 100% rename from Junit/com/junit/Class_1_1.java rename to src/test/java/Junit/com/junit/Class_1_1.java diff --git a/Junit/com/junit/Controller.java b/src/test/java/Junit/com/junit/Controller.java similarity index 100% rename from Junit/com/junit/Controller.java rename to src/test/java/Junit/com/junit/Controller.java diff --git a/Junit/com/junit/DeafultController.java b/src/test/java/Junit/com/junit/DeafultController.java similarity index 100% rename from Junit/com/junit/DeafultController.java rename to src/test/java/Junit/com/junit/DeafultController.java diff --git a/Junit/com/junit/ErrorResponse.java b/src/test/java/Junit/com/junit/ErrorResponse.java similarity index 100% rename from Junit/com/junit/ErrorResponse.java rename to src/test/java/Junit/com/junit/ErrorResponse.java diff --git a/Junit/com/junit/ParameterizedTest.java b/src/test/java/Junit/com/junit/ParameterizedTest.java similarity index 100% rename from Junit/com/junit/ParameterizedTest.java rename to src/test/java/Junit/com/junit/ParameterizedTest.java diff --git a/Junit/com/junit/Request.java b/src/test/java/Junit/com/junit/Request.java similarity index 100% rename from Junit/com/junit/Request.java rename to src/test/java/Junit/com/junit/Request.java diff --git a/Junit/com/junit/RequestHandler.java b/src/test/java/Junit/com/junit/RequestHandler.java similarity index 100% rename from Junit/com/junit/RequestHandler.java rename to src/test/java/Junit/com/junit/RequestHandler.java diff --git a/Junit/com/junit/Response.java b/src/test/java/Junit/com/junit/Response.java similarity index 100% rename from Junit/com/junit/Response.java rename to src/test/java/Junit/com/junit/Response.java diff --git a/Junit/com/junit/TestDefaultController.java b/src/test/java/Junit/com/junit/TestDefaultController.java similarity index 100% rename from Junit/com/junit/TestDefaultController.java rename to src/test/java/Junit/com/junit/TestDefaultController.java From b4a77bcfb8de4306aba686f97f577c05ee508c37 Mon Sep 17 00:00:00 2001 From: vunited Date: Mon, 6 Jan 2020 01:37:08 +0800 Subject: [PATCH 6/8] s --- .classpath | 15 +- .settings/org.eclipse.core.resources.prefs | 1 - .settings/org.eclipse.jdt.ui.prefs | 61 + .../org.eclipse.ltk.core.refactoring.prefs | 2 + Base/com/baseType/TestByte.java | 31 + .../java/Junit/JUnit4-5.docx => JUnit4-5.docx | Bin pom.xml | 80 +- spider/pom.xml | 117 - spider/resources/application.properties | 34 - spider/resources/logback-spring.xml | 29 - spider/resources/static/css/easyui.css | 2 - spider/resources/static/css/editor.css | 231 - spider/resources/static/css/index.css | 22 - spider/resources/static/css/layui-blue.css | 181 - spider/resources/static/datasource-edit.html | 127 - spider/resources/static/datasources.html | 82 - spider/resources/static/editCron.html | 533 - spider/resources/static/editor.html | 54 - spider/resources/static/favicon.ico | Bin 1150 -> 0 bytes spider/resources/static/index.html | 39 - spider/resources/static/js/canvas-viewer.js | 350 - .../static/js/codemirror/codemirror.css | 356 - .../static/js/codemirror/codemirror.js | 9765 -- .../resources/static/js/codemirror/idea.css | 42 - .../static/js/codemirror/placeholder.js | 63 - .../static/js/codemirror/show-hint.css | 36 - .../static/js/codemirror/show-hint.js | 744 - .../static/js/codemirror/spiderflow-hint.js | 131 - .../static/js/codemirror/spiderflow.js | 286 - spider/resources/static/js/codemirror/sql.js | 494 - spider/resources/static/js/common.js | 47 - spider/resources/static/js/cron/cron.js | 497 - .../resources/static/js/cron/easyui.min.css | 2316 - .../static/js/cron/images/spinner_arrows.png | Bin 115 -> 0 bytes .../static/js/cron/images/tabs_icons.png | Bin 150 -> 0 bytes .../static/js/cron/jquery-2.1.4.min.js | 4 - .../static/js/cron/jquery.easyui.min.js | 11839 -- spider/resources/static/js/editor.js | 955 - spider/resources/static/js/index.js | 43 - .../resources/static/js/jquery.easyui.min.js | 11838 -- spider/resources/static/js/jsontree/icons.svg | 1 - .../resources/static/js/jsontree/jsontree.css | 107 - .../resources/static/js/jsontree/jsontree.js | 819 - .../resources/static/js/layui/css/layui.css | 2 - .../static/js/layui/css/layui.mobile.css | 2 - .../static/js/layui/css/modules/code.css | 2 - .../css/modules/laydate/default/laydate.css | 2 - .../css/modules/layer/default/icon-ext.png | Bin 5911 -> 0 bytes .../layui/css/modules/layer/default/icon.png | Bin 11493 -> 0 bytes .../layui/css/modules/layer/default/layer.css | 2 - .../css/modules/layer/default/loading-0.gif | Bin 5793 -> 0 bytes .../css/modules/layer/default/loading-1.gif | Bin 701 -> 0 bytes .../css/modules/layer/default/loading-2.gif | Bin 1787 -> 0 bytes .../static/js/layui/ext/eleTree/eleTree.css | 149 - .../static/js/layui/ext/eleTree/eleTree.js | 1216 - .../js/layui/ext/treeselect/treeselect.js | 598 - .../js/layui/extends/formSelects-v4.css | 174 - .../static/js/layui/extends/formSelects-v4.js | 1791 - .../static/js/layui/extends/treeGrid.js | 2678 - .../static/js/layui/font/iconfont.eot | Bin 40844 -> 0 bytes .../static/js/layui/font/iconfont.svg | 473 - .../static/js/layui/font/iconfont.ttf | Bin 40668 -> 0 bytes .../static/js/layui/font/iconfont.woff | Bin 26744 -> 0 bytes .../static/js/layui/images/face/0.gif | Bin 2689 -> 0 bytes .../static/js/layui/images/face/1.gif | Bin 5514 -> 0 bytes .../static/js/layui/images/face/10.gif | Bin 2797 -> 0 bytes .../static/js/layui/images/face/11.gif | Bin 4121 -> 0 bytes .../static/js/layui/images/face/12.gif | Bin 3361 -> 0 bytes .../static/js/layui/images/face/13.gif | Bin 7425 -> 0 bytes .../static/js/layui/images/face/14.gif | Bin 2375 -> 0 bytes .../static/js/layui/images/face/15.gif | Bin 1793 -> 0 bytes .../static/js/layui/images/face/16.gif | Bin 6721 -> 0 bytes .../static/js/layui/images/face/17.gif | Bin 4439 -> 0 bytes .../static/js/layui/images/face/18.gif | Bin 3017 -> 0 bytes .../static/js/layui/images/face/19.gif | Bin 3040 -> 0 bytes .../static/js/layui/images/face/2.gif | Bin 3222 -> 0 bytes .../static/js/layui/images/face/20.gif | Bin 5144 -> 0 bytes .../static/js/layui/images/face/21.gif | Bin 5191 -> 0 bytes .../static/js/layui/images/face/22.gif | Bin 9823 -> 0 bytes .../static/js/layui/images/face/23.gif | Bin 3792 -> 0 bytes .../static/js/layui/images/face/24.gif | Bin 8096 -> 0 bytes .../static/js/layui/images/face/25.gif | Bin 3127 -> 0 bytes .../static/js/layui/images/face/26.gif | Bin 3291 -> 0 bytes .../static/js/layui/images/face/27.gif | Bin 4377 -> 0 bytes .../static/js/layui/images/face/28.gif | Bin 2793 -> 0 bytes .../static/js/layui/images/face/29.gif | Bin 4854 -> 0 bytes .../static/js/layui/images/face/3.gif | Bin 4017 -> 0 bytes .../static/js/layui/images/face/30.gif | Bin 2555 -> 0 bytes .../static/js/layui/images/face/31.gif | Bin 2002 -> 0 bytes .../static/js/layui/images/face/32.gif | Bin 3481 -> 0 bytes .../static/js/layui/images/face/33.gif | Bin 2454 -> 0 bytes .../static/js/layui/images/face/34.gif | Bin 3700 -> 0 bytes .../static/js/layui/images/face/35.gif | Bin 1800 -> 0 bytes .../static/js/layui/images/face/36.gif | Bin 2331 -> 0 bytes .../static/js/layui/images/face/37.gif | Bin 1513 -> 0 bytes .../static/js/layui/images/face/38.gif | Bin 3615 -> 0 bytes .../static/js/layui/images/face/39.gif | Bin 6495 -> 0 bytes .../static/js/layui/images/face/4.gif | Bin 5689 -> 0 bytes .../static/js/layui/images/face/40.gif | Bin 3154 -> 0 bytes .../static/js/layui/images/face/41.gif | Bin 3644 -> 0 bytes .../static/js/layui/images/face/42.gif | Bin 5305 -> 0 bytes .../static/js/layui/images/face/43.gif | Bin 2674 -> 0 bytes .../static/js/layui/images/face/44.gif | Bin 4126 -> 0 bytes .../static/js/layui/images/face/45.gif | Bin 3417 -> 0 bytes .../static/js/layui/images/face/46.gif | Bin 3007 -> 0 bytes .../static/js/layui/images/face/47.gif | Bin 2333 -> 0 bytes .../static/js/layui/images/face/48.gif | Bin 2689 -> 0 bytes .../static/js/layui/images/face/49.gif | Bin 2315 -> 0 bytes .../static/js/layui/images/face/5.gif | Bin 4567 -> 0 bytes .../static/js/layui/images/face/50.gif | Bin 5866 -> 0 bytes .../static/js/layui/images/face/51.gif | Bin 2785 -> 0 bytes .../static/js/layui/images/face/52.gif | Bin 777 -> 0 bytes .../static/js/layui/images/face/53.gif | Bin 2127 -> 0 bytes .../static/js/layui/images/face/54.gif | Bin 2196 -> 0 bytes .../static/js/layui/images/face/55.gif | Bin 1971 -> 0 bytes .../static/js/layui/images/face/56.gif | Bin 2034 -> 0 bytes .../static/js/layui/images/face/57.gif | Bin 2705 -> 0 bytes .../static/js/layui/images/face/58.gif | Bin 2258 -> 0 bytes .../static/js/layui/images/face/59.gif | Bin 10311 -> 0 bytes .../static/js/layui/images/face/6.gif | Bin 2213 -> 0 bytes .../static/js/layui/images/face/60.gif | Bin 3245 -> 0 bytes .../static/js/layui/images/face/61.gif | Bin 2495 -> 0 bytes .../static/js/layui/images/face/62.gif | Bin 2017 -> 0 bytes .../static/js/layui/images/face/63.gif | Bin 5871 -> 0 bytes .../static/js/layui/images/face/64.gif | Bin 6448 -> 0 bytes .../static/js/layui/images/face/65.gif | Bin 3576 -> 0 bytes .../static/js/layui/images/face/66.gif | Bin 3029 -> 0 bytes .../static/js/layui/images/face/67.gif | Bin 2701 -> 0 bytes .../static/js/layui/images/face/68.gif | Bin 1424 -> 0 bytes .../static/js/layui/images/face/69.gif | Bin 2431 -> 0 bytes .../static/js/layui/images/face/7.gif | Bin 3398 -> 0 bytes .../static/js/layui/images/face/70.gif | Bin 4590 -> 0 bytes .../static/js/layui/images/face/71.gif | Bin 5304 -> 0 bytes .../static/js/layui/images/face/8.gif | Bin 4050 -> 0 bytes .../static/js/layui/images/face/9.gif | Bin 4221 -> 0 bytes spider/resources/static/js/layui/layui.all.js | 13 - spider/resources/static/js/log-viewer.js | 168 - .../static/js/mxgraph/css/common.css | 162 - .../static/js/mxgraph/css/explorer.css | 18 - spider/resources/static/js/mxgraph/mxgraph.js | 89762 ---------------- .../static/js/mxgraph/mxgraph.min.js | 1825 - .../static/js/mxgraph/resources/editor.txt | 5 - .../static/js/mxgraph/resources/editor_de.txt | 5 - .../static/js/mxgraph/resources/editor_zh.txt | 5 - .../static/js/mxgraph/resources/graph.txt | 11 - .../static/js/mxgraph/resources/graph_de.txt | 11 - .../static/js/mxgraph/resources/graph_zh.txt | 11 - spider/resources/static/js/spider-editor.js | 204 - spider/resources/static/log.html | 235 - .../static/resources/templates/edge.html | 21 - .../resources/templates/executeSql.html | 60 - .../static/resources/templates/function.html | 42 - .../static/resources/templates/loop.html | 33 - .../static/resources/templates/loopJoin.html | 29 - .../static/resources/templates/output.html | 55 - .../static/resources/templates/process.html | 27 - .../static/resources/templates/request.html | 232 - .../static/resources/templates/root.html | 111 - .../static/resources/templates/start.html | 17 - .../static/resources/templates/variable.html | 49 - spider/resources/static/spiderList.html | 194 - spider/resources/static/task.html | 104 - spider/resources/static/variable-edit.html | 93 - spider/resources/static/variables.html | 83 - spider/spiderflow/ExpressionEngine.java | 9 - spider/spiderflow/Grammerable.java | 10 - spider/spiderflow/SpiderApplication.java | 38 - spider/spiderflow/annotation/Comment.java | 14 - spider/spiderflow/annotation/Example.java | 14 - spider/spiderflow/annotation/Return.java | 14 - spider/spiderflow/common/CURDController.java | 39 - .../SpiderFlowThreadPoolExecutor.java | 116 - .../configuration/ResourcesConfiguration.java | 28 - .../configuration/WebSocketConfiguration.java | 28 - spider/spiderflow/context/CookieContext.java | 6 - spider/spiderflow/context/RunnableNode.java | 20 - .../spiderflow/context/RunnableTreeNode.java | 59 - spider/spiderflow/context/SpiderContext.java | 101 - .../context/SpiderContextHolder.java | 22 - .../controller/DataSourceController.java | 94 - .../controller/SpiderFlowController.java | 193 - .../controller/SpiderRestController.java | 55 - .../spiderflow/controller/TaskController.java | 46 - .../controller/VariableController.java | 13 - spider/spiderflow/core/Spider.java | 255 - .../function/Base64FunctionExecutor.java | 88 - .../function/DateFunctionExecutor.java | 112 - .../function/ExtractFunctionExecutor.java | 150 - .../function/FileFunctionExecutor.java | 124 - .../function/JsonFunctionExecutor.java | 35 - .../function/ListFunctionExecutor.java | 75 - .../function/MD5FunctionExecutor.java | 56 - .../function/RandomFunctionExecutor.java | 60 - .../function/StringFunctionExecutor.java | 176 - .../function/ThreadFunctionExecutor.java | 30 - .../function/UrlFunctionExecutor.java | 95 - .../extension/ArrayFunctionExtension.java | 44 - .../extension/DateFunctionExtension.java | 30 - .../extension/ElementFunctionExtension.java | 86 - .../extension/ElementsFunctionExtension.java | 87 - .../extension/ListFunctionExtension.java | 57 - .../extension/MapFunctionExtension.java | 25 - .../extension/ObjectFunctionExtension.java | 48 - .../extension/ResponseFunctionExtension.java | 127 - .../extension/StringFunctionExtension.java | 137 - .../executor/shape/ExecuteSQLExecutor.java | 201 - .../core/executor/shape/FunctionExecutor.java | 54 - .../core/executor/shape/LoopExecutor.java | 30 - .../core/executor/shape/LoopJoinExecutor.java | 79 - .../core/executor/shape/OutputExecutor.java | 102 - .../core/executor/shape/ProcessExecutor.java | 53 - .../core/executor/shape/RequestExecutor.java | 367 - .../core/executor/shape/StartExecutor.java | 28 - .../core/executor/shape/VariableExecutor.java | 61 - .../expression/DefaultExpressionEngine.java | 48 - .../core/expression/ExpressionError.java | 118 - .../expression/ExpressionGlobalVariables.java | 35 - .../core/expression/ExpressionTemplate.java | 38 - .../expression/ExpressionTemplateContext.java | 98 - .../interpreter/AstInterpreter.java | 67 - .../interpreter/JavaReflection.java | 365 - .../expression/interpreter/Reflection.java | 39 - .../core/expression/parsing/Ast.java | 1320 - .../expression/parsing/CharacterStream.java | 129 - .../core/expression/parsing/Parser.java | 242 - .../core/expression/parsing/Span.java | 145 - .../core/expression/parsing/Token.java | 30 - .../core/expression/parsing/TokenStream.java | 132 - .../core/expression/parsing/TokenType.java | 101 - .../core/expression/parsing/Tokenizer.java | 192 - spider/spiderflow/core/io/HttpRequest.java | 129 - spider/spiderflow/core/io/HttpResponse.java | 105 - spider/spiderflow/core/job/SpiderJob.java | 96 - .../spiderflow/core/job/SpiderJobContext.java | 52 - .../spiderflow/core/job/SpiderJobManager.java | 88 - .../core/mapper/DataSourceMapper.java | 15 - .../core/mapper/SpiderFlowMapper.java | 72 - spider/spiderflow/core/mapper/TaskMapper.java | 9 - .../core/mapper/VariableMapper.java | 7 - spider/spiderflow/core/model/DataSource.java | 91 - spider/spiderflow/core/model/SpiderFlow.java | 135 - spider/spiderflow/core/model/Task.java | 52 - spider/spiderflow/core/model/Variable.java | 62 - .../core/serializer/FastJsonSerializer.java | 41 - .../core/service/DataSourceService.java | 13 - .../core/service/SpiderFlowService.java | 183 - .../spiderflow/core/service/TaskService.java | 11 - .../core/service/VariableService.java | 36 - .../core/utils/DataSourceUtils.java | 64 - .../spiderflow/core/utils/ExtractUtils.java | 185 - spider/spiderflow/core/utils/FileUtils.java | 249 - .../core/utils/SpiderFlowUtils.java | 93 - .../spiderflow/executor/FunctionExecutor.java | 7 - .../executor/FunctionExtension.java | 6 - spider/spiderflow/executor/PluginConfig.java | 9 - spider/spiderflow/executor/ShapeExecutor.java | 46 - .../spiderflow/expression/DynamicMethod.java | 9 - spider/spiderflow/io/Line.java | 49 - .../spiderflow/io/RandomAccessFileReader.java | 146 - spider/spiderflow/io/SpiderResponse.java | 58 - .../spiderflow/listener/SpiderListener.java | 17 - .../logback/SpiderFlowFileAppender.java | 36 - .../logback/SpiderFlowWebSocketAppender.java | 32 - spider/spiderflow/model/Grammer.java | 109 - spider/spiderflow/model/JsonBean.java | 49 - spider/spiderflow/model/Plugin.java | 30 - spider/spiderflow/model/Shape.java | 54 - spider/spiderflow/model/SpiderLog.java | 61 - spider/spiderflow/model/SpiderNameValue.java | 37 - spider/spiderflow/model/SpiderNode.java | 127 - spider/spiderflow/model/SpiderOutput.java | 70 - .../model/SpiderWebSocketContext.java | 49 - spider/spiderflow/model/WebSocketEvent.java | 51 - spider/spiderflow/utils/Maps.java | 31 - .../websocket/WebSocketEditorServer.java | 57 - src/Test_1.java | 9 - 276 files changed, 102 insertions(+), 152773 deletions(-) create mode 100644 .settings/org.eclipse.jdt.ui.prefs create mode 100644 .settings/org.eclipse.ltk.core.refactoring.prefs create mode 100644 Base/com/baseType/TestByte.java rename src/test/java/Junit/JUnit4-5.docx => JUnit4-5.docx (100%) delete mode 100644 spider/pom.xml delete mode 100644 spider/resources/application.properties delete mode 100644 spider/resources/logback-spring.xml delete mode 100644 spider/resources/static/css/easyui.css delete mode 100644 spider/resources/static/css/editor.css delete mode 100644 spider/resources/static/css/index.css delete mode 100644 spider/resources/static/css/layui-blue.css delete mode 100644 spider/resources/static/datasource-edit.html delete mode 100644 spider/resources/static/datasources.html delete mode 100644 spider/resources/static/editCron.html delete mode 100644 spider/resources/static/editor.html delete mode 100644 spider/resources/static/favicon.ico delete mode 100644 spider/resources/static/index.html delete mode 100644 spider/resources/static/js/canvas-viewer.js delete mode 100644 spider/resources/static/js/codemirror/codemirror.css delete mode 100644 spider/resources/static/js/codemirror/codemirror.js delete mode 100644 spider/resources/static/js/codemirror/idea.css delete mode 100644 spider/resources/static/js/codemirror/placeholder.js delete mode 100644 spider/resources/static/js/codemirror/show-hint.css delete mode 100644 spider/resources/static/js/codemirror/show-hint.js delete mode 100644 spider/resources/static/js/codemirror/spiderflow-hint.js delete mode 100644 spider/resources/static/js/codemirror/spiderflow.js delete mode 100644 spider/resources/static/js/codemirror/sql.js delete mode 100644 spider/resources/static/js/common.js delete mode 100644 spider/resources/static/js/cron/cron.js delete mode 100644 spider/resources/static/js/cron/easyui.min.css delete mode 100644 spider/resources/static/js/cron/images/spinner_arrows.png delete mode 100644 spider/resources/static/js/cron/images/tabs_icons.png delete mode 100644 spider/resources/static/js/cron/jquery-2.1.4.min.js delete mode 100644 spider/resources/static/js/cron/jquery.easyui.min.js delete mode 100644 spider/resources/static/js/editor.js delete mode 100644 spider/resources/static/js/index.js delete mode 100644 spider/resources/static/js/jquery.easyui.min.js delete mode 100644 spider/resources/static/js/jsontree/icons.svg delete mode 100644 spider/resources/static/js/jsontree/jsontree.css delete mode 100644 spider/resources/static/js/jsontree/jsontree.js delete mode 100644 spider/resources/static/js/layui/css/layui.css delete mode 100644 spider/resources/static/js/layui/css/layui.mobile.css delete mode 100644 spider/resources/static/js/layui/css/modules/code.css delete mode 100644 spider/resources/static/js/layui/css/modules/laydate/default/laydate.css delete mode 100644 spider/resources/static/js/layui/css/modules/layer/default/icon-ext.png delete mode 100644 spider/resources/static/js/layui/css/modules/layer/default/icon.png delete mode 100644 spider/resources/static/js/layui/css/modules/layer/default/layer.css delete mode 100644 spider/resources/static/js/layui/css/modules/layer/default/loading-0.gif delete mode 100644 spider/resources/static/js/layui/css/modules/layer/default/loading-1.gif delete mode 100644 spider/resources/static/js/layui/css/modules/layer/default/loading-2.gif delete mode 100644 spider/resources/static/js/layui/ext/eleTree/eleTree.css delete mode 100644 spider/resources/static/js/layui/ext/eleTree/eleTree.js delete mode 100644 spider/resources/static/js/layui/ext/treeselect/treeselect.js delete mode 100644 spider/resources/static/js/layui/extends/formSelects-v4.css delete mode 100644 spider/resources/static/js/layui/extends/formSelects-v4.js delete mode 100644 spider/resources/static/js/layui/extends/treeGrid.js delete mode 100644 spider/resources/static/js/layui/font/iconfont.eot delete mode 100644 spider/resources/static/js/layui/font/iconfont.svg delete mode 100644 spider/resources/static/js/layui/font/iconfont.ttf delete mode 100644 spider/resources/static/js/layui/font/iconfont.woff delete mode 100644 spider/resources/static/js/layui/images/face/0.gif delete mode 100644 spider/resources/static/js/layui/images/face/1.gif delete mode 100644 spider/resources/static/js/layui/images/face/10.gif delete mode 100644 spider/resources/static/js/layui/images/face/11.gif delete mode 100644 spider/resources/static/js/layui/images/face/12.gif delete mode 100644 spider/resources/static/js/layui/images/face/13.gif delete mode 100644 spider/resources/static/js/layui/images/face/14.gif delete mode 100644 spider/resources/static/js/layui/images/face/15.gif delete mode 100644 spider/resources/static/js/layui/images/face/16.gif delete mode 100644 spider/resources/static/js/layui/images/face/17.gif delete mode 100644 spider/resources/static/js/layui/images/face/18.gif delete mode 100644 spider/resources/static/js/layui/images/face/19.gif delete mode 100644 spider/resources/static/js/layui/images/face/2.gif delete mode 100644 spider/resources/static/js/layui/images/face/20.gif delete mode 100644 spider/resources/static/js/layui/images/face/21.gif delete mode 100644 spider/resources/static/js/layui/images/face/22.gif delete mode 100644 spider/resources/static/js/layui/images/face/23.gif delete mode 100644 spider/resources/static/js/layui/images/face/24.gif delete mode 100644 spider/resources/static/js/layui/images/face/25.gif delete mode 100644 spider/resources/static/js/layui/images/face/26.gif delete mode 100644 spider/resources/static/js/layui/images/face/27.gif delete mode 100644 spider/resources/static/js/layui/images/face/28.gif delete mode 100644 spider/resources/static/js/layui/images/face/29.gif delete mode 100644 spider/resources/static/js/layui/images/face/3.gif delete mode 100644 spider/resources/static/js/layui/images/face/30.gif delete mode 100644 spider/resources/static/js/layui/images/face/31.gif delete mode 100644 spider/resources/static/js/layui/images/face/32.gif delete mode 100644 spider/resources/static/js/layui/images/face/33.gif delete mode 100644 spider/resources/static/js/layui/images/face/34.gif delete mode 100644 spider/resources/static/js/layui/images/face/35.gif delete mode 100644 spider/resources/static/js/layui/images/face/36.gif delete mode 100644 spider/resources/static/js/layui/images/face/37.gif delete mode 100644 spider/resources/static/js/layui/images/face/38.gif delete mode 100644 spider/resources/static/js/layui/images/face/39.gif delete mode 100644 spider/resources/static/js/layui/images/face/4.gif delete mode 100644 spider/resources/static/js/layui/images/face/40.gif delete mode 100644 spider/resources/static/js/layui/images/face/41.gif delete mode 100644 spider/resources/static/js/layui/images/face/42.gif delete mode 100644 spider/resources/static/js/layui/images/face/43.gif delete mode 100644 spider/resources/static/js/layui/images/face/44.gif delete mode 100644 spider/resources/static/js/layui/images/face/45.gif delete mode 100644 spider/resources/static/js/layui/images/face/46.gif delete mode 100644 spider/resources/static/js/layui/images/face/47.gif delete mode 100644 spider/resources/static/js/layui/images/face/48.gif delete mode 100644 spider/resources/static/js/layui/images/face/49.gif delete mode 100644 spider/resources/static/js/layui/images/face/5.gif delete mode 100644 spider/resources/static/js/layui/images/face/50.gif delete mode 100644 spider/resources/static/js/layui/images/face/51.gif delete mode 100644 spider/resources/static/js/layui/images/face/52.gif delete mode 100644 spider/resources/static/js/layui/images/face/53.gif delete mode 100644 spider/resources/static/js/layui/images/face/54.gif delete mode 100644 spider/resources/static/js/layui/images/face/55.gif delete mode 100644 spider/resources/static/js/layui/images/face/56.gif delete mode 100644 spider/resources/static/js/layui/images/face/57.gif delete mode 100644 spider/resources/static/js/layui/images/face/58.gif delete mode 100644 spider/resources/static/js/layui/images/face/59.gif delete mode 100644 spider/resources/static/js/layui/images/face/6.gif delete mode 100644 spider/resources/static/js/layui/images/face/60.gif delete mode 100644 spider/resources/static/js/layui/images/face/61.gif delete mode 100644 spider/resources/static/js/layui/images/face/62.gif delete mode 100644 spider/resources/static/js/layui/images/face/63.gif delete mode 100644 spider/resources/static/js/layui/images/face/64.gif delete mode 100644 spider/resources/static/js/layui/images/face/65.gif delete mode 100644 spider/resources/static/js/layui/images/face/66.gif delete mode 100644 spider/resources/static/js/layui/images/face/67.gif delete mode 100644 spider/resources/static/js/layui/images/face/68.gif delete mode 100644 spider/resources/static/js/layui/images/face/69.gif delete mode 100644 spider/resources/static/js/layui/images/face/7.gif delete mode 100644 spider/resources/static/js/layui/images/face/70.gif delete mode 100644 spider/resources/static/js/layui/images/face/71.gif delete mode 100644 spider/resources/static/js/layui/images/face/8.gif delete mode 100644 spider/resources/static/js/layui/images/face/9.gif delete mode 100644 spider/resources/static/js/layui/layui.all.js delete mode 100644 spider/resources/static/js/log-viewer.js delete mode 100644 spider/resources/static/js/mxgraph/css/common.css delete mode 100644 spider/resources/static/js/mxgraph/css/explorer.css delete mode 100644 spider/resources/static/js/mxgraph/mxgraph.js delete mode 100644 spider/resources/static/js/mxgraph/mxgraph.min.js delete mode 100644 spider/resources/static/js/mxgraph/resources/editor.txt delete mode 100644 spider/resources/static/js/mxgraph/resources/editor_de.txt delete mode 100644 spider/resources/static/js/mxgraph/resources/editor_zh.txt delete mode 100644 spider/resources/static/js/mxgraph/resources/graph.txt delete mode 100644 spider/resources/static/js/mxgraph/resources/graph_de.txt delete mode 100644 spider/resources/static/js/mxgraph/resources/graph_zh.txt delete mode 100644 spider/resources/static/js/spider-editor.js delete mode 100644 spider/resources/static/log.html delete mode 100644 spider/resources/static/resources/templates/edge.html delete mode 100644 spider/resources/static/resources/templates/executeSql.html delete mode 100644 spider/resources/static/resources/templates/function.html delete mode 100644 spider/resources/static/resources/templates/loop.html delete mode 100644 spider/resources/static/resources/templates/loopJoin.html delete mode 100644 spider/resources/static/resources/templates/output.html delete mode 100644 spider/resources/static/resources/templates/process.html delete mode 100644 spider/resources/static/resources/templates/request.html delete mode 100644 spider/resources/static/resources/templates/root.html delete mode 100644 spider/resources/static/resources/templates/start.html delete mode 100644 spider/resources/static/resources/templates/variable.html delete mode 100644 spider/resources/static/spiderList.html delete mode 100644 spider/resources/static/task.html delete mode 100644 spider/resources/static/variable-edit.html delete mode 100644 spider/resources/static/variables.html delete mode 100644 spider/spiderflow/ExpressionEngine.java delete mode 100644 spider/spiderflow/Grammerable.java delete mode 100644 spider/spiderflow/SpiderApplication.java delete mode 100644 spider/spiderflow/annotation/Comment.java delete mode 100644 spider/spiderflow/annotation/Example.java delete mode 100644 spider/spiderflow/annotation/Return.java delete mode 100644 spider/spiderflow/common/CURDController.java delete mode 100644 spider/spiderflow/concurrent/SpiderFlowThreadPoolExecutor.java delete mode 100644 spider/spiderflow/configuration/ResourcesConfiguration.java delete mode 100644 spider/spiderflow/configuration/WebSocketConfiguration.java delete mode 100644 spider/spiderflow/context/CookieContext.java delete mode 100644 spider/spiderflow/context/RunnableNode.java delete mode 100644 spider/spiderflow/context/RunnableTreeNode.java delete mode 100644 spider/spiderflow/context/SpiderContext.java delete mode 100644 spider/spiderflow/context/SpiderContextHolder.java delete mode 100644 spider/spiderflow/controller/DataSourceController.java delete mode 100644 spider/spiderflow/controller/SpiderFlowController.java delete mode 100644 spider/spiderflow/controller/SpiderRestController.java delete mode 100644 spider/spiderflow/controller/TaskController.java delete mode 100644 spider/spiderflow/controller/VariableController.java delete mode 100644 spider/spiderflow/core/Spider.java delete mode 100644 spider/spiderflow/core/executor/function/Base64FunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/DateFunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/ExtractFunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/FileFunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/JsonFunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/ListFunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/MD5FunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/RandomFunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/StringFunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/ThreadFunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/UrlFunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/function/extension/ArrayFunctionExtension.java delete mode 100644 spider/spiderflow/core/executor/function/extension/DateFunctionExtension.java delete mode 100644 spider/spiderflow/core/executor/function/extension/ElementFunctionExtension.java delete mode 100644 spider/spiderflow/core/executor/function/extension/ElementsFunctionExtension.java delete mode 100644 spider/spiderflow/core/executor/function/extension/ListFunctionExtension.java delete mode 100644 spider/spiderflow/core/executor/function/extension/MapFunctionExtension.java delete mode 100644 spider/spiderflow/core/executor/function/extension/ObjectFunctionExtension.java delete mode 100644 spider/spiderflow/core/executor/function/extension/ResponseFunctionExtension.java delete mode 100644 spider/spiderflow/core/executor/function/extension/StringFunctionExtension.java delete mode 100644 spider/spiderflow/core/executor/shape/ExecuteSQLExecutor.java delete mode 100644 spider/spiderflow/core/executor/shape/FunctionExecutor.java delete mode 100644 spider/spiderflow/core/executor/shape/LoopExecutor.java delete mode 100644 spider/spiderflow/core/executor/shape/LoopJoinExecutor.java delete mode 100644 spider/spiderflow/core/executor/shape/OutputExecutor.java delete mode 100644 spider/spiderflow/core/executor/shape/ProcessExecutor.java delete mode 100644 spider/spiderflow/core/executor/shape/RequestExecutor.java delete mode 100644 spider/spiderflow/core/executor/shape/StartExecutor.java delete mode 100644 spider/spiderflow/core/executor/shape/VariableExecutor.java delete mode 100644 spider/spiderflow/core/expression/DefaultExpressionEngine.java delete mode 100644 spider/spiderflow/core/expression/ExpressionError.java delete mode 100644 spider/spiderflow/core/expression/ExpressionGlobalVariables.java delete mode 100644 spider/spiderflow/core/expression/ExpressionTemplate.java delete mode 100644 spider/spiderflow/core/expression/ExpressionTemplateContext.java delete mode 100644 spider/spiderflow/core/expression/interpreter/AstInterpreter.java delete mode 100644 spider/spiderflow/core/expression/interpreter/JavaReflection.java delete mode 100644 spider/spiderflow/core/expression/interpreter/Reflection.java delete mode 100644 spider/spiderflow/core/expression/parsing/Ast.java delete mode 100644 spider/spiderflow/core/expression/parsing/CharacterStream.java delete mode 100644 spider/spiderflow/core/expression/parsing/Parser.java delete mode 100644 spider/spiderflow/core/expression/parsing/Span.java delete mode 100644 spider/spiderflow/core/expression/parsing/Token.java delete mode 100644 spider/spiderflow/core/expression/parsing/TokenStream.java delete mode 100644 spider/spiderflow/core/expression/parsing/TokenType.java delete mode 100644 spider/spiderflow/core/expression/parsing/Tokenizer.java delete mode 100644 spider/spiderflow/core/io/HttpRequest.java delete mode 100644 spider/spiderflow/core/io/HttpResponse.java delete mode 100644 spider/spiderflow/core/job/SpiderJob.java delete mode 100644 spider/spiderflow/core/job/SpiderJobContext.java delete mode 100644 spider/spiderflow/core/job/SpiderJobManager.java delete mode 100644 spider/spiderflow/core/mapper/DataSourceMapper.java delete mode 100644 spider/spiderflow/core/mapper/SpiderFlowMapper.java delete mode 100644 spider/spiderflow/core/mapper/TaskMapper.java delete mode 100644 spider/spiderflow/core/mapper/VariableMapper.java delete mode 100644 spider/spiderflow/core/model/DataSource.java delete mode 100644 spider/spiderflow/core/model/SpiderFlow.java delete mode 100644 spider/spiderflow/core/model/Task.java delete mode 100644 spider/spiderflow/core/model/Variable.java delete mode 100644 spider/spiderflow/core/serializer/FastJsonSerializer.java delete mode 100644 spider/spiderflow/core/service/DataSourceService.java delete mode 100644 spider/spiderflow/core/service/SpiderFlowService.java delete mode 100644 spider/spiderflow/core/service/TaskService.java delete mode 100644 spider/spiderflow/core/service/VariableService.java delete mode 100644 spider/spiderflow/core/utils/DataSourceUtils.java delete mode 100644 spider/spiderflow/core/utils/ExtractUtils.java delete mode 100644 spider/spiderflow/core/utils/FileUtils.java delete mode 100644 spider/spiderflow/core/utils/SpiderFlowUtils.java delete mode 100644 spider/spiderflow/executor/FunctionExecutor.java delete mode 100644 spider/spiderflow/executor/FunctionExtension.java delete mode 100644 spider/spiderflow/executor/PluginConfig.java delete mode 100644 spider/spiderflow/executor/ShapeExecutor.java delete mode 100644 spider/spiderflow/expression/DynamicMethod.java delete mode 100644 spider/spiderflow/io/Line.java delete mode 100644 spider/spiderflow/io/RandomAccessFileReader.java delete mode 100644 spider/spiderflow/io/SpiderResponse.java delete mode 100644 spider/spiderflow/listener/SpiderListener.java delete mode 100644 spider/spiderflow/logback/SpiderFlowFileAppender.java delete mode 100644 spider/spiderflow/logback/SpiderFlowWebSocketAppender.java delete mode 100644 spider/spiderflow/model/Grammer.java delete mode 100644 spider/spiderflow/model/JsonBean.java delete mode 100644 spider/spiderflow/model/Plugin.java delete mode 100644 spider/spiderflow/model/Shape.java delete mode 100644 spider/spiderflow/model/SpiderLog.java delete mode 100644 spider/spiderflow/model/SpiderNameValue.java delete mode 100644 spider/spiderflow/model/SpiderNode.java delete mode 100644 spider/spiderflow/model/SpiderOutput.java delete mode 100644 spider/spiderflow/model/SpiderWebSocketContext.java delete mode 100644 spider/spiderflow/model/WebSocketEvent.java delete mode 100644 spider/spiderflow/utils/Maps.java delete mode 100644 spider/spiderflow/websocket/WebSocketEditorServer.java diff --git a/.classpath b/.classpath index 32b2c56..b2b208e 100644 --- a/.classpath +++ b/.classpath @@ -8,27 +8,14 @@ - + - - - - - - - - - - - - - diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index f9fe345..8dd9b1d 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,4 +1,3 @@ eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 encoding//src/test/java=UTF-8 encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..b4bd7a9 --- /dev/null +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,61 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=true +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/.settings/org.eclipse.ltk.core.refactoring.prefs b/.settings/org.eclipse.ltk.core.refactoring.prefs new file mode 100644 index 0000000..b196c64 --- /dev/null +++ b/.settings/org.eclipse.ltk.core.refactoring.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false diff --git a/Base/com/baseType/TestByte.java b/Base/com/baseType/TestByte.java new file mode 100644 index 0000000..06f64b1 --- /dev/null +++ b/Base/com/baseType/TestByte.java @@ -0,0 +1,31 @@ +package com.baseType; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +public class TestByte { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + // TODO Auto-generated method stub + byte[] arr = new byte[4]; + arr[0] = 0x78; + arr[1] = 0x56; + arr[2] = 0x34; + arr[3] = 0x12; + + ByteArrayInputStream bais = new ByteArrayInputStream(arr); + DataInputStream dis = new DataInputStream(bais); + try { + System.out.println(Integer.toHexString(dis.readInt())); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + +} diff --git a/src/test/java/Junit/JUnit4-5.docx b/JUnit4-5.docx similarity index 100% rename from src/test/java/Junit/JUnit4-5.docx rename to JUnit4-5.docx diff --git a/pom.xml b/pom.xml index a174f85..1c03545 100644 --- a/pom.xml +++ b/pom.xml @@ -1,15 +1,6 @@ - - - 4.0.0 - com.aliyun + JavaBase 4.4.9 @@ -57,11 +48,8 @@ - 2.0.4 - 3.2.4 - 0.3.2 UTF-8 @@ -72,11 +60,6 @@ org.springframework.boot spring-boot-starter-websocket - - org.spiderflow - spider-flow-core - ${spider-flow.version} - @@ -92,16 +75,6 @@ commons-codec commons-codec - - org.jsoup - jsoup - 1.11.3 - - - us.codecraft - xsoup - 0.3.1 - @@ -113,11 +86,6 @@ - - org.spiderflow - spider-flow-api - ${spider-flow.version} - org.springframework.boot spring-boot-starter-web @@ -158,12 +126,6 @@ - - junit - junit - 4.12 - test - com.google.code.gson gson @@ -205,24 +167,9 @@ ${powermock.version} test - - org.powermock - powermock-reflect - ${powermock.version} - test - - - org.powermock - powermock-module-junit4 - ${powermock.version} - test - - - org.powermock - powermock-api-mockito2 - ${powermock.version} - test - + + + org.jacoco org.jacoco.agent @@ -235,22 +182,8 @@ 1.18.10 provided - - org.ini4j - ini4j - 0.5.4 - - - org.slf4j - slf4j-api - 1.7.30 - - - org.slf4j - slf4j-simple - 1.7.30 - test - + + @@ -436,4 +369,5 @@ + net.vunited \ No newline at end of file diff --git a/spider/pom.xml b/spider/pom.xml deleted file mode 100644 index e9bbfa2..0000000 --- a/spider/pom.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - 4.0.0 - - org.spiderflow - spider-flow - 0.3.2 - - spider-flow-web - spider-flow-web - https://gitee.com/jmxd/spider-flow/tree/master/spider-flow-web - - UTF-8 - - - - org.springframework.boot - spring-boot-starter-websocket - - - org.spiderflow - spider-flow-core - ${spider-flow.version} - - - - - org.springframework.boot - spring-boot-starter-quartz - - - commons-io - commons-io - 2.6 - - - commons-codec - commons-codec - - - org.jsoup - jsoup - 1.11.3 - - - us.codecraft - xsoup - 0.3.1 - - - - - - - - - - - - - - org.spiderflow - spider-flow-api - ${spider-flow.version} - - - org.springframework.boot - spring-boot-starter-web - - - com.alibaba - fastjson - 1.2.58 - - - org.apache.commons - commons-text - 1.6 - - - com.baomidou - mybatis-plus-boot-starter - 3.1.0 - - - org.springframework - spring-jdbc - - - mysql - mysql-connector-java - - - com.alibaba - druid-spring-boot-starter - 1.1.16 - - - com.alibaba - transmittable-thread-local - 2.11.2 - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - spider-flow - org.spiderflow.SpiderApplication - - - - - diff --git a/spider/resources/application.properties b/spider/resources/application.properties deleted file mode 100644 index 91b182d..0000000 --- a/spider/resources/application.properties +++ /dev/null @@ -1,34 +0,0 @@ -server.port=8088 - -logging.level.root=INFO -#logging.level.org.spiderflow=DEBUG -#平台最大线程数 -spider.thread.max=64 -#单任务默认最大线程数 -spider.thread.default=8 -#设置为true时定时任务才生效 -spider.job.enable=false -#爬虫任务的执行日志保存路径 -spider.job.log.path=/data/spider/logs/ -#死循环检测(节点执行次数超过该值时认为是死循环)默认值为5000 -#spider.detect.dead-cycle=5000 - -spring.jackson.date-format=yyyy-MM-dd HH:mm:ss -spring.jackson.time-zone=GMT+8 -spring.jackson.serialization.fail_on_empty_beans=false - -spring.mvc.favicon.enabled=false - -spring.datasource.driver-class-name=com.mysql.jdbc.Driver -spring.datasource.username=root -spring.datasource.password=root -spring.datasource.url=jdbc:mysql://localhost:3306/spiderflow?useSSL=false&useUnicode=true&characterEncoding=UTF8&autoReconnect=true - -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration - -#selenium 插件配置 - -#设置chrome的WebDriver驱动路径,下载地址:http://npm.taobao.org/mirrors/chromedriver/,注意版本问题 -#selenium.driver.chrome=E:/driver/chromedriver.exe -#设置fireFox的WebDriver驱动路径,下载地址:https://github.com/mozilla/geckodriver/releases -#selenium.driver.firefox=E:/driver/geckodriver.exe \ No newline at end of file diff --git a/spider/resources/logback-spring.xml b/spider/resources/logback-spring.xml deleted file mode 100644 index 8ba8f17..0000000 --- a/spider/resources/logback-spring.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n - - - - - ${LOG_HOME}/spider-flow.log - true - - - %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n - - - - - - - - - - - \ No newline at end of file diff --git a/spider/resources/static/css/easyui.css b/spider/resources/static/css/easyui.css deleted file mode 100644 index acf5c04..0000000 --- a/spider/resources/static/css/easyui.css +++ /dev/null @@ -1,2 +0,0 @@ -.panel{overflow:hidden;text-align:left}.panel-header,.panel-body{border-width:1px;border-style:solid}.panel-header{padding:5px;position:relative}.panel-title{background:url('images/blank.gif') no-repeat}.panel-header-noborder{border-width:0 0 1px 0}.panel-body{overflow:auto;border-top-width:0}.panel-body-noheader{border-top-width:1px}.panel-body-noborder{border-width:0}.panel-with-icon{padding-left:18px}.panel-icon,.panel-tool{position:absolute;top:50%;margin-top:-8px;height:16px;overflow:hidden}.panel-icon{left:5px;width:16px}.panel-tool{right:5px;width:auto}.panel-tool a{display:inline-block;width:16px;height:16px;opacity:.6;filter:alpha(opacity=60);margin:0 0 0 2px;vertical-align:top}.panel-tool a:hover{opacity:1;filter:alpha(opacity=100);background-color:#e6e6e6;-moz-border-radius:3px 3px 3px 3px;-webkit-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px}.panel-loading{padding:11px 0 10px 30px}.panel-noscroll{overflow:hidden}.panel-fit,.panel-fit body{height:100%;margin:0;padding:0;border:0;overflow:hidden}.panel-loading{background:url('images/loading.gif') no-repeat 10px 10px}.panel-tool-close{background:url('images/panel_tools.png') no-repeat -16px 0}.panel-tool-min{background:url('images/panel_tools.png') no-repeat 0 0}.panel-tool-max{background:url('images/panel_tools.png') no-repeat 0 -16px}.panel-tool-restore{background:url('images/panel_tools.png') no-repeat -16px -16px}.panel-tool-collapse{background:url('images/panel_tools.png') no-repeat -32px 0}.panel-tool-expand{background:url('images/panel_tools.png') no-repeat -32px -16px}.panel-header,.panel-body{border-color:#d4d4d4}.panel-header{background-color:#f2f2f2;background:-webkit-linear-gradient(top,#fff 0,#f2f2f2 100%);background:-moz-linear-gradient(top,#fff 0,#f2f2f2 100%);background:-o-linear-gradient(top,#fff 0,#f2f2f2 100%);background:linear-gradient(to bottom,#fff 0,#f2f2f2 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0)}.panel-title{font-size:12px;font-weight:bold;color:#777;height:16px;line-height:16px}.panel-body{background-color:#fff;color:#333;font-size:12px;padding:10px 8px 8px 8px}.panel-body .line{height:25px;margin:3px}.panel-body .imp{padding-left:25px}.panel-body .col{width:60px}.panel-body ul{list-style:none;padding-left:10px}.panel-body li{height:20px}.accordion{overflow:hidden;border-width:1px;border-style:solid}.accordion .accordion-header{border-width:0 0 1px;cursor:pointer}.accordion .accordion-body{border-width:0 0 1px}.accordion-noborder{border-width:0}.accordion-noborder .accordion-header{border-width:0 0 1px}.accordion-noborder .accordion-body{border-width:0 0 1px}.accordion-collapse{background:url('images/accordion_arrows.png') no-repeat 0 0}.accordion-expand{background:url('images/accordion_arrows.png') no-repeat -16px 0}.accordion{background:#fff;border-color:#d4d4d4}.accordion .accordion-header{background:#f2f2f2;filter:none}.accordion .accordion-header-selected{background:#0081c2}.accordion .accordion-header-selected .panel-title{color:#fff}.window{overflow:hidden;padding:5px;border-width:1px;border-style:solid}.window .window-header{background:transparent;padding:0 0 6px 0}.window .window-body{border-width:1px;border-style:solid;border-top-width:0}.window .window-body-noheader{border-top-width:1px}.window .window-header .panel-icon,.window .window-header .panel-tool{top:50%;margin-top:-11px}.window .window-header .panel-icon{left:1px}.window .window-header .panel-tool{right:1px}.window .window-header .panel-with-icon{padding-left:18px}.window-proxy{position:absolute;overflow:hidden}.window-proxy-mask{position:absolute;filter:alpha(opacity=5);opacity:.05}.window-mask{position:absolute;left:0;top:0;width:100%;height:100%;filter:alpha(opacity=40);opacity:.40;font-size:1px;*zoom:1;overflow:hidden}.window,.window-shadow{position:absolute;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}.window-shadow{background:#ccc;-moz-box-shadow:2px 2px 3px #ccc;-webkit-box-shadow:2px 2px 3px #ccc;box-shadow:2px 2px 3px #ccc;filter:progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2)}.window,.window .window-body{border-color:#d4d4d4}.window{background-color:#f2f2f2;background:-webkit-linear-gradient(top,#fff 0,#f2f2f2 20%);background:-moz-linear-gradient(top,#fff 0,#f2f2f2 20%);background:-o-linear-gradient(top,#fff 0,#f2f2f2 20%);background:linear-gradient(to bottom,#fff 0,#f2f2f2 20%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0)}.window-proxy{border:1px dashed #d4d4d4}.window-proxy-mask,.window-mask{background:#ccc}.dialog-content{overflow:auto}.dialog-toolbar{padding:2px 5px}.dialog-tool-separator{float:left;height:24px;border-left:1px solid #ccc;border-right:1px solid #fff;margin:2px 1px}.dialog-button{padding:5px;text-align:right}.dialog-button .l-btn{margin-left:5px}.dialog-toolbar,.dialog-button{background:#f5f5f5}.dialog-toolbar{border-bottom:1px solid #e6e6e6}.dialog-button{border-top:1px solid #e6e6e6}.combo{display:inline-block;white-space:nowrap;margin:0;padding:0;border-width:1px;border-style:solid;overflow:hidden;vertical-align:middle}.combo .combo-text{font-size:12px;border:0;line-height:20px;height:20px;margin:0;padding:0 2px;*margin-top:-1px;*height:18px;*line-height:18px;_height:18px;_line-height:18px;vertical-align:baseline}.combo-arrow{width:18px;height:20px;overflow:hidden;display:inline-block;vertical-align:top;cursor:pointer;opacity:.6;filter:alpha(opacity=60)}.combo-arrow-hover{opacity:1.0;filter:alpha(opacity=100)}.combo-panel{overflow:auto}.combo-arrow{background:url('images/combo_arrow.png') no-repeat center center}.combo,.combo-panel{background-color:#fff}.combo{border-color:#d4d4d4;background-color:#fff}.combo-arrow{background-color:#f2f2f2}.combo-arrow-hover{background-color:#e6e6e6}.combobox-item{padding:2px;font-size:12px;padding:3px;padding-right:0}.combobox-item-hover{background-color:#e6e6e6;color:#00438a}.combobox-item-selected{background-color:#0081c2;color:#fff}.layout{position:relative;overflow:hidden;margin:0;padding:0;z-index:0}.layout-panel{position:absolute;overflow:hidden}.layout-panel-east,.layout-panel-west{z-index:2}.layout-panel-north,.layout-panel-south{z-index:3}.layout-expand{position:absolute;padding:0;font-size:1px;cursor:pointer;z-index:1}.layout-expand .panel-header,.layout-expand .panel-body{background:transparent;filter:none;overflow:hidden}.layout-expand .panel-header{border-bottom-width:0}.layout-split-proxy-h,.layout-split-proxy-v{position:absolute;font-size:1px;display:none;z-index:5}.layout-split-proxy-h{width:5px;cursor:e-resize}.layout-split-proxy-v{height:5px;cursor:n-resize}.layout-mask{position:absolute;background:#fafafa;filter:alpha(opacity=10);opacity:.10;z-index:4}.layout-button-up{background:url('images/layout_arrows.png') no-repeat -16px -16px}.layout-button-down{background:url('images/layout_arrows.png') no-repeat -16px 0}.layout-button-left{background:url('images/layout_arrows.png') no-repeat 0 0}.layout-button-right{background:url('images/layout_arrows.png') no-repeat 0 -16px}.layout-split-proxy-h,.layout-split-proxy-v{background-color:#bbb}.layout-split-north{border-bottom:5px solid #eee}.layout-split-south{border-top:5px solid #eee}.layout-split-east{border-left:5px solid #eee}.layout-split-west{border-right:5px solid #eee}.layout-expand{background-color:#f2f2f2}.layout-expand-over{background-color:#f2f2f2}.tabs-container{overflow:hidden}.tabs-header{border-width:1px;border-style:solid;border-bottom-width:0;position:relative;padding:0;padding-top:2px;overflow:hidden}.tabs-header-plain{border:0;background:transparent}.tabs-scroller-left,.tabs-scroller-right{position:absolute;top:auto;bottom:0;width:18px;height:28px!important;height:30px;font-size:1px;display:none;cursor:pointer;border-width:1px;border-style:solid}.tabs-scroller-left{left:0}.tabs-scroller-right{right:0}.tabs-header-plain .tabs-scroller-left,.tabs-header-plain .tabs-scroller-right{height:25px!important;height:27px}.tabs-tool{position:absolute;bottom:0;padding:1px;overflow:hidden;border-width:1px;border-style:solid}.tabs-header-plain .tabs-tool{padding:0 1px}.tabs-wrap{position:relative;left:0;overflow:hidden;width:100%;margin:0;padding:0}.tabs-scrolling{margin-left:18px;margin-right:18px}.tabs-disabled{opacity:.3;filter:alpha(opacity=30)}.tabs{list-style-type:none;height:26px;margin:0;padding:0;padding-left:4px;width:5000px;border-style:solid;border-width:0 0 1px 0}.tabs li{float:left;display:inline-block;margin:0 4px -1px 0;padding:0;position:relative;border:0}.tabs li a.tabs-inner{display:inline-block;text-decoration:none;margin:0;padding:0 10px;height:25px;line-height:25px;text-align:center;white-space:nowrap;border-width:1px;border-style:solid;-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.tabs li.tabs-selected a.tabs-inner{font-weight:bold;outline:0}.tabs li.tabs-selected a:hover.tabs-inner{cursor:default;pointer:default}.tabs li a.tabs-close,.tabs-p-tool{position:absolute;font-size:1px;display:block;height:12px;padding:0;top:50%;margin-top:-6px;overflow:hidden}.tabs li a.tabs-close{width:12px;right:5px;opacity:.6;filter:alpha(opacity=60)}.tabs-p-tool{right:16px}.tabs-p-tool a{display:inline-block;font-size:1px;width:12px;height:12px;margin:0;opacity:.6;filter:alpha(opacity=60)}.tabs li a:hover.tabs-close,.tabs-p-tool a:hover{opacity:1;filter:alpha(opacity=100);cursor:hand;cursor:pointer}.tabs-with-icon{padding-left:18px}.tabs-icon{position:absolute;width:16px;height:16px;left:10px;top:50%;margin-top:-8px}.tabs-title{font-size:12px}.tabs-closable{padding-right:8px}.tabs-panels{margin:0;padding:0;border-width:1px;border-style:solid;border-top-width:0;overflow:hidden}.tabs-header-bottom{border-width:0 1px 1px 1px;padding:0 0 2px 0}.tabs-header-bottom .tabs{border-width:1px 0 0 0}.tabs-header-bottom .tabs li{margin:-1px 4px 0 0}.tabs-header-bottom .tabs li a.tabs-inner{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}.tabs-header-bottom .tabs-tool{top:0}.tabs-header-bottom .tabs-scroller-left,.tabs-header-bottom .tabs-scroller-right{top:0;bottom:auto}.tabs-panels-top{border-width:1px 1px 0 1px}.tabs-header-left{float:left;border-width:1px 0 1px 1px;padding:0}.tabs-header-right{float:right;border-width:1px 1px 1px 0;padding:0}.tabs-header-left .tabs-wrap,.tabs-header-right .tabs-wrap{height:100%}.tabs-header-left .tabs{height:100%;padding:4px 0 0 4px;border-width:0 1px 0 0}.tabs-header-right .tabs{height:100%;padding:4px 4px 0 0;border-width:0 0 0 1px}.tabs-header-left .tabs li,.tabs-header-right .tabs li{display:block;width:100%;position:relative}.tabs-header-left .tabs li{left:auto;right:0;margin:0 -1px 4px 0;float:right}.tabs-header-right .tabs li{left:0;right:auto;margin:0 0 4px -1px;float:left}.tabs-header-left .tabs li a.tabs-inner{display:block;text-align:left;-moz-border-radius:5px 0 0 5px;-webkit-border-radius:5px 0 0 5px;border-radius:5px 0 0 5px}.tabs-header-right .tabs li a.tabs-inner{display:block;text-align:left;-moz-border-radius:0 5px 5px 0;-webkit-border-radius:0 5px 5px 0;border-radius:0 5px 5px 0}.tabs-panels-right{float:right;border-width:1px 1px 1px 0}.tabs-panels-left{float:left;border-width:1px 0 1px 1px}.tabs-header-noborder,.tabs-panels-noborder{border:0}.tabs-header-plain{border:0;background:transparent}.tabs-scroller-left{background:#f2f2f2 url('images/tabs_icons.png') no-repeat 1px center}.tabs-scroller-right{background:#f2f2f2 url('images/tabs_icons.png') no-repeat -15px center}.tabs li a.tabs-close{background:url('images/tabs_icons.png') no-repeat -34px center}.tabs li a.tabs-inner:hover{background:#e6e6e6;color:#00438a;filter:none}.tabs li.tabs-selected a.tabs-inner{background-color:#fff;color:#777;background:-webkit-linear-gradient(top,#fff 0,#fff 100%);background:-moz-linear-gradient(top,#fff 0,#fff 100%);background:-o-linear-gradient(top,#fff 0,#fff 100%);background:linear-gradient(to bottom,#fff 0,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0)}.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner{background:-webkit-linear-gradient(top,#fff 0,#fff 100%);background:-moz-linear-gradient(top,#fff 0,#fff 100%);background:-o-linear-gradient(top,#fff 0,#fff 100%);background:linear-gradient(to bottom,#fff 0,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0)}.tabs-header-left .tabs li.tabs-selected a.tabs-inner{background:-webkit-linear-gradient(left,#fff 0,#fff 100%);background:-moz-linear-gradient(left,#fff 0,#fff 100%);background:-o-linear-gradient(left,#fff 0,#fff 100%);background:linear-gradient(to right,#fff 0,#fff 100%);background-repeat:repeat-y;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1)}.tabs-header-right .tabs li.tabs-selected a.tabs-inner{background:-webkit-linear-gradient(left,#fff 0,#fff 100%);background:-moz-linear-gradient(left,#fff 0,#fff 100%);background:-o-linear-gradient(left,#fff 0,#fff 100%);background:linear-gradient(to right,#fff 0,#fff 100%);background-repeat:repeat-y;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1)}.tabs li a.tabs-inner{color:#777;background-color:#f2f2f2;background:-webkit-linear-gradient(top,#fff 0,#f2f2f2 100%);background:-moz-linear-gradient(top,#fff 0,#f2f2f2 100%);background:-o-linear-gradient(top,#fff 0,#f2f2f2 100%);background:linear-gradient(to bottom,#fff 0,#f2f2f2 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0)}.tabs-header,.tabs-tool{background-color:#f2f2f2}.tabs-header-plain{background:transparent}.tabs-header,.tabs-scroller-left,.tabs-scroller-right,.tabs-tool,.tabs,.tabs-panels,.tabs li a.tabs-inner,.tabs li.tabs-selected a.tabs-inner,.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner,.tabs-header-left .tabs li.tabs-selected a.tabs-inner,.tabs-header-right .tabs li.tabs-selected a.tabs-inner{border-color:#d4d4d4}.tabs-p-tool a:hover,.tabs li a:hover.tabs-close,.tabs-scroller-over{background-color:#e6e6e6}.tabs li.tabs-selected a.tabs-inner{border-bottom:1px solid #fff}.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner{border-top:1px solid #fff}.tabs-header-left .tabs li.tabs-selected a.tabs-inner{border-right:1px solid #fff}.tabs-header-right .tabs li.tabs-selected a.tabs-inner{border-left:1px solid #fff}a.l-btn{background-position:right 0;text-decoration:none;display:inline-block;zoom:1;height:24px;padding-right:18px;cursor:pointer;outline:0}a.l-btn-plain{padding-right:5px;border:0;padding:1px 6px 1px 1px}a.l-btn-disabled{color:#ccc;opacity:.5;filter:alpha(opacity=50);cursor:default}a.l-btn span.l-btn-left{display:inline-block;background-position:0 -48px;padding:4px 0 4px 18px;line-height:16px;height:16px}a.l-btn-plain span.l-btn-left{padding-left:5px}a.l-btn span span.l-btn-text{display:inline-block;vertical-align:baseline;width:auto;height:16px;line-height:16px;font-size:12px;padding:0;margin:0}a.l-btn span span.l-btn-icon-left{padding:0 0 0 20px;background-position:left center}a.l-btn span span.l-btn-icon-right{padding:0 20px 0 0;background-position:right center}a.l-btn span span span.l-btn-empty{display:inline-block;margin:0;padding:0;width:16px}a:hover.l-btn{background-position:right -24px;outline:0;text-decoration:none}a:hover.l-btn span.l-btn-left{background-position:0 bottom}a:hover.l-btn-plain{padding:0 5px 0 0}a:hover.l-btn-disabled{background-position:right 0}a:hover.l-btn-disabled span.l-btn-left{background-position:0 -48px}a.l-btn .l-btn-focus{outline:#00f dotted thin}a.l-btn{color:#444;background-image:url('images/linkbutton_bg.png');background-repeat:no-repeat;background:#f5f5f5;background-repeat:repeat-x;border:1px solid #bbb;background:-webkit-linear-gradient(top,#fff 0,#e6e6e6 100%);background:-moz-linear-gradient(top,#fff 0,#e6e6e6 100%);background:-o-linear-gradient(top,#fff 0,#e6e6e6 100%);background:linear-gradient(to bottom,#fff 0,#e6e6e6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0);-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}a.l-btn span.l-btn-left{background-image:url('images/linkbutton_bg.png');background-repeat:no-repeat;background-image:none}a:hover.l-btn{background:#e6e6e6;color:#00438a;border:1px solid #ddd;filter:none}a.l-btn-plain,a.l-btn-plain span.l-btn-left{background:transparent;border:0;filter:none}a:hover.l-btn-plain{background:#e6e6e6;color:#00438a;border:1px solid #ddd;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}a.l-btn-disabled,a:hover.l-btn-disabled{color:#444;filter:alpha(opacity=50);background:#f5f5f5;color:#444;background:-webkit-linear-gradient(top,#fff 0,#e6e6e6 100%);background:-moz-linear-gradient(top,#fff 0,#e6e6e6 100%);background:-o-linear-gradient(top,#fff 0,#e6e6e6 100%);background:linear-gradient(to bottom,#fff 0,#e6e6e6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0);filter:alpha(opacity=50) progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0)}a.l-btn-plain-disabled,a:hover.l-btn-plain-disabled{background:transparent;filter:alpha(opacity=50)}a.l-btn-selected,a:hover.l-btn-selected{background-position:right -24px;background:#ddd;filter:none}a.l-btn-selected span.l-btn-left,a:hover.l-btn-selected span.l-btn-left{background-position:0 bottom;background-image:none}a.l-btn-plain-selected,a:hover.l-btn-plain-selected{background:#ddd}.datagrid .panel-body{overflow:hidden;position:relative}.datagrid-view{position:relative;overflow:hidden}.datagrid-view1,.datagrid-view2{position:absolute;overflow:hidden;top:0}.datagrid-view1{left:0}.datagrid-view2{right:0}.datagrid-mask{position:absolute;left:0;top:0;width:100%;height:100%;opacity:.3;filter:alpha(opacity=30);display:none}.datagrid-mask-msg{position:absolute;top:50%;margin-top:-20px;padding:12px 5px 10px 30px;width:auto;height:16px;border-width:2px;border-style:solid;display:none}.datagrid-sort-icon{padding:0}.datagrid-toolbar{height:auto;padding:1px 2px;border-width:0 0 1px 0;border-style:solid}.datagrid-btn-separator{float:left;height:24px;border-left:1px solid #ccc;border-right:1px solid #fff;margin:2px 1px}.datagrid .datagrid-pager{margin:0;border-width:1px 0 0 0;border-style:solid}.datagrid .datagrid-pager-top{border-width:0 0 1px 0}.datagrid-header{overflow:hidden;cursor:default;border-width:0 0 1px 0;border-style:solid}.datagrid-header-inner{float:left;width:10000px}.datagrid-header-row,.datagrid-row{height:25px}.datagrid-header td,.datagrid-body td,.datagrid-footer td{border-width:0 1px 1px 0;border-style:dotted;margin:0;padding:0}.datagrid-cell,.datagrid-cell-group,.datagrid-header-rownumber,.datagrid-cell-rownumber{margin:0;padding:0 4px;white-space:nowrap;word-wrap:normal;overflow:hidden;height:18px;line-height:18px;font-weight:normal;font-size:12px}.datagrid-header .datagrid-cell{height:auto}.datagrid-header .datagrid-cell span{font-size:12px}.datagrid-cell-group{text-align:center}.datagrid-header-rownumber,.datagrid-cell-rownumber{width:25px;text-align:center;margin:0;padding:0}.datagrid-body{margin:0;padding:0;overflow:auto;zoom:1}.datagrid-view1 .datagrid-body-inner{padding-bottom:20px}.datagrid-view1 .datagrid-body{overflow:hidden}.datagrid-footer{overflow:hidden}.datagrid-footer-inner{border-width:1px 0 0 0;border-style:solid;width:10000px;float:left}.datagrid-row-editing .datagrid-cell{height:auto}.datagrid-header-check,.datagrid-cell-check{padding:0;width:27px;height:18px;font-size:1px;text-align:center;overflow:hidden}.datagrid-header-check input,.datagrid-cell-check input{margin:0;padding:0;width:15px;height:18px}.datagrid-resize-proxy{position:absolute;width:1px;height:10000px;top:0;cursor:e-resize;display:none}.datagrid-body .datagrid-editable{margin:0;padding:0}.datagrid-body .datagrid-editable table{width:100%;height:100%}.datagrid-body .datagrid-editable td{border:0;margin:0;padding:0}.datagrid-body .datagrid-editable .datagrid-editable-input{margin:0;padding:2px;border-width:1px;border-style:solid}.datagrid-sort-desc .datagrid-sort-icon{padding:0 13px 0 0;background:url('images/datagrid_icons.png') no-repeat -16px center}.datagrid-sort-asc .datagrid-sort-icon{padding:0 13px 0 0;background:url('images/datagrid_icons.png') no-repeat 0 center}.datagrid-row-collapse{background:url('images/datagrid_icons.png') no-repeat -48px center}.datagrid-row-expand{background:url('images/datagrid_icons.png') no-repeat -32px center}.datagrid-mask-msg{background:#fff url('images/loading.gif') no-repeat scroll 5px center}.datagrid-header,.datagrid-td-rownumber{background-color:#f2f2f2;background:-webkit-linear-gradient(top,#fff 0,#f2f2f2 100%);background:-moz-linear-gradient(top,#fff 0,#f2f2f2 100%);background:-o-linear-gradient(top,#fff 0,#f2f2f2 100%);background:linear-gradient(to bottom,#fff 0,#f2f2f2 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0)}.datagrid-cell-rownumber{color:#333}.datagrid-resize-proxy{background:#bbb}.datagrid-mask{background:#ccc}.datagrid-mask-msg{border-color:#d4d4d4}.datagrid-toolbar,.datagrid-pager{background:#f5f5f5}.datagrid-header,.datagrid-toolbar,.datagrid-pager,.datagrid-footer-inner{border-color:#e6e6e6}.datagrid-header td,.datagrid-body td,.datagrid-footer td{border-color:#ccc}.datagrid-htable,.datagrid-btable,.datagrid-ftable{color:#333}.datagrid-row-alt{background:#f5f5f5}.datagrid-row-over,.datagrid-header td.datagrid-header-over{background:#e6e6e6;color:#00438a;cursor:default}.datagrid-row-selected{background:#0081c2;color:#fff}.datagrid-body .datagrid-editable .datagrid-editable-input{border-color:#d4d4d4}.propertygrid .datagrid-view1 .datagrid-body td{padding-bottom:1px;border-width:0 1px 0 0}.propertygrid .datagrid-group{height:21px;overflow:hidden;border-width:0 0 1px 0;border-style:solid}.propertygrid .datagrid-group span{font-weight:bold}.propertygrid .datagrid-view1 .datagrid-body td{border-color:#e6e6e6}.propertygrid .datagrid-view1 .datagrid-group{border-color:#f2f2f2}.propertygrid .datagrid-view2 .datagrid-group{border-color:#e6e6e6}.propertygrid .datagrid-group,.propertygrid .datagrid-view1 .datagrid-body,.propertygrid .datagrid-view1 .datagrid-row-over,.propertygrid .datagrid-view1 .datagrid-row-selected{background:#f2f2f2}.pagination{zoom:1}.pagination table{float:left;height:30px}.pagination td{border:0}.pagination-btn-separator{float:left;height:24px;border-left:1px solid #ccc;border-right:1px solid #fff;margin:3px 1px}.pagination .pagination-num{border-width:1px;border-style:solid;margin:0 2px;padding:2px;width:2em;height:auto}.pagination-page-list{margin:0 6px;padding:1px 2px;width:auto;height:auto;border-width:1px;border-style:solid}.pagination-info{float:right;margin:0 6px 0 0;padding:0;height:30px;line-height:30px;font-size:12px}.pagination span{font-size:12px}.pagination-first{background:url('images/pagination_icons.png') no-repeat 0 0}.pagination-prev{background:url('images/pagination_icons.png') no-repeat -16px 0}.pagination-next{background:url('images/pagination_icons.png') no-repeat -32px 0}.pagination-last{background:url('images/pagination_icons.png') no-repeat -48px 0}.pagination-load{background:url('images/pagination_icons.png') no-repeat -64px 0}.pagination-loading{background:url('images/loading.gif') no-repeat}.pagination-page-list,.pagination .pagination-num{border-color:#d4d4d4}.calendar{border-width:1px;border-style:solid;padding:1px;overflow:hidden}.calendar table{border-collapse:separate;font-size:12px;width:100%;height:100%}.calendar table td,.calendar table th{font-size:12px}.calendar-noborder{border:0}.calendar-header{position:relative;height:22px}.calendar-title{text-align:center;height:22px}.calendar-title span{position:relative;display:inline-block;top:2px;padding:0 3px;height:18px;line-height:18px;font-size:12px;cursor:pointer;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}.calendar-prevmonth,.calendar-nextmonth,.calendar-prevyear,.calendar-nextyear{position:absolute;top:50%;margin-top:-7px;width:14px;height:14px;cursor:pointer;font-size:1px;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}.calendar-prevmonth{left:20px;background:url('images/calendar_arrows.png') no-repeat -18px -2px}.calendar-nextmonth{right:20px;background:url('images/calendar_arrows.png') no-repeat -34px -2px}.calendar-prevyear{left:3px;background:url('images/calendar_arrows.png') no-repeat -1px -2px}.calendar-nextyear{right:3px;background:url('images/calendar_arrows.png') no-repeat -49px -2px}.calendar-body{position:relative}.calendar-body th,.calendar-body td{text-align:center}.calendar-day{border:0;padding:1px;cursor:pointer;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}.calendar-other-month{opacity:.3;filter:alpha(opacity=30)}.calendar-menu{position:absolute;top:0;left:0;width:180px;height:150px;padding:5px;font-size:12px;display:none;overflow:hidden}.calendar-menu-year-inner{text-align:center;padding-bottom:5px}.calendar-menu-year{width:40px;text-align:center;border-width:1px;border-style:solid;margin:0;padding:2px;font-weight:bold;font-size:12px}.calendar-menu-prev,.calendar-menu-next{display:inline-block;width:21px;height:21px;vertical-align:top;cursor:pointer;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}.calendar-menu-prev{margin-right:10px;background:url('images/calendar_arrows.png') no-repeat 2px 2px}.calendar-menu-next{margin-left:10px;background:url('images/calendar_arrows.png') no-repeat -45px 2px}.calendar-menu-month{text-align:center;cursor:pointer;font-weight:bold;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}.calendar-body th,.calendar-menu-month{color:#808080}.calendar-day{color:#333}.calendar-sunday{color:#c22}.calendar-saturday{color:#0e0}.calendar-today{color:#00f}.calendar-menu-year{border-color:#d4d4d4}.calendar{border-color:#d4d4d4}.calendar-header{background:#f2f2f2}.calendar-body,.calendar-menu{background:#fff}.calendar-body th{background:#f5f5f5}.calendar-hover,.calendar-nav-hover,.calendar-menu-hover{background-color:#e6e6e6;color:#00438a}.calendar-hover{border:1px solid #ddd;padding:0}.calendar-selected{background-color:#0081c2;color:#fff;border:1px solid #0070a9;padding:0}.datebox-calendar-inner{height:180px}.datebox-button{height:18px;padding:2px 5px;text-align:center}.datebox-button a{font-size:12px}.datebox-current,.datebox-close,.datebox-ok{text-decoration:none;font-weight:bold;opacity:.6;filter:alpha(opacity=60)}.datebox-current,.datebox-close{float:left}.datebox-close{float:right}.datebox-button-hover{opacity:1.0;filter:alpha(opacity=100)}.datebox .combo-arrow{background-image:url('images/datebox_arrow.png');background-position:center center}.datebox-button{background-color:#f5f5f5}.datebox-current,.datebox-close,.datebox-ok{color:#444}.spinner{display:inline-block;white-space:nowrap;margin:0 5px;padding:0;border-width:1px;border-style:solid;overflow:hidden;vertical-align:middle}.spinner .spinner-text{font-size:12px;border:0;line-height:20px;height:20px;margin:0;padding:0 2px;*margin-top:-1px;*height:18px;*line-height:18px;_height:18px;_line-height:18px;vertical-align:baseline}.spinner-arrow{display:inline-block;overflow:hidden;vertical-align:top;margin:0;padding:0}.spinner-arrow-up,.spinner-arrow-down{opacity:.6;filter:alpha(opacity=60);display:block;font-size:1px;width:18px;height:10px}.spinner-arrow-hover{opacity:1.0;filter:alpha(opacity=100)}.spinner-arrow-up{background:url('images/spinner_arrows.png') no-repeat 1px center}.spinner-arrow-down{background:url('images/spinner_arrows.png') no-repeat -15px center}.spinner{border-color:#d4d4d4}.spinner-arrow{background-color:#f2f2f2}.spinner-arrow-hover{background-color:#e6e6e6}.progressbar{border-width:1px;border-style:solid;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px;overflow:hidden}.progressbar-text{text-align:center;position:absolute}.progressbar-value{position:relative;overflow:hidden;width:0;-moz-border-radius:5px 0 0 5px;-webkit-border-radius:5px 0 0 5px;border-radius:5px 0 0 5px}.progressbar{border-color:#d4d4d4}.progressbar-text{color:#333;font-size:12px}.progressbar-value .progressbar-text{background-color:#0081c2;color:#fff}.searchbox{display:inline-block;white-space:nowrap;margin:0;padding:0;border-width:1px;border-style:solid;overflow:hidden}.searchbox .searchbox-text{font-size:12px;border:0;margin:0;padding:0;line-height:20px;height:20px;*margin-top:-1px;*height:18px;*line-height:18px;_height:18px;_line-height:18px;vertical-align:baseline}.searchbox .searchbox-prompt{font-size:12px;color:#ccc}.searchbox-button{width:18px;height:20px;overflow:hidden;display:inline-block;vertical-align:top;cursor:pointer;opacity:.6;filter:alpha(opacity=60)} -.searchbox-button-hover{opacity:1.0;filter:alpha(opacity=100)}.searchbox a.l-btn-plain{height:20px;border:0;padding:0 6px 0 0;vertical-align:top;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;opacity:.6;filter:alpha(opacity=60)}.searchbox a.l-btn .l-btn-left{padding:2px 0 2px 4px}.searchbox a.l-btn-plain:hover{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border:0;padding:0 6px 0 0;opacity:1.0;filter:alpha(opacity=100)}.searchbox a.m-btn-plain-active{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.searchbox-button{background:url('images/searchbox_button.png') no-repeat center center}.searchbox{border-color:#d4d4d4;background-color:#fff}.searchbox a.l-btn-plain{background:#f2f2f2}.slider-disabled{opacity:.5;filter:alpha(opacity=50)}.slider-h{height:22px}.slider-v{width:22px}.slider-inner{position:relative;height:6px;top:7px;border-width:1px;border-style:solid;border-radius:5px}.slider-handle{position:absolute;display:block;outline:0;width:20px;height:20px;top:-7px;margin-left:-10px}.slider-tip{position:absolute;display:inline-block;line-height:12px;font-size:12px;white-space:nowrap;top:-22px}.slider-rule{position:relative;top:15px}.slider-rule span{position:absolute;display:inline-block;font-size:0;height:5px;border-width:0 0 0 1px;border-style:solid}.slider-rulelabel{position:relative;top:20px}.slider-rulelabel span{position:absolute;display:inline-block;font-size:12px}.slider-v .slider-inner{width:6px;left:7px;top:0;float:left}.slider-v .slider-handle{left:3px;margin-top:-10px}.slider-v .slider-tip{left:-10px;margin-top:-6px}.slider-v .slider-rule{float:left;top:0;left:16px}.slider-v .slider-rule span{width:5px;height:'auto';border-left:0;border-width:1px 0 0 0;border-style:solid}.slider-v .slider-rulelabel{float:left;top:0;left:23px}.slider-handle{background:url('images/slider_handle.png') no-repeat}.slider-inner{border-color:#d4d4d4;background:#f2f2f2}.slider-rule span{border-color:#d4d4d4}.slider-rulelabel span{color:#333}.menu{position:absolute;margin:0;padding:2px;border-width:1px;border-style:solid;overflow:hidden}.menu-item{position:relative;margin:0;padding:0;overflow:hidden;white-space:nowrap;cursor:pointer;border-width:1px;border-style:solid}.menu-text{height:20px;line-height:20px;float:left;padding-left:28px}.menu-icon{position:absolute;width:16px;height:16px;left:2px;top:50%;margin-top:-8px}.menu-rightarrow{position:absolute;width:16px;height:16px;right:0;top:50%;margin-top:-8px}.menu-line{position:absolute;left:26px;top:0;height:2000px;font-size:1px}.menu-sep{margin:3px 0 3px 25px;font-size:1px}.menu-active{-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}.menu-item-disabled{opacity:.5;filter:alpha(opacity=50);cursor:default}.menu-text,.menu-text span{font-size:12px}.menu-shadow{position:absolute;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px;background:#ccc;-moz-box-shadow:2px 2px 3px #ccc;-webkit-box-shadow:2px 2px 3px #ccc;box-shadow:2px 2px 3px #ccc;filter:progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2)}.menu-rightarrow{background:url('images/menu_arrows.png') no-repeat -32px center}.menu-line{border-left:1px solid #ccc;border-right:1px solid #fff}.menu-sep{border-top:1px solid #ccc;border-bottom:1px solid #fff}.menu{background-color:#fff;border-color:#e6e6e6;color:#333}.menu-content{background:#fff}.menu-item{border-color:transparent;_border-color:#fff}.menu-active{border-color:#ddd;color:#00438a;background:#e6e6e6}.menu-active-disabled{border-color:transparent;background:transparent;color:#333}.m-btn-downarrow{display:inline-block;width:16px;height:16px;line-height:16px;font-size:12px;_vertical-align:middle}a.m-btn-active{background-position:bottom right}a.m-btn-active span.l-btn-left{background-position:bottom left}a.m-btn-plain-active{background:transparent;padding:0 5px 0 0;border-width:1px;border-style:solid;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}.m-btn-downarrow{background:url('images/menu_arrows.png') no-repeat 2px center}a.m-btn-plain-active{border-color:#ddd;background-color:#e6e6e6;color:#00438a}.s-btn-downarrow{display:inline-block;margin:0 0 0 4px;padding:0 0 0 1px;width:14px;height:16px;line-height:16px;border-width:0;border-style:solid;font-size:12px;_vertical-align:middle}a.s-btn-active{background-position:bottom right}a.s-btn-active span.l-btn-left{background-position:bottom left}a.s-btn-plain-active{background:transparent;padding:0 5px 0 0;border-width:1px;border-style:solid;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}.s-btn-downarrow{background:url('images/menu_arrows.png') no-repeat 2px center;border-color:#bbb}a:hover.l-btn .s-btn-downarrow,a.s-btn-active .s-btn-downarrow,a.s-btn-plain-active .s-btn-downarrow{background-position:1px center;padding:0;border-width:0 0 0 1px}a.s-btn-plain-active{border-color:#ddd;background-color:#e6e6e6;color:#00438a}.messager-body{padding:10px;overflow:hidden}.messager-button{text-align:center;padding-top:10px}.messager-icon{float:left;width:32px;height:32px;margin:0 10px 10px 0}.messager-error{background:url('images/messager_icons.png') no-repeat scroll -64px 0}.messager-info{background:url('images/messager_icons.png') no-repeat scroll 0 0}.messager-question{background:url('images/messager_icons.png') no-repeat scroll -32px 0}.messager-warning{background:url('images/messager_icons.png') no-repeat scroll -96px 0}.messager-progress{padding:10px}.messager-p-msg{margin-bottom:5px}.messager-body .messager-input{width:100%;padding:1px 0;border:1px solid #d4d4d4}.tree{margin:0;padding:0;list-style-type:none}.tree li{white-space:nowrap}.tree li ul{list-style-type:none;margin:0;padding:0}.tree-node{height:18px;white-space:nowrap;cursor:pointer}.tree-hit{cursor:pointer}.tree-expanded,.tree-collapsed,.tree-folder,.tree-file,.tree-checkbox,.tree-indent{display:inline-block;width:16px;height:18px;vertical-align:top;overflow:hidden}.tree-expanded{background:url('images/tree_icons.png') no-repeat -18px 0}.tree-expanded-hover{background:url('images/tree_icons.png') no-repeat -50px 0}.tree-collapsed{background:url('images/tree_icons.png') no-repeat 0 0}.tree-collapsed-hover{background:url('images/tree_icons.png') no-repeat -32px 0}.tree-lines .tree-expanded,.tree-lines .tree-root-first .tree-expanded{background:url('images/tree_icons.png') no-repeat -144px 0}.tree-lines .tree-collapsed,.tree-lines .tree-root-first .tree-collapsed{background:url('images/tree_icons.png') no-repeat -128px 0}.tree-lines .tree-node-last .tree-expanded,.tree-lines .tree-root-one .tree-expanded{background:url('images/tree_icons.png') no-repeat -80px 0}.tree-lines .tree-node-last .tree-collapsed,.tree-lines .tree-root-one .tree-collapsed{background:url('images/tree_icons.png') no-repeat -64px 0}.tree-line{background:url('images/tree_icons.png') no-repeat -176px 0}.tree-join{background:url('images/tree_icons.png') no-repeat -192px 0}.tree-joinbottom{background:url('images/tree_icons.png') no-repeat -160px 0}.tree-folder{background:url('images/tree_icons.png') no-repeat -208px 0}.tree-folder-open{background:url('images/tree_icons.png') no-repeat -224px 0}.tree-file{background:url('images/tree_icons.png') no-repeat -240px 0}.tree-loading{background:url('images/loading.gif') no-repeat center center}.tree-checkbox0{background:url('images/tree_icons.png') no-repeat -208px -18px}.tree-checkbox1{background:url('images/tree_icons.png') no-repeat -224px -18px}.tree-checkbox2{background:url('images/tree_icons.png') no-repeat -240px -18px}.tree-title{font-size:12px;display:inline-block;text-decoration:none;vertical-align:top;white-space:nowrap;padding:0 2px;height:18px;line-height:18px}.tree-node-proxy{font-size:12px;line-height:20px;padding:0 2px 0 20px;border-width:1px;border-style:solid;z-index:9900000}.tree-dnd-icon{display:inline-block;position:absolute;width:16px;height:18px;left:2px;top:50%;margin-top:-9px}.tree-dnd-yes{background:url('images/tree_icons.png') no-repeat -256px 0}.tree-dnd-no{background:url('images/tree_icons.png') no-repeat -256px -18px}.tree-node-top{border-top:1px dotted red}.tree-node-bottom{border-bottom:1px dotted red}.tree-node-append .tree-title{border:1px dotted red}.tree-editor{border:1px solid #ccc;font-size:12px;height:14px!important;height:18px;line-height:14px;padding:1px 2px;width:80px;position:absolute;top:0}.tree-node-proxy{background-color:#fff;color:#333;border-color:#d4d4d4}.tree-node-hover{background:#e6e6e6;color:#00438a}.tree-node-selected{background:#0081c2;color:#fff}.validatebox-invalid{background-image:url('images/validatebox_warning.png');background-repeat:no-repeat;background-position:right center;border-color:#ffa8a8;background-color:#fff3f3;color:#000}.tooltip{position:absolute;display:none;z-index:9900000;outline:0;padding:5px;border-width:1px;border-style:solid;border-radius:5px;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;border-radius:5px 5px 5px 5px}.tooltip-content{font-size:12px}.tooltip-arrow-outer,.tooltip-arrow{position:absolute;width:0;height:0;line-height:0;font-size:0;border-style:solid;border-width:6px;border-color:transparent;_border-color:tomato;_filter:chroma(color=tomato)}.tooltip-right .tooltip-arrow-outer{left:0;top:50%;margin:-6px 0 0 -13px}.tooltip-right .tooltip-arrow{left:0;top:50%;margin:-6px 0 0 -12px}.tooltip-left .tooltip-arrow-outer{right:0;top:50%;margin:-6px -13px 0 0}.tooltip-left .tooltip-arrow{right:0;top:50%;margin:-6px -12px 0 0}.tooltip-top .tooltip-arrow-outer{bottom:0;left:50%;margin:0 0 -13px -6px}.tooltip-top .tooltip-arrow{bottom:0;left:50%;margin:0 0 -12px -6px}.tooltip-bottom .tooltip-arrow-outer{top:0;left:50%;margin:-13px 0 0 -6px}.tooltip-bottom .tooltip-arrow{top:0;left:50%;margin:-12px 0 0 -6px}.tooltip{background-color:#fff;border-color:#d4d4d4;color:#333}.tooltip-right .tooltip-arrow-outer{border-right-color:#d4d4d4}.tooltip-right .tooltip-arrow{border-right-color:#fff}.tooltip-left .tooltip-arrow-outer{border-left-color:#d4d4d4}.tooltip-left .tooltip-arrow{border-left-color:#fff}.tooltip-top .tooltip-arrow-outer{border-top-color:#d4d4d4}.tooltip-top .tooltip-arrow{border-top-color:#fff}.tooltip-bottom .tooltip-arrow-outer{border-bottom-color:#d4d4d4}.tooltip-bottom .tooltip-arrow{border-bottom-color:#fff}.tabs-panels{border-color:transparent}.tabs li a.tabs-inner{border-color:transparent;background:transparent;filter:none;color:#08c}.menu-active{background-color:#0081c2;border-color:#0081c2;color:#fff}.menu-active-disabled{border-color:transparent;background:transparent;color:#333} \ No newline at end of file diff --git a/spider/resources/static/css/editor.css b/spider/resources/static/css/editor.css deleted file mode 100644 index 1e34735..0000000 --- a/spider/resources/static/css/editor.css +++ /dev/null @@ -1,231 +0,0 @@ -*{ - margin : 0; - padding : 0; -} -html,body{ - width : 100%; - height : 100%; - overflow: hidden; - font-family: Microsoft YaHei; -} -.main-container{ - width : 100%; - height : 100%; -} -.main-container .sidebar-container{ - position: absolute; - width : 46px; - left : 0px; - top : 30px; - bottom:0px; - max-height: 100%; - overflow: auto; - background: #F6F6F6; - z-index: 1; - border-radius: 2px; -} -.main-container .sidebar-container::-webkit-scrollbar { - width: 3px; -} -.main-container .sidebar-container::-webkit-scrollbar-track { - background-color:#ccc; - -webkit-border-radius: 2em; - -moz-border-radius: 2em; - border-radius:2em; -} -.main-container .sidebar-container::-webkit-scrollbar-thumb { - background-color:#999; - -webkit-border-radius: 2em; - -moz-border-radius: 2em; - border-radius:2em; -} -.main-container .sidebar-container img{ - padding: 5px; - margin : 2px; - border-radius: 3px; - width : 32px; - height : 32px; -} -.main-container .sidebar-container img:hover{ - background:#ccc; -} -.main-container .resize-container{ - cursor: w-resize; - position: absolute; - right : 400px; - width : 10px; - height : 100%; - background: transparent; -} -.editor-container,.xml-container{ - position: absolute; - left : 38px; - right : 400px; - top : 30px; - bottom : 0px; - background-image: linear-gradient(90deg, rgba(153, 153, 153, 0.3) 1px, rgba(0, 0, 0, 0) 1px),linear-gradient(rgba(153, 153, 153, 0.3) 1px, rgba(0, 0, 0, 0) 1px); - background-size: 8px 8px; - overflow: auto; -} -.properties-container{ - position: absolute; - right : 0px; - top:30px; - bottom : 0px; - width : 400px; - box-shadow: -2px 1px 3px #eee; - overflow: auto; -} -.properties-container .editor-form-node .layui-form-relative{ - position: relative; -} -.properties-container .editor-form-node input,.properties-container .editor-form-node textarea{ - font-family: 'Consolas'; - font-size : 14px; -} -.properties-container .editor-form-node .layui-form-relative .layui-icon-close{ - position: absolute; - left : 10px; - font-size:28px; - top : 30px; - color : #333; - cursor: pointer; - z-index: 1; -} -.properties-container .editor-form-node .layui-form-relative .layui-icon-close.function-remove{ - top : 5px; -} -.properties-container .editor-form-node .layui-form-relative .layui-icon-close.cmd-remove{ - top : 5px; -} - -.toolbar-container ul li{ - float : left; - padding : 0 10px; - cursor: pointer; - margin-top:5px; - color:#333; -} -.toolbar-container ul li:hover{ - color : #40a9ff; -} -.toolbar-container ul li:not(:first-child){ - border-left: 1px solid #ccc; -} - -.test-window-container .output-container{ - /* height: 320px; */ -} -.test-window-container .log-container{ - border: 1px solid #ccc; -} -.test-window-container .log-container textarea{ - width : 100%; - height : 100%; -} -.xml-container{ - display: none; -} -.xml-container textarea{ - width: 100%; - height: 99.6%; - border:none; - padding: 10px 20px; - box-sizing: border-box; -} -.xml-container textarea::-webkit-scrollbar { - width: 5px; -} -.xml-container textarea::-webkit-scrollbar-track { - background-color:#ccc; - -webkit-border-radius: 2em; - -moz-border-radius: 2em; - border-radius:2em; -} -.xml-container textarea::-webkit-scrollbar-thumb { - background-color:#999; - -webkit-border-radius: 2em; - -moz-border-radius: 2em; - border-radius:2em; -} -.log-container span{ - display:inline-block; - vertical-align: middle; - font-weight: bold; -} -.log-container .test-log > span{ - height:24px; - line-height:24px; - float : left; - font-family: 'Consolas'; -} -.log-container .test-log{ - height:24px; - line-height:24px; - width:100%; - clear:both; -} -.log-container .test-log.log-error{ - color : red; -} -.log-container span.level{ - text-align:center; - width:60px; -} -.log-container span.timestamp{ - margin-right:5px; -} -.log-container span.variable{ - margin:0 2px; - max-width: 230px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - cursor:pointer; - color: #025900; -} -.log-container span.variable-object,.log-container span.variable-array{ - color : #2a00ff; -} -.log-container span.variable.variable-boolean{ - color : #600100; -} -.log-container span.variable.variable-number{ - color : #000E59; -} -.jsontree_value-wrapper{ - overflow: unset !important; -} -.jsontree_value_string,.jsontree_node{ - white-space: nowrap; -} -#test-window{ - padding:0px 10px; - overflow: hidden; -} -.layui-layer.codemirror .layui-input-block{ - margin-left:0px; -} - -.hint-grammer{ - width : 100%; - color : #333; -} -.hint-grammer:not(:first-child){ - border-top:1px solid #ccc; - margin-top:5px; - padding-top:5px; -} -.hint-grammer .hint-owner span{ - color : #600100 -} -.hint-grammer .hint-return span{ - color : #0000C0 -} -.hint-grammer .hint-example{ - padding:2px 5px; - color : #000; -} -.layui-layer-tips{ - word-break: break-all; -} \ No newline at end of file diff --git a/spider/resources/static/css/index.css b/spider/resources/static/css/index.css deleted file mode 100644 index cf552af..0000000 --- a/spider/resources/static/css/index.css +++ /dev/null @@ -1,22 +0,0 @@ -.layui-body .layui-tab{margin:0px;height:100%;} -.layui-body .layui-tab .layui-tab-content{position: absolute;top: 40px;bottom: 0px;width: 100%;padding:0px;overflow: hidden;} -.layui-body .layui-tab .layui-tab-content .layui-tab-item{height:100%;width:calc(100% - 48px);} -/***********************/ - -.layui-layout-admin .layui-search-menu{ - width:200px; - padding:2px 5px; - border-bottom:1px solid #eee; - box-sizing: border-box; -} -.layui-layout-admin .layui-search-menu .layui-input{ - margin:0; - padding-left:10px; -} -.layui-layout-admin .layui-search-menu .layui-form-select .layui-anim{ - max-width: 195px; - max-height: 360px; -} -a{ - cursor:pointer; -} \ No newline at end of file diff --git a/spider/resources/static/css/layui-blue.css b/spider/resources/static/css/layui-blue.css deleted file mode 100644 index 8bb266c..0000000 --- a/spider/resources/static/css/layui-blue.css +++ /dev/null @@ -1,181 +0,0 @@ -/* start */ -.layui-layout-right{ - right:15px; -} -iframe{ - background:#fff; -} -.layui-layout-admin .layui-header,.layui-laypage .layui-laypage-curr .layui-laypage-em,.layui-form-checked[lay-skin=primary] i{ - background-color:#1890FF; -} -.layui-layout-admin .layui-layout-right.layui-nav .layui-nav-child dd.layui-this a, -.layui-layout-admin .layui-layout-right.layui-nav .layui-nav-child dd.layui-this{ - background-color:#1890FF; -} -.layui-laydate li.layui-this,.layui-laydate td.layui-this{ - background-color:#1890FF !important; - color : #fff !important; -} -.layui-laydate .layui-laydate-header i:hover, .layui-laydate .layui-laydate-header span:hover,.layui-laydate .layui-laydate-footer span:hover{ - color : #1890FF; -} -.layui-btn.layui-btn-normal,.layui-form-select dl dd.layui-this{ - background-color:#1890FF; - color : #fff; -} -.layui-btn{ - background-color: transparent; - color : #1890FF -} -.layui-btn-danger{ - background-color: #FF5722; - color : #fff -} -.layui-btn-common{ - background-color: #009688; - color : #fff -} -.layui-btn.layui-btn-normal:hover{ - color : #fff; -} -.layui-btn-sm{ - padding:0; -} -.layui-btn-sm.layui-btn-normal{ - padding:0 10px; -} -.layui-table-cell .layui-btn:not(:last-child){ - margin-right:3px; -} -.layui-table tbody tr:hover, .layui-table-click, .layui-table-header, .layui-table-hover, .layui-table-mend, .layui-table-patch, .layui-table-tool, .layui-table-total, .layui-table-total tr, .layui-table[lay-even] tr:nth-child(even){ - background-color: rgb(230, 247, 255); -} -.layui-table thead tr{ - background-color:#fafafa !important; -} -.layui-btn-primary:hover,.layui-form-checked[lay-skin=primary] i,.layui-form-checkbox[lay-skin=primary]:hover i{ - border-color:#1890FF; -} -.layui-input:hover,.layui-textarea:hover,.layui-laypage input:focus, .layui-laypage select:focus{ - border-color:#40a9ff !important; -} -.layui-input:hover,.layui-textarea{ - -webkit-box-shadow: 0 0 0 2px rgba(24,144,255,.2); - box-shadow: 0 0 0 2px rgba(24,144,255,.2); - border-right-width: 1px!important; -} -.layui-table-cell .layui-btn:not(:last-child)::after{ - display: inline-block; - content : ' '; - position: absolute; - top:5px; - padding-right:5px; - bottom:5px; - border-right:1px solid #e8e8e8; -} -.layui-btn:hover,.layui-laypage a:hover,.layui-tab-brief>.layui-tab-title .layui-this{ - color : #40a9ff; -} -.layui-nav .layui-nav-item a,.layui-layout-admin .layui-logo{ - color : #fff; -} -.layui-nav .layui-nav-item.layui-this{ - background-color: rgba(255,255,255,.2); -} -.layui-nav .layui-this:after, .layui-nav-bar, .layui-nav-tree .layui-nav-itemed:after{ - display: none; -} -.layui-tab-title li{ - padding: 0 5px; -} -.layui-tab-title li .layui-tab-close{ - visibility: hidden; -} -.layui-tab-title li:hover,.layui-tab-title .layui-this,.layui-form-radio>i:hover, .layui-form-radioed>i{ - color : #1890FF; -} -.layui-treeSelect .ztree li a.curSelectedNode{ - color : #1890FF !important; -} -.layui-tab-title li .layui-tab-close:hover{ - background: transparent; - color:#231f1f; -} -.layui-nav .layui-nav-child a{ - color:rgba(0, 0, 0, 0.65); -} -.layui-body .layui-tab .layui-tab-content{ - top:64px !important; - left:24px; - right:24px; - bottom:24px !important; -} -.layui-layout-admin .layui-body,.layui-layout-admin .layui-footer{ - background-color: #f0f2f5; -} -.layui-layout-admin .layui-tab-title{ - background-color: #fff; -} -.layui-tab-title li:hover .layui-tab-close{ - visibility: visible; -} -.layui-nav{ - background:#fff; -} -.layui-nav-itemed>.layui-nav-child{ - background-color : transparent !important; - margin-left:15px; -} -.layui-nav-tree .layui-nav-item a{ - color : rgba(0, 0, 0, 0.65) !important; -} -.layui-nav-tree .layui-nav-item a:hover{ - background-color: transparent !important; - color : #1890FF !important; -} -.layui-nav .layui-nav-more{ - border-color : rgba(0, 0, 0, 0.3) transparent transparent; -} -.layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, .layui-nav-tree .layui-this>a, .layui-nav-tree .layui-this>a:hover{ - color : #1890FF !important; - background-color: #e6f7ff; - border-right: 2px solid #1890FF; -} -.layui-nav .layui-nav-mored, .layui-nav-itemed>a .layui-nav-more{ - border-color : transparent transparent rgba(0, 0, 0, 0.3); -} -.layui-nav-tree .layui-nav-bar{ - display: none; -} -.menu-list{ - border-right: 1px solid #e8e8e8; -} -.layui-tab-brief>.layui-tab-more li.layui-this:after, .layui-tab-brief>.layui-tab-title .layui-this:after{ - border-bottom-color: #1890FF; -} - -.layui-tab-title .layui-tab-bar{ - display: none; -} -.layui-tab .layui-tab-title{ - overflow-x: auto; - overflow-y: hidden; -} -.layui-tab[overflow]>.layui-tab-title{ - overflow : auto; - overflow-y: hidden; -} -.layui-tab .layui-tab-title::-webkit-scrollbar{ - width: 3px; - height: 2px; -} -.layui-tab .layui-tab-title::-webkit-scrollbar-thumb{ - border-radius: 10px; - -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2); - background: #1890ff; -} -.layui-tab .layui-tab-title::-webkit-scrollbar-track{ - -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2); - border-radius: 10px; - background: #EDEDED; -} \ No newline at end of file diff --git a/spider/resources/static/datasource-edit.html b/spider/resources/static/datasource-edit.html deleted file mode 100644 index 5b5b528..0000000 --- a/spider/resources/static/datasource-edit.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - DataSource - - - - - - - -

-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- - - -
- - - - \ No newline at end of file diff --git a/spider/resources/static/datasources.html b/spider/resources/static/datasources.html deleted file mode 100644 index cd7ae2e..0000000 --- a/spider/resources/static/datasources.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - DataSource - - - - - -
添加数据源 -
-
- - - - \ No newline at end of file diff --git a/spider/resources/static/editCron.html b/spider/resources/static/editCron.html deleted file mode 100644 index 39df921..0000000 --- a/spider/resources/static/editCron.html +++ /dev/null @@ -1,533 +0,0 @@ - - - -Cron表达式生成器 - - - - -
-
-
-
-
-
- 每秒 允许的通配符[, - * /] -
-
- - 周期从 - - - 秒 -
-
- - 从 - 秒开始,每 - 秒执行一次 -
-
- - 指定 -
-
- 00 01 02 03 - 04 05 06 07 - 08 09 -
-
- 10 11 12 13 - 14 15 16 17 - 18 19 -
-
- 20 21 22 23 - 24 25 26 27 - 28 29 -
-
- 30 31 32 33 - 34 35 36 37 - 38 39 -
-
- 40 41 42 43 - 44 45 46 47 - 48 49 -
-
- 50 51 52 53 - 54 55 56 57 - 58 59 -
-
-
-
- 分钟 允许的通配符[, - * /] -
-
- 周期从 - - - 分钟 -
-
- 从 - - 分钟开始,每 - 分钟执行一次 -
-
- 指定 -
-
- 00 01 02 03 - 04 05 06 07 - 08 09 -
-
- 10 11 12 13 - 14 15 16 17 - 18 19 -
-
- 20 21 22 23 - 24 25 26 27 - 28 29 -
-
- 30 31 32 33 - 34 35 36 37 - 38 39 -
-
- 40 41 42 43 - 44 45 46 47 - 48 49 -
-
- 50 51 52 53 - 54 55 56 57 - 58 59 -
-
-
-
- 小时 允许的通配符[, - * /] -
-
- - 周期从 - - 小时 -
-
- - 从 - 小时开始,每 - 小时执行一次 -
-
- 指定 -
-
- AM: 00 01 02 03 - 04 05 06 07 - 08 09 10 11 -
-
- PM: 12 13 14 15 - 16 17 18 19 - 20 21 22 23 -
-
-
-
- 日 允许的通配符[, - * / L W] -
-
- - 不指定 -
-
- 周期从 - - - 日 -
-
- 从 - - 日开始,每 - 天执行一次 -
-
- - 每月 - 号最近的那个工作日 -
-
- - 每月最后一天 -
-
- 指定 -
-
- 1 2 3 4 5 6 7 8 9 10 11 12 - 13 14 15 16 -
-
- 17 18 19 20 - 21 22 23 24 - 25 26 27 28 - 29 30 31 -
-
-
-
- 月 允许的通配符[, - * /] -
-
- - 不指定 -
-
- - 周期从 - - 月 -
-
- - 从 - 日开始,每 - 月执行一次 -
-
- 指定 -
-
- 1 2 3 4 5 6 7 8 9 10 11 12 -
-
-
-
- 周 允许的通配符[, - * / L #] -
-
- - 不指定 -
-
- - 周期 从星期 - - -
-
- - 第 周 - 的星期 -
-
- - 本月最后一个星期 -
-
- 指定 -
-
- 1 2 3 4 5 6 7 -
-
-
-
- 不指定 允许的通配符[, - * /] 非必填 -
-
- - 每年 -
-
- 周期 - 从 - - -
-
-
-
-
-
- 表达式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
分钟小时
-
星期
表达式字段:
Cron 表达式: - - - -
最近5次运行时间:
-
-
-
-
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/spider/resources/static/editor.html b/spider/resources/static/editor.html deleted file mode 100644 index 23e5ac9..0000000 --- a/spider/resources/static/editor.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - SpiderFlow-Editor - - - - - - - - - - - - - - - - - - - - - - - -
-
-
    -
  • 返回
  • -
  • 全选
  • -
  • 保存
  • -
  • 测试
  • -
  • 打印XML
  • -
  • XML编辑
  • -
  • 图形化编辑
  • -
  • 复制
  • -
  • 粘贴
  • -
  • 剪切
  • -
  • 撤销
  • -
  • 恢复
  • -
  • 删除
  • -
-
- -
-
-
-
-
- - diff --git a/spider/resources/static/favicon.ico b/spider/resources/static/favicon.ico deleted file mode 100644 index 62c0cea2a370d7e7fff5ba1606a9a2935346d133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lH~{4a8~FeKKhx>cUnEbT{wGO{ z+komB&z}7!b>qf=5fFRk{7=D^b#D(ZTk)j~WELSa{{8#MK5O2mo{HMHdzY;E?3kJN zdRuz#>ubwbevUeE@vF?OTmRTWW`OABtG`+8*zsKjWDiITNVA^3{#9z_nor4b$uA$4 z*Sww6(eu8<-S7E3C(mbJ0wZ2r&nkGmuA%K+Jy5(EDE>Mj_0_SNb3Vp4cf6}8D0#Ci zBC1(^-X@4UtIZS zb9TY&2SB^OtLQxbude_2Ut0F7_t^z+ZdcU3TRC~!hqR4bKUq(h`eA-;)4OFExvvj; z_&iz7!XW;Yqsadb~FI@6@ns?Ciw;=sMH~dS=cy)i?!VeP@(_S6-^nd=r&G-2m z@4y$YiYnf&S-s(_c}v&3zA4i`u3fqIqu-tb-yLIIDdj11sx3Sfe-$4;CK4s*+ z-hS%TFVm$fK1WQP@?mXj*W0$uJ3s4y!gc%h&)N+w@AmK7`zUHq z8}j0DO6Kc>a~FQ7b@6)sJ~RK#hF!b9h1NH}+jH#vS80%55ZJr-yK+YU>x+J&FJ8KM zKY!aj;bY_xp3h#D4T%6{{8=1 z7A^bWQQ!QwW!}P1{`c?y=YYw<=V b - - - - SpiderFlow - - - - - - - -
- -
    -
    - -
    -
    -
      -
    • 爬虫列表
    • -
    -
    -
    - -
    -
    -
    -
    - - \ No newline at end of file diff --git a/spider/resources/static/js/canvas-viewer.js b/spider/resources/static/js/canvas-viewer.js deleted file mode 100644 index 025bf88..0000000 --- a/spider/resources/static/js/canvas-viewer.js +++ /dev/null @@ -1,350 +0,0 @@ -window.requestAnimFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback,element){ - window.setTimeout(callback, 1000 / 60); -} -window.cancelAnimationFrame=window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || window.msCancelAnimationFrame || window.oCancelAnimationFrame || function( id ){ - window.clearTimeout( id ); -} -var canvas = document.getElementById('logviewer'); -function CanvasText(options){ - options = options || {}; - this.maxWidth = options.maxWidth || 2147483648; - this.color = options.color; - this.text = options.text === undefined || options.text === null ? '': options.text.toString(); - this.click = options.click; - this.startX = 0; - this.endX = 0; -} -function CanvasViewer(options){ - options = options || {}; - this.canvas = options.element; - this.context = this.canvas.getContext('2d'); - this.style = options.style || {}; - this.context.font = this.style.font || 'bold 14px Consolas'; - this.context.textBaseline = this.style.textBaseLine || 'middle'; - this.lines = []; - this.sourceLines = []; - this.lineHeight = 24; - this.maxRows = Math.ceil(this.canvas.height / this.lineHeight); - this.scrollHeight = this.canvas.height; - this.scrollTop = 0; - var _this = this; - this.mouseEvent = 0; - this.mouseDownX = 0; - this.mouseDownY = 0; - this.startIndex = 0; - this.startX = 5; - this.mouseX = 0; - this.mouseY = 0; - this.colsOffsetX = [0]; - this.filterText = ''; - this.maxWidth = this.canvas.width - 8; - this.onClick = options.onClick || function(){}; - this.grid = options.grid; - this.header = options.header; - this.canvas.onmousemove = function(e){ - var x = e.offsetX; - var y = e.offsetY; - _this.mouseX = x; - _this.mouseY = y; - var _hover = false; - if(x < _this.canvas.width - 8 && y < _this.canvas.height - 8){ - var row = _this.startIndex + parseInt(y / _this.lineHeight) + (y % _this.lineHeight == 0 ? 0 : 1) - 1; - var texts = _this.lines[row]; - if(texts){ - for(var i =0,len = texts.length;i x){ - _hover = true; - break; - } - } - } - } - if(_hover){ - _this.canvas.style.cursor = 'pointer'; - }else{ - _this.canvas.style.cursor = 'default'; - } - //鼠标按下且有纵向滚动条 - if(_this.mouseEvent == 1 && _this.hasScroll){ - _this.scrollTo(Math.max(Math.min(Math.floor((y / (_this.canvas.height - 8)) * _this.lines.length - _this.maxRows / 2),_this.lines.length - _this.maxRows),0)); - } - //鼠标按下且有横向滚动条 - if(_this.mouseEvent == 2 && _this.hasXScroll){ - var delta = e.offsetX - _this.mouseDownX; - _this.mouseDownX = e.offsetX; - var canvasWidth = _this.canvas.width - 8; - _this.startX = Math.max(Math.min(_this.startX - (canvasWidth / _this.slideWidth) * delta,_this.grid ? 5 : 0),canvasWidth - _this.maxWidth) - } - - } - this.canvas.onmousewheel = function(e){ - if(e.wheelDelta > 0){ //向上滚动 - _this.scrollTo(Math.max(_this.startIndex - 2,0)); - }else{ - _this.scrollTo(Math.max(Math.min(_this.startIndex + 1,_this.lines.length - _this.maxRows),0)); - } - } - this.canvas.onmousedown = function(e){ - if(e.offsetX > _this.canvas.width - 8 && e.offsetY < _this.canvas.height - 8){ - _this.mouseEvent = 1; - _this.mouseDownX = e.offsetX; - _this.mouseDownY = e.offsetY; - } - if(e.offsetX < _this.canvas.width - 8 && e.offsetY > _this.canvas.height - 8){ - _this.mouseEvent = 2; - _this.mouseDownX = e.offsetX; - _this.mouseDownY = e.offsetY; - } - } - this.canvas.onmouseup = this.canvas.onmouseout = function(){ - _this.mouseEvent = 0; - _this.mouseDownX = 0; - _this.mouseDownY = 0; - } - this.canvas.onclick = function(e){ - var x = e.offsetX; - var y = e.offsetY; - if(x < _this.canvas.width - 8 && y < _this.canvas.height - 8){ - var row = _this.startIndex + parseInt(y / _this.lineHeight) + (y % _this.lineHeight == 0 ? 0 : 1) - 1; - var _hover = false; - var texts = _this.lines[row]; - if(texts){ - for(var i =0,len = texts.length;i x){ - _this.onClick(text); - break; - } - } - } - } - - } - var animate = function(){ - _this.animateIndex = requestAnimFrame(animate); - _this.redraw(); - } - animate(); -} -CanvasViewer.prototype.destory = function(){ - cancelAnimationFrame(this.animateIndex); - this.texts = null; -} -CanvasViewer.prototype.append = function(texts){ - this.sourceLines.push(texts); - if(this.filterLine(texts)){ - this.calcMaxWidth(texts); - this.lines.push(texts); - } -} -CanvasViewer.prototype.calcMaxWidth = function(texts){ - var width = texts.length * 10 - 10; - for(var i =0,len = texts.length;i 0){ - w = this._drawLongText(text.text,0,0,text.maxWidth,true); - }else{ - w = this.context.measureText(content).width; - } - this.colsOffsetX[i] = Math.max(this.colsOffsetX[i] || 0,w); - width += ((this.grid ? this.colsOffsetX[i] : 0) || w); - } - this.maxWidth = Math.max(this.maxWidth,width); -} -CanvasViewer.prototype.filter = function(content){ - this.filterText = content; - var nLines = []; - for(var i=0,len = this.sourceLines.length;i -1; -} -CanvasViewer.prototype.resize = function(){ - var prevMaxRows = this.maxRows; - this.maxRows = Math.ceil(this.canvas.height / this.lineHeight); - this.context = this.canvas.getContext('2d'); - this.context.font = 'bold 14px Consolas'; - this.context.textBaseline = 'middle'; - this.scrollTo(this.startIndex + (prevMaxRows - this.maxRows)); - this.redraw(); -} -CanvasViewer.prototype._drawScroll = function(){ - var surplus = this.lines.length - this.maxRows; - this.hasScroll = surplus > 0; - - this.context.clearRect(x,canvasHeight,8,8); - if(this.hasScroll){ - var canvasHeight = this.canvas.height - 8; - this.scrollHeight = canvasHeight + this.lineHeight * surplus; - this.slideHeight = Math.max(canvasHeight * (canvasHeight / this.scrollHeight),10); - this.scrollTop = Math.min(this.startIndex / this.lines.length * canvasHeight,canvasHeight - this.slideHeight); - this.context.save(); - this.context.beginPath(); - var x = this.canvas.width - 8; - var y = this.scrollTop; - var r = 4; - var width = 8; - var height = this.slideHeight; - this.context.fillStyle = '#f1f1f1'; - this.context.fillRect(x,0,8,canvasHeight); - - - this.context.moveTo(x + r, y); - this.context.arcTo(x + width, y, x + width, y + r, r); - this.context.arcTo(x + width, y + height, x + width - r, y + height, r); - this.context.arcTo(x, y + height, x, y + height - r, r); - this.context.arcTo(x, y, x + r, y, r); - if(this.mouseEvent == 1){ - this.context.fillStyle = '#787878'; - }else if(this.mouseX > x && this.mouseY > y &&this.mouseY < y + height){ - this.context.fillStyle = '#a8a8a8'; - }else{ - this.context.fillStyle = '#c1c1c1'; - } - this.context.fill(); - this.context.restore(); - } - // - this.hasXScroll = this.maxWidth > this.canvas.width - 8; - if(this.hasXScroll){ - var canvasWidth = this.canvas.width - 8; - this.scrollWidth = this.maxWidth; - this.slideWidth = Math.max(canvasWidth * (canvasWidth / this.scrollWidth),10); - - this.scrollLeft = Math.min(-this.startX / this.maxWidth * canvasWidth,canvasWidth - this.slideWidth); - this.context.save(); - this.context.beginPath(); - var x = this.scrollLeft; - var y = this.canvas.height - 8; - var r = 4; - var width = this.slideWidth; - var height = 8; - this.context.fillStyle = '#f1f1f1'; - this.context.fillRect(0,this.canvas.height - 8,canvasWidth,8); - - this.context.moveTo(x + r, y); - this.context.arcTo(x + width, y, x + width, y + r, r); - this.context.arcTo(x + width, y + height, x + width - r, y + height, r); - this.context.arcTo(x, y + height, x, y + height - r, r); - this.context.arcTo(x, y, x + r, y, r); - if(this.mouseEvent == 2){ - this.context.fillStyle = '#787878'; - }else if(this.mouseX > x && this.mouseY > y &&this.mouseX < x + width){ - this.context.fillStyle = '#a8a8a8'; - }else{ - this.context.fillStyle = '#c1c1c1'; - } - this.context.fill(); - this.context.restore(); - } -} -CanvasViewer.prototype.scrollTo = function(index){ - if(index < 0){ - index = this.lines.length - 1; - } - this.startIndex = Math.max(Math.min(Math.max(index,0),this.lines.length - this.maxRows),0); - if(this.startIndex > 0){ - this.startIndex = this.startIndex + 1; - } -} -CanvasViewer.prototype.redraw = function(){ - var lines = this.lines.slice(this.startIndex,this.startIndex + this.maxRows); - this.context.clearRect(0,0,this.canvas.width,this.canvas.height); - this.context.lineWidth = 1; - this.context.strokeStyle = '#e6e6e6'; - this.context.font = this.style.font || 'bold 14px Consolas'; - this.context.textBaseline = this.style.textBaseLine || 'middle'; - var cols = [0]; - var maxY = 0; - var maxX = 0; - for(var i=0,l =lines.length;i 0){ - width = this._drawLongText(content,x,y,text.maxWidth); - }else{ - this.context.fillText(content,x,y); - } - text.startX = x; - text.endX = x + width; - x = x + ((this.grid ? this.colsOffsetX[j] : 0) || width) + 10; - maxX = x - 5; - if(this.grid){ - cols[j + 1] = Math.max(cols[j + 1] || 0,maxX); - } - } - } - if(this.grid && lines.length > 0){ - for(var i=0;i<=lines.length;i++){ - if(this.grid){ - this.context.save(); - this.context.beginPath(); - this.context.moveTo(2.5,i * 24 + 0.5); - this.context.lineTo(maxX + 0.5, i * 24 + 0.5); - this.context.stroke(); - this.context.restore(); - } - } - for(var i=0;i < cols.length;i++){ - var x = cols[i]; - this.context.save(); - this.context.beginPath(); - this.context.moveTo(x + 0.5,0.5); - this.context.lineTo(x + 0.5, maxY); - this.context.stroke(); - this.context.restore(); - } - } - this._drawScroll(); -} -CanvasViewer.prototype._drawLongText = function(text,x,y,maxWidth,calcWidth){ - var length = text.length; - var index = 0; - var width = 0; - while(index < length){ - var str = text.substr(index,1); - var w = this.context.measureText(str).width; - width+= w; - if(width > maxWidth){ - width-=w; - break; - } - if(calcWidth === undefined){ - this.context.fillText(str,x + width - w,y); - } - index++; - } - if(index < length){ - var w = this.context.measureText('...').width; - width+=w; - if(calcWidth === undefined){ - this.context.fillText('...',x + width - w,y); - } - - } - return width; -} \ No newline at end of file diff --git a/spider/resources/static/js/codemirror/codemirror.css b/spider/resources/static/js/codemirror/codemirror.css deleted file mode 100644 index 7d0a49f..0000000 --- a/spider/resources/static/js/codemirror/codemirror.css +++ /dev/null @@ -1,356 +0,0 @@ -/* BASICS */ - -.CodeMirror { - /* Set height, width, borders, and global font properties here */ - font-family: monospace; - color: black; - direction: ltr; - border: 1px solid #e6e6e6; - height: 100%; - padding-left: 7px; - padding-top: 4px; - box-sizing: border-box; -} - -/* PADDING */ - -.CodeMirror-lines { - padding: 4px 0; /* Vertical padding around content */ -} -.CodeMirror pre.CodeMirror-line, -.CodeMirror pre.CodeMirror-line-like { - padding: 0 4px; /* Horizontal padding of content */ -} - -.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { - background-color: white; /* The little square between H and V scrollbars */ -} - -/* GUTTER */ - -.CodeMirror-gutters { - border-right: 1px solid #ddd; - background-color: #f7f7f7; - white-space: nowrap; -} -.CodeMirror-linenumbers {} -.CodeMirror-linenumber { - padding: 0 3px 0 5px; - min-width: 20px; - text-align: right; - color: #999; - white-space: nowrap; -} - -.CodeMirror-guttermarker { color: black; } -.CodeMirror-guttermarker-subtle { color: #999; } - -/* CURSOR */ - -.CodeMirror-cursor { - border-left: 1px solid black; - border-right: none; - width: 0; -} -/* Shown when moving in bi-directional text */ -.CodeMirror div.CodeMirror-secondarycursor { - border-left: 1px solid silver; -} -.cm-fat-cursor .CodeMirror-cursor { - width: auto; - border: 0 !important; - background: #7e7; -} -.cm-fat-cursor div.CodeMirror-cursors { - z-index: 1; -} -.cm-fat-cursor-mark { - background-color: rgba(20, 255, 20, 0.5); - -webkit-animation: blink 1.06s steps(1) infinite; - -moz-animation: blink 1.06s steps(1) infinite; - animation: blink 1.06s steps(1) infinite; -} -.cm-animate-fat-cursor { - width: auto; - border: 0; - -webkit-animation: blink 1.06s steps(1) infinite; - -moz-animation: blink 1.06s steps(1) infinite; - animation: blink 1.06s steps(1) infinite; - background-color: #7e7; -} -@-moz-keyframes blink { - 0% {} - 50% { background-color: transparent; } - 100% {} -} -@-webkit-keyframes blink { - 0% {} - 50% { background-color: transparent; } - 100% {} -} -@keyframes blink { - 0% {} - 50% { background-color: transparent; } - 100% {} -} - -/* Can style cursor different in overwrite (non-insert) mode */ -.CodeMirror-overwrite .CodeMirror-cursor {} - -.cm-tab { display: inline-block; text-decoration: inherit; } - -.CodeMirror-rulers { - position: absolute; - left: 0; right: 0; top: -50px; bottom: 0; - overflow: hidden; -} -.CodeMirror-ruler { - border-left: 1px solid #ccc; - top: 0; bottom: 0; - position: absolute; -} - -/* DEFAULT THEME */ - -.cm-s-default .cm-header {color: blue;} -.cm-s-default .cm-quote {color: #090;} -.cm-negative {color: #d44;} -.cm-positive {color: #292;} -.cm-header, .cm-strong {font-weight: bold;} -.cm-em {font-style: italic;} -.cm-link {text-decoration: underline;} -.cm-strikethrough {text-decoration: line-through;} - -.cm-s-default .cm-keyword {color: #708;} -.cm-s-default .cm-atom {color: #219;} -.cm-s-default .cm-number {color: #164;} -.cm-s-default .cm-def {color: #00f;} -.cm-s-default .cm-variable, -.cm-s-default .cm-punctuation, -.cm-s-default .cm-property, -.cm-s-default .cm-operator {} -.cm-s-default .cm-variable-2 {color: #05a;} -.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} -.cm-s-default .cm-comment {color: #a50;} -.cm-s-default .cm-string {color: #a11;} -.cm-s-default .cm-string-2 {color: #f50;} -.cm-s-default .cm-meta {color: #555;} -.cm-s-default .cm-qualifier {color: #555;} -.cm-s-default .cm-builtin {color: #30a;} -.cm-s-default .cm-bracket {color: #997;} -.cm-s-default .cm-tag {color: #170;} -.cm-s-default .cm-attribute {color: #00c;} -.cm-s-default .cm-hr {color: #999;} -.cm-s-default .cm-link {color: #00c;} - -.cm-s-default .cm-error {color: #f00;} -.cm-invalidchar {color: #f00;} - -.CodeMirror-composing { border-bottom: 2px solid; } - -/* Default styles for common addons */ - -div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} -div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} -.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } -.CodeMirror-activeline-background {background: #e8f2ff;} - -/* STOP */ - -/* The rest of this file contains styles related to the mechanics of - the editor. You probably shouldn't touch them. */ - -.CodeMirror { - position: relative; - overflow: hidden; - background: white; -} - -.CodeMirror-scroll { - overflow: scroll !important; /* Things will break if this is overridden */ - /* 30px is the magic margin used to hide the element's real scrollbars */ - /* See overflow: hidden in .CodeMirror */ - margin-bottom: -30px; margin-right: -30px; - padding-bottom: 30px; - height: 100%; - outline: none; /* Prevent dragging from highlighting the element */ - position: relative; -} -.CodeMirror-sizer { - position: relative; - border-right: 30px solid transparent; -} - -/* The fake, visible scrollbars. Used to force redraw during scrolling - before actual scrolling happens, thus preventing shaking and - flickering artifacts. */ -.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { - position: absolute; - z-index: 6; - display: none; -} -.CodeMirror-vscrollbar { - right: 0; top: 0; - overflow-x: hidden; - overflow-y: scroll; -} -.CodeMirror-hscrollbar { - bottom: 0; left: 0; - overflow-y: hidden; - overflow-x: scroll; -} -.CodeMirror-scrollbar-filler { - right: 0; bottom: 0; -} -.CodeMirror-gutter-filler { - left: 0; bottom: 0; -} - -.CodeMirror-gutters { - position: absolute; left: 0; top: 0; - min-height: 100%; - z-index: 3; -} -.CodeMirror-gutter { - white-space: normal; - height: 100%; - display: inline-block; - vertical-align: top; - margin-bottom: -30px; -} -.CodeMirror-gutter-wrapper { - position: absolute; - z-index: 4; - background: none !important; - border: none !important; -} -.CodeMirror-gutter-background { - position: absolute; - top: 0; bottom: 0; - z-index: 4; -} -.CodeMirror-gutter-elt { - position: absolute; - cursor: default; - z-index: 4; -} -.CodeMirror-gutter-wrapper ::selection { background-color: transparent } -.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } - -.CodeMirror-lines { - cursor: text; - min-height: 1px; /* prevents collapsing before first draw */ -} -.CodeMirror pre.CodeMirror-line, -.CodeMirror pre.CodeMirror-line-like { - /* Reset some styles that the rest of the page might have set */ - -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; - border-width: 0; - background: transparent; - font-family: inherit; - font-size: inherit; - margin: 0; - white-space: pre; - word-wrap: normal; - line-height: inherit; - color: inherit; - z-index: 2; - position: relative; - overflow: visible; - -webkit-tap-highlight-color: transparent; - -webkit-font-variant-ligatures: contextual; - font-variant-ligatures: contextual; -} -.CodeMirror-wrap pre.CodeMirror-line, -.CodeMirror-wrap pre.CodeMirror-line-like { - word-wrap: break-word; - white-space: pre-wrap; - word-break: normal; -} - -.CodeMirror-linebackground { - position: absolute; - left: 0; right: 0; top: 0; bottom: 0; - z-index: 0; -} - -.CodeMirror-linewidget { - position: relative; - z-index: 2; - padding: 0.1px; /* Force widget margins to stay inside of the container */ -} - -.CodeMirror-widget {} - -.CodeMirror-rtl pre { direction: rtl; } - -.CodeMirror-code { - outline: none; -} - -/* Force content-box sizing for the elements where we expect it */ -.CodeMirror-scroll, -.CodeMirror-sizer, -.CodeMirror-gutter, -.CodeMirror-gutters, -.CodeMirror-linenumber { - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -.CodeMirror-measure { - position: absolute; - width: 100%; - height: 0; - overflow: hidden; - visibility: hidden; -} - -.CodeMirror-cursor { - position: absolute; - pointer-events: none; -} -.CodeMirror-measure pre { position: static; } - -div.CodeMirror-cursors { - visibility: hidden; - position: relative; - z-index: 3; -} -div.CodeMirror-dragcursors { - visibility: visible; -} - -.CodeMirror-focused div.CodeMirror-cursors { - visibility: visible; -} - -.CodeMirror-selected { background: #d9d9d9; } -.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } -.CodeMirror-crosshair { cursor: crosshair; } -.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } -.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } - -.cm-searching { - background-color: #ffa; - background-color: rgba(255, 255, 0, .4); -} - -/* Used to force a border model for a node */ -.cm-force-border { padding-right: .1px; } - -@media print { - /* Hide the cursor when printing */ - .CodeMirror div.CodeMirror-cursors { - visibility: hidden; - } -} - -/* See issue #2901 */ -.cm-tab-wrap-hack:after { content: ''; } - -/* Help users use markselection to safely style text background */ -span.CodeMirror-selectedtext { background: none; } - - -.CodeMirror pre.CodeMirror-placeholder { color: #666; } \ No newline at end of file diff --git a/spider/resources/static/js/codemirror/codemirror.js b/spider/resources/static/js/codemirror/codemirror.js deleted file mode 100644 index 076a0b8..0000000 --- a/spider/resources/static/js/codemirror/codemirror.js +++ /dev/null @@ -1,9765 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: https://codemirror.net/LICENSE - -// This is CodeMirror (https://codemirror.net), a code editor -// implemented in JavaScript on top of the browser's DOM. -// -// You can find some technical background for some of the code below -// at http://marijnhaverbeke.nl/blog/#cm-internals . - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.CodeMirror = factory()); -}(this, (function () { 'use strict'; - - // Kludges for bugs and behavior differences that can't be feature - // detected are enabled based on userAgent etc sniffing. - var userAgent = navigator.userAgent; - var platform = navigator.platform; - - var gecko = /gecko\/\d/i.test(userAgent); - var ie_upto10 = /MSIE \d/.test(userAgent); - var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); - var edge = /Edge\/(\d+)/.exec(userAgent); - var ie = ie_upto10 || ie_11up || edge; - var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); - var webkit = !edge && /WebKit\//.test(userAgent); - var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); - var chrome = !edge && /Chrome\//.test(userAgent); - var presto = /Opera\//.test(userAgent); - var safari = /Apple Computer/.test(navigator.vendor); - var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); - var phantom = /PhantomJS/.test(userAgent); - - var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent); - var android = /Android/.test(userAgent); - // This is woefully incomplete. Suggestions for alternative methods welcome. - var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); - var mac = ios || /Mac/.test(platform); - var chromeOS = /\bCrOS\b/.test(userAgent); - var windows = /win/i.test(platform); - - var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); - if (presto_version) { presto_version = Number(presto_version[1]); } - if (presto_version && presto_version >= 15) { presto = false; webkit = true; } - // Some browsers use the wrong event properties to signal cmd/ctrl on OS X - var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); - var captureRightClick = gecko || (ie && ie_version >= 9); - - function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } - - var rmClass = function(node, cls) { - var current = node.className; - var match = classTest(cls).exec(current); - if (match) { - var after = current.slice(match.index + match[0].length); - node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); - } - }; - - function removeChildren(e) { - for (var count = e.childNodes.length; count > 0; --count) - { e.removeChild(e.firstChild); } - return e - } - - function removeChildrenAndAdd(parent, e) { - return removeChildren(parent).appendChild(e) - } - - function elt(tag, content, className, style) { - var e = document.createElement(tag); - if (className) { e.className = className; } - if (style) { e.style.cssText = style; } - if (typeof content == "string") { e.appendChild(document.createTextNode(content)); } - else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } } - return e - } - // wrapper for elt, which removes the elt from the accessibility tree - function eltP(tag, content, className, style) { - var e = elt(tag, content, className, style); - e.setAttribute("role", "presentation"); - return e - } - - var range; - if (document.createRange) { range = function(node, start, end, endNode) { - var r = document.createRange(); - r.setEnd(endNode || node, end); - r.setStart(node, start); - return r - }; } - else { range = function(node, start, end) { - var r = document.body.createTextRange(); - try { r.moveToElementText(node.parentNode); } - catch(e) { return r } - r.collapse(true); - r.moveEnd("character", end); - r.moveStart("character", start); - return r - }; } - - function contains(parent, child) { - if (child.nodeType == 3) // Android browser always returns false when child is a textnode - { child = child.parentNode; } - if (parent.contains) - { return parent.contains(child) } - do { - if (child.nodeType == 11) { child = child.host; } - if (child == parent) { return true } - } while (child = child.parentNode) - } - - function activeElt() { - // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. - // IE < 10 will throw when accessed while the page is loading or in an iframe. - // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. - var activeElement; - try { - activeElement = document.activeElement; - } catch(e) { - activeElement = document.body || null; - } - while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) - { activeElement = activeElement.shadowRoot.activeElement; } - return activeElement - } - - function addClass(node, cls) { - var current = node.className; - if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; } - } - function joinClasses(a, b) { - var as = a.split(" "); - for (var i = 0; i < as.length; i++) - { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } } - return b - } - - var selectInput = function(node) { node.select(); }; - if (ios) // Mobile Safari apparently has a bug where select() is broken. - { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; } - else if (ie) // Suppress mysterious IE10 errors - { selectInput = function(node) { try { node.select(); } catch(_e) {} }; } - - function bind(f) { - var args = Array.prototype.slice.call(arguments, 1); - return function(){return f.apply(null, args)} - } - - function copyObj(obj, target, overwrite) { - if (!target) { target = {}; } - for (var prop in obj) - { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) - { target[prop] = obj[prop]; } } - return target - } - - // Counts the column offset in a string, taking tabs into account. - // Used mostly to find indentation. - function countColumn(string, end, tabSize, startIndex, startValue) { - if (end == null) { - end = string.search(/[^\s\u00a0]/); - if (end == -1) { end = string.length; } - } - for (var i = startIndex || 0, n = startValue || 0;;) { - var nextTab = string.indexOf("\t", i); - if (nextTab < 0 || nextTab >= end) - { return n + (end - i) } - n += nextTab - i; - n += tabSize - (n % tabSize); - i = nextTab + 1; - } - } - - var Delayed = function() {this.id = null;}; - Delayed.prototype.set = function (ms, f) { - clearTimeout(this.id); - this.id = setTimeout(f, ms); - }; - - function indexOf(array, elt) { - for (var i = 0; i < array.length; ++i) - { if (array[i] == elt) { return i } } - return -1 - } - - // Number of pixels added to scroller and sizer to hide scrollbar - var scrollerGap = 30; - - // Returned or thrown by various protocols to signal 'I'm not - // handling this'. - var Pass = {toString: function(){return "CodeMirror.Pass"}}; - - // Reused option objects for setSelection & friends - var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"}; - - // The inverse of countColumn -- find the offset that corresponds to - // a particular column. - function findColumn(string, goal, tabSize) { - for (var pos = 0, col = 0;;) { - var nextTab = string.indexOf("\t", pos); - if (nextTab == -1) { nextTab = string.length; } - var skipped = nextTab - pos; - if (nextTab == string.length || col + skipped >= goal) - { return pos + Math.min(skipped, goal - col) } - col += nextTab - pos; - col += tabSize - (col % tabSize); - pos = nextTab + 1; - if (col >= goal) { return pos } - } - } - - var spaceStrs = [""]; - function spaceStr(n) { - while (spaceStrs.length <= n) - { spaceStrs.push(lst(spaceStrs) + " "); } - return spaceStrs[n] - } - - function lst(arr) { return arr[arr.length-1] } - - function map(array, f) { - var out = []; - for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); } - return out - } - - function insertSorted(array, value, score) { - var pos = 0, priority = score(value); - while (pos < array.length && score(array[pos]) <= priority) { pos++; } - array.splice(pos, 0, value); - } - - function nothing() {} - - function createObj(base, props) { - var inst; - if (Object.create) { - inst = Object.create(base); - } else { - nothing.prototype = base; - inst = new nothing(); - } - if (props) { copyObj(props, inst); } - return inst - } - - var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; - function isWordCharBasic(ch) { - return /\w/.test(ch) || ch > "\x80" && - (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) - } - function isWordChar(ch, helper) { - if (!helper) { return isWordCharBasic(ch) } - if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } - return helper.test(ch) - } - - function isEmpty(obj) { - for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } - return true - } - - // Extending unicode characters. A series of a non-extending char + - // any number of extending chars is treated as a single unit as far - // as editing and measuring is concerned. This is not fully correct, - // since some scripts/fonts/browsers also treat other configurations - // of code points as a group. - var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; - function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } - - // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. - function skipExtendingChars(str, pos, dir) { - while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; } - return pos - } - - // Returns the value from the range [`from`; `to`] that satisfies - // `pred` and is closest to `from`. Assumes that at least `to` - // satisfies `pred`. Supports `from` being greater than `to`. - function findFirst(pred, from, to) { - // At any point we are certain `to` satisfies `pred`, don't know - // whether `from` does. - var dir = from > to ? -1 : 1; - for (;;) { - if (from == to) { return from } - var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); - if (mid == from) { return pred(mid) ? from : to } - if (pred(mid)) { to = mid; } - else { from = mid + dir; } - } - } - - // BIDI HELPERS - - function iterateBidiSections(order, from, to, f) { - if (!order) { return f(from, to, "ltr", 0) } - var found = false; - for (var i = 0; i < order.length; ++i) { - var part = order[i]; - if (part.from < to && part.to > from || from == to && part.to == from) { - f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i); - found = true; - } - } - if (!found) { f(from, to, "ltr"); } - } - - var bidiOther = null; - function getBidiPartAt(order, ch, sticky) { - var found; - bidiOther = null; - for (var i = 0; i < order.length; ++i) { - var cur = order[i]; - if (cur.from < ch && cur.to > ch) { return i } - if (cur.to == ch) { - if (cur.from != cur.to && sticky == "before") { found = i; } - else { bidiOther = i; } - } - if (cur.from == ch) { - if (cur.from != cur.to && sticky != "before") { found = i; } - else { bidiOther = i; } - } - } - return found != null ? found : bidiOther - } - - // Bidirectional ordering algorithm - // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm - // that this (partially) implements. - - // One-char codes used for character types: - // L (L): Left-to-Right - // R (R): Right-to-Left - // r (AL): Right-to-Left Arabic - // 1 (EN): European Number - // + (ES): European Number Separator - // % (ET): European Number Terminator - // n (AN): Arabic Number - // , (CS): Common Number Separator - // m (NSM): Non-Spacing Mark - // b (BN): Boundary Neutral - // s (B): Paragraph Separator - // t (S): Segment Separator - // w (WS): Whitespace - // N (ON): Other Neutrals - - // Returns null if characters are ordered as they appear - // (left-to-right), or an array of sections ({from, to, level} - // objects) in the order in which they occur visually. - var bidiOrdering = (function() { - // Character types for codepoints 0 to 0xff - var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; - // Character types for codepoints 0x600 to 0x6f9 - var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; - function charType(code) { - if (code <= 0xf7) { return lowTypes.charAt(code) } - else if (0x590 <= code && code <= 0x5f4) { return "R" } - else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } - else if (0x6ee <= code && code <= 0x8ac) { return "r" } - else if (0x2000 <= code && code <= 0x200b) { return "w" } - else if (code == 0x200c) { return "b" } - else { return "L" } - } - - var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; - var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; - - function BidiSpan(level, from, to) { - this.level = level; - this.from = from; this.to = to; - } - - return function(str, direction) { - var outerType = direction == "ltr" ? "L" : "R"; - - if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false } - var len = str.length, types = []; - for (var i = 0; i < len; ++i) - { types.push(charType(str.charCodeAt(i))); } - - // W1. Examine each non-spacing mark (NSM) in the level run, and - // change the type of the NSM to the type of the previous - // character. If the NSM is at the start of the level run, it will - // get the type of sor. - for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { - var type = types[i$1]; - if (type == "m") { types[i$1] = prev; } - else { prev = type; } - } - - // W2. Search backwards from each instance of a European number - // until the first strong type (R, L, AL, or sor) is found. If an - // AL is found, change the type of the European number to Arabic - // number. - // W3. Change all ALs to R. - for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { - var type$1 = types[i$2]; - if (type$1 == "1" && cur == "r") { types[i$2] = "n"; } - else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } } - } - - // W4. A single European separator between two European numbers - // changes to a European number. A single common separator between - // two numbers of the same type changes to that type. - for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { - var type$2 = types[i$3]; - if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; } - else if (type$2 == "," && prev$1 == types[i$3+1] && - (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; } - prev$1 = type$2; - } - - // W5. A sequence of European terminators adjacent to European - // numbers changes to all European numbers. - // W6. Otherwise, separators and terminators change to Other - // Neutral. - for (var i$4 = 0; i$4 < len; ++i$4) { - var type$3 = types[i$4]; - if (type$3 == ",") { types[i$4] = "N"; } - else if (type$3 == "%") { - var end = (void 0); - for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} - var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; - for (var j = i$4; j < end; ++j) { types[j] = replace; } - i$4 = end - 1; - } - } - - // W7. Search backwards from each instance of a European number - // until the first strong type (R, L, or sor) is found. If an L is - // found, then change the type of the European number to L. - for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { - var type$4 = types[i$5]; - if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; } - else if (isStrong.test(type$4)) { cur$1 = type$4; } - } - - // N1. A sequence of neutrals takes the direction of the - // surrounding strong text if the text on both sides has the same - // direction. European and Arabic numbers act as if they were R in - // terms of their influence on neutrals. Start-of-level-run (sor) - // and end-of-level-run (eor) are used at level run boundaries. - // N2. Any remaining neutrals take the embedding direction. - for (var i$6 = 0; i$6 < len; ++i$6) { - if (isNeutral.test(types[i$6])) { - var end$1 = (void 0); - for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} - var before = (i$6 ? types[i$6-1] : outerType) == "L"; - var after = (end$1 < len ? types[end$1] : outerType) == "L"; - var replace$1 = before == after ? (before ? "L" : "R") : outerType; - for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; } - i$6 = end$1 - 1; - } - } - - // Here we depart from the documented algorithm, in order to avoid - // building up an actual levels array. Since there are only three - // levels (0, 1, 2) in an implementation that doesn't take - // explicit embedding into account, we can build up the order on - // the fly, without following the level-based algorithm. - var order = [], m; - for (var i$7 = 0; i$7 < len;) { - if (countsAsLeft.test(types[i$7])) { - var start = i$7; - for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} - order.push(new BidiSpan(0, start, i$7)); - } else { - var pos = i$7, at = order.length; - for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} - for (var j$2 = pos; j$2 < i$7;) { - if (countsAsNum.test(types[j$2])) { - if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); } - var nstart = j$2; - for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} - order.splice(at, 0, new BidiSpan(2, nstart, j$2)); - pos = j$2; - } else { ++j$2; } - } - if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); } - } - } - if (direction == "ltr") { - if (order[0].level == 1 && (m = str.match(/^\s+/))) { - order[0].from = m[0].length; - order.unshift(new BidiSpan(0, 0, m[0].length)); - } - if (lst(order).level == 1 && (m = str.match(/\s+$/))) { - lst(order).to -= m[0].length; - order.push(new BidiSpan(0, len - m[0].length, len)); - } - } - - return direction == "rtl" ? order.reverse() : order - } - })(); - - // Get the bidi ordering for the given line (and cache it). Returns - // false for lines that are fully left-to-right, and an array of - // BidiSpan objects otherwise. - function getOrder(line, direction) { - var order = line.order; - if (order == null) { order = line.order = bidiOrdering(line.text, direction); } - return order - } - - // EVENT HANDLING - - // Lightweight event framework. on/off also work on DOM nodes, - // registering native DOM handlers. - - var noHandlers = []; - - var on = function(emitter, type, f) { - if (emitter.addEventListener) { - emitter.addEventListener(type, f, false); - } else if (emitter.attachEvent) { - emitter.attachEvent("on" + type, f); - } else { - var map$$1 = emitter._handlers || (emitter._handlers = {}); - map$$1[type] = (map$$1[type] || noHandlers).concat(f); - } - }; - - function getHandlers(emitter, type) { - return emitter._handlers && emitter._handlers[type] || noHandlers - } - - function off(emitter, type, f) { - if (emitter.removeEventListener) { - emitter.removeEventListener(type, f, false); - } else if (emitter.detachEvent) { - emitter.detachEvent("on" + type, f); - } else { - var map$$1 = emitter._handlers, arr = map$$1 && map$$1[type]; - if (arr) { - var index = indexOf(arr, f); - if (index > -1) - { map$$1[type] = arr.slice(0, index).concat(arr.slice(index + 1)); } - } - } - } - - function signal(emitter, type /*, values...*/) { - var handlers = getHandlers(emitter, type); - if (!handlers.length) { return } - var args = Array.prototype.slice.call(arguments, 2); - for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); } - } - - // The DOM events that CodeMirror handles can be overridden by - // registering a (non-DOM) handler on the editor for the event name, - // and preventDefault-ing the event in that handler. - function signalDOMEvent(cm, e, override) { - if (typeof e == "string") - { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; } - signal(cm, override || e.type, cm, e); - return e_defaultPrevented(e) || e.codemirrorIgnore - } - - function signalCursorActivity(cm) { - var arr = cm._handlers && cm._handlers.cursorActivity; - if (!arr) { return } - var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); - for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) - { set.push(arr[i]); } } - } - - function hasHandler(emitter, type) { - return getHandlers(emitter, type).length > 0 - } - - // Add on and off methods to a constructor's prototype, to make - // registering events on such objects more convenient. - function eventMixin(ctor) { - ctor.prototype.on = function(type, f) {on(this, type, f);}; - ctor.prototype.off = function(type, f) {off(this, type, f);}; - } - - // Due to the fact that we still support jurassic IE versions, some - // compatibility wrappers are needed. - - function e_preventDefault(e) { - if (e.preventDefault) { e.preventDefault(); } - else { e.returnValue = false; } - } - function e_stopPropagation(e) { - if (e.stopPropagation) { e.stopPropagation(); } - else { e.cancelBubble = true; } - } - function e_defaultPrevented(e) { - return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false - } - function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} - - function e_target(e) {return e.target || e.srcElement} - function e_button(e) { - var b = e.which; - if (b == null) { - if (e.button & 1) { b = 1; } - else if (e.button & 2) { b = 3; } - else if (e.button & 4) { b = 2; } - } - if (mac && e.ctrlKey && b == 1) { b = 3; } - return b - } - - // Detect drag-and-drop - var dragAndDrop = function() { - // There is *some* kind of drag-and-drop support in IE6-8, but I - // couldn't get it to work yet. - if (ie && ie_version < 9) { return false } - var div = elt('div'); - return "draggable" in div || "dragDrop" in div - }(); - - var zwspSupported; - function zeroWidthElement(measure) { - if (zwspSupported == null) { - var test = elt("span", "\u200b"); - removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); - if (measure.firstChild.offsetHeight != 0) - { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } - } - var node = zwspSupported ? elt("span", "\u200b") : - elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); - node.setAttribute("cm-text", ""); - return node - } - - // Feature-detect IE's crummy client rect reporting for bidi text - var badBidiRects; - function hasBadBidiRects(measure) { - if (badBidiRects != null) { return badBidiRects } - var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); - var r0 = range(txt, 0, 1).getBoundingClientRect(); - var r1 = range(txt, 1, 2).getBoundingClientRect(); - removeChildren(measure); - if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) - return badBidiRects = (r1.right - r0.right < 3) - } - - // See if "".split is the broken IE version, if so, provide an - // alternative way to split lines. - var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { - var pos = 0, result = [], l = string.length; - while (pos <= l) { - var nl = string.indexOf("\n", pos); - if (nl == -1) { nl = string.length; } - var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); - var rt = line.indexOf("\r"); - if (rt != -1) { - result.push(line.slice(0, rt)); - pos += rt + 1; - } else { - result.push(line); - pos = nl + 1; - } - } - return result - } : function (string) { return string.split(/\r\n?|\n/); }; - - var hasSelection = window.getSelection ? function (te) { - try { return te.selectionStart != te.selectionEnd } - catch(e) { return false } - } : function (te) { - var range$$1; - try {range$$1 = te.ownerDocument.selection.createRange();} - catch(e) {} - if (!range$$1 || range$$1.parentElement() != te) { return false } - return range$$1.compareEndPoints("StartToEnd", range$$1) != 0 - }; - - var hasCopyEvent = (function () { - var e = elt("div"); - if ("oncopy" in e) { return true } - e.setAttribute("oncopy", "return;"); - return typeof e.oncopy == "function" - })(); - - var badZoomedRects = null; - function hasBadZoomedRects(measure) { - if (badZoomedRects != null) { return badZoomedRects } - var node = removeChildrenAndAdd(measure, elt("span", "x")); - var normal = node.getBoundingClientRect(); - var fromRange = range(node, 0, 1).getBoundingClientRect(); - return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 - } - - // Known modes, by name and by MIME - var modes = {}, mimeModes = {}; - - // Extra arguments are stored as the mode's dependencies, which is - // used by (legacy) mechanisms like loadmode.js to automatically - // load a mode. (Preferred mechanism is the require/define calls.) - function defineMode(name, mode) { - if (arguments.length > 2) - { mode.dependencies = Array.prototype.slice.call(arguments, 2); } - modes[name] = mode; - } - - function defineMIME(mime, spec) { - mimeModes[mime] = spec; - } - - // Given a MIME type, a {name, ...options} config object, or a name - // string, return a mode config object. - function resolveMode(spec) { - if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { - spec = mimeModes[spec]; - } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { - var found = mimeModes[spec.name]; - if (typeof found == "string") { found = {name: found}; } - spec = createObj(found, spec); - spec.name = found.name; - } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { - return resolveMode("application/xml") - } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { - return resolveMode("application/json") - } - if (typeof spec == "string") { return {name: spec} } - else { return spec || {name: "null"} } - } - - // Given a mode spec (anything that resolveMode accepts), find and - // initialize an actual mode object. - function getMode(options, spec) { - spec = resolveMode(spec); - var mfactory = modes[spec.name]; - if (!mfactory) { return getMode(options, "text/plain") } - var modeObj = mfactory(options, spec); - if (modeExtensions.hasOwnProperty(spec.name)) { - var exts = modeExtensions[spec.name]; - for (var prop in exts) { - if (!exts.hasOwnProperty(prop)) { continue } - if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } - modeObj[prop] = exts[prop]; - } - } - modeObj.name = spec.name; - if (spec.helperType) { modeObj.helperType = spec.helperType; } - if (spec.modeProps) { for (var prop$1 in spec.modeProps) - { modeObj[prop$1] = spec.modeProps[prop$1]; } } - - return modeObj - } - - // This can be used to attach properties to mode objects from - // outside the actual mode definition. - var modeExtensions = {}; - function extendMode(mode, properties) { - var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); - copyObj(properties, exts); - } - - function copyState(mode, state) { - if (state === true) { return state } - if (mode.copyState) { return mode.copyState(state) } - var nstate = {}; - for (var n in state) { - var val = state[n]; - if (val instanceof Array) { val = val.concat([]); } - nstate[n] = val; - } - return nstate - } - - // Given a mode and a state (for that mode), find the inner mode and - // state at the position that the state refers to. - function innerMode(mode, state) { - var info; - while (mode.innerMode) { - info = mode.innerMode(state); - if (!info || info.mode == mode) { break } - state = info.state; - mode = info.mode; - } - return info || {mode: mode, state: state} - } - - function startState(mode, a1, a2) { - return mode.startState ? mode.startState(a1, a2) : true - } - - // STRING STREAM - - // Fed to the mode parsers, provides helper functions to make - // parsers more succinct. - - var StringStream = function(string, tabSize, lineOracle) { - this.pos = this.start = 0; - this.string = string; - this.tabSize = tabSize || 8; - this.lastColumnPos = this.lastColumnValue = 0; - this.lineStart = 0; - this.lineOracle = lineOracle; - }; - - StringStream.prototype.eol = function () {return this.pos >= this.string.length}; - StringStream.prototype.sol = function () {return this.pos == this.lineStart}; - StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; - StringStream.prototype.next = function () { - if (this.pos < this.string.length) - { return this.string.charAt(this.pos++) } - }; - StringStream.prototype.eat = function (match) { - var ch = this.string.charAt(this.pos); - var ok; - if (typeof match == "string") { ok = ch == match; } - else { ok = ch && (match.test ? match.test(ch) : match(ch)); } - if (ok) {++this.pos; return ch} - }; - StringStream.prototype.eatWhile = function (match) { - var start = this.pos; - while (this.eat(match)){} - return this.pos > start - }; - StringStream.prototype.eatSpace = function () { - var this$1 = this; - - var start = this.pos; - while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this$1.pos; } - return this.pos > start - }; - StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; - StringStream.prototype.skipTo = function (ch) { - var found = this.string.indexOf(ch, this.pos); - if (found > -1) {this.pos = found; return true} - }; - StringStream.prototype.backUp = function (n) {this.pos -= n;}; - StringStream.prototype.column = function () { - if (this.lastColumnPos < this.start) { - this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); - this.lastColumnPos = this.start; - } - return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) - }; - StringStream.prototype.indentation = function () { - return countColumn(this.string, null, this.tabSize) - - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) - }; - StringStream.prototype.match = function (pattern, consume, caseInsensitive) { - if (typeof pattern == "string") { - var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; - var substr = this.string.substr(this.pos, pattern.length); - if (cased(substr) == cased(pattern)) { - if (consume !== false) { this.pos += pattern.length; } - return true - } - } else { - var match = this.string.slice(this.pos).match(pattern); - if (match && match.index > 0) { return null } - if (match && consume !== false) { this.pos += match[0].length; } - return match - } - }; - StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; - StringStream.prototype.hideFirstChars = function (n, inner) { - this.lineStart += n; - try { return inner() } - finally { this.lineStart -= n; } - }; - StringStream.prototype.lookAhead = function (n) { - var oracle = this.lineOracle; - return oracle && oracle.lookAhead(n) - }; - StringStream.prototype.baseToken = function () { - var oracle = this.lineOracle; - return oracle && oracle.baseToken(this.pos) - }; - - // Find the line object corresponding to the given line number. - function getLine(doc, n) { - n -= doc.first; - if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } - var chunk = doc; - while (!chunk.lines) { - for (var i = 0;; ++i) { - var child = chunk.children[i], sz = child.chunkSize(); - if (n < sz) { chunk = child; break } - n -= sz; - } - } - return chunk.lines[n] - } - - // Get the part of a document between two positions, as an array of - // strings. - function getBetween(doc, start, end) { - var out = [], n = start.line; - doc.iter(start.line, end.line + 1, function (line) { - var text = line.text; - if (n == end.line) { text = text.slice(0, end.ch); } - if (n == start.line) { text = text.slice(start.ch); } - out.push(text); - ++n; - }); - return out - } - // Get the lines between from and to, as array of strings. - function getLines(doc, from, to) { - var out = []; - doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value - return out - } - - // Update the height of a line, propagating the height change - // upwards to parent nodes. - function updateLineHeight(line, height) { - var diff = height - line.height; - if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } } - } - - // Given a line object, find its line number by walking up through - // its parent links. - function lineNo(line) { - if (line.parent == null) { return null } - var cur = line.parent, no = indexOf(cur.lines, line); - for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { - for (var i = 0;; ++i) { - if (chunk.children[i] == cur) { break } - no += chunk.children[i].chunkSize(); - } - } - return no + cur.first - } - - // Find the line at the given vertical position, using the height - // information in the document tree. - function lineAtHeight(chunk, h) { - var n = chunk.first; - outer: do { - for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { - var child = chunk.children[i$1], ch = child.height; - if (h < ch) { chunk = child; continue outer } - h -= ch; - n += child.chunkSize(); - } - return n - } while (!chunk.lines) - var i = 0; - for (; i < chunk.lines.length; ++i) { - var line = chunk.lines[i], lh = line.height; - if (h < lh) { break } - h -= lh; - } - return n + i - } - - function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} - - function lineNumberFor(options, i) { - return String(options.lineNumberFormatter(i + options.firstLineNumber)) - } - - // A Pos instance represents a position within the text. - function Pos(line, ch, sticky) { - if ( sticky === void 0 ) sticky = null; - - if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) } - this.line = line; - this.ch = ch; - this.sticky = sticky; - } - - // Compare two positions, return 0 if they are the same, a negative - // number when a is less, and a positive number otherwise. - function cmp(a, b) { return a.line - b.line || a.ch - b.ch } - - function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 } - - function copyPos(x) {return Pos(x.line, x.ch)} - function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } - function minPos(a, b) { return cmp(a, b) < 0 ? a : b } - - // Most of the external API clips given positions to make sure they - // actually exist within the document. - function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} - function clipPos(doc, pos) { - if (pos.line < doc.first) { return Pos(doc.first, 0) } - var last = doc.first + doc.size - 1; - if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } - return clipToLen(pos, getLine(doc, pos.line).text.length) - } - function clipToLen(pos, linelen) { - var ch = pos.ch; - if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } - else if (ch < 0) { return Pos(pos.line, 0) } - else { return pos } - } - function clipPosArray(doc, array) { - var out = []; - for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); } - return out - } - - var SavedContext = function(state, lookAhead) { - this.state = state; - this.lookAhead = lookAhead; - }; - - var Context = function(doc, state, line, lookAhead) { - this.state = state; - this.doc = doc; - this.line = line; - this.maxLookAhead = lookAhead || 0; - this.baseTokens = null; - this.baseTokenPos = 1; - }; - - Context.prototype.lookAhead = function (n) { - var line = this.doc.getLine(this.line + n); - if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; } - return line - }; - - Context.prototype.baseToken = function (n) { - var this$1 = this; - - if (!this.baseTokens) { return null } - while (this.baseTokens[this.baseTokenPos] <= n) - { this$1.baseTokenPos += 2; } - var type = this.baseTokens[this.baseTokenPos + 1]; - return {type: type && type.replace(/( |^)overlay .*/, ""), - size: this.baseTokens[this.baseTokenPos] - n} - }; - - Context.prototype.nextLine = function () { - this.line++; - if (this.maxLookAhead > 0) { this.maxLookAhead--; } - }; - - Context.fromSaved = function (doc, saved, line) { - if (saved instanceof SavedContext) - { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) } - else - { return new Context(doc, copyState(doc.mode, saved), line) } - }; - - Context.prototype.save = function (copy) { - var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; - return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state - }; - - - // Compute a style array (an array starting with a mode generation - // -- for invalidation -- followed by pairs of end positions and - // style strings), which is used to highlight the tokens on the - // line. - function highlightLine(cm, line, context, forceToEnd) { - // A styles array always starts with a number identifying the - // mode/overlays that it is based on (for easy invalidation). - var st = [cm.state.modeGen], lineClasses = {}; - // Compute the base array of styles - runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); }, - lineClasses, forceToEnd); - var state = context.state; - - // Run overlays, adjust style array. - var loop = function ( o ) { - context.baseTokens = st; - var overlay = cm.state.overlays[o], i = 1, at = 0; - context.state = true; - runMode(cm, line.text, overlay.mode, context, function (end, style) { - var start = i; - // Ensure there's a token end at the current position, and that i points at it - while (at < end) { - var i_end = st[i]; - if (i_end > end) - { st.splice(i, 1, end, st[i+1], i_end); } - i += 2; - at = Math.min(end, i_end); - } - if (!style) { return } - if (overlay.opaque) { - st.splice(start, i - start, end, "overlay " + style); - i = start + 2; - } else { - for (; start < i; start += 2) { - var cur = st[start+1]; - st[start+1] = (cur ? cur + " " : "") + "overlay " + style; - } - } - }, lineClasses); - context.state = state; - context.baseTokens = null; - context.baseTokenPos = 1; - }; - - for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); - - return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} - } - - function getLineStyles(cm, line, updateFrontier) { - if (!line.styles || line.styles[0] != cm.state.modeGen) { - var context = getContextBefore(cm, lineNo(line)); - var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); - var result = highlightLine(cm, line, context); - if (resetState) { context.state = resetState; } - line.stateAfter = context.save(!resetState); - line.styles = result.styles; - if (result.classes) { line.styleClasses = result.classes; } - else if (line.styleClasses) { line.styleClasses = null; } - if (updateFrontier === cm.doc.highlightFrontier) - { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); } - } - return line.styles - } - - function getContextBefore(cm, n, precise) { - var doc = cm.doc, display = cm.display; - if (!doc.mode.startState) { return new Context(doc, true, n) } - var start = findStartLine(cm, n, precise); - var saved = start > doc.first && getLine(doc, start - 1).stateAfter; - var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); - - doc.iter(start, n, function (line) { - processLine(cm, line.text, context); - var pos = context.line; - line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; - context.nextLine(); - }); - if (precise) { doc.modeFrontier = context.line; } - return context - } - - // Lightweight form of highlight -- proceed over this line and - // update state, but don't save a style array. Used for lines that - // aren't currently visible. - function processLine(cm, text, context, startAt) { - var mode = cm.doc.mode; - var stream = new StringStream(text, cm.options.tabSize, context); - stream.start = stream.pos = startAt || 0; - if (text == "") { callBlankLine(mode, context.state); } - while (!stream.eol()) { - readToken(mode, stream, context.state); - stream.start = stream.pos; - } - } - - function callBlankLine(mode, state) { - if (mode.blankLine) { return mode.blankLine(state) } - if (!mode.innerMode) { return } - var inner = innerMode(mode, state); - if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } - } - - function readToken(mode, stream, state, inner) { - for (var i = 0; i < 10; i++) { - if (inner) { inner[0] = innerMode(mode, state).mode; } - var style = mode.token(stream, state); - if (stream.pos > stream.start) { return style } - } - throw new Error("Mode " + mode.name + " failed to advance stream.") - } - - var Token = function(stream, type, state) { - this.start = stream.start; this.end = stream.pos; - this.string = stream.current(); - this.type = type || null; - this.state = state; - }; - - // Utility for getTokenAt and getLineTokens - function takeToken(cm, pos, precise, asArray) { - var doc = cm.doc, mode = doc.mode, style; - pos = clipPos(doc, pos); - var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise); - var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; - if (asArray) { tokens = []; } - while ((asArray || stream.pos < pos.ch) && !stream.eol()) { - stream.start = stream.pos; - style = readToken(mode, stream, context.state); - if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); } - } - return asArray ? tokens : new Token(stream, style, context.state) - } - - function extractLineClasses(type, output) { - if (type) { for (;;) { - var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); - if (!lineClass) { break } - type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); - var prop = lineClass[1] ? "bgClass" : "textClass"; - if (output[prop] == null) - { output[prop] = lineClass[2]; } - else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop])) - { output[prop] += " " + lineClass[2]; } - } } - return type - } - - // Run the given mode's parser over a line, calling f for each token. - function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { - var flattenSpans = mode.flattenSpans; - if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; } - var curStart = 0, curStyle = null; - var stream = new StringStream(text, cm.options.tabSize, context), style; - var inner = cm.options.addModeClass && [null]; - if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); } - while (!stream.eol()) { - if (stream.pos > cm.options.maxHighlightLength) { - flattenSpans = false; - if (forceToEnd) { processLine(cm, text, context, stream.pos); } - stream.pos = text.length; - style = null; - } else { - style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); - } - if (inner) { - var mName = inner[0].name; - if (mName) { style = "m-" + (style ? mName + " " + style : mName); } - } - if (!flattenSpans || curStyle != style) { - while (curStart < stream.start) { - curStart = Math.min(stream.start, curStart + 5000); - f(curStart, curStyle); - } - curStyle = style; - } - stream.start = stream.pos; - } - while (curStart < stream.pos) { - // Webkit seems to refuse to render text nodes longer than 57444 - // characters, and returns inaccurate measurements in nodes - // starting around 5000 chars. - var pos = Math.min(stream.pos, curStart + 5000); - f(pos, curStyle); - curStart = pos; - } - } - - // Finds the line to start with when starting a parse. Tries to - // find a line with a stateAfter, so that it can start with a - // valid state. If that fails, it returns the line with the - // smallest indentation, which tends to need the least context to - // parse correctly. - function findStartLine(cm, n, precise) { - var minindent, minline, doc = cm.doc; - var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); - for (var search = n; search > lim; --search) { - if (search <= doc.first) { return doc.first } - var line = getLine(doc, search - 1), after = line.stateAfter; - if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) - { return search } - var indented = countColumn(line.text, null, cm.options.tabSize); - if (minline == null || minindent > indented) { - minline = search - 1; - minindent = indented; - } - } - return minline - } - - function retreatFrontier(doc, n) { - doc.modeFrontier = Math.min(doc.modeFrontier, n); - if (doc.highlightFrontier < n - 10) { return } - var start = doc.first; - for (var line = n - 1; line > start; line--) { - var saved = getLine(doc, line).stateAfter; - // change is on 3 - // state on line 1 looked ahead 2 -- so saw 3 - // test 1 + 2 < 3 should cover this - if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { - start = line + 1; - break - } - } - doc.highlightFrontier = Math.min(doc.highlightFrontier, start); - } - - // Optimize some code when these features are not used. - var sawReadOnlySpans = false, sawCollapsedSpans = false; - - function seeReadOnlySpans() { - sawReadOnlySpans = true; - } - - function seeCollapsedSpans() { - sawCollapsedSpans = true; - } - - // TEXTMARKER SPANS - - function MarkedSpan(marker, from, to) { - this.marker = marker; - this.from = from; this.to = to; - } - - // Search an array of spans for a span matching the given marker. - function getMarkedSpanFor(spans, marker) { - if (spans) { for (var i = 0; i < spans.length; ++i) { - var span = spans[i]; - if (span.marker == marker) { return span } - } } - } - // Remove a span from an array, returning undefined if no spans are - // left (we don't store arrays for lines without spans). - function removeMarkedSpan(spans, span) { - var r; - for (var i = 0; i < spans.length; ++i) - { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } } - return r - } - // Add a span to a line. - function addMarkedSpan(line, span) { - line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; - span.marker.attachLine(line); - } - - // Used for the algorithm that adjusts markers for a change in the - // document. These functions cut an array of spans at a given - // character position, returning an array of remaining chunks (or - // undefined if nothing remains). - function markedSpansBefore(old, startCh, isInsert) { - var nw; - if (old) { for (var i = 0; i < old.length; ++i) { - var span = old[i], marker = span.marker; - var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); - if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { - var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh) - ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); - } - } } - return nw - } - function markedSpansAfter(old, endCh, isInsert) { - var nw; - if (old) { for (var i = 0; i < old.length; ++i) { - var span = old[i], marker = span.marker; - var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); - if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { - var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh) - ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, - span.to == null ? null : span.to - endCh)); - } - } } - return nw - } - - // Given a change object, compute the new set of marker spans that - // cover the line in which the change took place. Removes spans - // entirely within the change, reconnects spans belonging to the - // same marker that appear on both sides of the change, and cuts off - // spans partially within the change. Returns an array of span - // arrays with one element for each line in (after) the change. - function stretchSpansOverChange(doc, change) { - if (change.full) { return null } - var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; - var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; - if (!oldFirst && !oldLast) { return null } - - var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; - // Get the spans that 'stick out' on both sides - var first = markedSpansBefore(oldFirst, startCh, isInsert); - var last = markedSpansAfter(oldLast, endCh, isInsert); - - // Next, merge those two ends - var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); - if (first) { - // Fix up .to properties of first - for (var i = 0; i < first.length; ++i) { - var span = first[i]; - if (span.to == null) { - var found = getMarkedSpanFor(last, span.marker); - if (!found) { span.to = startCh; } - else if (sameLine) { span.to = found.to == null ? null : found.to + offset; } - } - } - } - if (last) { - // Fix up .from in last (or move them into first in case of sameLine) - for (var i$1 = 0; i$1 < last.length; ++i$1) { - var span$1 = last[i$1]; - if (span$1.to != null) { span$1.to += offset; } - if (span$1.from == null) { - var found$1 = getMarkedSpanFor(first, span$1.marker); - if (!found$1) { - span$1.from = offset; - if (sameLine) { (first || (first = [])).push(span$1); } - } - } else { - span$1.from += offset; - if (sameLine) { (first || (first = [])).push(span$1); } - } - } - } - // Make sure we didn't create any zero-length spans - if (first) { first = clearEmptySpans(first); } - if (last && last != first) { last = clearEmptySpans(last); } - - var newMarkers = [first]; - if (!sameLine) { - // Fill gap with whole-line-spans - var gap = change.text.length - 2, gapMarkers; - if (gap > 0 && first) - { for (var i$2 = 0; i$2 < first.length; ++i$2) - { if (first[i$2].to == null) - { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } } - for (var i$3 = 0; i$3 < gap; ++i$3) - { newMarkers.push(gapMarkers); } - newMarkers.push(last); - } - return newMarkers - } - - // Remove spans that are empty and don't have a clearWhenEmpty - // option of false. - function clearEmptySpans(spans) { - for (var i = 0; i < spans.length; ++i) { - var span = spans[i]; - if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) - { spans.splice(i--, 1); } - } - if (!spans.length) { return null } - return spans - } - - // Used to 'clip' out readOnly ranges when making a change. - function removeReadOnlyRanges(doc, from, to) { - var markers = null; - doc.iter(from.line, to.line + 1, function (line) { - if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { - var mark = line.markedSpans[i].marker; - if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) - { (markers || (markers = [])).push(mark); } - } } - }); - if (!markers) { return null } - var parts = [{from: from, to: to}]; - for (var i = 0; i < markers.length; ++i) { - var mk = markers[i], m = mk.find(0); - for (var j = 0; j < parts.length; ++j) { - var p = parts[j]; - if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } - var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); - if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) - { newParts.push({from: p.from, to: m.from}); } - if (dto > 0 || !mk.inclusiveRight && !dto) - { newParts.push({from: m.to, to: p.to}); } - parts.splice.apply(parts, newParts); - j += newParts.length - 3; - } - } - return parts - } - - // Connect or disconnect spans from a line. - function detachMarkedSpans(line) { - var spans = line.markedSpans; - if (!spans) { return } - for (var i = 0; i < spans.length; ++i) - { spans[i].marker.detachLine(line); } - line.markedSpans = null; - } - function attachMarkedSpans(line, spans) { - if (!spans) { return } - for (var i = 0; i < spans.length; ++i) - { spans[i].marker.attachLine(line); } - line.markedSpans = spans; - } - - // Helpers used when computing which overlapping collapsed span - // counts as the larger one. - function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } - function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } - - // Returns a number indicating which of two overlapping collapsed - // spans is larger (and thus includes the other). Falls back to - // comparing ids when the spans cover exactly the same range. - function compareCollapsedMarkers(a, b) { - var lenDiff = a.lines.length - b.lines.length; - if (lenDiff != 0) { return lenDiff } - var aPos = a.find(), bPos = b.find(); - var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); - if (fromCmp) { return -fromCmp } - var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); - if (toCmp) { return toCmp } - return b.id - a.id - } - - // Find out whether a line ends or starts in a collapsed span. If - // so, return the marker for that span. - function collapsedSpanAtSide(line, start) { - var sps = sawCollapsedSpans && line.markedSpans, found; - if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { - sp = sps[i]; - if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && - (!found || compareCollapsedMarkers(found, sp.marker) < 0)) - { found = sp.marker; } - } } - return found - } - function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } - function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } - - function collapsedSpanAround(line, ch) { - var sps = sawCollapsedSpans && line.markedSpans, found; - if (sps) { for (var i = 0; i < sps.length; ++i) { - var sp = sps[i]; - if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && - (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; } - } } - return found - } - - // Test whether there exists a collapsed span that partially - // overlaps (covers the start or end, but not both) of a new span. - // Such overlap is not allowed. - function conflictingCollapsedRange(doc, lineNo$$1, from, to, marker) { - var line = getLine(doc, lineNo$$1); - var sps = sawCollapsedSpans && line.markedSpans; - if (sps) { for (var i = 0; i < sps.length; ++i) { - var sp = sps[i]; - if (!sp.marker.collapsed) { continue } - var found = sp.marker.find(0); - var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); - var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); - if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } - if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || - fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) - { return true } - } } - } - - // A visual line is a line as drawn on the screen. Folding, for - // example, can cause multiple logical lines to appear on the same - // visual line. This finds the start of the visual line that the - // given line is part of (usually that is the line itself). - function visualLine(line) { - var merged; - while (merged = collapsedSpanAtStart(line)) - { line = merged.find(-1, true).line; } - return line - } - - function visualLineEnd(line) { - var merged; - while (merged = collapsedSpanAtEnd(line)) - { line = merged.find(1, true).line; } - return line - } - - // Returns an array of logical lines that continue the visual line - // started by the argument, or undefined if there are no such lines. - function visualLineContinued(line) { - var merged, lines; - while (merged = collapsedSpanAtEnd(line)) { - line = merged.find(1, true).line - ;(lines || (lines = [])).push(line); - } - return lines - } - - // Get the line number of the start of the visual line that the - // given line number is part of. - function visualLineNo(doc, lineN) { - var line = getLine(doc, lineN), vis = visualLine(line); - if (line == vis) { return lineN } - return lineNo(vis) - } - - // Get the line number of the start of the next visual line after - // the given line. - function visualLineEndNo(doc, lineN) { - if (lineN > doc.lastLine()) { return lineN } - var line = getLine(doc, lineN), merged; - if (!lineIsHidden(doc, line)) { return lineN } - while (merged = collapsedSpanAtEnd(line)) - { line = merged.find(1, true).line; } - return lineNo(line) + 1 - } - - // Compute whether a line is hidden. Lines count as hidden when they - // are part of a visual line that starts with another line, or when - // they are entirely covered by collapsed, non-widget span. - function lineIsHidden(doc, line) { - var sps = sawCollapsedSpans && line.markedSpans; - if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { - sp = sps[i]; - if (!sp.marker.collapsed) { continue } - if (sp.from == null) { return true } - if (sp.marker.widgetNode) { continue } - if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) - { return true } - } } - } - function lineIsHiddenInner(doc, line, span) { - if (span.to == null) { - var end = span.marker.find(1, true); - return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) - } - if (span.marker.inclusiveRight && span.to == line.text.length) - { return true } - for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { - sp = line.markedSpans[i]; - if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && - (sp.to == null || sp.to != span.from) && - (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && - lineIsHiddenInner(doc, line, sp)) { return true } - } - } - - // Find the height above the given line. - function heightAtLine(lineObj) { - lineObj = visualLine(lineObj); - - var h = 0, chunk = lineObj.parent; - for (var i = 0; i < chunk.lines.length; ++i) { - var line = chunk.lines[i]; - if (line == lineObj) { break } - else { h += line.height; } - } - for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { - for (var i$1 = 0; i$1 < p.children.length; ++i$1) { - var cur = p.children[i$1]; - if (cur == chunk) { break } - else { h += cur.height; } - } - } - return h - } - - // Compute the character length of a line, taking into account - // collapsed ranges (see markText) that might hide parts, and join - // other lines onto it. - function lineLength(line) { - if (line.height == 0) { return 0 } - var len = line.text.length, merged, cur = line; - while (merged = collapsedSpanAtStart(cur)) { - var found = merged.find(0, true); - cur = found.from.line; - len += found.from.ch - found.to.ch; - } - cur = line; - while (merged = collapsedSpanAtEnd(cur)) { - var found$1 = merged.find(0, true); - len -= cur.text.length - found$1.from.ch; - cur = found$1.to.line; - len += cur.text.length - found$1.to.ch; - } - return len - } - - // Find the longest line in the document. - function findMaxLine(cm) { - var d = cm.display, doc = cm.doc; - d.maxLine = getLine(doc, doc.first); - d.maxLineLength = lineLength(d.maxLine); - d.maxLineChanged = true; - doc.iter(function (line) { - var len = lineLength(line); - if (len > d.maxLineLength) { - d.maxLineLength = len; - d.maxLine = line; - } - }); - } - - // LINE DATA STRUCTURE - - // Line objects. These hold state related to a line, including - // highlighting info (the styles array). - var Line = function(text, markedSpans, estimateHeight) { - this.text = text; - attachMarkedSpans(this, markedSpans); - this.height = estimateHeight ? estimateHeight(this) : 1; - }; - - Line.prototype.lineNo = function () { return lineNo(this) }; - eventMixin(Line); - - // Change the content (text, markers) of a line. Automatically - // invalidates cached information and tries to re-estimate the - // line's height. - function updateLine(line, text, markedSpans, estimateHeight) { - line.text = text; - if (line.stateAfter) { line.stateAfter = null; } - if (line.styles) { line.styles = null; } - if (line.order != null) { line.order = null; } - detachMarkedSpans(line); - attachMarkedSpans(line, markedSpans); - var estHeight = estimateHeight ? estimateHeight(line) : 1; - if (estHeight != line.height) { updateLineHeight(line, estHeight); } - } - - // Detach a line from the document tree and its markers. - function cleanUpLine(line) { - line.parent = null; - detachMarkedSpans(line); - } - - // Convert a style as returned by a mode (either null, or a string - // containing one or more styles) to a CSS style. This is cached, - // and also looks for line-wide styles. - var styleToClassCache = {}, styleToClassCacheWithMode = {}; - function interpretTokenStyle(style, options) { - if (!style || /^\s*$/.test(style)) { return null } - var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; - return cache[style] || - (cache[style] = style.replace(/\S+/g, "cm-$&")) - } - - // Render the DOM representation of the text of a line. Also builds - // up a 'line map', which points at the DOM nodes that represent - // specific stretches of text, and is used by the measuring code. - // The returned object contains the DOM node, this map, and - // information about line-wide styles that were set by the mode. - function buildLineContent(cm, lineView) { - // The padding-right forces the element to have a 'border', which - // is needed on Webkit to be able to get line-level bounding - // rectangles for it (in measureChar). - var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); - var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content, - col: 0, pos: 0, cm: cm, - trailingSpace: false, - splitSpaces: cm.getOption("lineWrapping")}; - lineView.measure = {}; - - // Iterate over the logical lines that make up this visual line. - for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { - var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0); - builder.pos = 0; - builder.addToken = buildToken; - // Optionally wire in some hacks into the token-rendering - // algorithm, to deal with browser quirks. - if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) - { builder.addToken = buildTokenBadBidi(builder.addToken, order); } - builder.map = []; - var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); - insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); - if (line.styleClasses) { - if (line.styleClasses.bgClass) - { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); } - if (line.styleClasses.textClass) - { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } - } - - // Ensure at least a single node is present, for measuring. - if (builder.map.length == 0) - { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); } - - // Store the map and a cache object for the current logical line - if (i == 0) { - lineView.measure.map = builder.map; - lineView.measure.cache = {}; - } else { - (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) - ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}); - } - } - - // See issue #2901 - if (webkit) { - var last = builder.content.lastChild; - if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) - { builder.content.className = "cm-tab-wrap-hack"; } - } - - signal(cm, "renderLine", cm, lineView.line, builder.pre); - if (builder.pre.className) - { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); } - - return builder - } - - function defaultSpecialCharPlaceholder(ch) { - var token = elt("span", "\u2022", "cm-invalidchar"); - token.title = "\\u" + ch.charCodeAt(0).toString(16); - token.setAttribute("aria-label", token.title); - return token - } - - // Build up the DOM representation for a single token, and add it to - // the line map. Takes care to render special characters separately. - function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { - if (!text) { return } - var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; - var special = builder.cm.state.specialChars, mustWrap = false; - var content; - if (!special.test(text)) { - builder.col += text.length; - content = document.createTextNode(displayText); - builder.map.push(builder.pos, builder.pos + text.length, content); - if (ie && ie_version < 9) { mustWrap = true; } - builder.pos += text.length; - } else { - content = document.createDocumentFragment(); - var pos = 0; - while (true) { - special.lastIndex = pos; - var m = special.exec(text); - var skipped = m ? m.index - pos : text.length - pos; - if (skipped) { - var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); - if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); } - else { content.appendChild(txt); } - builder.map.push(builder.pos, builder.pos + skipped, txt); - builder.col += skipped; - builder.pos += skipped; - } - if (!m) { break } - pos += skipped + 1; - var txt$1 = (void 0); - if (m[0] == "\t") { - var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; - txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); - txt$1.setAttribute("role", "presentation"); - txt$1.setAttribute("cm-text", "\t"); - builder.col += tabWidth; - } else if (m[0] == "\r" || m[0] == "\n") { - txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); - txt$1.setAttribute("cm-text", m[0]); - builder.col += 1; - } else { - txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); - txt$1.setAttribute("cm-text", m[0]); - if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); } - else { content.appendChild(txt$1); } - builder.col += 1; - } - builder.map.push(builder.pos, builder.pos + 1, txt$1); - builder.pos++; - } - } - builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; - if (style || startStyle || endStyle || mustWrap || css) { - var fullStyle = style || ""; - if (startStyle) { fullStyle += startStyle; } - if (endStyle) { fullStyle += endStyle; } - var token = elt("span", [content], fullStyle, css); - if (attributes) { - for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") - { token.setAttribute(attr, attributes[attr]); } } - } - return builder.content.appendChild(token) - } - builder.content.appendChild(content); - } - - // Change some spaces to NBSP to prevent the browser from collapsing - // trailing spaces at the end of a line when rendering text (issue #1362). - function splitSpaces(text, trailingBefore) { - if (text.length > 1 && !/ /.test(text)) { return text } - var spaceBefore = trailingBefore, result = ""; - for (var i = 0; i < text.length; i++) { - var ch = text.charAt(i); - if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) - { ch = "\u00a0"; } - result += ch; - spaceBefore = ch == " "; - } - return result - } - - // Work around nonsense dimensions being reported for stretches of - // right-to-left text. - function buildTokenBadBidi(inner, order) { - return function (builder, text, style, startStyle, endStyle, css, attributes) { - style = style ? style + " cm-force-border" : "cm-force-border"; - var start = builder.pos, end = start + text.length; - for (;;) { - // Find the part that overlaps with the start of this text - var part = (void 0); - for (var i = 0; i < order.length; i++) { - part = order[i]; - if (part.to > start && part.from <= start) { break } - } - if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) } - inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); - startStyle = null; - text = text.slice(part.to - start); - start = part.to; - } - } - } - - function buildCollapsedSpan(builder, size, marker, ignoreWidget) { - var widget = !ignoreWidget && marker.widgetNode; - if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); } - if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { - if (!widget) - { widget = builder.content.appendChild(document.createElement("span")); } - widget.setAttribute("cm-marker", marker.id); - } - if (widget) { - builder.cm.display.input.setUneditable(widget); - builder.content.appendChild(widget); - } - builder.pos += size; - builder.trailingSpace = false; - } - - // Outputs a number of spans to make up a line, taking highlighting - // and marked text into account. - function insertLineContent(line, builder, styles) { - var spans = line.markedSpans, allText = line.text, at = 0; - if (!spans) { - for (var i$1 = 1; i$1 < styles.length; i$1+=2) - { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); } - return - } - - var len = allText.length, pos = 0, i = 1, text = "", style, css; - var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes; - for (;;) { - if (nextChange == pos) { // Update current marker set - spanStyle = spanEndStyle = spanStartStyle = css = ""; - attributes = null; - collapsed = null; nextChange = Infinity; - var foundBookmarks = [], endStyles = (void 0); - for (var j = 0; j < spans.length; ++j) { - var sp = spans[j], m = sp.marker; - if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { - foundBookmarks.push(m); - } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { - if (sp.to != null && sp.to != pos && nextChange > sp.to) { - nextChange = sp.to; - spanEndStyle = ""; - } - if (m.className) { spanStyle += " " + m.className; } - if (m.css) { css = (css ? css + ";" : "") + m.css; } - if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; } - if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); } - // support for the old title property - // https://github.com/codemirror/CodeMirror/pull/5673 - if (m.title) { (attributes || (attributes = {})).title = m.title; } - if (m.attributes) { - for (var attr in m.attributes) - { (attributes || (attributes = {}))[attr] = m.attributes[attr]; } - } - if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) - { collapsed = sp; } - } else if (sp.from > pos && nextChange > sp.from) { - nextChange = sp.from; - } - } - if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) - { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } } - - if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) - { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } } - if (collapsed && (collapsed.from || 0) == pos) { - buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, - collapsed.marker, collapsed.from == null); - if (collapsed.to == null) { return } - if (collapsed.to == pos) { collapsed = false; } - } - } - if (pos >= len) { break } - - var upto = Math.min(len, nextChange); - while (true) { - if (text) { - var end = pos + text.length; - if (!collapsed) { - var tokenText = end > upto ? text.slice(0, upto - pos) : text; - builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, - spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); - } - if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} - pos = end; - spanStartStyle = ""; - } - text = allText.slice(at, at = styles[i++]); - style = interpretTokenStyle(styles[i++], builder.cm.options); - } - } - } - - - // These objects are used to represent the visible (currently drawn) - // part of the document. A LineView may correspond to multiple - // logical lines, if those are connected by collapsed ranges. - function LineView(doc, line, lineN) { - // The starting line - this.line = line; - // Continuing lines, if any - this.rest = visualLineContinued(line); - // Number of logical lines in this visual line - this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; - this.node = this.text = null; - this.hidden = lineIsHidden(doc, line); - } - - // Create a range of LineView objects for the given lines. - function buildViewArray(cm, from, to) { - var array = [], nextPos; - for (var pos = from; pos < to; pos = nextPos) { - var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); - nextPos = pos + view.size; - array.push(view); - } - return array - } - - var operationGroup = null; - - function pushOperation(op) { - if (operationGroup) { - operationGroup.ops.push(op); - } else { - op.ownsGroup = operationGroup = { - ops: [op], - delayedCallbacks: [] - }; - } - } - - function fireCallbacksForOps(group) { - // Calls delayed callbacks and cursorActivity handlers until no - // new ones appear - var callbacks = group.delayedCallbacks, i = 0; - do { - for (; i < callbacks.length; i++) - { callbacks[i].call(null); } - for (var j = 0; j < group.ops.length; j++) { - var op = group.ops[j]; - if (op.cursorActivityHandlers) - { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) - { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } - } - } while (i < callbacks.length) - } - - function finishOperation(op, endCb) { - var group = op.ownsGroup; - if (!group) { return } - - try { fireCallbacksForOps(group); } - finally { - operationGroup = null; - endCb(group); - } - } - - var orphanDelayedCallbacks = null; - - // Often, we want to signal events at a point where we are in the - // middle of some work, but don't want the handler to start calling - // other methods on the editor, which might be in an inconsistent - // state or simply not expect any other events to happen. - // signalLater looks whether there are any handlers, and schedules - // them to be executed when the last operation ends, or, if no - // operation is active, when a timeout fires. - function signalLater(emitter, type /*, values...*/) { - var arr = getHandlers(emitter, type); - if (!arr.length) { return } - var args = Array.prototype.slice.call(arguments, 2), list; - if (operationGroup) { - list = operationGroup.delayedCallbacks; - } else if (orphanDelayedCallbacks) { - list = orphanDelayedCallbacks; - } else { - list = orphanDelayedCallbacks = []; - setTimeout(fireOrphanDelayed, 0); - } - var loop = function ( i ) { - list.push(function () { return arr[i].apply(null, args); }); - }; - - for (var i = 0; i < arr.length; ++i) - loop( i ); - } - - function fireOrphanDelayed() { - var delayed = orphanDelayedCallbacks; - orphanDelayedCallbacks = null; - for (var i = 0; i < delayed.length; ++i) { delayed[i](); } - } - - // When an aspect of a line changes, a string is added to - // lineView.changes. This updates the relevant part of the line's - // DOM structure. - function updateLineForChanges(cm, lineView, lineN, dims) { - for (var j = 0; j < lineView.changes.length; j++) { - var type = lineView.changes[j]; - if (type == "text") { updateLineText(cm, lineView); } - else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); } - else if (type == "class") { updateLineClasses(cm, lineView); } - else if (type == "widget") { updateLineWidgets(cm, lineView, dims); } - } - lineView.changes = null; - } - - // Lines with gutter elements, widgets or a background class need to - // be wrapped, and have the extra elements added to the wrapper div - function ensureLineWrapped(lineView) { - if (lineView.node == lineView.text) { - lineView.node = elt("div", null, null, "position: relative"); - if (lineView.text.parentNode) - { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); } - lineView.node.appendChild(lineView.text); - if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; } - } - return lineView.node - } - - function updateLineBackground(cm, lineView) { - var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; - if (cls) { cls += " CodeMirror-linebackground"; } - if (lineView.background) { - if (cls) { lineView.background.className = cls; } - else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } - } else if (cls) { - var wrap = ensureLineWrapped(lineView); - lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); - cm.display.input.setUneditable(lineView.background); - } - } - - // Wrapper around buildLineContent which will reuse the structure - // in display.externalMeasured when possible. - function getLineContent(cm, lineView) { - var ext = cm.display.externalMeasured; - if (ext && ext.line == lineView.line) { - cm.display.externalMeasured = null; - lineView.measure = ext.measure; - return ext.built - } - return buildLineContent(cm, lineView) - } - - // Redraw the line's text. Interacts with the background and text - // classes because the mode may output tokens that influence these - // classes. - function updateLineText(cm, lineView) { - var cls = lineView.text.className; - var built = getLineContent(cm, lineView); - if (lineView.text == lineView.node) { lineView.node = built.pre; } - lineView.text.parentNode.replaceChild(built.pre, lineView.text); - lineView.text = built.pre; - if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { - lineView.bgClass = built.bgClass; - lineView.textClass = built.textClass; - updateLineClasses(cm, lineView); - } else if (cls) { - lineView.text.className = cls; - } - } - - function updateLineClasses(cm, lineView) { - updateLineBackground(cm, lineView); - if (lineView.line.wrapClass) - { ensureLineWrapped(lineView).className = lineView.line.wrapClass; } - else if (lineView.node != lineView.text) - { lineView.node.className = ""; } - var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; - lineView.text.className = textClass || ""; - } - - function updateLineGutter(cm, lineView, lineN, dims) { - if (lineView.gutter) { - lineView.node.removeChild(lineView.gutter); - lineView.gutter = null; - } - if (lineView.gutterBackground) { - lineView.node.removeChild(lineView.gutterBackground); - lineView.gutterBackground = null; - } - if (lineView.line.gutterClass) { - var wrap = ensureLineWrapped(lineView); - lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, - ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")); - cm.display.input.setUneditable(lineView.gutterBackground); - wrap.insertBefore(lineView.gutterBackground, lineView.text); - } - var markers = lineView.line.gutterMarkers; - if (cm.options.lineNumbers || markers) { - var wrap$1 = ensureLineWrapped(lineView); - var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); - cm.display.input.setUneditable(gutterWrap); - wrap$1.insertBefore(gutterWrap, lineView.text); - if (lineView.line.gutterClass) - { gutterWrap.className += " " + lineView.line.gutterClass; } - if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) - { lineView.lineNumber = gutterWrap.appendChild( - elt("div", lineNumberFor(cm.options, lineN), - "CodeMirror-linenumber CodeMirror-gutter-elt", - ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); } - if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { - var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]; - if (found) - { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", - ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); } - } } - } - } - - function updateLineWidgets(cm, lineView, dims) { - if (lineView.alignable) { lineView.alignable = null; } - for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { - next = node.nextSibling; - if (node.className == "CodeMirror-linewidget") - { lineView.node.removeChild(node); } - } - insertLineWidgets(cm, lineView, dims); - } - - // Build a line's DOM representation from scratch - function buildLineElement(cm, lineView, lineN, dims) { - var built = getLineContent(cm, lineView); - lineView.text = lineView.node = built.pre; - if (built.bgClass) { lineView.bgClass = built.bgClass; } - if (built.textClass) { lineView.textClass = built.textClass; } - - updateLineClasses(cm, lineView); - updateLineGutter(cm, lineView, lineN, dims); - insertLineWidgets(cm, lineView, dims); - return lineView.node - } - - // A lineView may contain multiple logical lines (when merged by - // collapsed spans). The widgets for all of them need to be drawn. - function insertLineWidgets(cm, lineView, dims) { - insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); - if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) - { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } } - } - - function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { - if (!line.widgets) { return } - var wrap = ensureLineWrapped(lineView); - for (var i = 0, ws = line.widgets; i < ws.length; ++i) { - var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); - if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); } - positionLineWidget(widget, node, lineView, dims); - cm.display.input.setUneditable(node); - if (allowAbove && widget.above) - { wrap.insertBefore(node, lineView.gutter || lineView.text); } - else - { wrap.appendChild(node); } - signalLater(widget, "redraw"); - } - } - - function positionLineWidget(widget, node, lineView, dims) { - if (widget.noHScroll) { - (lineView.alignable || (lineView.alignable = [])).push(node); - var width = dims.wrapperWidth; - node.style.left = dims.fixedPos + "px"; - if (!widget.coverGutter) { - width -= dims.gutterTotalWidth; - node.style.paddingLeft = dims.gutterTotalWidth + "px"; - } - node.style.width = width + "px"; - } - if (widget.coverGutter) { - node.style.zIndex = 5; - node.style.position = "relative"; - if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; } - } - } - - function widgetHeight(widget) { - if (widget.height != null) { return widget.height } - var cm = widget.doc.cm; - if (!cm) { return 0 } - if (!contains(document.body, widget.node)) { - var parentStyle = "position: relative;"; - if (widget.coverGutter) - { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; } - if (widget.noHScroll) - { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; } - removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); - } - return widget.height = widget.node.parentNode.offsetHeight - } - - // Return true when the given mouse event happened in a widget - function eventInWidget(display, e) { - for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { - if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || - (n.parentNode == display.sizer && n != display.mover)) - { return true } - } - } - - // POSITION MEASUREMENT - - function paddingTop(display) {return display.lineSpace.offsetTop} - function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} - function paddingH(display) { - if (display.cachedPaddingH) { return display.cachedPaddingH } - var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); - var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; - var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; - if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; } - return data - } - - function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } - function displayWidth(cm) { - return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth - } - function displayHeight(cm) { - return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight - } - - // Ensure the lineView.wrapping.heights array is populated. This is - // an array of bottom offsets for the lines that make up a drawn - // line. When lineWrapping is on, there might be more than one - // height. - function ensureLineHeights(cm, lineView, rect) { - var wrapping = cm.options.lineWrapping; - var curWidth = wrapping && displayWidth(cm); - if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { - var heights = lineView.measure.heights = []; - if (wrapping) { - lineView.measure.width = curWidth; - var rects = lineView.text.firstChild.getClientRects(); - for (var i = 0; i < rects.length - 1; i++) { - var cur = rects[i], next = rects[i + 1]; - if (Math.abs(cur.bottom - next.bottom) > 2) - { heights.push((cur.bottom + next.top) / 2 - rect.top); } - } - } - heights.push(rect.bottom - rect.top); - } - } - - // Find a line map (mapping character offsets to text nodes) and a - // measurement cache for the given line number. (A line view might - // contain multiple lines when collapsed ranges are present.) - function mapFromLineView(lineView, line, lineN) { - if (lineView.line == line) - { return {map: lineView.measure.map, cache: lineView.measure.cache} } - for (var i = 0; i < lineView.rest.length; i++) - { if (lineView.rest[i] == line) - { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } - for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) - { if (lineNo(lineView.rest[i$1]) > lineN) - { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } - } - - // Render a line into the hidden node display.externalMeasured. Used - // when measurement is needed for a line that's not in the viewport. - function updateExternalMeasurement(cm, line) { - line = visualLine(line); - var lineN = lineNo(line); - var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); - view.lineN = lineN; - var built = view.built = buildLineContent(cm, view); - view.text = built.pre; - removeChildrenAndAdd(cm.display.lineMeasure, built.pre); - return view - } - - // Get a {top, bottom, left, right} box (in line-local coordinates) - // for a given character. - function measureChar(cm, line, ch, bias) { - return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) - } - - // Find a line view that corresponds to the given line number. - function findViewForLine(cm, lineN) { - if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) - { return cm.display.view[findViewIndex(cm, lineN)] } - var ext = cm.display.externalMeasured; - if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) - { return ext } - } - - // Measurement can be split in two steps, the set-up work that - // applies to the whole line, and the measurement of the actual - // character. Functions like coordsChar, that need to do a lot of - // measurements in a row, can thus ensure that the set-up work is - // only done once. - function prepareMeasureForLine(cm, line) { - var lineN = lineNo(line); - var view = findViewForLine(cm, lineN); - if (view && !view.text) { - view = null; - } else if (view && view.changes) { - updateLineForChanges(cm, view, lineN, getDimensions(cm)); - cm.curOp.forceUpdate = true; - } - if (!view) - { view = updateExternalMeasurement(cm, line); } - - var info = mapFromLineView(view, line, lineN); - return { - line: line, view: view, rect: null, - map: info.map, cache: info.cache, before: info.before, - hasHeights: false - } - } - - // Given a prepared measurement object, measures the position of an - // actual character (or fetches it from the cache). - function measureCharPrepared(cm, prepared, ch, bias, varHeight) { - if (prepared.before) { ch = -1; } - var key = ch + (bias || ""), found; - if (prepared.cache.hasOwnProperty(key)) { - found = prepared.cache[key]; - } else { - if (!prepared.rect) - { prepared.rect = prepared.view.text.getBoundingClientRect(); } - if (!prepared.hasHeights) { - ensureLineHeights(cm, prepared.view, prepared.rect); - prepared.hasHeights = true; - } - found = measureCharInner(cm, prepared, ch, bias); - if (!found.bogus) { prepared.cache[key] = found; } - } - return {left: found.left, right: found.right, - top: varHeight ? found.rtop : found.top, - bottom: varHeight ? found.rbottom : found.bottom} - } - - var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; - - function nodeAndOffsetInLineMap(map$$1, ch, bias) { - var node, start, end, collapse, mStart, mEnd; - // First, search the line map for the text node corresponding to, - // or closest to, the target character. - for (var i = 0; i < map$$1.length; i += 3) { - mStart = map$$1[i]; - mEnd = map$$1[i + 1]; - if (ch < mStart) { - start = 0; end = 1; - collapse = "left"; - } else if (ch < mEnd) { - start = ch - mStart; - end = start + 1; - } else if (i == map$$1.length - 3 || ch == mEnd && map$$1[i + 3] > ch) { - end = mEnd - mStart; - start = end - 1; - if (ch >= mEnd) { collapse = "right"; } - } - if (start != null) { - node = map$$1[i + 2]; - if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) - { collapse = bias; } - if (bias == "left" && start == 0) - { while (i && map$$1[i - 2] == map$$1[i - 3] && map$$1[i - 1].insertLeft) { - node = map$$1[(i -= 3) + 2]; - collapse = "left"; - } } - if (bias == "right" && start == mEnd - mStart) - { while (i < map$$1.length - 3 && map$$1[i + 3] == map$$1[i + 4] && !map$$1[i + 5].insertLeft) { - node = map$$1[(i += 3) + 2]; - collapse = "right"; - } } - break - } - } - return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} - } - - function getUsefulRect(rects, bias) { - var rect = nullRect; - if (bias == "left") { for (var i = 0; i < rects.length; i++) { - if ((rect = rects[i]).left != rect.right) { break } - } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { - if ((rect = rects[i$1]).left != rect.right) { break } - } } - return rect - } - - function measureCharInner(cm, prepared, ch, bias) { - var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); - var node = place.node, start = place.start, end = place.end, collapse = place.collapse; - - var rect; - if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. - for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned - while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; } - while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; } - if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) - { rect = node.parentNode.getBoundingClientRect(); } - else - { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); } - if (rect.left || rect.right || start == 0) { break } - end = start; - start = start - 1; - collapse = "right"; - } - if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); } - } else { // If it is a widget, simply get the box for the whole widget. - if (start > 0) { collapse = bias = "right"; } - var rects; - if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) - { rect = rects[bias == "right" ? rects.length - 1 : 0]; } - else - { rect = node.getBoundingClientRect(); } - } - if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { - var rSpan = node.parentNode.getClientRects()[0]; - if (rSpan) - { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; } - else - { rect = nullRect; } - } - - var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; - var mid = (rtop + rbot) / 2; - var heights = prepared.view.measure.heights; - var i = 0; - for (; i < heights.length - 1; i++) - { if (mid < heights[i]) { break } } - var top = i ? heights[i - 1] : 0, bot = heights[i]; - var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, - right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, - top: top, bottom: bot}; - if (!rect.left && !rect.right) { result.bogus = true; } - if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } - - return result - } - - // Work around problem with bounding client rects on ranges being - // returned incorrectly when zoomed on IE10 and below. - function maybeUpdateRectForZooming(measure, rect) { - if (!window.screen || screen.logicalXDPI == null || - screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) - { return rect } - var scaleX = screen.logicalXDPI / screen.deviceXDPI; - var scaleY = screen.logicalYDPI / screen.deviceYDPI; - return {left: rect.left * scaleX, right: rect.right * scaleX, - top: rect.top * scaleY, bottom: rect.bottom * scaleY} - } - - function clearLineMeasurementCacheFor(lineView) { - if (lineView.measure) { - lineView.measure.cache = {}; - lineView.measure.heights = null; - if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) - { lineView.measure.caches[i] = {}; } } - } - } - - function clearLineMeasurementCache(cm) { - cm.display.externalMeasure = null; - removeChildren(cm.display.lineMeasure); - for (var i = 0; i < cm.display.view.length; i++) - { clearLineMeasurementCacheFor(cm.display.view[i]); } - } - - function clearCaches(cm) { - clearLineMeasurementCache(cm); - cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; - if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; } - cm.display.lineNumChars = null; - } - - function pageScrollX() { - // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 - // which causes page_Offset and bounding client rects to use - // different reference viewports and invalidate our calculations. - if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) } - return window.pageXOffset || (document.documentElement || document.body).scrollLeft - } - function pageScrollY() { - if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) } - return window.pageYOffset || (document.documentElement || document.body).scrollTop - } - - function widgetTopHeight(lineObj) { - var height = 0; - if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above) - { height += widgetHeight(lineObj.widgets[i]); } } } - return height - } - - // Converts a {top, bottom, left, right} box from line-local - // coordinates into another coordinate system. Context may be one of - // "line", "div" (display.lineDiv), "local"./null (editor), "window", - // or "page". - function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { - if (!includeWidgets) { - var height = widgetTopHeight(lineObj); - rect.top += height; rect.bottom += height; - } - if (context == "line") { return rect } - if (!context) { context = "local"; } - var yOff = heightAtLine(lineObj); - if (context == "local") { yOff += paddingTop(cm.display); } - else { yOff -= cm.display.viewOffset; } - if (context == "page" || context == "window") { - var lOff = cm.display.lineSpace.getBoundingClientRect(); - yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); - var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); - rect.left += xOff; rect.right += xOff; - } - rect.top += yOff; rect.bottom += yOff; - return rect - } - - // Coverts a box from "div" coords to another coordinate system. - // Context may be "window", "page", "div", or "local"./null. - function fromCoordSystem(cm, coords, context) { - if (context == "div") { return coords } - var left = coords.left, top = coords.top; - // First move into "page" coordinate system - if (context == "page") { - left -= pageScrollX(); - top -= pageScrollY(); - } else if (context == "local" || !context) { - var localBox = cm.display.sizer.getBoundingClientRect(); - left += localBox.left; - top += localBox.top; - } - - var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); - return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} - } - - function charCoords(cm, pos, context, lineObj, bias) { - if (!lineObj) { lineObj = getLine(cm.doc, pos.line); } - return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) - } - - // Returns a box for a given cursor position, which may have an - // 'other' property containing the position of the secondary cursor - // on a bidi boundary. - // A cursor Pos(line, char, "before") is on the same visual line as `char - 1` - // and after `char - 1` in writing order of `char - 1` - // A cursor Pos(line, char, "after") is on the same visual line as `char` - // and before `char` in writing order of `char` - // Examples (upper-case letters are RTL, lower-case are LTR): - // Pos(0, 1, ...) - // before after - // ab a|b a|b - // aB a|B aB| - // Ab |Ab A|b - // AB B|A B|A - // Every position after the last character on a line is considered to stick - // to the last character on the line. - function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { - lineObj = lineObj || getLine(cm.doc, pos.line); - if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } - function get(ch, right) { - var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); - if (right) { m.left = m.right; } else { m.right = m.left; } - return intoCoordSystem(cm, lineObj, m, context) - } - var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; - if (ch >= lineObj.text.length) { - ch = lineObj.text.length; - sticky = "before"; - } else if (ch <= 0) { - ch = 0; - sticky = "after"; - } - if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") } - - function getBidi(ch, partPos, invert) { - var part = order[partPos], right = part.level == 1; - return get(invert ? ch - 1 : ch, right != invert) - } - var partPos = getBidiPartAt(order, ch, sticky); - var other = bidiOther; - var val = getBidi(ch, partPos, sticky == "before"); - if (other != null) { val.other = getBidi(ch, other, sticky != "before"); } - return val - } - - // Used to cheaply estimate the coordinates for a position. Used for - // intermediate scroll updates. - function estimateCoords(cm, pos) { - var left = 0; - pos = clipPos(cm.doc, pos); - if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; } - var lineObj = getLine(cm.doc, pos.line); - var top = heightAtLine(lineObj) + paddingTop(cm.display); - return {left: left, right: left, top: top, bottom: top + lineObj.height} - } - - // Positions returned by coordsChar contain some extra information. - // xRel is the relative x position of the input coordinates compared - // to the found position (so xRel > 0 means the coordinates are to - // the right of the character position, for example). When outside - // is true, that means the coordinates lie outside the line's - // vertical range. - function PosWithInfo(line, ch, sticky, outside, xRel) { - var pos = Pos(line, ch, sticky); - pos.xRel = xRel; - if (outside) { pos.outside = outside; } - return pos - } - - // Compute the character position closest to the given coordinates. - // Input must be lineSpace-local ("div" coordinate system). - function coordsChar(cm, x, y) { - var doc = cm.doc; - y += cm.display.viewOffset; - if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) } - var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; - if (lineN > last) - { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) } - if (x < 0) { x = 0; } - - var lineObj = getLine(doc, lineN); - for (;;) { - var found = coordsCharInner(cm, lineObj, lineN, x, y); - var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); - if (!collapsed) { return found } - var rangeEnd = collapsed.find(1); - if (rangeEnd.line == lineN) { return rangeEnd } - lineObj = getLine(doc, lineN = rangeEnd.line); - } - } - - function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { - y -= widgetTopHeight(lineObj); - var end = lineObj.text.length; - var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0); - end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end); - return {begin: begin, end: end} - } - - function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { - if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } - var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; - return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) - } - - // Returns true if the given side of a box is after the given - // coordinates, in top-to-bottom, left-to-right order. - function boxIsAfter(box, x, y, left) { - return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x - } - - function coordsCharInner(cm, lineObj, lineNo$$1, x, y) { - // Move y into line-local coordinate space - y -= heightAtLine(lineObj); - var preparedMeasure = prepareMeasureForLine(cm, lineObj); - // When directly calling `measureCharPrepared`, we have to adjust - // for the widgets at this line. - var widgetHeight$$1 = widgetTopHeight(lineObj); - var begin = 0, end = lineObj.text.length, ltr = true; - - var order = getOrder(lineObj, cm.doc.direction); - // If the line isn't plain left-to-right text, first figure out - // which bidi section the coordinates fall into. - if (order) { - var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart) - (cm, lineObj, lineNo$$1, preparedMeasure, order, x, y); - ltr = part.level != 1; - // The awkward -1 offsets are needed because findFirst (called - // on these below) will treat its first bound as inclusive, - // second as exclusive, but we want to actually address the - // characters in the part's range - begin = ltr ? part.from : part.to - 1; - end = ltr ? part.to : part.from - 1; - } - - // A binary search to find the first character whose bounding box - // starts after the coordinates. If we run across any whose box wrap - // the coordinates, store that. - var chAround = null, boxAround = null; - var ch = findFirst(function (ch) { - var box = measureCharPrepared(cm, preparedMeasure, ch); - box.top += widgetHeight$$1; box.bottom += widgetHeight$$1; - if (!boxIsAfter(box, x, y, false)) { return false } - if (box.top <= y && box.left <= x) { - chAround = ch; - boxAround = box; - } - return true - }, begin, end); - - var baseX, sticky, outside = false; - // If a box around the coordinates was found, use that - if (boxAround) { - // Distinguish coordinates nearer to the left or right side of the box - var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr; - ch = chAround + (atStart ? 0 : 1); - sticky = atStart ? "after" : "before"; - baseX = atLeft ? boxAround.left : boxAround.right; - } else { - // (Adjust for extended bound, if necessary.) - if (!ltr && (ch == end || ch == begin)) { ch++; } - // To determine which side to associate with, get the box to the - // left of the character and compare it's vertical position to the - // coordinates - sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : - (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight$$1 <= y) == ltr ? - "after" : "before"; - // Now get accurate coordinates for this place, in order to get a - // base X position - var coords = cursorCoords(cm, Pos(lineNo$$1, ch, sticky), "line", lineObj, preparedMeasure); - baseX = coords.left; - outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; - } - - ch = skipExtendingChars(lineObj.text, ch, 1); - return PosWithInfo(lineNo$$1, ch, sticky, outside, x - baseX) - } - - function coordsBidiPart(cm, lineObj, lineNo$$1, preparedMeasure, order, x, y) { - // Bidi parts are sorted left-to-right, and in a non-line-wrapping - // situation, we can take this ordering to correspond to the visual - // ordering. This finds the first part whose end is after the given - // coordinates. - var index = findFirst(function (i) { - var part = order[i], ltr = part.level != 1; - return boxIsAfter(cursorCoords(cm, Pos(lineNo$$1, ltr ? part.to : part.from, ltr ? "before" : "after"), - "line", lineObj, preparedMeasure), x, y, true) - }, 0, order.length - 1); - var part = order[index]; - // If this isn't the first part, the part's start is also after - // the coordinates, and the coordinates aren't on the same line as - // that start, move one part back. - if (index > 0) { - var ltr = part.level != 1; - var start = cursorCoords(cm, Pos(lineNo$$1, ltr ? part.from : part.to, ltr ? "after" : "before"), - "line", lineObj, preparedMeasure); - if (boxIsAfter(start, x, y, true) && start.top > y) - { part = order[index - 1]; } - } - return part - } - - function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { - // In a wrapped line, rtl text on wrapping boundaries can do things - // that don't correspond to the ordering in our `order` array at - // all, so a binary search doesn't work, and we want to return a - // part that only spans one line so that the binary search in - // coordsCharInner is safe. As such, we first find the extent of the - // wrapped line, and then do a flat search in which we discard any - // spans that aren't on the line. - var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); - var begin = ref.begin; - var end = ref.end; - if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; } - var part = null, closestDist = null; - for (var i = 0; i < order.length; i++) { - var p = order[i]; - if (p.from >= end || p.to <= begin) { continue } - var ltr = p.level != 1; - var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; - // Weigh against spans ending before this, so that they are only - // picked if nothing ends after - var dist = endX < x ? x - endX + 1e9 : endX - x; - if (!part || closestDist > dist) { - part = p; - closestDist = dist; - } - } - if (!part) { part = order[order.length - 1]; } - // Clip the part to the wrapped line. - if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; } - if (part.to > end) { part = {from: part.from, to: end, level: part.level}; } - return part - } - - var measureText; - // Compute the default text height. - function textHeight(display) { - if (display.cachedTextHeight != null) { return display.cachedTextHeight } - if (measureText == null) { - measureText = elt("pre", null, "CodeMirror-line-like"); - // Measure a bunch of lines, for browsers that compute - // fractional heights. - for (var i = 0; i < 49; ++i) { - measureText.appendChild(document.createTextNode("x")); - measureText.appendChild(elt("br")); - } - measureText.appendChild(document.createTextNode("x")); - } - removeChildrenAndAdd(display.measure, measureText); - var height = measureText.offsetHeight / 50; - if (height > 3) { display.cachedTextHeight = height; } - removeChildren(display.measure); - return height || 1 - } - - // Compute the default character width. - function charWidth(display) { - if (display.cachedCharWidth != null) { return display.cachedCharWidth } - var anchor = elt("span", "xxxxxxxxxx"); - var pre = elt("pre", [anchor], "CodeMirror-line-like"); - removeChildrenAndAdd(display.measure, pre); - var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; - if (width > 2) { display.cachedCharWidth = width; } - return width || 10 - } - - // Do a bulk-read of the DOM positions and sizes needed to draw the - // view, so that we don't interleave reading and writing to the DOM. - function getDimensions(cm) { - var d = cm.display, left = {}, width = {}; - var gutterLeft = d.gutters.clientLeft; - for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { - var id = cm.display.gutterSpecs[i].className; - left[id] = n.offsetLeft + n.clientLeft + gutterLeft; - width[id] = n.clientWidth; - } - return {fixedPos: compensateForHScroll(d), - gutterTotalWidth: d.gutters.offsetWidth, - gutterLeft: left, - gutterWidth: width, - wrapperWidth: d.wrapper.clientWidth} - } - - // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, - // but using getBoundingClientRect to get a sub-pixel-accurate - // result. - function compensateForHScroll(display) { - return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left - } - - // Returns a function that estimates the height of a line, to use as - // first approximation until the line becomes visible (and is thus - // properly measurable). - function estimateHeight(cm) { - var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; - var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); - return function (line) { - if (lineIsHidden(cm.doc, line)) { return 0 } - - var widgetsHeight = 0; - if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { - if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; } - } } - - if (wrapping) - { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } - else - { return widgetsHeight + th } - } - } - - function estimateLineHeights(cm) { - var doc = cm.doc, est = estimateHeight(cm); - doc.iter(function (line) { - var estHeight = est(line); - if (estHeight != line.height) { updateLineHeight(line, estHeight); } - }); - } - - // Given a mouse event, find the corresponding position. If liberal - // is false, it checks whether a gutter or scrollbar was clicked, - // and returns null if it was. forRect is used by rectangular - // selections, and tries to estimate a character position even for - // coordinates beyond the right of the text. - function posFromMouse(cm, e, liberal, forRect) { - var display = cm.display; - if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } - - var x, y, space = display.lineSpace.getBoundingClientRect(); - // Fails unpredictably on IE[67] when mouse is dragged around quickly. - try { x = e.clientX - space.left; y = e.clientY - space.top; } - catch (e) { return null } - var coords = coordsChar(cm, x, y), line; - if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { - var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; - coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); - } - return coords - } - - // Find the view element corresponding to a given line. Return null - // when the line isn't visible. - function findViewIndex(cm, n) { - if (n >= cm.display.viewTo) { return null } - n -= cm.display.viewFrom; - if (n < 0) { return null } - var view = cm.display.view; - for (var i = 0; i < view.length; i++) { - n -= view[i].size; - if (n < 0) { return i } - } - } - - // Updates the display.view data structure for a given change to the - // document. From and to are in pre-change coordinates. Lendiff is - // the amount of lines added or subtracted by the change. This is - // used for changes that span multiple lines, or change the way - // lines are divided into visual lines. regLineChange (below) - // registers single-line changes. - function regChange(cm, from, to, lendiff) { - if (from == null) { from = cm.doc.first; } - if (to == null) { to = cm.doc.first + cm.doc.size; } - if (!lendiff) { lendiff = 0; } - - var display = cm.display; - if (lendiff && to < display.viewTo && - (display.updateLineNumbers == null || display.updateLineNumbers > from)) - { display.updateLineNumbers = from; } - - cm.curOp.viewChanged = true; - - if (from >= display.viewTo) { // Change after - if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) - { resetView(cm); } - } else if (to <= display.viewFrom) { // Change before - if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { - resetView(cm); - } else { - display.viewFrom += lendiff; - display.viewTo += lendiff; - } - } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap - resetView(cm); - } else if (from <= display.viewFrom) { // Top overlap - var cut = viewCuttingPoint(cm, to, to + lendiff, 1); - if (cut) { - display.view = display.view.slice(cut.index); - display.viewFrom = cut.lineN; - display.viewTo += lendiff; - } else { - resetView(cm); - } - } else if (to >= display.viewTo) { // Bottom overlap - var cut$1 = viewCuttingPoint(cm, from, from, -1); - if (cut$1) { - display.view = display.view.slice(0, cut$1.index); - display.viewTo = cut$1.lineN; - } else { - resetView(cm); - } - } else { // Gap in the middle - var cutTop = viewCuttingPoint(cm, from, from, -1); - var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); - if (cutTop && cutBot) { - display.view = display.view.slice(0, cutTop.index) - .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) - .concat(display.view.slice(cutBot.index)); - display.viewTo += lendiff; - } else { - resetView(cm); - } - } - - var ext = display.externalMeasured; - if (ext) { - if (to < ext.lineN) - { ext.lineN += lendiff; } - else if (from < ext.lineN + ext.size) - { display.externalMeasured = null; } - } - } - - // Register a change to a single line. Type must be one of "text", - // "gutter", "class", "widget" - function regLineChange(cm, line, type) { - cm.curOp.viewChanged = true; - var display = cm.display, ext = cm.display.externalMeasured; - if (ext && line >= ext.lineN && line < ext.lineN + ext.size) - { display.externalMeasured = null; } - - if (line < display.viewFrom || line >= display.viewTo) { return } - var lineView = display.view[findViewIndex(cm, line)]; - if (lineView.node == null) { return } - var arr = lineView.changes || (lineView.changes = []); - if (indexOf(arr, type) == -1) { arr.push(type); } - } - - // Clear the view. - function resetView(cm) { - cm.display.viewFrom = cm.display.viewTo = cm.doc.first; - cm.display.view = []; - cm.display.viewOffset = 0; - } - - function viewCuttingPoint(cm, oldN, newN, dir) { - var index = findViewIndex(cm, oldN), diff, view = cm.display.view; - if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) - { return {index: index, lineN: newN} } - var n = cm.display.viewFrom; - for (var i = 0; i < index; i++) - { n += view[i].size; } - if (n != oldN) { - if (dir > 0) { - if (index == view.length - 1) { return null } - diff = (n + view[index].size) - oldN; - index++; - } else { - diff = n - oldN; - } - oldN += diff; newN += diff; - } - while (visualLineNo(cm.doc, newN) != newN) { - if (index == (dir < 0 ? 0 : view.length - 1)) { return null } - newN += dir * view[index - (dir < 0 ? 1 : 0)].size; - index += dir; - } - return {index: index, lineN: newN} - } - - // Force the view to cover a given range, adding empty view element - // or clipping off existing ones as needed. - function adjustView(cm, from, to) { - var display = cm.display, view = display.view; - if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { - display.view = buildViewArray(cm, from, to); - display.viewFrom = from; - } else { - if (display.viewFrom > from) - { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); } - else if (display.viewFrom < from) - { display.view = display.view.slice(findViewIndex(cm, from)); } - display.viewFrom = from; - if (display.viewTo < to) - { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); } - else if (display.viewTo > to) - { display.view = display.view.slice(0, findViewIndex(cm, to)); } - } - display.viewTo = to; - } - - // Count the number of lines in the view whose DOM representation is - // out of date (or nonexistent). - function countDirtyView(cm) { - var view = cm.display.view, dirty = 0; - for (var i = 0; i < view.length; i++) { - var lineView = view[i]; - if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; } - } - return dirty - } - - function updateSelection(cm) { - cm.display.input.showSelection(cm.display.input.prepareSelection()); - } - - function prepareSelection(cm, primary) { - if ( primary === void 0 ) primary = true; - - var doc = cm.doc, result = {}; - var curFragment = result.cursors = document.createDocumentFragment(); - var selFragment = result.selection = document.createDocumentFragment(); - - for (var i = 0; i < doc.sel.ranges.length; i++) { - if (!primary && i == doc.sel.primIndex) { continue } - var range$$1 = doc.sel.ranges[i]; - if (range$$1.from().line >= cm.display.viewTo || range$$1.to().line < cm.display.viewFrom) { continue } - var collapsed = range$$1.empty(); - if (collapsed || cm.options.showCursorWhenSelecting) - { drawSelectionCursor(cm, range$$1.head, curFragment); } - if (!collapsed) - { drawSelectionRange(cm, range$$1, selFragment); } - } - return result - } - - // Draws a cursor for the given range - function drawSelectionCursor(cm, head, output) { - var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); - - var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); - cursor.style.left = pos.left + "px"; - cursor.style.top = pos.top + "px"; - cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; - - if (pos.other) { - // Secondary cursor, shown when on a 'jump' in bi-directional text - var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); - otherCursor.style.display = ""; - otherCursor.style.left = pos.other.left + "px"; - otherCursor.style.top = pos.other.top + "px"; - otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; - } - } - - function cmpCoords(a, b) { return a.top - b.top || a.left - b.left } - - // Draws the given range as a highlighted selection - function drawSelectionRange(cm, range$$1, output) { - var display = cm.display, doc = cm.doc; - var fragment = document.createDocumentFragment(); - var padding = paddingH(cm.display), leftSide = padding.left; - var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; - var docLTR = doc.direction == "ltr"; - - function add(left, top, width, bottom) { - if (top < 0) { top = 0; } - top = Math.round(top); - bottom = Math.round(bottom); - fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))); - } - - function drawForLine(line, fromArg, toArg) { - var lineObj = getLine(doc, line); - var lineLen = lineObj.text.length; - var start, end; - function coords(ch, bias) { - return charCoords(cm, Pos(line, ch), "div", lineObj, bias) - } - - function wrapX(pos, dir, side) { - var extent = wrappedLineExtentChar(cm, lineObj, null, pos); - var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; - var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); - return coords(ch, prop)[prop] - } - - var order = getOrder(lineObj, doc.direction); - iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { - var ltr = dir == "ltr"; - var fromPos = coords(from, ltr ? "left" : "right"); - var toPos = coords(to - 1, ltr ? "right" : "left"); - - var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; - var first = i == 0, last = !order || i == order.length - 1; - if (toPos.top - fromPos.top <= 3) { // Single line - var openLeft = (docLTR ? openStart : openEnd) && first; - var openRight = (docLTR ? openEnd : openStart) && last; - var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; - var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; - add(left, fromPos.top, right - left, fromPos.bottom); - } else { // Multiple lines - var topLeft, topRight, botLeft, botRight; - if (ltr) { - topLeft = docLTR && openStart && first ? leftSide : fromPos.left; - topRight = docLTR ? rightSide : wrapX(from, dir, "before"); - botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); - botRight = docLTR && openEnd && last ? rightSide : toPos.right; - } else { - topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); - topRight = !docLTR && openStart && first ? rightSide : fromPos.right; - botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; - botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); - } - add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); - if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } - add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); - } - - if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } - if (cmpCoords(toPos, start) < 0) { start = toPos; } - if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } - if (cmpCoords(toPos, end) < 0) { end = toPos; } - }); - return {start: start, end: end} - } - - var sFrom = range$$1.from(), sTo = range$$1.to(); - if (sFrom.line == sTo.line) { - drawForLine(sFrom.line, sFrom.ch, sTo.ch); - } else { - var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); - var singleVLine = visualLine(fromLine) == visualLine(toLine); - var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; - var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; - if (singleVLine) { - if (leftEnd.top < rightStart.top - 2) { - add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); - add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); - } else { - add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); - } - } - if (leftEnd.bottom < rightStart.top) - { add(leftSide, leftEnd.bottom, null, rightStart.top); } - } - - output.appendChild(fragment); - } - - // Cursor-blinking - function restartBlink(cm) { - if (!cm.state.focused) { return } - var display = cm.display; - clearInterval(display.blinker); - var on = true; - display.cursorDiv.style.visibility = ""; - if (cm.options.cursorBlinkRate > 0) - { display.blinker = setInterval(function () { return display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; }, - cm.options.cursorBlinkRate); } - else if (cm.options.cursorBlinkRate < 0) - { display.cursorDiv.style.visibility = "hidden"; } - } - - function ensureFocus(cm) { - if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); } - } - - function delayBlurEvent(cm) { - cm.state.delayingBlurEvent = true; - setTimeout(function () { if (cm.state.delayingBlurEvent) { - cm.state.delayingBlurEvent = false; - onBlur(cm); - } }, 100); - } - - function onFocus(cm, e) { - if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; } - - if (cm.options.readOnly == "nocursor") { return } - if (!cm.state.focused) { - signal(cm, "focus", cm, e); - cm.state.focused = true; - addClass(cm.display.wrapper, "CodeMirror-focused"); - // This test prevents this from firing when a context - // menu is closed (since the input reset would kill the - // select-all detection hack) - if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { - cm.display.input.reset(); - if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730 - } - cm.display.input.receivedFocus(); - } - restartBlink(cm); - } - function onBlur(cm, e) { - if (cm.state.delayingBlurEvent) { return } - - if (cm.state.focused) { - signal(cm, "blur", cm, e); - cm.state.focused = false; - rmClass(cm.display.wrapper, "CodeMirror-focused"); - } - clearInterval(cm.display.blinker); - setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150); - } - - // Read the actual heights of the rendered lines, and update their - // stored heights to match. - function updateHeightsInViewport(cm) { - var display = cm.display; - var prevBottom = display.lineDiv.offsetTop; - for (var i = 0; i < display.view.length; i++) { - var cur = display.view[i], wrapping = cm.options.lineWrapping; - var height = (void 0), width = 0; - if (cur.hidden) { continue } - if (ie && ie_version < 8) { - var bot = cur.node.offsetTop + cur.node.offsetHeight; - height = bot - prevBottom; - prevBottom = bot; - } else { - var box = cur.node.getBoundingClientRect(); - height = box.bottom - box.top; - // Check that lines don't extend past the right of the current - // editor width - if (!wrapping && cur.text.firstChild) - { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; } - } - var diff = cur.line.height - height; - if (diff > .005 || diff < -.005) { - updateLineHeight(cur.line, height); - updateWidgetHeight(cur.line); - if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) - { updateWidgetHeight(cur.rest[j]); } } - } - if (width > cm.display.sizerWidth) { - var chWidth = Math.ceil(width / charWidth(cm.display)); - if (chWidth > cm.display.maxLineLength) { - cm.display.maxLineLength = chWidth; - cm.display.maxLine = cur.line; - cm.display.maxLineChanged = true; - } - } - } - } - - // Read and store the height of line widgets associated with the - // given line. - function updateWidgetHeight(line) { - if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) { - var w = line.widgets[i], parent = w.node.parentNode; - if (parent) { w.height = parent.offsetHeight; } - } } - } - - // Compute the lines that are visible in a given viewport (defaults - // the the current scroll position). viewport may contain top, - // height, and ensure (see op.scrollToPos) properties. - function visibleLines(display, doc, viewport) { - var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; - top = Math.floor(top - paddingTop(display)); - var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; - - var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); - // Ensure is a {from: {line, ch}, to: {line, ch}} object, and - // forces those lines into the viewport (if possible). - if (viewport && viewport.ensure) { - var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; - if (ensureFrom < from) { - from = ensureFrom; - to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); - } else if (Math.min(ensureTo, doc.lastLine()) >= to) { - from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); - to = ensureTo; - } - } - return {from: from, to: Math.max(to, from + 1)} - } - - // SCROLLING THINGS INTO VIEW - - // If an editor sits on the top or bottom of the window, partially - // scrolled out of view, this ensures that the cursor is visible. - function maybeScrollWindow(cm, rect) { - if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } - - var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; - if (rect.top + box.top < 0) { doScroll = true; } - else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; } - if (doScroll != null && !phantom) { - var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;")); - cm.display.lineSpace.appendChild(scrollNode); - scrollNode.scrollIntoView(doScroll); - cm.display.lineSpace.removeChild(scrollNode); - } - } - - // Scroll a given position into view (immediately), verifying that - // it actually became visible (as line heights are accurately - // measured, the position of something may 'drift' during drawing). - function scrollPosIntoView(cm, pos, end, margin) { - if (margin == null) { margin = 0; } - var rect; - if (!cm.options.lineWrapping && pos == end) { - // Set pos and end to the cursor positions around the character pos sticks to - // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch - // If pos == Pos(_, 0, "before"), pos and end are unchanged - pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; - end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; - } - for (var limit = 0; limit < 5; limit++) { - var changed = false; - var coords = cursorCoords(cm, pos); - var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); - rect = {left: Math.min(coords.left, endCoords.left), - top: Math.min(coords.top, endCoords.top) - margin, - right: Math.max(coords.left, endCoords.left), - bottom: Math.max(coords.bottom, endCoords.bottom) + margin}; - var scrollPos = calculateScrollPos(cm, rect); - var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; - if (scrollPos.scrollTop != null) { - updateScrollTop(cm, scrollPos.scrollTop); - if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; } - } - if (scrollPos.scrollLeft != null) { - setScrollLeft(cm, scrollPos.scrollLeft); - if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; } - } - if (!changed) { break } - } - return rect - } - - // Scroll a given set of coordinates into view (immediately). - function scrollIntoView(cm, rect) { - var scrollPos = calculateScrollPos(cm, rect); - if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); } - if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); } - } - - // Calculate a new scroll position needed to scroll the given - // rectangle into view. Returns an object with scrollTop and - // scrollLeft properties. When these are undefined, the - // vertical/horizontal position does not need to be adjusted. - function calculateScrollPos(cm, rect) { - var display = cm.display, snapMargin = textHeight(cm.display); - if (rect.top < 0) { rect.top = 0; } - var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; - var screen = displayHeight(cm), result = {}; - if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; } - var docBottom = cm.doc.height + paddingVert(display); - var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; - if (rect.top < screentop) { - result.scrollTop = atTop ? 0 : rect.top; - } else if (rect.bottom > screentop + screen) { - var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); - if (newTop != screentop) { result.scrollTop = newTop; } - } - - var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft; - var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0); - var tooWide = rect.right - rect.left > screenw; - if (tooWide) { rect.right = rect.left + screenw; } - if (rect.left < 10) - { result.scrollLeft = 0; } - else if (rect.left < screenleft) - { result.scrollLeft = Math.max(0, rect.left - (tooWide ? 0 : 10)); } - else if (rect.right > screenw + screenleft - 3) - { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; } - return result - } - - // Store a relative adjustment to the scroll position in the current - // operation (to be applied when the operation finishes). - function addToScrollTop(cm, top) { - if (top == null) { return } - resolveScrollToPos(cm); - cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; - } - - // Make sure that at the end of the operation the current cursor is - // shown. - function ensureCursorVisible(cm) { - resolveScrollToPos(cm); - var cur = cm.getCursor(); - cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}; - } - - function scrollToCoords(cm, x, y) { - if (x != null || y != null) { resolveScrollToPos(cm); } - if (x != null) { cm.curOp.scrollLeft = x; } - if (y != null) { cm.curOp.scrollTop = y; } - } - - function scrollToRange(cm, range$$1) { - resolveScrollToPos(cm); - cm.curOp.scrollToPos = range$$1; - } - - // When an operation has its scrollToPos property set, and another - // scroll action is applied before the end of the operation, this - // 'simulates' scrolling that position into view in a cheap way, so - // that the effect of intermediate scroll commands is not ignored. - function resolveScrollToPos(cm) { - var range$$1 = cm.curOp.scrollToPos; - if (range$$1) { - cm.curOp.scrollToPos = null; - var from = estimateCoords(cm, range$$1.from), to = estimateCoords(cm, range$$1.to); - scrollToCoordsRange(cm, from, to, range$$1.margin); - } - } - - function scrollToCoordsRange(cm, from, to, margin) { - var sPos = calculateScrollPos(cm, { - left: Math.min(from.left, to.left), - top: Math.min(from.top, to.top) - margin, - right: Math.max(from.right, to.right), - bottom: Math.max(from.bottom, to.bottom) + margin - }); - scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); - } - - // Sync the scrollable area and scrollbars, ensure the viewport - // covers the visible area. - function updateScrollTop(cm, val) { - if (Math.abs(cm.doc.scrollTop - val) < 2) { return } - if (!gecko) { updateDisplaySimple(cm, {top: val}); } - setScrollTop(cm, val, true); - if (gecko) { updateDisplaySimple(cm); } - startWorker(cm, 100); - } - - function setScrollTop(cm, val, forceScroll) { - val = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val); - if (cm.display.scroller.scrollTop == val && !forceScroll) { return } - cm.doc.scrollTop = val; - cm.display.scrollbars.setScrollTop(val); - if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; } - } - - // Sync scroller and scrollbar, ensure the gutter elements are - // aligned. - function setScrollLeft(cm, val, isScroller, forceScroll) { - val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth); - if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return } - cm.doc.scrollLeft = val; - alignHorizontally(cm); - if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; } - cm.display.scrollbars.setScrollLeft(val); - } - - // SCROLLBARS - - // Prepare DOM reads needed to update the scrollbars. Done in one - // shot to minimize update/measure roundtrips. - function measureForScrollbars(cm) { - var d = cm.display, gutterW = d.gutters.offsetWidth; - var docH = Math.round(cm.doc.height + paddingVert(cm.display)); - return { - clientHeight: d.scroller.clientHeight, - viewHeight: d.wrapper.clientHeight, - scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, - viewWidth: d.wrapper.clientWidth, - barLeft: cm.options.fixedGutter ? gutterW : 0, - docHeight: docH, - scrollHeight: docH + scrollGap(cm) + d.barHeight, - nativeBarWidth: d.nativeBarWidth, - gutterWidth: gutterW - } - } - - var NativeScrollbars = function(place, scroll, cm) { - this.cm = cm; - var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); - var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); - vert.tabIndex = horiz.tabIndex = -1; - place(vert); place(horiz); - - on(vert, "scroll", function () { - if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); } - }); - on(horiz, "scroll", function () { - if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); } - }); - - this.checkedZeroWidth = false; - // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). - if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } - }; - - NativeScrollbars.prototype.update = function (measure) { - var needsH = measure.scrollWidth > measure.clientWidth + 1; - var needsV = measure.scrollHeight > measure.clientHeight + 1; - var sWidth = measure.nativeBarWidth; - - if (needsV) { - this.vert.style.display = "block"; - this.vert.style.bottom = needsH ? sWidth + "px" : "0"; - var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); - // A bug in IE8 can cause this value to be negative, so guard it. - this.vert.firstChild.style.height = - Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; - } else { - this.vert.style.display = ""; - this.vert.firstChild.style.height = "0"; - } - - if (needsH) { - this.horiz.style.display = "block"; - this.horiz.style.right = needsV ? sWidth + "px" : "0"; - this.horiz.style.left = measure.barLeft + "px"; - var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); - this.horiz.firstChild.style.width = - Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; - } else { - this.horiz.style.display = ""; - this.horiz.firstChild.style.width = "0"; - } - - if (!this.checkedZeroWidth && measure.clientHeight > 0) { - if (sWidth == 0) { this.zeroWidthHack(); } - this.checkedZeroWidth = true; - } - - return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} - }; - - NativeScrollbars.prototype.setScrollLeft = function (pos) { - if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; } - if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); } - }; - - NativeScrollbars.prototype.setScrollTop = function (pos) { - if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; } - if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); } - }; - - NativeScrollbars.prototype.zeroWidthHack = function () { - var w = mac && !mac_geMountainLion ? "12px" : "18px"; - this.horiz.style.height = this.vert.style.width = w; - this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; - this.disableHoriz = new Delayed; - this.disableVert = new Delayed; - }; - - NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { - bar.style.pointerEvents = "auto"; - function maybeDisable() { - // To find out whether the scrollbar is still visible, we - // check whether the element under the pixel in the bottom - // right corner of the scrollbar box is the scrollbar box - // itself (when the bar is still visible) or its filler child - // (when the bar is hidden). If it is still visible, we keep - // it enabled, if it's hidden, we disable pointer events. - var box = bar.getBoundingClientRect(); - var elt$$1 = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) - : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); - if (elt$$1 != bar) { bar.style.pointerEvents = "none"; } - else { delay.set(1000, maybeDisable); } - } - delay.set(1000, maybeDisable); - }; - - NativeScrollbars.prototype.clear = function () { - var parent = this.horiz.parentNode; - parent.removeChild(this.horiz); - parent.removeChild(this.vert); - }; - - var NullScrollbars = function () {}; - - NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; - NullScrollbars.prototype.setScrollLeft = function () {}; - NullScrollbars.prototype.setScrollTop = function () {}; - NullScrollbars.prototype.clear = function () {}; - - function updateScrollbars(cm, measure) { - if (!measure) { measure = measureForScrollbars(cm); } - var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; - updateScrollbarsInner(cm, measure); - for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { - if (startWidth != cm.display.barWidth && cm.options.lineWrapping) - { updateHeightsInViewport(cm); } - updateScrollbarsInner(cm, measureForScrollbars(cm)); - startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; - } - } - - // Re-synchronize the fake scrollbars with the actual size of the - // content. - function updateScrollbarsInner(cm, measure) { - var d = cm.display; - var sizes = d.scrollbars.update(measure); - - d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; - d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; - d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; - - if (sizes.right && sizes.bottom) { - d.scrollbarFiller.style.display = "block"; - d.scrollbarFiller.style.height = sizes.bottom + "px"; - d.scrollbarFiller.style.width = sizes.right + "px"; - } else { d.scrollbarFiller.style.display = ""; } - if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { - d.gutterFiller.style.display = "block"; - d.gutterFiller.style.height = sizes.bottom + "px"; - d.gutterFiller.style.width = measure.gutterWidth + "px"; - } else { d.gutterFiller.style.display = ""; } - } - - var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; - - function initScrollbars(cm) { - if (cm.display.scrollbars) { - cm.display.scrollbars.clear(); - if (cm.display.scrollbars.addClass) - { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } - } - - cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { - cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); - // Prevent clicks in the scrollbars from killing focus - on(node, "mousedown", function () { - if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); } - }); - node.setAttribute("cm-not-content", "true"); - }, function (pos, axis) { - if (axis == "horizontal") { setScrollLeft(cm, pos); } - else { updateScrollTop(cm, pos); } - }, cm); - if (cm.display.scrollbars.addClass) - { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } - } - - // Operations are used to wrap a series of changes to the editor - // state in such a way that each change won't have to update the - // cursor and display (which would be awkward, slow, and - // error-prone). Instead, display updates are batched and then all - // combined and executed at once. - - var nextOpId = 0; - // Start a new operation. - function startOperation(cm) { - cm.curOp = { - cm: cm, - viewChanged: false, // Flag that indicates that lines might need to be redrawn - startHeight: cm.doc.height, // Used to detect need to update scrollbar - forceUpdate: false, // Used to force a redraw - updateInput: 0, // Whether to reset the input textarea - typing: false, // Whether this reset should be careful to leave existing text (for compositing) - changeObjs: null, // Accumulated changes, for firing change events - cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on - cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already - selectionChanged: false, // Whether the selection needs to be redrawn - updateMaxLine: false, // Set when the widest line needs to be determined anew - scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet - scrollToPos: null, // Used to scroll to a specific position - focus: false, - id: ++nextOpId // Unique ID - }; - pushOperation(cm.curOp); - } - - // Finish an operation, updating the display and signalling delayed events - function endOperation(cm) { - var op = cm.curOp; - if (op) { finishOperation(op, function (group) { - for (var i = 0; i < group.ops.length; i++) - { group.ops[i].cm.curOp = null; } - endOperations(group); - }); } - } - - // The DOM updates done when an operation finishes are batched so - // that the minimum number of relayouts are required. - function endOperations(group) { - var ops = group.ops; - for (var i = 0; i < ops.length; i++) // Read DOM - { endOperation_R1(ops[i]); } - for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) - { endOperation_W1(ops[i$1]); } - for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM - { endOperation_R2(ops[i$2]); } - for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) - { endOperation_W2(ops[i$3]); } - for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM - { endOperation_finish(ops[i$4]); } - } - - function endOperation_R1(op) { - var cm = op.cm, display = cm.display; - maybeClipScrollbars(cm); - if (op.updateMaxLine) { findMaxLine(cm); } - - op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || - op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || - op.scrollToPos.to.line >= display.viewTo) || - display.maxLineChanged && cm.options.lineWrapping; - op.update = op.mustUpdate && - new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); - } - - function endOperation_W1(op) { - op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); - } - - function endOperation_R2(op) { - var cm = op.cm, display = cm.display; - if (op.updatedDisplay) { updateHeightsInViewport(cm); } - - op.barMeasure = measureForScrollbars(cm); - - // If the max line changed since it was last measured, measure it, - // and ensure the document's width matches it. - // updateDisplay_W2 will use these properties to do the actual resizing - if (display.maxLineChanged && !cm.options.lineWrapping) { - op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; - cm.display.sizerWidth = op.adjustWidthTo; - op.barMeasure.scrollWidth = - Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); - op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); - } - - if (op.updatedDisplay || op.selectionChanged) - { op.preparedSelection = display.input.prepareSelection(); } - } - - function endOperation_W2(op) { - var cm = op.cm; - - if (op.adjustWidthTo != null) { - cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; - if (op.maxScrollLeft < cm.doc.scrollLeft) - { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); } - cm.display.maxLineChanged = false; - } - - var takeFocus = op.focus && op.focus == activeElt(); - if (op.preparedSelection) - { cm.display.input.showSelection(op.preparedSelection, takeFocus); } - if (op.updatedDisplay || op.startHeight != cm.doc.height) - { updateScrollbars(cm, op.barMeasure); } - if (op.updatedDisplay) - { setDocumentHeight(cm, op.barMeasure); } - - if (op.selectionChanged) { restartBlink(cm); } - - if (cm.state.focused && op.updateInput) - { cm.display.input.reset(op.typing); } - if (takeFocus) { ensureFocus(op.cm); } - } - - function endOperation_finish(op) { - var cm = op.cm, display = cm.display, doc = cm.doc; - - if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); } - - // Abort mouse wheel delta measurement, when scrolling explicitly - if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) - { display.wheelStartX = display.wheelStartY = null; } - - // Propagate the scroll position to the actual DOM scroller - if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); } - - if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); } - // If we need to scroll a specific position into view, do so. - if (op.scrollToPos) { - var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), - clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); - maybeScrollWindow(cm, rect); - } - - // Fire events for markers that are hidden/unidden by editing or - // undoing - var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; - if (hidden) { for (var i = 0; i < hidden.length; ++i) - { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } } - if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) - { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } } - - if (display.wrapper.offsetHeight) - { doc.scrollTop = cm.display.scroller.scrollTop; } - - // Fire change events, and delayed event handlers - if (op.changeObjs) - { signal(cm, "changes", cm, op.changeObjs); } - if (op.update) - { op.update.finish(); } - } - - // Run the given function in an operation - function runInOp(cm, f) { - if (cm.curOp) { return f() } - startOperation(cm); - try { return f() } - finally { endOperation(cm); } - } - // Wraps a function in an operation. Returns the wrapped function. - function operation(cm, f) { - return function() { - if (cm.curOp) { return f.apply(cm, arguments) } - startOperation(cm); - try { return f.apply(cm, arguments) } - finally { endOperation(cm); } - } - } - // Used to add methods to editor and doc instances, wrapping them in - // operations. - function methodOp(f) { - return function() { - if (this.curOp) { return f.apply(this, arguments) } - startOperation(this); - try { return f.apply(this, arguments) } - finally { endOperation(this); } - } - } - function docMethodOp(f) { - return function() { - var cm = this.cm; - if (!cm || cm.curOp) { return f.apply(this, arguments) } - startOperation(cm); - try { return f.apply(this, arguments) } - finally { endOperation(cm); } - } - } - - // HIGHLIGHT WORKER - - function startWorker(cm, time) { - if (cm.doc.highlightFrontier < cm.display.viewTo) - { cm.state.highlight.set(time, bind(highlightWorker, cm)); } - } - - function highlightWorker(cm) { - var doc = cm.doc; - if (doc.highlightFrontier >= cm.display.viewTo) { return } - var end = +new Date + cm.options.workTime; - var context = getContextBefore(cm, doc.highlightFrontier); - var changedLines = []; - - doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { - if (context.line >= cm.display.viewFrom) { // Visible - var oldStyles = line.styles; - var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; - var highlighted = highlightLine(cm, line, context, true); - if (resetState) { context.state = resetState; } - line.styles = highlighted.styles; - var oldCls = line.styleClasses, newCls = highlighted.classes; - if (newCls) { line.styleClasses = newCls; } - else if (oldCls) { line.styleClasses = null; } - var ischange = !oldStyles || oldStyles.length != line.styles.length || - oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); - for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; } - if (ischange) { changedLines.push(context.line); } - line.stateAfter = context.save(); - context.nextLine(); - } else { - if (line.text.length <= cm.options.maxHighlightLength) - { processLine(cm, line.text, context); } - line.stateAfter = context.line % 5 == 0 ? context.save() : null; - context.nextLine(); - } - if (+new Date > end) { - startWorker(cm, cm.options.workDelay); - return true - } - }); - doc.highlightFrontier = context.line; - doc.modeFrontier = Math.max(doc.modeFrontier, context.line); - if (changedLines.length) { runInOp(cm, function () { - for (var i = 0; i < changedLines.length; i++) - { regLineChange(cm, changedLines[i], "text"); } - }); } - } - - // DISPLAY DRAWING - - var DisplayUpdate = function(cm, viewport, force) { - var display = cm.display; - - this.viewport = viewport; - // Store some values that we'll need later (but don't want to force a relayout for) - this.visible = visibleLines(display, cm.doc, viewport); - this.editorIsHidden = !display.wrapper.offsetWidth; - this.wrapperHeight = display.wrapper.clientHeight; - this.wrapperWidth = display.wrapper.clientWidth; - this.oldDisplayWidth = displayWidth(cm); - this.force = force; - this.dims = getDimensions(cm); - this.events = []; - }; - - DisplayUpdate.prototype.signal = function (emitter, type) { - if (hasHandler(emitter, type)) - { this.events.push(arguments); } - }; - DisplayUpdate.prototype.finish = function () { - var this$1 = this; - - for (var i = 0; i < this.events.length; i++) - { signal.apply(null, this$1.events[i]); } - }; - - function maybeClipScrollbars(cm) { - var display = cm.display; - if (!display.scrollbarsClipped && display.scroller.offsetWidth) { - display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; - display.heightForcer.style.height = scrollGap(cm) + "px"; - display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; - display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; - display.scrollbarsClipped = true; - } - } - - function selectionSnapshot(cm) { - if (cm.hasFocus()) { return null } - var active = activeElt(); - if (!active || !contains(cm.display.lineDiv, active)) { return null } - var result = {activeElt: active}; - if (window.getSelection) { - var sel = window.getSelection(); - if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { - result.anchorNode = sel.anchorNode; - result.anchorOffset = sel.anchorOffset; - result.focusNode = sel.focusNode; - result.focusOffset = sel.focusOffset; - } - } - return result - } - - function restoreSelection(snapshot) { - if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return } - snapshot.activeElt.focus(); - if (snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { - var sel = window.getSelection(), range$$1 = document.createRange(); - range$$1.setEnd(snapshot.anchorNode, snapshot.anchorOffset); - range$$1.collapse(false); - sel.removeAllRanges(); - sel.addRange(range$$1); - sel.extend(snapshot.focusNode, snapshot.focusOffset); - } - } - - // Does the actual updating of the line display. Bails out - // (returning false) when there is nothing to be done and forced is - // false. - function updateDisplayIfNeeded(cm, update) { - var display = cm.display, doc = cm.doc; - - if (update.editorIsHidden) { - resetView(cm); - return false - } - - // Bail out if the visible area is already rendered and nothing changed. - if (!update.force && - update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && - (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && - display.renderedView == display.view && countDirtyView(cm) == 0) - { return false } - - if (maybeUpdateLineNumberWidth(cm)) { - resetView(cm); - update.dims = getDimensions(cm); - } - - // Compute a suitable new viewport (from & to) - var end = doc.first + doc.size; - var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); - var to = Math.min(end, update.visible.to + cm.options.viewportMargin); - if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); } - if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); } - if (sawCollapsedSpans) { - from = visualLineNo(cm.doc, from); - to = visualLineEndNo(cm.doc, to); - } - - var different = from != display.viewFrom || to != display.viewTo || - display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; - adjustView(cm, from, to); - - display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); - // Position the mover div to align with the current scroll position - cm.display.mover.style.top = display.viewOffset + "px"; - - var toUpdate = countDirtyView(cm); - if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && - (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) - { return false } - - // For big changes, we hide the enclosing element during the - // update, since that speeds up the operations on most browsers. - var selSnapshot = selectionSnapshot(cm); - if (toUpdate > 4) { display.lineDiv.style.display = "none"; } - patchDisplay(cm, display.updateLineNumbers, update.dims); - if (toUpdate > 4) { display.lineDiv.style.display = ""; } - display.renderedView = display.view; - // There might have been a widget with a focused element that got - // hidden or updated, if so re-focus it. - restoreSelection(selSnapshot); - - // Prevent selection and cursors from interfering with the scroll - // width and height. - removeChildren(display.cursorDiv); - removeChildren(display.selectionDiv); - display.gutters.style.height = display.sizer.style.minHeight = 0; - - if (different) { - display.lastWrapHeight = update.wrapperHeight; - display.lastWrapWidth = update.wrapperWidth; - startWorker(cm, 400); - } - - display.updateLineNumbers = null; - - return true - } - - function postUpdateDisplay(cm, update) { - var viewport = update.viewport; - - for (var first = true;; first = false) { - if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { - // Clip forced viewport to actual scrollable area. - if (viewport && viewport.top != null) - { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; } - // Updated line heights might result in the drawn area not - // actually covering the viewport. Keep looping until it does. - update.visible = visibleLines(cm.display, cm.doc, viewport); - if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) - { break } - } - if (!updateDisplayIfNeeded(cm, update)) { break } - updateHeightsInViewport(cm); - var barMeasure = measureForScrollbars(cm); - updateSelection(cm); - updateScrollbars(cm, barMeasure); - setDocumentHeight(cm, barMeasure); - update.force = false; - } - - update.signal(cm, "update", cm); - if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { - update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); - cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; - } - } - - function updateDisplaySimple(cm, viewport) { - var update = new DisplayUpdate(cm, viewport); - if (updateDisplayIfNeeded(cm, update)) { - updateHeightsInViewport(cm); - postUpdateDisplay(cm, update); - var barMeasure = measureForScrollbars(cm); - updateSelection(cm); - updateScrollbars(cm, barMeasure); - setDocumentHeight(cm, barMeasure); - update.finish(); - } - } - - // Sync the actual display DOM structure with display.view, removing - // nodes for lines that are no longer in view, and creating the ones - // that are not there yet, and updating the ones that are out of - // date. - function patchDisplay(cm, updateNumbersFrom, dims) { - var display = cm.display, lineNumbers = cm.options.lineNumbers; - var container = display.lineDiv, cur = container.firstChild; - - function rm(node) { - var next = node.nextSibling; - // Works around a throw-scroll bug in OS X Webkit - if (webkit && mac && cm.display.currentWheelTarget == node) - { node.style.display = "none"; } - else - { node.parentNode.removeChild(node); } - return next - } - - var view = display.view, lineN = display.viewFrom; - // Loop over the elements in the view, syncing cur (the DOM nodes - // in display.lineDiv) with the view as we go. - for (var i = 0; i < view.length; i++) { - var lineView = view[i]; - if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet - var node = buildLineElement(cm, lineView, lineN, dims); - container.insertBefore(node, cur); - } else { // Already drawn - while (cur != lineView.node) { cur = rm(cur); } - var updateNumber = lineNumbers && updateNumbersFrom != null && - updateNumbersFrom <= lineN && lineView.lineNumber; - if (lineView.changes) { - if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; } - updateLineForChanges(cm, lineView, lineN, dims); - } - if (updateNumber) { - removeChildren(lineView.lineNumber); - lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); - } - cur = lineView.node.nextSibling; - } - lineN += lineView.size; - } - while (cur) { cur = rm(cur); } - } - - function updateGutterSpace(display) { - var width = display.gutters.offsetWidth; - display.sizer.style.marginLeft = width + "px"; - } - - function setDocumentHeight(cm, measure) { - cm.display.sizer.style.minHeight = measure.docHeight + "px"; - cm.display.heightForcer.style.top = measure.docHeight + "px"; - cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; - } - - // Re-align line numbers and gutter marks to compensate for - // horizontal scrolling. - function alignHorizontally(cm) { - var display = cm.display, view = display.view; - if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } - var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; - var gutterW = display.gutters.offsetWidth, left = comp + "px"; - for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { - if (cm.options.fixedGutter) { - if (view[i].gutter) - { view[i].gutter.style.left = left; } - if (view[i].gutterBackground) - { view[i].gutterBackground.style.left = left; } - } - var align = view[i].alignable; - if (align) { for (var j = 0; j < align.length; j++) - { align[j].style.left = left; } } - } } - if (cm.options.fixedGutter) - { display.gutters.style.left = (comp + gutterW) + "px"; } - } - - // Used to ensure that the line number gutter is still the right - // size for the current document size. Returns true when an update - // is needed. - function maybeUpdateLineNumberWidth(cm) { - if (!cm.options.lineNumbers) { return false } - var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; - if (last.length != display.lineNumChars) { - var test = display.measure.appendChild(elt("div", [elt("div", last)], - "CodeMirror-linenumber CodeMirror-gutter-elt")); - var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; - display.lineGutter.style.width = ""; - display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; - display.lineNumWidth = display.lineNumInnerWidth + padding; - display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; - display.lineGutter.style.width = display.lineNumWidth + "px"; - updateGutterSpace(cm.display); - return true - } - return false - } - - function getGutters(gutters, lineNumbers) { - var result = [], sawLineNumbers = false; - for (var i = 0; i < gutters.length; i++) { - var name = gutters[i], style = null; - if (typeof name != "string") { style = name.style; name = name.className; } - if (name == "CodeMirror-linenumbers") { - if (!lineNumbers) { continue } - else { sawLineNumbers = true; } - } - result.push({className: name, style: style}); - } - if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); } - return result - } - - // Rebuild the gutter elements, ensure the margin to the left of the - // code matches their width. - function renderGutters(display) { - var gutters = display.gutters, specs = display.gutterSpecs; - removeChildren(gutters); - display.lineGutter = null; - for (var i = 0; i < specs.length; ++i) { - var ref = specs[i]; - var className = ref.className; - var style = ref.style; - var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); - if (style) { gElt.style.cssText = style; } - if (className == "CodeMirror-linenumbers") { - display.lineGutter = gElt; - gElt.style.width = (display.lineNumWidth || 1) + "px"; - } - } - gutters.style.display = specs.length ? "" : "none"; - updateGutterSpace(display); - } - - function updateGutters(cm) { - renderGutters(cm.display); - regChange(cm); - alignHorizontally(cm); - } - - // The display handles the DOM integration, both for input reading - // and content drawing. It holds references to DOM nodes and - // display-related state. - - function Display(place, doc, input, options) { - var d = this; - this.input = input; - - // Covers bottom-right square when both scrollbars are present. - d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); - d.scrollbarFiller.setAttribute("cm-not-content", "true"); - // Covers bottom of gutter when coverGutterNextToScrollbar is on - // and h scrollbar is present. - d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); - d.gutterFiller.setAttribute("cm-not-content", "true"); - // Will contain the actual code, positioned to cover the viewport. - d.lineDiv = eltP("div", null, "CodeMirror-code"); - // Elements are added to these to represent selection and cursors. - d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); - d.cursorDiv = elt("div", null, "CodeMirror-cursors"); - // A visibility: hidden element used to find the size of things. - d.measure = elt("div", null, "CodeMirror-measure"); - // When lines outside of the viewport are measured, they are drawn in this. - d.lineMeasure = elt("div", null, "CodeMirror-measure"); - // Wraps everything that needs to exist inside the vertically-padded coordinate system - d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], - null, "position: relative; outline: none"); - var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); - // Moved around its parent to cover visible view. - d.mover = elt("div", [lines], null, "position: relative"); - // Set to the height of the document, allowing scrolling. - d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); - d.sizerWidth = null; - // Behavior of elts with overflow: auto and padding is - // inconsistent across browsers. This is used to ensure the - // scrollable area is big enough. - d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); - // Will contain the gutters, if any. - d.gutters = elt("div", null, "CodeMirror-gutters"); - d.lineGutter = null; - // Actual scrollable element. - d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); - d.scroller.setAttribute("tabIndex", "-1"); - // The element in which the editor lives. - d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); - - // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) - if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } - if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; } - - if (place) { - if (place.appendChild) { place.appendChild(d.wrapper); } - else { place(d.wrapper); } - } - - // Current rendered range (may be bigger than the view window). - d.viewFrom = d.viewTo = doc.first; - d.reportedViewFrom = d.reportedViewTo = doc.first; - // Information about the rendered lines. - d.view = []; - d.renderedView = null; - // Holds info about a single rendered line when it was rendered - // for measurement, while not in view. - d.externalMeasured = null; - // Empty space (in pixels) above the view - d.viewOffset = 0; - d.lastWrapHeight = d.lastWrapWidth = 0; - d.updateLineNumbers = null; - - d.nativeBarWidth = d.barHeight = d.barWidth = 0; - d.scrollbarsClipped = false; - - // Used to only resize the line number gutter when necessary (when - // the amount of lines crosses a boundary that makes its width change) - d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; - // Set to true when a non-horizontal-scrolling line widget is - // added. As an optimization, line widget aligning is skipped when - // this is false. - d.alignWidgets = false; - - d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; - - // Tracks the maximum line length so that the horizontal scrollbar - // can be kept static when scrolling. - d.maxLine = null; - d.maxLineLength = 0; - d.maxLineChanged = false; - - // Used for measuring wheel scrolling granularity - d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; - - // True when shift is held down. - d.shift = false; - - // Used to track whether anything happened since the context menu - // was opened. - d.selForContextMenu = null; - - d.activeTouch = null; - - d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); - renderGutters(d); - - input.init(d); - } - - // Since the delta values reported on mouse wheel events are - // unstandardized between browsers and even browser versions, and - // generally horribly unpredictable, this code starts by measuring - // the scroll effect that the first few mouse wheel events have, - // and, from that, detects the way it can convert deltas to pixel - // offsets afterwards. - // - // The reason we want to know the amount a wheel event will scroll - // is that it gives us a chance to update the display before the - // actual scrolling happens, reducing flickering. - - var wheelSamples = 0, wheelPixelsPerUnit = null; - // Fill in a browser-detected starting value on browsers where we - // know one. These don't have to be accurate -- the result of them - // being wrong would just be a slight flicker on the first wheel - // scroll (if it is large enough). - if (ie) { wheelPixelsPerUnit = -.53; } - else if (gecko) { wheelPixelsPerUnit = 15; } - else if (chrome) { wheelPixelsPerUnit = -.7; } - else if (safari) { wheelPixelsPerUnit = -1/3; } - - function wheelEventDelta(e) { - var dx = e.wheelDeltaX, dy = e.wheelDeltaY; - if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; } - if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; } - else if (dy == null) { dy = e.wheelDelta; } - return {x: dx, y: dy} - } - function wheelEventPixels(e) { - var delta = wheelEventDelta(e); - delta.x *= wheelPixelsPerUnit; - delta.y *= wheelPixelsPerUnit; - return delta - } - - function onScrollWheel(cm, e) { - var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; - - var display = cm.display, scroll = display.scroller; - // Quit if there's nothing to scroll here - var canScrollX = scroll.scrollWidth > scroll.clientWidth; - var canScrollY = scroll.scrollHeight > scroll.clientHeight; - if (!(dx && canScrollX || dy && canScrollY)) { return } - - // Webkit browsers on OS X abort momentum scrolls when the target - // of the scroll event is removed from the scrollable element. - // This hack (see related code in patchDisplay) makes sure the - // element is kept around. - if (dy && mac && webkit) { - outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { - for (var i = 0; i < view.length; i++) { - if (view[i].node == cur) { - cm.display.currentWheelTarget = cur; - break outer - } - } - } - } - - // On some browsers, horizontal scrolling will cause redraws to - // happen before the gutter has been realigned, causing it to - // wriggle around in a most unseemly way. When we have an - // estimated pixels/delta value, we just handle horizontal - // scrolling entirely here. It'll be slightly off from native, but - // better than glitching out. - if (dx && !gecko && !presto && wheelPixelsPerUnit != null) { - if (dy && canScrollY) - { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); } - setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit)); - // Only prevent default scrolling if vertical scrolling is - // actually possible. Otherwise, it causes vertical scroll - // jitter on OSX trackpads when deltaX is small and deltaY - // is large (issue #3579) - if (!dy || (dy && canScrollY)) - { e_preventDefault(e); } - display.wheelStartX = null; // Abort measurement, if in progress - return - } - - // 'Project' the visible viewport to cover the area that is being - // scrolled into view (if we know enough to estimate it). - if (dy && wheelPixelsPerUnit != null) { - var pixels = dy * wheelPixelsPerUnit; - var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; - if (pixels < 0) { top = Math.max(0, top + pixels - 50); } - else { bot = Math.min(cm.doc.height, bot + pixels + 50); } - updateDisplaySimple(cm, {top: top, bottom: bot}); - } - - if (wheelSamples < 20) { - if (display.wheelStartX == null) { - display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; - display.wheelDX = dx; display.wheelDY = dy; - setTimeout(function () { - if (display.wheelStartX == null) { return } - var movedX = scroll.scrollLeft - display.wheelStartX; - var movedY = scroll.scrollTop - display.wheelStartY; - var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || - (movedX && display.wheelDX && movedX / display.wheelDX); - display.wheelStartX = display.wheelStartY = null; - if (!sample) { return } - wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); - ++wheelSamples; - }, 200); - } else { - display.wheelDX += dx; display.wheelDY += dy; - } - } - } - - // Selection objects are immutable. A new one is created every time - // the selection changes. A selection is one or more non-overlapping - // (and non-touching) ranges, sorted, and an integer that indicates - // which one is the primary selection (the one that's scrolled into - // view, that getCursor returns, etc). - var Selection = function(ranges, primIndex) { - this.ranges = ranges; - this.primIndex = primIndex; - }; - - Selection.prototype.primary = function () { return this.ranges[this.primIndex] }; - - Selection.prototype.equals = function (other) { - var this$1 = this; - - if (other == this) { return true } - if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } - for (var i = 0; i < this.ranges.length; i++) { - var here = this$1.ranges[i], there = other.ranges[i]; - if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false } - } - return true - }; - - Selection.prototype.deepCopy = function () { - var this$1 = this; - - var out = []; - for (var i = 0; i < this.ranges.length; i++) - { out[i] = new Range(copyPos(this$1.ranges[i].anchor), copyPos(this$1.ranges[i].head)); } - return new Selection(out, this.primIndex) - }; - - Selection.prototype.somethingSelected = function () { - var this$1 = this; - - for (var i = 0; i < this.ranges.length; i++) - { if (!this$1.ranges[i].empty()) { return true } } - return false - }; - - Selection.prototype.contains = function (pos, end) { - var this$1 = this; - - if (!end) { end = pos; } - for (var i = 0; i < this.ranges.length; i++) { - var range = this$1.ranges[i]; - if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) - { return i } - } - return -1 - }; - - var Range = function(anchor, head) { - this.anchor = anchor; this.head = head; - }; - - Range.prototype.from = function () { return minPos(this.anchor, this.head) }; - Range.prototype.to = function () { return maxPos(this.anchor, this.head) }; - Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }; - - // Take an unsorted, potentially overlapping set of ranges, and - // build a selection out of it. 'Consumes' ranges array (modifying - // it). - function normalizeSelection(cm, ranges, primIndex) { - var mayTouch = cm && cm.options.selectionsMayTouch; - var prim = ranges[primIndex]; - ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }); - primIndex = indexOf(ranges, prim); - for (var i = 1; i < ranges.length; i++) { - var cur = ranges[i], prev = ranges[i - 1]; - var diff = cmp(prev.to(), cur.from()); - if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { - var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); - var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; - if (i <= primIndex) { --primIndex; } - ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); - } - } - return new Selection(ranges, primIndex) - } - - function simpleSelection(anchor, head) { - return new Selection([new Range(anchor, head || anchor)], 0) - } - - // Compute the position of the end of a change (its 'to' property - // refers to the pre-change end). - function changeEnd(change) { - if (!change.text) { return change.to } - return Pos(change.from.line + change.text.length - 1, - lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) - } - - // Adjust a position to refer to the post-change position of the - // same text, or the end of the change if the change covers it. - function adjustForChange(pos, change) { - if (cmp(pos, change.from) < 0) { return pos } - if (cmp(pos, change.to) <= 0) { return changeEnd(change) } - - var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; - if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; } - return Pos(line, ch) - } - - function computeSelAfterChange(doc, change) { - var out = []; - for (var i = 0; i < doc.sel.ranges.length; i++) { - var range = doc.sel.ranges[i]; - out.push(new Range(adjustForChange(range.anchor, change), - adjustForChange(range.head, change))); - } - return normalizeSelection(doc.cm, out, doc.sel.primIndex) - } - - function offsetPos(pos, old, nw) { - if (pos.line == old.line) - { return Pos(nw.line, pos.ch - old.ch + nw.ch) } - else - { return Pos(nw.line + (pos.line - old.line), pos.ch) } - } - - // Used by replaceSelections to allow moving the selection to the - // start or around the replaced test. Hint may be "start" or "around". - function computeReplacedSel(doc, changes, hint) { - var out = []; - var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; - for (var i = 0; i < changes.length; i++) { - var change = changes[i]; - var from = offsetPos(change.from, oldPrev, newPrev); - var to = offsetPos(changeEnd(change), oldPrev, newPrev); - oldPrev = change.to; - newPrev = to; - if (hint == "around") { - var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; - out[i] = new Range(inv ? to : from, inv ? from : to); - } else { - out[i] = new Range(from, from); - } - } - return new Selection(out, doc.sel.primIndex) - } - - // Used to get the editor into a consistent state again when options change. - - function loadMode(cm) { - cm.doc.mode = getMode(cm.options, cm.doc.modeOption); - resetModeState(cm); - } - - function resetModeState(cm) { - cm.doc.iter(function (line) { - if (line.stateAfter) { line.stateAfter = null; } - if (line.styles) { line.styles = null; } - }); - cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; - startWorker(cm, 100); - cm.state.modeGen++; - if (cm.curOp) { regChange(cm); } - } - - // DOCUMENT DATA STRUCTURE - - // By default, updates that start and end at the beginning of a line - // are treated specially, in order to make the association of line - // widgets and marker elements with the text behave more intuitive. - function isWholeLineUpdate(doc, change) { - return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && - (!doc.cm || doc.cm.options.wholeLineUpdateBefore) - } - - // Perform a change on the document data structure. - function updateDoc(doc, change, markedSpans, estimateHeight$$1) { - function spansFor(n) {return markedSpans ? markedSpans[n] : null} - function update(line, text, spans) { - updateLine(line, text, spans, estimateHeight$$1); - signalLater(line, "change", line, change); - } - function linesFor(start, end) { - var result = []; - for (var i = start; i < end; ++i) - { result.push(new Line(text[i], spansFor(i), estimateHeight$$1)); } - return result - } - - var from = change.from, to = change.to, text = change.text; - var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); - var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; - - // Adjust the line structure - if (change.full) { - doc.insert(0, linesFor(0, text.length)); - doc.remove(text.length, doc.size - text.length); - } else if (isWholeLineUpdate(doc, change)) { - // This is a whole-line replace. Treated specially to make - // sure line objects move the way they are supposed to. - var added = linesFor(0, text.length - 1); - update(lastLine, lastLine.text, lastSpans); - if (nlines) { doc.remove(from.line, nlines); } - if (added.length) { doc.insert(from.line, added); } - } else if (firstLine == lastLine) { - if (text.length == 1) { - update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); - } else { - var added$1 = linesFor(1, text.length - 1); - added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight$$1)); - update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); - doc.insert(from.line + 1, added$1); - } - } else if (text.length == 1) { - update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); - doc.remove(from.line + 1, nlines); - } else { - update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); - update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); - var added$2 = linesFor(1, text.length - 1); - if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); } - doc.insert(from.line + 1, added$2); - } - - signalLater(doc, "change", doc, change); - } - - // Call f for all linked documents. - function linkedDocs(doc, f, sharedHistOnly) { - function propagate(doc, skip, sharedHist) { - if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { - var rel = doc.linked[i]; - if (rel.doc == skip) { continue } - var shared = sharedHist && rel.sharedHist; - if (sharedHistOnly && !shared) { continue } - f(rel.doc, shared); - propagate(rel.doc, doc, shared); - } } - } - propagate(doc, null, true); - } - - // Attach a document to an editor. - function attachDoc(cm, doc) { - if (doc.cm) { throw new Error("This document is already in use.") } - cm.doc = doc; - doc.cm = cm; - estimateLineHeights(cm); - loadMode(cm); - setDirectionClass(cm); - if (!cm.options.lineWrapping) { findMaxLine(cm); } - cm.options.mode = doc.modeOption; - regChange(cm); - } - - function setDirectionClass(cm) { - (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); - } - - function directionChanged(cm) { - runInOp(cm, function () { - setDirectionClass(cm); - regChange(cm); - }); - } - - function History(startGen) { - // Arrays of change events and selections. Doing something adds an - // event to done and clears undo. Undoing moves events from done - // to undone, redoing moves them in the other direction. - this.done = []; this.undone = []; - this.undoDepth = Infinity; - // Used to track when changes can be merged into a single undo - // event - this.lastModTime = this.lastSelTime = 0; - this.lastOp = this.lastSelOp = null; - this.lastOrigin = this.lastSelOrigin = null; - // Used by the isClean() method - this.generation = this.maxGeneration = startGen || 1; - } - - // Create a history change event from an updateDoc-style change - // object. - function historyChangeFromChange(doc, change) { - var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; - attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); - linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true); - return histChange - } - - // Pop all selection events off the end of a history array. Stop at - // a change event. - function clearSelectionEvents(array) { - while (array.length) { - var last = lst(array); - if (last.ranges) { array.pop(); } - else { break } - } - } - - // Find the top change event in the history. Pop off selection - // events that are in the way. - function lastChangeEvent(hist, force) { - if (force) { - clearSelectionEvents(hist.done); - return lst(hist.done) - } else if (hist.done.length && !lst(hist.done).ranges) { - return lst(hist.done) - } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { - hist.done.pop(); - return lst(hist.done) - } - } - - // Register a change in the history. Merges changes that are within - // a single operation, or are close together with an origin that - // allows merging (starting with "+") into a single event. - function addChangeToHistory(doc, change, selAfter, opId) { - var hist = doc.history; - hist.undone.length = 0; - var time = +new Date, cur; - var last; - - if ((hist.lastOp == opId || - hist.lastOrigin == change.origin && change.origin && - ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) || - change.origin.charAt(0) == "*")) && - (cur = lastChangeEvent(hist, hist.lastOp == opId))) { - // Merge this change into the last event - last = lst(cur.changes); - if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { - // Optimized case for simple insertion -- don't want to add - // new changesets for every character typed - last.to = changeEnd(change); - } else { - // Add new sub-event - cur.changes.push(historyChangeFromChange(doc, change)); - } - } else { - // Can not be merged, start a new event. - var before = lst(hist.done); - if (!before || !before.ranges) - { pushSelectionToHistory(doc.sel, hist.done); } - cur = {changes: [historyChangeFromChange(doc, change)], - generation: hist.generation}; - hist.done.push(cur); - while (hist.done.length > hist.undoDepth) { - hist.done.shift(); - if (!hist.done[0].ranges) { hist.done.shift(); } - } - } - hist.done.push(selAfter); - hist.generation = ++hist.maxGeneration; - hist.lastModTime = hist.lastSelTime = time; - hist.lastOp = hist.lastSelOp = opId; - hist.lastOrigin = hist.lastSelOrigin = change.origin; - - if (!last) { signal(doc, "historyAdded"); } - } - - function selectionEventCanBeMerged(doc, origin, prev, sel) { - var ch = origin.charAt(0); - return ch == "*" || - ch == "+" && - prev.ranges.length == sel.ranges.length && - prev.somethingSelected() == sel.somethingSelected() && - new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) - } - - // Called whenever the selection changes, sets the new selection as - // the pending selection in the history, and pushes the old pending - // selection into the 'done' array when it was significantly - // different (in number of selected ranges, emptiness, or time). - function addSelectionToHistory(doc, sel, opId, options) { - var hist = doc.history, origin = options && options.origin; - - // A new event is started when the previous origin does not match - // the current, or the origins don't allow matching. Origins - // starting with * are always merged, those starting with + are - // merged when similar and close together in time. - if (opId == hist.lastSelOp || - (origin && hist.lastSelOrigin == origin && - (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || - selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) - { hist.done[hist.done.length - 1] = sel; } - else - { pushSelectionToHistory(sel, hist.done); } - - hist.lastSelTime = +new Date; - hist.lastSelOrigin = origin; - hist.lastSelOp = opId; - if (options && options.clearRedo !== false) - { clearSelectionEvents(hist.undone); } - } - - function pushSelectionToHistory(sel, dest) { - var top = lst(dest); - if (!(top && top.ranges && top.equals(sel))) - { dest.push(sel); } - } - - // Used to store marked span information in the history. - function attachLocalSpans(doc, change, from, to) { - var existing = change["spans_" + doc.id], n = 0; - doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { - if (line.markedSpans) - { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; } - ++n; - }); - } - - // When un/re-doing restores text containing marked spans, those - // that have been explicitly cleared should not be restored. - function removeClearedSpans(spans) { - if (!spans) { return null } - var out; - for (var i = 0; i < spans.length; ++i) { - if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } } - else if (out) { out.push(spans[i]); } - } - return !out ? spans : out.length ? out : null - } - - // Retrieve and filter the old marked spans stored in a change event. - function getOldSpans(doc, change) { - var found = change["spans_" + doc.id]; - if (!found) { return null } - var nw = []; - for (var i = 0; i < change.text.length; ++i) - { nw.push(removeClearedSpans(found[i])); } - return nw - } - - // Used for un/re-doing changes from the history. Combines the - // result of computing the existing spans with the set of spans that - // existed in the history (so that deleting around a span and then - // undoing brings back the span). - function mergeOldSpans(doc, change) { - var old = getOldSpans(doc, change); - var stretched = stretchSpansOverChange(doc, change); - if (!old) { return stretched } - if (!stretched) { return old } - - for (var i = 0; i < old.length; ++i) { - var oldCur = old[i], stretchCur = stretched[i]; - if (oldCur && stretchCur) { - spans: for (var j = 0; j < stretchCur.length; ++j) { - var span = stretchCur[j]; - for (var k = 0; k < oldCur.length; ++k) - { if (oldCur[k].marker == span.marker) { continue spans } } - oldCur.push(span); - } - } else if (stretchCur) { - old[i] = stretchCur; - } - } - return old - } - - // Used both to provide a JSON-safe object in .getHistory, and, when - // detaching a document, to split the history in two - function copyHistoryArray(events, newGroup, instantiateSel) { - var copy = []; - for (var i = 0; i < events.length; ++i) { - var event = events[i]; - if (event.ranges) { - copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); - continue - } - var changes = event.changes, newChanges = []; - copy.push({changes: newChanges}); - for (var j = 0; j < changes.length; ++j) { - var change = changes[j], m = (void 0); - newChanges.push({from: change.from, to: change.to, text: change.text}); - if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { - if (indexOf(newGroup, Number(m[1])) > -1) { - lst(newChanges)[prop] = change[prop]; - delete change[prop]; - } - } } } - } - } - return copy - } - - // The 'scroll' parameter given to many of these indicated whether - // the new cursor position should be scrolled into view after - // modifying the selection. - - // If shift is held or the extend flag is set, extends a range to - // include a given position (and optionally a second position). - // Otherwise, simply returns the range between the given positions. - // Used for cursor motion and such. - function extendRange(range, head, other, extend) { - if (extend) { - var anchor = range.anchor; - if (other) { - var posBefore = cmp(head, anchor) < 0; - if (posBefore != (cmp(other, anchor) < 0)) { - anchor = head; - head = other; - } else if (posBefore != (cmp(head, other) < 0)) { - head = other; - } - } - return new Range(anchor, head) - } else { - return new Range(other || head, head) - } - } - - // Extend the primary selection range, discard the rest. - function extendSelection(doc, head, other, options, extend) { - if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); } - setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); - } - - // Extend all selections (pos is an array of selections with length - // equal the number of selections) - function extendSelections(doc, heads, options) { - var out = []; - var extend = doc.cm && (doc.cm.display.shift || doc.extend); - for (var i = 0; i < doc.sel.ranges.length; i++) - { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); } - var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); - setSelection(doc, newSel, options); - } - - // Updates a single range in the selection. - function replaceOneSelection(doc, i, range, options) { - var ranges = doc.sel.ranges.slice(0); - ranges[i] = range; - setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); - } - - // Reset the selection to a single range. - function setSimpleSelection(doc, anchor, head, options) { - setSelection(doc, simpleSelection(anchor, head), options); - } - - // Give beforeSelectionChange handlers a change to influence a - // selection update. - function filterSelectionChange(doc, sel, options) { - var obj = { - ranges: sel.ranges, - update: function(ranges) { - var this$1 = this; - - this.ranges = []; - for (var i = 0; i < ranges.length; i++) - { this$1.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), - clipPos(doc, ranges[i].head)); } - }, - origin: options && options.origin - }; - signal(doc, "beforeSelectionChange", doc, obj); - if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); } - if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) } - else { return sel } - } - - function setSelectionReplaceHistory(doc, sel, options) { - var done = doc.history.done, last = lst(done); - if (last && last.ranges) { - done[done.length - 1] = sel; - setSelectionNoUndo(doc, sel, options); - } else { - setSelection(doc, sel, options); - } - } - - // Set a new selection. - function setSelection(doc, sel, options) { - setSelectionNoUndo(doc, sel, options); - addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); - } - - function setSelectionNoUndo(doc, sel, options) { - if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) - { sel = filterSelectionChange(doc, sel, options); } - - var bias = options && options.bias || - (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); - setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); - - if (!(options && options.scroll === false) && doc.cm) - { ensureCursorVisible(doc.cm); } - } - - function setSelectionInner(doc, sel) { - if (sel.equals(doc.sel)) { return } - - doc.sel = sel; - - if (doc.cm) { - doc.cm.curOp.updateInput = 1; - doc.cm.curOp.selectionChanged = true; - signalCursorActivity(doc.cm); - } - signalLater(doc, "cursorActivity", doc); - } - - // Verify that the selection does not partially select any atomic - // marked ranges. - function reCheckSelection(doc) { - setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); - } - - // Return a selection that does not partially select any atomic - // ranges. - function skipAtomicInSelection(doc, sel, bias, mayClear) { - var out; - for (var i = 0; i < sel.ranges.length; i++) { - var range = sel.ranges[i]; - var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; - var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); - var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear); - if (out || newAnchor != range.anchor || newHead != range.head) { - if (!out) { out = sel.ranges.slice(0, i); } - out[i] = new Range(newAnchor, newHead); - } - } - return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel - } - - function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { - var line = getLine(doc, pos.line); - if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { - var sp = line.markedSpans[i], m = sp.marker; - - // Determine if we should prevent the cursor being placed to the left/right of an atomic marker - // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it - // is with selectLeft/Right - var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft; - var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight; - - if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && - (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { - if (mayClear) { - signal(m, "beforeCursorEnter"); - if (m.explicitlyCleared) { - if (!line.markedSpans) { break } - else {--i; continue} - } - } - if (!m.atomic) { continue } - - if (oldPos) { - var near = m.find(dir < 0 ? 1 : -1), diff = (void 0); - if (dir < 0 ? preventCursorRight : preventCursorLeft) - { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); } - if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) - { return skipAtomicInner(doc, near, pos, dir, mayClear) } - } - - var far = m.find(dir < 0 ? -1 : 1); - if (dir < 0 ? preventCursorLeft : preventCursorRight) - { far = movePos(doc, far, dir, far.line == pos.line ? line : null); } - return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null - } - } } - return pos - } - - // Ensure a given position is not inside an atomic range. - function skipAtomic(doc, pos, oldPos, bias, mayClear) { - var dir = bias || 1; - var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || - (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || - skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || - (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); - if (!found) { - doc.cantEdit = true; - return Pos(doc.first, 0) - } - return found - } - - function movePos(doc, pos, dir, line) { - if (dir < 0 && pos.ch == 0) { - if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } - else { return null } - } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { - if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } - else { return null } - } else { - return new Pos(pos.line, pos.ch + dir) - } - } - - function selectAll(cm) { - cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); - } - - // UPDATING - - // Allow "beforeChange" event handlers to influence a change - function filterChange(doc, change, update) { - var obj = { - canceled: false, - from: change.from, - to: change.to, - text: change.text, - origin: change.origin, - cancel: function () { return obj.canceled = true; } - }; - if (update) { obj.update = function (from, to, text, origin) { - if (from) { obj.from = clipPos(doc, from); } - if (to) { obj.to = clipPos(doc, to); } - if (text) { obj.text = text; } - if (origin !== undefined) { obj.origin = origin; } - }; } - signal(doc, "beforeChange", doc, obj); - if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); } - - if (obj.canceled) { - if (doc.cm) { doc.cm.curOp.updateInput = 2; } - return null - } - return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} - } - - // Apply a change to a document, and add it to the document's - // history, and propagating it to all linked documents. - function makeChange(doc, change, ignoreReadOnly) { - if (doc.cm) { - if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } - if (doc.cm.state.suppressEdits) { return } - } - - if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { - change = filterChange(doc, change, true); - if (!change) { return } - } - - // Possibly split or suppress the update based on the presence - // of read-only spans in its range. - var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); - if (split) { - for (var i = split.length - 1; i >= 0; --i) - { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); } - } else { - makeChangeInner(doc, change); - } - } - - function makeChangeInner(doc, change) { - if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } - var selAfter = computeSelAfterChange(doc, change); - addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); - - makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); - var rebased = []; - - linkedDocs(doc, function (doc, sharedHist) { - if (!sharedHist && indexOf(rebased, doc.history) == -1) { - rebaseHist(doc.history, change); - rebased.push(doc.history); - } - makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); - }); - } - - // Revert a change stored in a document's history. - function makeChangeFromHistory(doc, type, allowSelectionOnly) { - var suppress = doc.cm && doc.cm.state.suppressEdits; - if (suppress && !allowSelectionOnly) { return } - - var hist = doc.history, event, selAfter = doc.sel; - var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; - - // Verify that there is a useable event (so that ctrl-z won't - // needlessly clear selection events) - var i = 0; - for (; i < source.length; i++) { - event = source[i]; - if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) - { break } - } - if (i == source.length) { return } - hist.lastOrigin = hist.lastSelOrigin = null; - - for (;;) { - event = source.pop(); - if (event.ranges) { - pushSelectionToHistory(event, dest); - if (allowSelectionOnly && !event.equals(doc.sel)) { - setSelection(doc, event, {clearRedo: false}); - return - } - selAfter = event; - } else if (suppress) { - source.push(event); - return - } else { break } - } - - // Build up a reverse change object to add to the opposite history - // stack (redo when undoing, and vice versa). - var antiChanges = []; - pushSelectionToHistory(selAfter, dest); - dest.push({changes: antiChanges, generation: hist.generation}); - hist.generation = event.generation || ++hist.maxGeneration; - - var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); - - var loop = function ( i ) { - var change = event.changes[i]; - change.origin = type; - if (filter && !filterChange(doc, change, false)) { - source.length = 0; - return {} - } - - antiChanges.push(historyChangeFromChange(doc, change)); - - var after = i ? computeSelAfterChange(doc, change) : lst(source); - makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); - if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } - var rebased = []; - - // Propagate to the linked documents - linkedDocs(doc, function (doc, sharedHist) { - if (!sharedHist && indexOf(rebased, doc.history) == -1) { - rebaseHist(doc.history, change); - rebased.push(doc.history); - } - makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); - }); - }; - - for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { - var returned = loop( i$1 ); - - if ( returned ) return returned.v; - } - } - - // Sub-views need their line numbers shifted when text is added - // above or below them in the parent document. - function shiftDoc(doc, distance) { - if (distance == 0) { return } - doc.first += distance; - doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( - Pos(range.anchor.line + distance, range.anchor.ch), - Pos(range.head.line + distance, range.head.ch) - ); }), doc.sel.primIndex); - if (doc.cm) { - regChange(doc.cm, doc.first, doc.first - distance, distance); - for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) - { regLineChange(doc.cm, l, "gutter"); } - } - } - - // More lower-level change function, handling only a single document - // (not linked ones). - function makeChangeSingleDoc(doc, change, selAfter, spans) { - if (doc.cm && !doc.cm.curOp) - { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } - - if (change.to.line < doc.first) { - shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); - return - } - if (change.from.line > doc.lastLine()) { return } - - // Clip the change to the size of this doc - if (change.from.line < doc.first) { - var shift = change.text.length - 1 - (doc.first - change.from.line); - shiftDoc(doc, shift); - change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), - text: [lst(change.text)], origin: change.origin}; - } - var last = doc.lastLine(); - if (change.to.line > last) { - change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), - text: [change.text[0]], origin: change.origin}; - } - - change.removed = getBetween(doc, change.from, change.to); - - if (!selAfter) { selAfter = computeSelAfterChange(doc, change); } - if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); } - else { updateDoc(doc, change, spans); } - setSelectionNoUndo(doc, selAfter, sel_dontScroll); - - if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) - { doc.cantEdit = false; } - } - - // Handle the interaction of a change to a document with the editor - // that this document is part of. - function makeChangeSingleDocInEditor(cm, change, spans) { - var doc = cm.doc, display = cm.display, from = change.from, to = change.to; - - var recomputeMaxLength = false, checkWidthStart = from.line; - if (!cm.options.lineWrapping) { - checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); - doc.iter(checkWidthStart, to.line + 1, function (line) { - if (line == display.maxLine) { - recomputeMaxLength = true; - return true - } - }); - } - - if (doc.sel.contains(change.from, change.to) > -1) - { signalCursorActivity(cm); } - - updateDoc(doc, change, spans, estimateHeight(cm)); - - if (!cm.options.lineWrapping) { - doc.iter(checkWidthStart, from.line + change.text.length, function (line) { - var len = lineLength(line); - if (len > display.maxLineLength) { - display.maxLine = line; - display.maxLineLength = len; - display.maxLineChanged = true; - recomputeMaxLength = false; - } - }); - if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; } - } - - retreatFrontier(doc, from.line); - startWorker(cm, 400); - - var lendiff = change.text.length - (to.line - from.line) - 1; - // Remember that these lines changed, for updating the display - if (change.full) - { regChange(cm); } - else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) - { regLineChange(cm, from.line, "text"); } - else - { regChange(cm, from.line, to.line + 1, lendiff); } - - var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); - if (changeHandler || changesHandler) { - var obj = { - from: from, to: to, - text: change.text, - removed: change.removed, - origin: change.origin - }; - if (changeHandler) { signalLater(cm, "change", cm, obj); } - if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } - } - cm.display.selForContextMenu = null; - } - - function replaceRange(doc, code, from, to, origin) { - var assign; - - if (!to) { to = from; } - if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); } - if (typeof code == "string") { code = doc.splitLines(code); } - makeChange(doc, {from: from, to: to, text: code, origin: origin}); - } - - // Rebasing/resetting history to deal with externally-sourced changes - - function rebaseHistSelSingle(pos, from, to, diff) { - if (to < pos.line) { - pos.line += diff; - } else if (from < pos.line) { - pos.line = from; - pos.ch = 0; - } - } - - // Tries to rebase an array of history events given a change in the - // document. If the change touches the same lines as the event, the - // event, and everything 'behind' it, is discarded. If the change is - // before the event, the event's positions are updated. Uses a - // copy-on-write scheme for the positions, to avoid having to - // reallocate them all on every rebase, but also avoid problems with - // shared position objects being unsafely updated. - function rebaseHistArray(array, from, to, diff) { - for (var i = 0; i < array.length; ++i) { - var sub = array[i], ok = true; - if (sub.ranges) { - if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } - for (var j = 0; j < sub.ranges.length; j++) { - rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); - rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); - } - continue - } - for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { - var cur = sub.changes[j$1]; - if (to < cur.from.line) { - cur.from = Pos(cur.from.line + diff, cur.from.ch); - cur.to = Pos(cur.to.line + diff, cur.to.ch); - } else if (from <= cur.to.line) { - ok = false; - break - } - } - if (!ok) { - array.splice(0, i + 1); - i = 0; - } - } - } - - function rebaseHist(hist, change) { - var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; - rebaseHistArray(hist.done, from, to, diff); - rebaseHistArray(hist.undone, from, to, diff); - } - - // Utility for applying a change to a line by handle or number, - // returning the number and optionally registering the line as - // changed. - function changeLine(doc, handle, changeType, op) { - var no = handle, line = handle; - if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); } - else { no = lineNo(handle); } - if (no == null) { return null } - if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); } - return line - } - - // The document is represented as a BTree consisting of leaves, with - // chunk of lines in them, and branches, with up to ten leaves or - // other branch nodes below them. The top node is always a branch - // node, and is the document object itself (meaning it has - // additional methods and properties). - // - // All nodes have parent links. The tree is used both to go from - // line numbers to line objects, and to go from objects to numbers. - // It also indexes by height, and is used to convert between height - // and line object, and to find the total height of the document. - // - // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html - - function LeafChunk(lines) { - var this$1 = this; - - this.lines = lines; - this.parent = null; - var height = 0; - for (var i = 0; i < lines.length; ++i) { - lines[i].parent = this$1; - height += lines[i].height; - } - this.height = height; - } - - LeafChunk.prototype = { - chunkSize: function() { return this.lines.length }, - - // Remove the n lines at offset 'at'. - removeInner: function(at, n) { - var this$1 = this; - - for (var i = at, e = at + n; i < e; ++i) { - var line = this$1.lines[i]; - this$1.height -= line.height; - cleanUpLine(line); - signalLater(line, "delete"); - } - this.lines.splice(at, n); - }, - - // Helper used to collapse a small branch into a single leaf. - collapse: function(lines) { - lines.push.apply(lines, this.lines); - }, - - // Insert the given array of lines at offset 'at', count them as - // having the given height. - insertInner: function(at, lines, height) { - var this$1 = this; - - this.height += height; - this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); - for (var i = 0; i < lines.length; ++i) { lines[i].parent = this$1; } - }, - - // Used to iterate over a part of the tree. - iterN: function(at, n, op) { - var this$1 = this; - - for (var e = at + n; at < e; ++at) - { if (op(this$1.lines[at])) { return true } } - } - }; - - function BranchChunk(children) { - var this$1 = this; - - this.children = children; - var size = 0, height = 0; - for (var i = 0; i < children.length; ++i) { - var ch = children[i]; - size += ch.chunkSize(); height += ch.height; - ch.parent = this$1; - } - this.size = size; - this.height = height; - this.parent = null; - } - - BranchChunk.prototype = { - chunkSize: function() { return this.size }, - - removeInner: function(at, n) { - var this$1 = this; - - this.size -= n; - for (var i = 0; i < this.children.length; ++i) { - var child = this$1.children[i], sz = child.chunkSize(); - if (at < sz) { - var rm = Math.min(n, sz - at), oldHeight = child.height; - child.removeInner(at, rm); - this$1.height -= oldHeight - child.height; - if (sz == rm) { this$1.children.splice(i--, 1); child.parent = null; } - if ((n -= rm) == 0) { break } - at = 0; - } else { at -= sz; } - } - // If the result is smaller than 25 lines, ensure that it is a - // single leaf node. - if (this.size - n < 25 && - (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { - var lines = []; - this.collapse(lines); - this.children = [new LeafChunk(lines)]; - this.children[0].parent = this; - } - }, - - collapse: function(lines) { - var this$1 = this; - - for (var i = 0; i < this.children.length; ++i) { this$1.children[i].collapse(lines); } - }, - - insertInner: function(at, lines, height) { - var this$1 = this; - - this.size += lines.length; - this.height += height; - for (var i = 0; i < this.children.length; ++i) { - var child = this$1.children[i], sz = child.chunkSize(); - if (at <= sz) { - child.insertInner(at, lines, height); - if (child.lines && child.lines.length > 50) { - // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. - // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. - var remaining = child.lines.length % 25 + 25; - for (var pos = remaining; pos < child.lines.length;) { - var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); - child.height -= leaf.height; - this$1.children.splice(++i, 0, leaf); - leaf.parent = this$1; - } - child.lines = child.lines.slice(0, remaining); - this$1.maybeSpill(); - } - break - } - at -= sz; - } - }, - - // When a node has grown, check whether it should be split. - maybeSpill: function() { - if (this.children.length <= 10) { return } - var me = this; - do { - var spilled = me.children.splice(me.children.length - 5, 5); - var sibling = new BranchChunk(spilled); - if (!me.parent) { // Become the parent node - var copy = new BranchChunk(me.children); - copy.parent = me; - me.children = [copy, sibling]; - me = copy; - } else { - me.size -= sibling.size; - me.height -= sibling.height; - var myIndex = indexOf(me.parent.children, me); - me.parent.children.splice(myIndex + 1, 0, sibling); - } - sibling.parent = me.parent; - } while (me.children.length > 10) - me.parent.maybeSpill(); - }, - - iterN: function(at, n, op) { - var this$1 = this; - - for (var i = 0; i < this.children.length; ++i) { - var child = this$1.children[i], sz = child.chunkSize(); - if (at < sz) { - var used = Math.min(n, sz - at); - if (child.iterN(at, used, op)) { return true } - if ((n -= used) == 0) { break } - at = 0; - } else { at -= sz; } - } - } - }; - - // Line widgets are block elements displayed above or below a line. - - var LineWidget = function(doc, node, options) { - var this$1 = this; - - if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) - { this$1[opt] = options[opt]; } } } - this.doc = doc; - this.node = node; - }; - - LineWidget.prototype.clear = function () { - var this$1 = this; - - var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); - if (no == null || !ws) { return } - for (var i = 0; i < ws.length; ++i) { if (ws[i] == this$1) { ws.splice(i--, 1); } } - if (!ws.length) { line.widgets = null; } - var height = widgetHeight(this); - updateLineHeight(line, Math.max(0, line.height - height)); - if (cm) { - runInOp(cm, function () { - adjustScrollWhenAboveVisible(cm, line, -height); - regLineChange(cm, no, "widget"); - }); - signalLater(cm, "lineWidgetCleared", cm, this, no); - } - }; - - LineWidget.prototype.changed = function () { - var this$1 = this; - - var oldH = this.height, cm = this.doc.cm, line = this.line; - this.height = null; - var diff = widgetHeight(this) - oldH; - if (!diff) { return } - if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); } - if (cm) { - runInOp(cm, function () { - cm.curOp.forceUpdate = true; - adjustScrollWhenAboveVisible(cm, line, diff); - signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); - }); - } - }; - eventMixin(LineWidget); - - function adjustScrollWhenAboveVisible(cm, line, diff) { - if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) - { addToScrollTop(cm, diff); } - } - - function addLineWidget(doc, handle, node, options) { - var widget = new LineWidget(doc, node, options); - var cm = doc.cm; - if (cm && widget.noHScroll) { cm.display.alignWidgets = true; } - changeLine(doc, handle, "widget", function (line) { - var widgets = line.widgets || (line.widgets = []); - if (widget.insertAt == null) { widgets.push(widget); } - else { widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); } - widget.line = line; - if (cm && !lineIsHidden(doc, line)) { - var aboveVisible = heightAtLine(line) < doc.scrollTop; - updateLineHeight(line, line.height + widgetHeight(widget)); - if (aboveVisible) { addToScrollTop(cm, widget.height); } - cm.curOp.forceUpdate = true; - } - return true - }); - if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); } - return widget - } - - // TEXTMARKERS - - // Created with markText and setBookmark methods. A TextMarker is a - // handle that can be used to clear or find a marked position in the - // document. Line objects hold arrays (markedSpans) containing - // {from, to, marker} object pointing to such marker objects, and - // indicating that such a marker is present on that line. Multiple - // lines may point to the same marker when it spans across lines. - // The spans will have null for their from/to properties when the - // marker continues beyond the start/end of the line. Markers have - // links back to the lines they currently touch. - - // Collapsed markers have unique ids, in order to be able to order - // them, which is needed for uniquely determining an outer marker - // when they overlap (they may nest, but not partially overlap). - var nextMarkerId = 0; - - var TextMarker = function(doc, type) { - this.lines = []; - this.type = type; - this.doc = doc; - this.id = ++nextMarkerId; - }; - - // Clear the marker. - TextMarker.prototype.clear = function () { - var this$1 = this; - - if (this.explicitlyCleared) { return } - var cm = this.doc.cm, withOp = cm && !cm.curOp; - if (withOp) { startOperation(cm); } - if (hasHandler(this, "clear")) { - var found = this.find(); - if (found) { signalLater(this, "clear", found.from, found.to); } - } - var min = null, max = null; - for (var i = 0; i < this.lines.length; ++i) { - var line = this$1.lines[i]; - var span = getMarkedSpanFor(line.markedSpans, this$1); - if (cm && !this$1.collapsed) { regLineChange(cm, lineNo(line), "text"); } - else if (cm) { - if (span.to != null) { max = lineNo(line); } - if (span.from != null) { min = lineNo(line); } - } - line.markedSpans = removeMarkedSpan(line.markedSpans, span); - if (span.from == null && this$1.collapsed && !lineIsHidden(this$1.doc, line) && cm) - { updateLineHeight(line, textHeight(cm.display)); } - } - if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { - var visual = visualLine(this$1.lines[i$1]), len = lineLength(visual); - if (len > cm.display.maxLineLength) { - cm.display.maxLine = visual; - cm.display.maxLineLength = len; - cm.display.maxLineChanged = true; - } - } } - - if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); } - this.lines.length = 0; - this.explicitlyCleared = true; - if (this.atomic && this.doc.cantEdit) { - this.doc.cantEdit = false; - if (cm) { reCheckSelection(cm.doc); } - } - if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); } - if (withOp) { endOperation(cm); } - if (this.parent) { this.parent.clear(); } - }; - - // Find the position of the marker in the document. Returns a {from, - // to} object by default. Side can be passed to get a specific side - // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the - // Pos objects returned contain a line object, rather than a line - // number (used to prevent looking up the same line twice). - TextMarker.prototype.find = function (side, lineObj) { - var this$1 = this; - - if (side == null && this.type == "bookmark") { side = 1; } - var from, to; - for (var i = 0; i < this.lines.length; ++i) { - var line = this$1.lines[i]; - var span = getMarkedSpanFor(line.markedSpans, this$1); - if (span.from != null) { - from = Pos(lineObj ? line : lineNo(line), span.from); - if (side == -1) { return from } - } - if (span.to != null) { - to = Pos(lineObj ? line : lineNo(line), span.to); - if (side == 1) { return to } - } - } - return from && {from: from, to: to} - }; - - // Signals that the marker's widget changed, and surrounding layout - // should be recomputed. - TextMarker.prototype.changed = function () { - var this$1 = this; - - var pos = this.find(-1, true), widget = this, cm = this.doc.cm; - if (!pos || !cm) { return } - runInOp(cm, function () { - var line = pos.line, lineN = lineNo(pos.line); - var view = findViewForLine(cm, lineN); - if (view) { - clearLineMeasurementCacheFor(view); - cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; - } - cm.curOp.updateMaxLine = true; - if (!lineIsHidden(widget.doc, line) && widget.height != null) { - var oldHeight = widget.height; - widget.height = null; - var dHeight = widgetHeight(widget) - oldHeight; - if (dHeight) - { updateLineHeight(line, line.height + dHeight); } - } - signalLater(cm, "markerChanged", cm, this$1); - }); - }; - - TextMarker.prototype.attachLine = function (line) { - if (!this.lines.length && this.doc.cm) { - var op = this.doc.cm.curOp; - if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) - { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } - } - this.lines.push(line); - }; - - TextMarker.prototype.detachLine = function (line) { - this.lines.splice(indexOf(this.lines, line), 1); - if (!this.lines.length && this.doc.cm) { - var op = this.doc.cm.curOp - ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); - } - }; - eventMixin(TextMarker); - - // Create a marker, wire it up to the right lines, and - function markText(doc, from, to, options, type) { - // Shared markers (across linked documents) are handled separately - // (markTextShared will call out to this again, once per - // document). - if (options && options.shared) { return markTextShared(doc, from, to, options, type) } - // Ensure we are in an operation. - if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } - - var marker = new TextMarker(doc, type), diff = cmp(from, to); - if (options) { copyObj(options, marker, false); } - // Don't connect empty markers unless clearWhenEmpty is false - if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) - { return marker } - if (marker.replacedWith) { - // Showing up as a widget implies collapsed (widget replaces text) - marker.collapsed = true; - marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); - if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); } - if (options.insertLeft) { marker.widgetNode.insertLeft = true; } - } - if (marker.collapsed) { - if (conflictingCollapsedRange(doc, from.line, from, to, marker) || - from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) - { throw new Error("Inserting collapsed marker partially overlapping an existing one") } - seeCollapsedSpans(); - } - - if (marker.addToHistory) - { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); } - - var curLine = from.line, cm = doc.cm, updateMaxLine; - doc.iter(curLine, to.line + 1, function (line) { - if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) - { updateMaxLine = true; } - if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); } - addMarkedSpan(line, new MarkedSpan(marker, - curLine == from.line ? from.ch : null, - curLine == to.line ? to.ch : null)); - ++curLine; - }); - // lineIsHidden depends on the presence of the spans, so needs a second pass - if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { - if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); } - }); } - - if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); } - - if (marker.readOnly) { - seeReadOnlySpans(); - if (doc.history.done.length || doc.history.undone.length) - { doc.clearHistory(); } - } - if (marker.collapsed) { - marker.id = ++nextMarkerId; - marker.atomic = true; - } - if (cm) { - // Sync editor state - if (updateMaxLine) { cm.curOp.updateMaxLine = true; } - if (marker.collapsed) - { regChange(cm, from.line, to.line + 1); } - else if (marker.className || marker.startStyle || marker.endStyle || marker.css || - marker.attributes || marker.title) - { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } } - if (marker.atomic) { reCheckSelection(cm.doc); } - signalLater(cm, "markerAdded", cm, marker); - } - return marker - } - - // SHARED TEXTMARKERS - - // A shared marker spans multiple linked documents. It is - // implemented as a meta-marker-object controlling multiple normal - // markers. - var SharedTextMarker = function(markers, primary) { - var this$1 = this; - - this.markers = markers; - this.primary = primary; - for (var i = 0; i < markers.length; ++i) - { markers[i].parent = this$1; } - }; - - SharedTextMarker.prototype.clear = function () { - var this$1 = this; - - if (this.explicitlyCleared) { return } - this.explicitlyCleared = true; - for (var i = 0; i < this.markers.length; ++i) - { this$1.markers[i].clear(); } - signalLater(this, "clear"); - }; - - SharedTextMarker.prototype.find = function (side, lineObj) { - return this.primary.find(side, lineObj) - }; - eventMixin(SharedTextMarker); - - function markTextShared(doc, from, to, options, type) { - options = copyObj(options); - options.shared = false; - var markers = [markText(doc, from, to, options, type)], primary = markers[0]; - var widget = options.widgetNode; - linkedDocs(doc, function (doc) { - if (widget) { options.widgetNode = widget.cloneNode(true); } - markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); - for (var i = 0; i < doc.linked.length; ++i) - { if (doc.linked[i].isParent) { return } } - primary = lst(markers); - }); - return new SharedTextMarker(markers, primary) - } - - function findSharedMarkers(doc) { - return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) - } - - function copySharedMarkers(doc, markers) { - for (var i = 0; i < markers.length; i++) { - var marker = markers[i], pos = marker.find(); - var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); - if (cmp(mFrom, mTo)) { - var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); - marker.markers.push(subMark); - subMark.parent = marker; - } - } - } - - function detachSharedMarkers(markers) { - var loop = function ( i ) { - var marker = markers[i], linked = [marker.primary.doc]; - linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }); - for (var j = 0; j < marker.markers.length; j++) { - var subMarker = marker.markers[j]; - if (indexOf(linked, subMarker.doc) == -1) { - subMarker.parent = null; - marker.markers.splice(j--, 1); - } - } - }; - - for (var i = 0; i < markers.length; i++) loop( i ); - } - - var nextDocId = 0; - var Doc = function(text, mode, firstLine, lineSep, direction) { - if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) } - if (firstLine == null) { firstLine = 0; } - - BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); - this.first = firstLine; - this.scrollTop = this.scrollLeft = 0; - this.cantEdit = false; - this.cleanGeneration = 1; - this.modeFrontier = this.highlightFrontier = firstLine; - var start = Pos(firstLine, 0); - this.sel = simpleSelection(start); - this.history = new History(null); - this.id = ++nextDocId; - this.modeOption = mode; - this.lineSep = lineSep; - this.direction = (direction == "rtl") ? "rtl" : "ltr"; - this.extend = false; - - if (typeof text == "string") { text = this.splitLines(text); } - updateDoc(this, {from: start, to: start, text: text}); - setSelection(this, simpleSelection(start), sel_dontScroll); - }; - - Doc.prototype = createObj(BranchChunk.prototype, { - constructor: Doc, - // Iterate over the document. Supports two forms -- with only one - // argument, it calls that for each line in the document. With - // three, it iterates over the range given by the first two (with - // the second being non-inclusive). - iter: function(from, to, op) { - if (op) { this.iterN(from - this.first, to - from, op); } - else { this.iterN(this.first, this.first + this.size, from); } - }, - - // Non-public interface for adding and removing lines. - insert: function(at, lines) { - var height = 0; - for (var i = 0; i < lines.length; ++i) { height += lines[i].height; } - this.insertInner(at - this.first, lines, height); - }, - remove: function(at, n) { this.removeInner(at - this.first, n); }, - - // From here, the methods are part of the public interface. Most - // are also available from CodeMirror (editor) instances. - - getValue: function(lineSep) { - var lines = getLines(this, this.first, this.first + this.size); - if (lineSep === false) { return lines } - return lines.join(lineSep || this.lineSeparator()) - }, - setValue: docMethodOp(function(code) { - var top = Pos(this.first, 0), last = this.first + this.size - 1; - makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), - text: this.splitLines(code), origin: "setValue", full: true}, true); - if (this.cm) { scrollToCoords(this.cm, 0, 0); } - setSelection(this, simpleSelection(top), sel_dontScroll); - }), - replaceRange: function(code, from, to, origin) { - from = clipPos(this, from); - to = to ? clipPos(this, to) : from; - replaceRange(this, code, from, to, origin); - }, - getRange: function(from, to, lineSep) { - var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); - if (lineSep === false) { return lines } - return lines.join(lineSep || this.lineSeparator()) - }, - - getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, - - getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, - getLineNumber: function(line) {return lineNo(line)}, - - getLineHandleVisualStart: function(line) { - if (typeof line == "number") { line = getLine(this, line); } - return visualLine(line) - }, - - lineCount: function() {return this.size}, - firstLine: function() {return this.first}, - lastLine: function() {return this.first + this.size - 1}, - - clipPos: function(pos) {return clipPos(this, pos)}, - - getCursor: function(start) { - var range$$1 = this.sel.primary(), pos; - if (start == null || start == "head") { pos = range$$1.head; } - else if (start == "anchor") { pos = range$$1.anchor; } - else if (start == "end" || start == "to" || start === false) { pos = range$$1.to(); } - else { pos = range$$1.from(); } - return pos - }, - listSelections: function() { return this.sel.ranges }, - somethingSelected: function() {return this.sel.somethingSelected()}, - - setCursor: docMethodOp(function(line, ch, options) { - setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); - }), - setSelection: docMethodOp(function(anchor, head, options) { - setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); - }), - extendSelection: docMethodOp(function(head, other, options) { - extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); - }), - extendSelections: docMethodOp(function(heads, options) { - extendSelections(this, clipPosArray(this, heads), options); - }), - extendSelectionsBy: docMethodOp(function(f, options) { - var heads = map(this.sel.ranges, f); - extendSelections(this, clipPosArray(this, heads), options); - }), - setSelections: docMethodOp(function(ranges, primary, options) { - var this$1 = this; - - if (!ranges.length) { return } - var out = []; - for (var i = 0; i < ranges.length; i++) - { out[i] = new Range(clipPos(this$1, ranges[i].anchor), - clipPos(this$1, ranges[i].head)); } - if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); } - setSelection(this, normalizeSelection(this.cm, out, primary), options); - }), - addSelection: docMethodOp(function(anchor, head, options) { - var ranges = this.sel.ranges.slice(0); - ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); - setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); - }), - - getSelection: function(lineSep) { - var this$1 = this; - - var ranges = this.sel.ranges, lines; - for (var i = 0; i < ranges.length; i++) { - var sel = getBetween(this$1, ranges[i].from(), ranges[i].to()); - lines = lines ? lines.concat(sel) : sel; - } - if (lineSep === false) { return lines } - else { return lines.join(lineSep || this.lineSeparator()) } - }, - getSelections: function(lineSep) { - var this$1 = this; - - var parts = [], ranges = this.sel.ranges; - for (var i = 0; i < ranges.length; i++) { - var sel = getBetween(this$1, ranges[i].from(), ranges[i].to()); - if (lineSep !== false) { sel = sel.join(lineSep || this$1.lineSeparator()); } - parts[i] = sel; - } - return parts - }, - replaceSelection: function(code, collapse, origin) { - var dup = []; - for (var i = 0; i < this.sel.ranges.length; i++) - { dup[i] = code; } - this.replaceSelections(dup, collapse, origin || "+input"); - }, - replaceSelections: docMethodOp(function(code, collapse, origin) { - var this$1 = this; - - var changes = [], sel = this.sel; - for (var i = 0; i < sel.ranges.length; i++) { - var range$$1 = sel.ranges[i]; - changes[i] = {from: range$$1.from(), to: range$$1.to(), text: this$1.splitLines(code[i]), origin: origin}; - } - var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); - for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) - { makeChange(this$1, changes[i$1]); } - if (newSel) { setSelectionReplaceHistory(this, newSel); } - else if (this.cm) { ensureCursorVisible(this.cm); } - }), - undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), - redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), - undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), - redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), - - setExtending: function(val) {this.extend = val;}, - getExtending: function() {return this.extend}, - - historySize: function() { - var hist = this.history, done = 0, undone = 0; - for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } } - for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } } - return {undo: done, redo: undone} - }, - clearHistory: function() {this.history = new History(this.history.maxGeneration);}, - - markClean: function() { - this.cleanGeneration = this.changeGeneration(true); - }, - changeGeneration: function(forceSplit) { - if (forceSplit) - { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; } - return this.history.generation - }, - isClean: function (gen) { - return this.history.generation == (gen || this.cleanGeneration) - }, - - getHistory: function() { - return {done: copyHistoryArray(this.history.done), - undone: copyHistoryArray(this.history.undone)} - }, - setHistory: function(histData) { - var hist = this.history = new History(this.history.maxGeneration); - hist.done = copyHistoryArray(histData.done.slice(0), null, true); - hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); - }, - - setGutterMarker: docMethodOp(function(line, gutterID, value) { - return changeLine(this, line, "gutter", function (line) { - var markers = line.gutterMarkers || (line.gutterMarkers = {}); - markers[gutterID] = value; - if (!value && isEmpty(markers)) { line.gutterMarkers = null; } - return true - }) - }), - - clearGutter: docMethodOp(function(gutterID) { - var this$1 = this; - - this.iter(function (line) { - if (line.gutterMarkers && line.gutterMarkers[gutterID]) { - changeLine(this$1, line, "gutter", function () { - line.gutterMarkers[gutterID] = null; - if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; } - return true - }); - } - }); - }), - - lineInfo: function(line) { - var n; - if (typeof line == "number") { - if (!isLine(this, line)) { return null } - n = line; - line = getLine(this, line); - if (!line) { return null } - } else { - n = lineNo(line); - if (n == null) { return null } - } - return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, - textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, - widgets: line.widgets} - }, - - addLineClass: docMethodOp(function(handle, where, cls) { - return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { - var prop = where == "text" ? "textClass" - : where == "background" ? "bgClass" - : where == "gutter" ? "gutterClass" : "wrapClass"; - if (!line[prop]) { line[prop] = cls; } - else if (classTest(cls).test(line[prop])) { return false } - else { line[prop] += " " + cls; } - return true - }) - }), - removeLineClass: docMethodOp(function(handle, where, cls) { - return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { - var prop = where == "text" ? "textClass" - : where == "background" ? "bgClass" - : where == "gutter" ? "gutterClass" : "wrapClass"; - var cur = line[prop]; - if (!cur) { return false } - else if (cls == null) { line[prop] = null; } - else { - var found = cur.match(classTest(cls)); - if (!found) { return false } - var end = found.index + found[0].length; - line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; - } - return true - }) - }), - - addLineWidget: docMethodOp(function(handle, node, options) { - return addLineWidget(this, handle, node, options) - }), - removeLineWidget: function(widget) { widget.clear(); }, - - markText: function(from, to, options) { - return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") - }, - setBookmark: function(pos, options) { - var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), - insertLeft: options && options.insertLeft, - clearWhenEmpty: false, shared: options && options.shared, - handleMouseEvents: options && options.handleMouseEvents}; - pos = clipPos(this, pos); - return markText(this, pos, pos, realOpts, "bookmark") - }, - findMarksAt: function(pos) { - pos = clipPos(this, pos); - var markers = [], spans = getLine(this, pos.line).markedSpans; - if (spans) { for (var i = 0; i < spans.length; ++i) { - var span = spans[i]; - if ((span.from == null || span.from <= pos.ch) && - (span.to == null || span.to >= pos.ch)) - { markers.push(span.marker.parent || span.marker); } - } } - return markers - }, - findMarks: function(from, to, filter) { - from = clipPos(this, from); to = clipPos(this, to); - var found = [], lineNo$$1 = from.line; - this.iter(from.line, to.line + 1, function (line) { - var spans = line.markedSpans; - if (spans) { for (var i = 0; i < spans.length; i++) { - var span = spans[i]; - if (!(span.to != null && lineNo$$1 == from.line && from.ch >= span.to || - span.from == null && lineNo$$1 != from.line || - span.from != null && lineNo$$1 == to.line && span.from >= to.ch) && - (!filter || filter(span.marker))) - { found.push(span.marker.parent || span.marker); } - } } - ++lineNo$$1; - }); - return found - }, - getAllMarks: function() { - var markers = []; - this.iter(function (line) { - var sps = line.markedSpans; - if (sps) { for (var i = 0; i < sps.length; ++i) - { if (sps[i].from != null) { markers.push(sps[i].marker); } } } - }); - return markers - }, - - posFromIndex: function(off) { - var ch, lineNo$$1 = this.first, sepSize = this.lineSeparator().length; - this.iter(function (line) { - var sz = line.text.length + sepSize; - if (sz > off) { ch = off; return true } - off -= sz; - ++lineNo$$1; - }); - return clipPos(this, Pos(lineNo$$1, ch)) - }, - indexFromPos: function (coords) { - coords = clipPos(this, coords); - var index = coords.ch; - if (coords.line < this.first || coords.ch < 0) { return 0 } - var sepSize = this.lineSeparator().length; - this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value - index += line.text.length + sepSize; - }); - return index - }, - - copy: function(copyHistory) { - var doc = new Doc(getLines(this, this.first, this.first + this.size), - this.modeOption, this.first, this.lineSep, this.direction); - doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; - doc.sel = this.sel; - doc.extend = false; - if (copyHistory) { - doc.history.undoDepth = this.history.undoDepth; - doc.setHistory(this.getHistory()); - } - return doc - }, - - linkedDoc: function(options) { - if (!options) { options = {}; } - var from = this.first, to = this.first + this.size; - if (options.from != null && options.from > from) { from = options.from; } - if (options.to != null && options.to < to) { to = options.to; } - var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); - if (options.sharedHist) { copy.history = this.history - ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); - copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; - copySharedMarkers(copy, findSharedMarkers(this)); - return copy - }, - unlinkDoc: function(other) { - var this$1 = this; - - if (other instanceof CodeMirror) { other = other.doc; } - if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { - var link = this$1.linked[i]; - if (link.doc != other) { continue } - this$1.linked.splice(i, 1); - other.unlinkDoc(this$1); - detachSharedMarkers(findSharedMarkers(this$1)); - break - } } - // If the histories were shared, split them again - if (other.history == this.history) { - var splitIds = [other.id]; - linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true); - other.history = new History(null); - other.history.done = copyHistoryArray(this.history.done, splitIds); - other.history.undone = copyHistoryArray(this.history.undone, splitIds); - } - }, - iterLinkedDocs: function(f) {linkedDocs(this, f);}, - - getMode: function() {return this.mode}, - getEditor: function() {return this.cm}, - - splitLines: function(str) { - if (this.lineSep) { return str.split(this.lineSep) } - return splitLinesAuto(str) - }, - lineSeparator: function() { return this.lineSep || "\n" }, - - setDirection: docMethodOp(function (dir) { - if (dir != "rtl") { dir = "ltr"; } - if (dir == this.direction) { return } - this.direction = dir; - this.iter(function (line) { return line.order = null; }); - if (this.cm) { directionChanged(this.cm); } - }) - }); - - // Public alias. - Doc.prototype.eachLine = Doc.prototype.iter; - - // Kludge to work around strange IE behavior where it'll sometimes - // re-fire a series of drag-related events right after the drop (#1551) - var lastDrop = 0; - - function onDrop(e) { - var cm = this; - clearDragCursor(cm); - if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) - { return } - e_preventDefault(e); - if (ie) { lastDrop = +new Date; } - var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; - if (!pos || cm.isReadOnly()) { return } - // Might be a file drop, in which case we simply extract the text - // and insert it. - if (files && files.length && window.FileReader && window.File) { - var n = files.length, text = Array(n), read = 0; - var loadFile = function (file, i) { - if (cm.options.allowDropFileTypes && - indexOf(cm.options.allowDropFileTypes, file.type) == -1) - { return } - - var reader = new FileReader; - reader.onload = operation(cm, function () { - var content = reader.result; - if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { content = ""; } - text[i] = content; - if (++read == n) { - pos = clipPos(cm.doc, pos); - var change = {from: pos, to: pos, - text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())), - origin: "paste"}; - makeChange(cm.doc, change); - setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change))); - } - }); - reader.readAsText(file); - }; - for (var i = 0; i < n; ++i) { loadFile(files[i], i); } - } else { // Normal drop - // Don't do a replace if the drop happened inside of the selected text. - if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { - cm.state.draggingText(e); - // Ensure the editor is re-focused - setTimeout(function () { return cm.display.input.focus(); }, 20); - return - } - try { - var text$1 = e.dataTransfer.getData("Text"); - if (text$1) { - var selected; - if (cm.state.draggingText && !cm.state.draggingText.copy) - { selected = cm.listSelections(); } - setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); - if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) - { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } } - cm.replaceSelection(text$1, "around", "paste"); - cm.display.input.focus(); - } - } - catch(e){} - } - } - - function onDragStart(cm, e) { - if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } - if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } - - e.dataTransfer.setData("Text", cm.getSelection()); - e.dataTransfer.effectAllowed = "copyMove"; - - // Use dummy image instead of default browsers image. - // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. - if (e.dataTransfer.setDragImage && !safari) { - var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); - img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; - if (presto) { - img.width = img.height = 1; - cm.display.wrapper.appendChild(img); - // Force a relayout, or Opera won't use our image for some obscure reason - img._top = img.offsetTop; - } - e.dataTransfer.setDragImage(img, 0, 0); - if (presto) { img.parentNode.removeChild(img); } - } - } - - function onDragOver(cm, e) { - var pos = posFromMouse(cm, e); - if (!pos) { return } - var frag = document.createDocumentFragment(); - drawSelectionCursor(cm, pos, frag); - if (!cm.display.dragCursor) { - cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); - cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); - } - removeChildrenAndAdd(cm.display.dragCursor, frag); - } - - function clearDragCursor(cm) { - if (cm.display.dragCursor) { - cm.display.lineSpace.removeChild(cm.display.dragCursor); - cm.display.dragCursor = null; - } - } - - // These must be handled carefully, because naively registering a - // handler for each editor will cause the editors to never be - // garbage collected. - - function forEachCodeMirror(f) { - if (!document.getElementsByClassName) { return } - var byClass = document.getElementsByClassName("CodeMirror"), editors = []; - for (var i = 0; i < byClass.length; i++) { - var cm = byClass[i].CodeMirror; - if (cm) { editors.push(cm); } - } - if (editors.length) { editors[0].operation(function () { - for (var i = 0; i < editors.length; i++) { f(editors[i]); } - }); } - } - - var globalsRegistered = false; - function ensureGlobalHandlers() { - if (globalsRegistered) { return } - registerGlobalHandlers(); - globalsRegistered = true; - } - function registerGlobalHandlers() { - // When the window resizes, we need to refresh active editors. - var resizeTimer; - on(window, "resize", function () { - if (resizeTimer == null) { resizeTimer = setTimeout(function () { - resizeTimer = null; - forEachCodeMirror(onResize); - }, 100); } - }); - // When the window loses focus, we want to show the editor as blurred - on(window, "blur", function () { return forEachCodeMirror(onBlur); }); - } - // Called when the window resizes - function onResize(cm) { - var d = cm.display; - // Might be a text scaling operation, clear size caches. - d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; - d.scrollbarsClipped = false; - cm.setSize(); - } - - var keyNames = { - 3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", - 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", - 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", - 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", - 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock", - 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", - 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", - 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" - }; - - // Number keys - for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); } - // Alphabetic keys - for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); } - // Function keys - for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; } - - var keyMap = {}; - - keyMap.basic = { - "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", - "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", - "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", - "Tab": "defaultTab", "Shift-Tab": "indentAuto", - "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", - "Esc": "singleSelection" - }; - // Note that the save and find-related commands aren't defined by - // default. User code or addons can define them. Unknown commands - // are simply ignored. - keyMap.pcDefault = { - "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", - "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", - "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", - "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", - "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", - "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", - "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", - "fallthrough": "basic" - }; - // Very basic readline/emacs-style bindings, which are standard on Mac. - keyMap.emacsy = { - "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", - "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", - "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", - "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars", - "Ctrl-O": "openLine" - }; - keyMap.macDefault = { - "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", - "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", - "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", - "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", - "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", - "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", - "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", - "fallthrough": ["basic", "emacsy"] - }; - keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; - - // KEYMAP DISPATCH - - function normalizeKeyName(name) { - var parts = name.split(/-(?!$)/); - name = parts[parts.length - 1]; - var alt, ctrl, shift, cmd; - for (var i = 0; i < parts.length - 1; i++) { - var mod = parts[i]; - if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; } - else if (/^a(lt)?$/i.test(mod)) { alt = true; } - else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; } - else if (/^s(hift)?$/i.test(mod)) { shift = true; } - else { throw new Error("Unrecognized modifier name: " + mod) } - } - if (alt) { name = "Alt-" + name; } - if (ctrl) { name = "Ctrl-" + name; } - if (cmd) { name = "Cmd-" + name; } - if (shift) { name = "Shift-" + name; } - return name - } - - // This is a kludge to keep keymaps mostly working as raw objects - // (backwards compatibility) while at the same time support features - // like normalization and multi-stroke key bindings. It compiles a - // new normalized keymap, and then updates the old object to reflect - // this. - function normalizeKeyMap(keymap) { - var copy = {}; - for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { - var value = keymap[keyname]; - if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } - if (value == "...") { delete keymap[keyname]; continue } - - var keys = map(keyname.split(" "), normalizeKeyName); - for (var i = 0; i < keys.length; i++) { - var val = (void 0), name = (void 0); - if (i == keys.length - 1) { - name = keys.join(" "); - val = value; - } else { - name = keys.slice(0, i + 1).join(" "); - val = "..."; - } - var prev = copy[name]; - if (!prev) { copy[name] = val; } - else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } - } - delete keymap[keyname]; - } } - for (var prop in copy) { keymap[prop] = copy[prop]; } - return keymap - } - - function lookupKey(key, map$$1, handle, context) { - map$$1 = getKeyMap(map$$1); - var found = map$$1.call ? map$$1.call(key, context) : map$$1[key]; - if (found === false) { return "nothing" } - if (found === "...") { return "multi" } - if (found != null && handle(found)) { return "handled" } - - if (map$$1.fallthrough) { - if (Object.prototype.toString.call(map$$1.fallthrough) != "[object Array]") - { return lookupKey(key, map$$1.fallthrough, handle, context) } - for (var i = 0; i < map$$1.fallthrough.length; i++) { - var result = lookupKey(key, map$$1.fallthrough[i], handle, context); - if (result) { return result } - } - } - } - - // Modifier key presses don't count as 'real' key presses for the - // purpose of keymap fallthrough. - function isModifierKey(value) { - var name = typeof value == "string" ? value : keyNames[value.keyCode]; - return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" - } - - function addModifierNames(name, event, noShift) { - var base = name; - if (event.altKey && base != "Alt") { name = "Alt-" + name; } - if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; } - if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") { name = "Cmd-" + name; } - if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; } - return name - } - - // Look up the name of a key as indicated by an event object. - function keyName(event, noShift) { - if (presto && event.keyCode == 34 && event["char"]) { return false } - var name = keyNames[event.keyCode]; - if (name == null || event.altGraphKey) { return false } - // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause, - // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+) - if (event.keyCode == 3 && event.code) { name = event.code; } - return addModifierNames(name, event, noShift) - } - - function getKeyMap(val) { - return typeof val == "string" ? keyMap[val] : val - } - - // Helper for deleting text near the selection(s), used to implement - // backspace, delete, and similar functionality. - function deleteNearSelection(cm, compute) { - var ranges = cm.doc.sel.ranges, kill = []; - // Build up a set of ranges to kill first, merging overlapping - // ranges. - for (var i = 0; i < ranges.length; i++) { - var toKill = compute(ranges[i]); - while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { - var replaced = kill.pop(); - if (cmp(replaced.from, toKill.from) < 0) { - toKill.from = replaced.from; - break - } - } - kill.push(toKill); - } - // Next, remove those actual ranges. - runInOp(cm, function () { - for (var i = kill.length - 1; i >= 0; i--) - { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); } - ensureCursorVisible(cm); - }); - } - - function moveCharLogically(line, ch, dir) { - var target = skipExtendingChars(line.text, ch + dir, dir); - return target < 0 || target > line.text.length ? null : target - } - - function moveLogically(line, start, dir) { - var ch = moveCharLogically(line, start.ch, dir); - return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before") - } - - function endOfLine(visually, cm, lineObj, lineNo, dir) { - if (visually) { - var order = getOrder(lineObj, cm.doc.direction); - if (order) { - var part = dir < 0 ? lst(order) : order[0]; - var moveInStorageOrder = (dir < 0) == (part.level == 1); - var sticky = moveInStorageOrder ? "after" : "before"; - var ch; - // With a wrapped rtl chunk (possibly spanning multiple bidi parts), - // it could be that the last bidi part is not on the last visual line, - // since visual lines contain content order-consecutive chunks. - // Thus, in rtl, we are looking for the first (content-order) character - // in the rtl chunk that is on the last line (that is, the same line - // as the last (content-order) character). - if (part.level > 0 || cm.doc.direction == "rtl") { - var prep = prepareMeasureForLine(cm, lineObj); - ch = dir < 0 ? lineObj.text.length - 1 : 0; - var targetTop = measureCharPrepared(cm, prep, ch).top; - ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch); - if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); } - } else { ch = dir < 0 ? part.to : part.from; } - return new Pos(lineNo, ch, sticky) - } - } - return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after") - } - - function moveVisually(cm, line, start, dir) { - var bidi = getOrder(line, cm.doc.direction); - if (!bidi) { return moveLogically(line, start, dir) } - if (start.ch >= line.text.length) { - start.ch = line.text.length; - start.sticky = "before"; - } else if (start.ch <= 0) { - start.ch = 0; - start.sticky = "after"; - } - var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; - if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { - // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, - // nothing interesting happens. - return moveLogically(line, start, dir) - } - - var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); }; - var prep; - var getWrappedLineExtent = function (ch) { - if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} } - prep = prep || prepareMeasureForLine(cm, line); - return wrappedLineExtentChar(cm, line, prep, ch) - }; - var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); - - if (cm.doc.direction == "rtl" || part.level == 1) { - var moveInStorageOrder = (part.level == 1) == (dir < 0); - var ch = mv(start, moveInStorageOrder ? 1 : -1); - if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { - // Case 2: We move within an rtl part or in an rtl editor on the same visual line - var sticky = moveInStorageOrder ? "before" : "after"; - return new Pos(start.line, ch, sticky) - } - } - - // Case 3: Could not move within this bidi part in this visual line, so leave - // the current bidi part - - var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { - var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder - ? new Pos(start.line, mv(ch, 1), "before") - : new Pos(start.line, ch, "after"); }; - - for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { - var part = bidi[partPos]; - var moveInStorageOrder = (dir > 0) == (part.level != 1); - var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); - if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) } - ch = moveInStorageOrder ? part.from : mv(part.to, -1); - if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) } - } - }; - - // Case 3a: Look for other bidi parts on the same visual line - var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); - if (res) { return res } - - // Case 3b: Look for other bidi parts on the next visual line - var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); - if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { - res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); - if (res) { return res } - } - - // Case 4: Nowhere to move - return null - } - - // Commands are parameter-less actions that can be performed on an - // editor, mostly used for keybindings. - var commands = { - selectAll: selectAll, - singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, - killLine: function (cm) { return deleteNearSelection(cm, function (range) { - if (range.empty()) { - var len = getLine(cm.doc, range.head.line).text.length; - if (range.head.ch == len && range.head.line < cm.lastLine()) - { return {from: range.head, to: Pos(range.head.line + 1, 0)} } - else - { return {from: range.head, to: Pos(range.head.line, len)} } - } else { - return {from: range.from(), to: range.to()} - } - }); }, - deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ - from: Pos(range.from().line, 0), - to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) - }); }); }, - delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ - from: Pos(range.from().line, 0), to: range.from() - }); }); }, - delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { - var top = cm.charCoords(range.head, "div").top + 5; - var leftPos = cm.coordsChar({left: 0, top: top}, "div"); - return {from: leftPos, to: range.from()} - }); }, - delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { - var top = cm.charCoords(range.head, "div").top + 5; - var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); - return {from: range.from(), to: rightPos } - }); }, - undo: function (cm) { return cm.undo(); }, - redo: function (cm) { return cm.redo(); }, - undoSelection: function (cm) { return cm.undoSelection(); }, - redoSelection: function (cm) { return cm.redoSelection(); }, - goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, - goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, - goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, - {origin: "+move", bias: 1} - ); }, - goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, - {origin: "+move", bias: 1} - ); }, - goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, - {origin: "+move", bias: -1} - ); }, - goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { - var top = cm.cursorCoords(range.head, "div").top + 5; - return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") - }, sel_move); }, - goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { - var top = cm.cursorCoords(range.head, "div").top + 5; - return cm.coordsChar({left: 0, top: top}, "div") - }, sel_move); }, - goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { - var top = cm.cursorCoords(range.head, "div").top + 5; - var pos = cm.coordsChar({left: 0, top: top}, "div"); - if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } - return pos - }, sel_move); }, - goLineUp: function (cm) { return cm.moveV(-1, "line"); }, - goLineDown: function (cm) { return cm.moveV(1, "line"); }, - goPageUp: function (cm) { return cm.moveV(-1, "page"); }, - goPageDown: function (cm) { return cm.moveV(1, "page"); }, - goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, - goCharRight: function (cm) { return cm.moveH(1, "char"); }, - goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, - goColumnRight: function (cm) { return cm.moveH(1, "column"); }, - goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, - goGroupRight: function (cm) { return cm.moveH(1, "group"); }, - goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, - goWordRight: function (cm) { return cm.moveH(1, "word"); }, - delCharBefore: function (cm) { return cm.deleteH(-1, "char"); }, - delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, - delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, - delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, - delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, - delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, - indentAuto: function (cm) { return cm.indentSelection("smart"); }, - indentMore: function (cm) { return cm.indentSelection("add"); }, - indentLess: function (cm) { return cm.indentSelection("subtract"); }, - insertTab: function (cm) { return cm.replaceSelection("\t"); }, - insertSoftTab: function (cm) { - var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; - for (var i = 0; i < ranges.length; i++) { - var pos = ranges[i].from(); - var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); - spaces.push(spaceStr(tabSize - col % tabSize)); - } - cm.replaceSelections(spaces); - }, - defaultTab: function (cm) { - if (cm.somethingSelected()) { cm.indentSelection("add"); } - else { cm.execCommand("insertTab"); } - }, - // Swap the two chars left and right of each selection's head. - // Move cursor behind the two swapped characters afterwards. - // - // Doesn't consider line feeds a character. - // Doesn't scan more than one line above to find a character. - // Doesn't do anything on an empty line. - // Doesn't do anything with non-empty selections. - transposeChars: function (cm) { return runInOp(cm, function () { - var ranges = cm.listSelections(), newSel = []; - for (var i = 0; i < ranges.length; i++) { - if (!ranges[i].empty()) { continue } - var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; - if (line) { - if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); } - if (cur.ch > 0) { - cur = new Pos(cur.line, cur.ch + 1); - cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), - Pos(cur.line, cur.ch - 2), cur, "+transpose"); - } else if (cur.line > cm.doc.first) { - var prev = getLine(cm.doc, cur.line - 1).text; - if (prev) { - cur = new Pos(cur.line, 1); - cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + - prev.charAt(prev.length - 1), - Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); - } - } - } - newSel.push(new Range(cur, cur)); - } - cm.setSelections(newSel); - }); }, - newlineAndIndent: function (cm) { return runInOp(cm, function () { - var sels = cm.listSelections(); - for (var i = sels.length - 1; i >= 0; i--) - { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); } - sels = cm.listSelections(); - for (var i$1 = 0; i$1 < sels.length; i$1++) - { cm.indentLine(sels[i$1].from().line, null, true); } - ensureCursorVisible(cm); - }); }, - openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, - toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } - }; - - - function lineStart(cm, lineN) { - var line = getLine(cm.doc, lineN); - var visual = visualLine(line); - if (visual != line) { lineN = lineNo(visual); } - return endOfLine(true, cm, visual, lineN, 1) - } - function lineEnd(cm, lineN) { - var line = getLine(cm.doc, lineN); - var visual = visualLineEnd(line); - if (visual != line) { lineN = lineNo(visual); } - return endOfLine(true, cm, line, lineN, -1) - } - function lineStartSmart(cm, pos) { - var start = lineStart(cm, pos.line); - var line = getLine(cm.doc, start.line); - var order = getOrder(line, cm.doc.direction); - if (!order || order[0].level == 0) { - var firstNonWS = Math.max(0, line.text.search(/\S/)); - var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; - return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky) - } - return start - } - - // Run a handler that was bound to a key. - function doHandleBinding(cm, bound, dropShift) { - if (typeof bound == "string") { - bound = commands[bound]; - if (!bound) { return false } - } - // Ensure previous input has been read, so that the handler sees a - // consistent view of the document - cm.display.input.ensurePolled(); - var prevShift = cm.display.shift, done = false; - try { - if (cm.isReadOnly()) { cm.state.suppressEdits = true; } - if (dropShift) { cm.display.shift = false; } - done = bound(cm) != Pass; - } finally { - cm.display.shift = prevShift; - cm.state.suppressEdits = false; - } - return done - } - - function lookupKeyForEditor(cm, name, handle) { - for (var i = 0; i < cm.state.keyMaps.length; i++) { - var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); - if (result) { return result } - } - return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) - || lookupKey(name, cm.options.keyMap, handle, cm) - } - - // Note that, despite the name, this function is also used to check - // for bound mouse clicks. - - var stopSeq = new Delayed; - - function dispatchKey(cm, name, e, handle) { - var seq = cm.state.keySeq; - if (seq) { - if (isModifierKey(name)) { return "handled" } - if (/\'$/.test(name)) - { cm.state.keySeq = null; } - else - { stopSeq.set(50, function () { - if (cm.state.keySeq == seq) { - cm.state.keySeq = null; - cm.display.input.reset(); - } - }); } - if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true } - } - return dispatchKeyInner(cm, name, e, handle) - } - - function dispatchKeyInner(cm, name, e, handle) { - var result = lookupKeyForEditor(cm, name, handle); - - if (result == "multi") - { cm.state.keySeq = name; } - if (result == "handled") - { signalLater(cm, "keyHandled", cm, name, e); } - - if (result == "handled" || result == "multi") { - e_preventDefault(e); - restartBlink(cm); - } - - return !!result - } - - // Handle a key from the keydown event. - function handleKeyBinding(cm, e) { - var name = keyName(e, true); - if (!name) { return false } - - if (e.shiftKey && !cm.state.keySeq) { - // First try to resolve full name (including 'Shift-'). Failing - // that, see if there is a cursor-motion command (starting with - // 'go') bound to the keyname without 'Shift-'. - return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) - || dispatchKey(cm, name, e, function (b) { - if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) - { return doHandleBinding(cm, b) } - }) - } else { - return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) - } - } - - // Handle a key from the keypress event - function handleCharBinding(cm, e, ch) { - return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) - } - - var lastStoppedKey = null; - function onKeyDown(e) { - var cm = this; - cm.curOp.focus = activeElt(); - if (signalDOMEvent(cm, e)) { return } - // IE does strange things with escape. - if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; } - var code = e.keyCode; - cm.display.shift = code == 16 || e.shiftKey; - var handled = handleKeyBinding(cm, e); - if (presto) { - lastStoppedKey = handled ? code : null; - // Opera has no cut event... we try to at least catch the key combo - if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) - { cm.replaceSelection("", null, "cut"); } - } - - // Turn mouse into crosshair when Alt is held on Mac. - if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) - { showCrossHair(cm); } - } - - function showCrossHair(cm) { - var lineDiv = cm.display.lineDiv; - addClass(lineDiv, "CodeMirror-crosshair"); - - function up(e) { - if (e.keyCode == 18 || !e.altKey) { - rmClass(lineDiv, "CodeMirror-crosshair"); - off(document, "keyup", up); - off(document, "mouseover", up); - } - } - on(document, "keyup", up); - on(document, "mouseover", up); - } - - function onKeyUp(e) { - if (e.keyCode == 16) { this.doc.sel.shift = false; } - signalDOMEvent(this, e); - } - - function onKeyPress(e) { - var cm = this; - if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } - var keyCode = e.keyCode, charCode = e.charCode; - if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} - if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } - var ch = String.fromCharCode(charCode == null ? keyCode : charCode); - // Some browsers fire keypress events for backspace - if (ch == "\x08") { return } - if (handleCharBinding(cm, e, ch)) { return } - cm.display.input.onKeyPress(e); - } - - var DOUBLECLICK_DELAY = 400; - - var PastClick = function(time, pos, button) { - this.time = time; - this.pos = pos; - this.button = button; - }; - - PastClick.prototype.compare = function (time, pos, button) { - return this.time + DOUBLECLICK_DELAY > time && - cmp(pos, this.pos) == 0 && button == this.button - }; - - var lastClick, lastDoubleClick; - function clickRepeat(pos, button) { - var now = +new Date; - if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { - lastClick = lastDoubleClick = null; - return "triple" - } else if (lastClick && lastClick.compare(now, pos, button)) { - lastDoubleClick = new PastClick(now, pos, button); - lastClick = null; - return "double" - } else { - lastClick = new PastClick(now, pos, button); - lastDoubleClick = null; - return "single" - } - } - - // A mouse down can be a single click, double click, triple click, - // start of selection drag, start of text drag, new cursor - // (ctrl-click), rectangle drag (alt-drag), or xwin - // middle-click-paste. Or it might be a click on something we should - // not interfere with, such as a scrollbar or widget. - function onMouseDown(e) { - var cm = this, display = cm.display; - if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } - display.input.ensurePolled(); - display.shift = e.shiftKey; - - if (eventInWidget(display, e)) { - if (!webkit) { - // Briefly turn off draggability, to allow widgets to do - // normal dragging things. - display.scroller.draggable = false; - setTimeout(function () { return display.scroller.draggable = true; }, 100); - } - return - } - if (clickInGutter(cm, e)) { return } - var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; - window.focus(); - - // #3261: make sure, that we're not starting a second selection - if (button == 1 && cm.state.selectingText) - { cm.state.selectingText(e); } - - if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return } - - if (button == 1) { - if (pos) { leftButtonDown(cm, pos, repeat, e); } - else if (e_target(e) == display.scroller) { e_preventDefault(e); } - } else if (button == 2) { - if (pos) { extendSelection(cm.doc, pos); } - setTimeout(function () { return display.input.focus(); }, 20); - } else if (button == 3) { - if (captureRightClick) { cm.display.input.onContextMenu(e); } - else { delayBlurEvent(cm); } - } - } - - function handleMappedButton(cm, button, pos, repeat, event) { - var name = "Click"; - if (repeat == "double") { name = "Double" + name; } - else if (repeat == "triple") { name = "Triple" + name; } - name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; - - return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { - if (typeof bound == "string") { bound = commands[bound]; } - if (!bound) { return false } - var done = false; - try { - if (cm.isReadOnly()) { cm.state.suppressEdits = true; } - done = bound(cm, pos) != Pass; - } finally { - cm.state.suppressEdits = false; - } - return done - }) - } - - function configureMouse(cm, repeat, event) { - var option = cm.getOption("configureMouse"); - var value = option ? option(cm, repeat, event) : {}; - if (value.unit == null) { - var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; - value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; - } - if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; } - if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; } - if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); } - return value - } - - function leftButtonDown(cm, pos, repeat, event) { - if (ie) { setTimeout(bind(ensureFocus, cm), 0); } - else { cm.curOp.focus = activeElt(); } - - var behavior = configureMouse(cm, repeat, event); - - var sel = cm.doc.sel, contained; - if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && - repeat == "single" && (contained = sel.contains(pos)) > -1 && - (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && - (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) - { leftButtonStartDrag(cm, event, pos, behavior); } - else - { leftButtonSelect(cm, event, pos, behavior); } - } - - // Start a text drag. When it ends, see if any dragging actually - // happen, and treat as a click if it didn't. - function leftButtonStartDrag(cm, event, pos, behavior) { - var display = cm.display, moved = false; - var dragEnd = operation(cm, function (e) { - if (webkit) { display.scroller.draggable = false; } - cm.state.draggingText = false; - off(display.wrapper.ownerDocument, "mouseup", dragEnd); - off(display.wrapper.ownerDocument, "mousemove", mouseMove); - off(display.scroller, "dragstart", dragStart); - off(display.scroller, "drop", dragEnd); - if (!moved) { - e_preventDefault(e); - if (!behavior.addNew) - { extendSelection(cm.doc, pos, null, null, behavior.extend); } - // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) - if (webkit || ie && ie_version == 9) - { setTimeout(function () {display.wrapper.ownerDocument.body.focus(); display.input.focus();}, 20); } - else - { display.input.focus(); } - } - }); - var mouseMove = function(e2) { - moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; - }; - var dragStart = function () { return moved = true; }; - // Let the drag handler handle this. - if (webkit) { display.scroller.draggable = true; } - cm.state.draggingText = dragEnd; - dragEnd.copy = !behavior.moveOnDrag; - // IE's approach to draggable - if (display.scroller.dragDrop) { display.scroller.dragDrop(); } - on(display.wrapper.ownerDocument, "mouseup", dragEnd); - on(display.wrapper.ownerDocument, "mousemove", mouseMove); - on(display.scroller, "dragstart", dragStart); - on(display.scroller, "drop", dragEnd); - - delayBlurEvent(cm); - setTimeout(function () { return display.input.focus(); }, 20); - } - - function rangeForUnit(cm, pos, unit) { - if (unit == "char") { return new Range(pos, pos) } - if (unit == "word") { return cm.findWordAt(pos) } - if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } - var result = unit(cm, pos); - return new Range(result.from, result.to) - } - - // Normal selection, as opposed to text dragging. - function leftButtonSelect(cm, event, start, behavior) { - var display = cm.display, doc = cm.doc; - e_preventDefault(event); - - var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; - if (behavior.addNew && !behavior.extend) { - ourIndex = doc.sel.contains(start); - if (ourIndex > -1) - { ourRange = ranges[ourIndex]; } - else - { ourRange = new Range(start, start); } - } else { - ourRange = doc.sel.primary(); - ourIndex = doc.sel.primIndex; - } - - if (behavior.unit == "rectangle") { - if (!behavior.addNew) { ourRange = new Range(start, start); } - start = posFromMouse(cm, event, true, true); - ourIndex = -1; - } else { - var range$$1 = rangeForUnit(cm, start, behavior.unit); - if (behavior.extend) - { ourRange = extendRange(ourRange, range$$1.anchor, range$$1.head, behavior.extend); } - else - { ourRange = range$$1; } - } - - if (!behavior.addNew) { - ourIndex = 0; - setSelection(doc, new Selection([ourRange], 0), sel_mouse); - startSel = doc.sel; - } else if (ourIndex == -1) { - ourIndex = ranges.length; - setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), - {scroll: false, origin: "*mouse"}); - } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { - setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), - {scroll: false, origin: "*mouse"}); - startSel = doc.sel; - } else { - replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); - } - - var lastPos = start; - function extendTo(pos) { - if (cmp(lastPos, pos) == 0) { return } - lastPos = pos; - - if (behavior.unit == "rectangle") { - var ranges = [], tabSize = cm.options.tabSize; - var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); - var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); - var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); - for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); - line <= end; line++) { - var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); - if (left == right) - { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); } - else if (text.length > leftPos) - { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } - } - if (!ranges.length) { ranges.push(new Range(start, start)); } - setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), - {origin: "*mouse", scroll: false}); - cm.scrollIntoView(pos); - } else { - var oldRange = ourRange; - var range$$1 = rangeForUnit(cm, pos, behavior.unit); - var anchor = oldRange.anchor, head; - if (cmp(range$$1.anchor, anchor) > 0) { - head = range$$1.head; - anchor = minPos(oldRange.from(), range$$1.anchor); - } else { - head = range$$1.anchor; - anchor = maxPos(oldRange.to(), range$$1.head); - } - var ranges$1 = startSel.ranges.slice(0); - ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); - setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); - } - } - - var editorSize = display.wrapper.getBoundingClientRect(); - // Used to ensure timeout re-tries don't fire when another extend - // happened in the meantime (clearTimeout isn't reliable -- at - // least on Chrome, the timeouts still happen even when cleared, - // if the clear happens after their scheduled firing time). - var counter = 0; - - function extend(e) { - var curCount = ++counter; - var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); - if (!cur) { return } - if (cmp(cur, lastPos) != 0) { - cm.curOp.focus = activeElt(); - extendTo(cur); - var visible = visibleLines(display, doc); - if (cur.line >= visible.to || cur.line < visible.from) - { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); } - } else { - var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; - if (outside) { setTimeout(operation(cm, function () { - if (counter != curCount) { return } - display.scroller.scrollTop += outside; - extend(e); - }), 50); } - } - } - - function done(e) { - cm.state.selectingText = false; - counter = Infinity; - // If e is null or undefined we interpret this as someone trying - // to explicitly cancel the selection rather than the user - // letting go of the mouse button. - if (e) { - e_preventDefault(e); - display.input.focus(); - } - off(display.wrapper.ownerDocument, "mousemove", move); - off(display.wrapper.ownerDocument, "mouseup", up); - doc.history.lastSelOrigin = null; - } - - var move = operation(cm, function (e) { - if (e.buttons === 0 || !e_button(e)) { done(e); } - else { extend(e); } - }); - var up = operation(cm, done); - cm.state.selectingText = up; - on(display.wrapper.ownerDocument, "mousemove", move); - on(display.wrapper.ownerDocument, "mouseup", up); - } - - // Used when mouse-selecting to adjust the anchor to the proper side - // of a bidi jump depending on the visual position of the head. - function bidiSimplify(cm, range$$1) { - var anchor = range$$1.anchor; - var head = range$$1.head; - var anchorLine = getLine(cm.doc, anchor.line); - if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range$$1 } - var order = getOrder(anchorLine); - if (!order) { return range$$1 } - var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]; - if (part.from != anchor.ch && part.to != anchor.ch) { return range$$1 } - var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1); - if (boundary == 0 || boundary == order.length) { return range$$1 } - - // Compute the relative visual position of the head compared to the - // anchor (<0 is to the left, >0 to the right) - var leftSide; - if (head.line != anchor.line) { - leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; - } else { - var headIndex = getBidiPartAt(order, head.ch, head.sticky); - var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); - if (headIndex == boundary - 1 || headIndex == boundary) - { leftSide = dir < 0; } - else - { leftSide = dir > 0; } - } - - var usePart = order[boundary + (leftSide ? -1 : 0)]; - var from = leftSide == (usePart.level == 1); - var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before"; - return anchor.ch == ch && anchor.sticky == sticky ? range$$1 : new Range(new Pos(anchor.line, ch, sticky), head) - } - - - // Determines whether an event happened in the gutter, and fires the - // handlers for the corresponding event. - function gutterEvent(cm, e, type, prevent) { - var mX, mY; - if (e.touches) { - mX = e.touches[0].clientX; - mY = e.touches[0].clientY; - } else { - try { mX = e.clientX; mY = e.clientY; } - catch(e) { return false } - } - if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } - if (prevent) { e_preventDefault(e); } - - var display = cm.display; - var lineBox = display.lineDiv.getBoundingClientRect(); - - if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } - mY -= lineBox.top - display.viewOffset; - - for (var i = 0; i < cm.display.gutterSpecs.length; ++i) { - var g = display.gutters.childNodes[i]; - if (g && g.getBoundingClientRect().right >= mX) { - var line = lineAtHeight(cm.doc, mY); - var gutter = cm.display.gutterSpecs[i]; - signal(cm, type, cm, line, gutter.className, e); - return e_defaultPrevented(e) - } - } - } - - function clickInGutter(cm, e) { - return gutterEvent(cm, e, "gutterClick", true) - } - - // CONTEXT MENU HANDLING - - // To make the context menu work, we need to briefly unhide the - // textarea (making it as unobtrusive as possible) to let the - // right-click take effect on it. - function onContextMenu(cm, e) { - if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } - if (signalDOMEvent(cm, e, "contextmenu")) { return } - if (!captureRightClick) { cm.display.input.onContextMenu(e); } - } - - function contextMenuInGutter(cm, e) { - if (!hasHandler(cm, "gutterContextMenu")) { return false } - return gutterEvent(cm, e, "gutterContextMenu", false) - } - - function themeChanged(cm) { - cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + - cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); - clearCaches(cm); - } - - var Init = {toString: function(){return "CodeMirror.Init"}}; - - var defaults = {}; - var optionHandlers = {}; - - function defineOptions(CodeMirror) { - var optionHandlers = CodeMirror.optionHandlers; - - function option(name, deflt, handle, notOnInit) { - CodeMirror.defaults[name] = deflt; - if (handle) { optionHandlers[name] = - notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; } - } - - CodeMirror.defineOption = option; - - // Passed to option handlers when there is no old value. - CodeMirror.Init = Init; - - // These two are, on init, called from the constructor because they - // have to be initialized before the editor can start at all. - option("value", "", function (cm, val) { return cm.setValue(val); }, true); - option("mode", null, function (cm, val) { - cm.doc.modeOption = val; - loadMode(cm); - }, true); - - option("indentUnit", 2, loadMode, true); - option("indentWithTabs", false); - option("smartIndent", true); - option("tabSize", 4, function (cm) { - resetModeState(cm); - clearCaches(cm); - regChange(cm); - }, true); - - option("lineSeparator", null, function (cm, val) { - cm.doc.lineSep = val; - if (!val) { return } - var newBreaks = [], lineNo = cm.doc.first; - cm.doc.iter(function (line) { - for (var pos = 0;;) { - var found = line.text.indexOf(val, pos); - if (found == -1) { break } - pos = found + val.length; - newBreaks.push(Pos(lineNo, found)); - } - lineNo++; - }); - for (var i = newBreaks.length - 1; i >= 0; i--) - { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); } - }); - option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { - cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); - if (old != Init) { cm.refresh(); } - }); - option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true); - option("electricChars", true); - option("inputStyle", mobile ? "contenteditable" : "textarea", function () { - throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME - }, true); - option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true); - option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true); - option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true); - option("rtlMoveVisually", !windows); - option("wholeLineUpdateBefore", true); - - option("theme", "default", function (cm) { - themeChanged(cm); - updateGutters(cm); - }, true); - option("keyMap", "default", function (cm, val, old) { - var next = getKeyMap(val); - var prev = old != Init && getKeyMap(old); - if (prev && prev.detach) { prev.detach(cm, next); } - if (next.attach) { next.attach(cm, prev || null); } - }); - option("extraKeys", null); - option("configureMouse", null); - - option("lineWrapping", false, wrappingChanged, true); - option("gutters", [], function (cm, val) { - cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); - updateGutters(cm); - }, true); - option("fixedGutter", true, function (cm, val) { - cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; - cm.refresh(); - }, true); - option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true); - option("scrollbarStyle", "native", function (cm) { - initScrollbars(cm); - updateScrollbars(cm); - cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); - cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); - }, true); - option("lineNumbers", false, function (cm, val) { - cm.display.gutterSpecs = getGutters(cm.options.gutters, val); - updateGutters(cm); - }, true); - option("firstLineNumber", 1, updateGutters, true); - option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true); - option("showCursorWhenSelecting", false, updateSelection, true); - - option("resetSelectionOnContextMenu", true); - option("lineWiseCopyCut", true); - option("pasteLinesPerSelection", true); - option("selectionsMayTouch", false); - - option("readOnly", false, function (cm, val) { - if (val == "nocursor") { - onBlur(cm); - cm.display.input.blur(); - } - cm.display.input.readOnlyChanged(val); - }); - option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true); - option("dragDrop", true, dragDropChanged); - option("allowDropFileTypes", null); - - option("cursorBlinkRate", 530); - option("cursorScrollMargin", 0); - option("cursorHeight", 1, updateSelection, true); - option("singleCursorHeightPerLine", true, updateSelection, true); - option("workTime", 100); - option("workDelay", 100); - option("flattenSpans", true, resetModeState, true); - option("addModeClass", false, resetModeState, true); - option("pollInterval", 100); - option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }); - option("historyEventDelay", 1250); - option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true); - option("maxHighlightLength", 10000, resetModeState, true); - option("moveInputWithCursor", true, function (cm, val) { - if (!val) { cm.display.input.resetPosition(); } - }); - - option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }); - option("autofocus", null); - option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true); - option("phrases", null); - } - - function dragDropChanged(cm, value, old) { - var wasOn = old && old != Init; - if (!value != !wasOn) { - var funcs = cm.display.dragFunctions; - var toggle = value ? on : off; - toggle(cm.display.scroller, "dragstart", funcs.start); - toggle(cm.display.scroller, "dragenter", funcs.enter); - toggle(cm.display.scroller, "dragover", funcs.over); - toggle(cm.display.scroller, "dragleave", funcs.leave); - toggle(cm.display.scroller, "drop", funcs.drop); - } - } - - function wrappingChanged(cm) { - if (cm.options.lineWrapping) { - addClass(cm.display.wrapper, "CodeMirror-wrap"); - cm.display.sizer.style.minWidth = ""; - cm.display.sizerWidth = null; - } else { - rmClass(cm.display.wrapper, "CodeMirror-wrap"); - findMaxLine(cm); - } - estimateLineHeights(cm); - regChange(cm); - clearCaches(cm); - setTimeout(function () { return updateScrollbars(cm); }, 100); - } - - // A CodeMirror instance represents an editor. This is the object - // that user code is usually dealing with. - - function CodeMirror(place, options) { - var this$1 = this; - - if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) } - - this.options = options = options ? copyObj(options) : {}; - // Determine effective options based on given values and defaults. - copyObj(defaults, options, false); - - var doc = options.value; - if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); } - else if (options.mode) { doc.modeOption = options.mode; } - this.doc = doc; - - var input = new CodeMirror.inputStyles[options.inputStyle](this); - var display = this.display = new Display(place, doc, input, options); - display.wrapper.CodeMirror = this; - themeChanged(this); - if (options.lineWrapping) - { this.display.wrapper.className += " CodeMirror-wrap"; } - initScrollbars(this); - - this.state = { - keyMaps: [], // stores maps added by addKeyMap - overlays: [], // highlighting overlays, as added by addOverlay - modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info - overwrite: false, - delayingBlurEvent: false, - focused: false, - suppressEdits: false, // used to disable editing during key handlers when in readOnly mode - pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll - selectingText: false, - draggingText: false, - highlight: new Delayed(), // stores highlight worker timeout - keySeq: null, // Unfinished key sequence - specialChars: null - }; - - if (options.autofocus && !mobile) { display.input.focus(); } - - // Override magic textarea content restore that IE sometimes does - // on our hidden textarea on reload - if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); } - - registerEventHandlers(this); - ensureGlobalHandlers(); - - startOperation(this); - this.curOp.forceUpdate = true; - attachDoc(this, doc); - - if ((options.autofocus && !mobile) || this.hasFocus()) - { setTimeout(bind(onFocus, this), 20); } - else - { onBlur(this); } - - for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) - { optionHandlers[opt](this$1, options[opt], Init); } } - maybeUpdateLineNumberWidth(this); - if (options.finishInit) { options.finishInit(this); } - for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this$1); } - endOperation(this); - // Suppress optimizelegibility in Webkit, since it breaks text - // measuring on line wrapping boundaries. - if (webkit && options.lineWrapping && - getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") - { display.lineDiv.style.textRendering = "auto"; } - } - - // The default configuration options. - CodeMirror.defaults = defaults; - // Functions to run when options are changed. - CodeMirror.optionHandlers = optionHandlers; - - // Attach the necessary event handlers when initializing the editor - function registerEventHandlers(cm) { - var d = cm.display; - on(d.scroller, "mousedown", operation(cm, onMouseDown)); - // Older IE's will not fire a second mousedown for a double click - if (ie && ie_version < 11) - { on(d.scroller, "dblclick", operation(cm, function (e) { - if (signalDOMEvent(cm, e)) { return } - var pos = posFromMouse(cm, e); - if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } - e_preventDefault(e); - var word = cm.findWordAt(pos); - extendSelection(cm.doc, word.anchor, word.head); - })); } - else - { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); } - // Some browsers fire contextmenu *after* opening the menu, at - // which point we can't mess with it anymore. Context menu is - // handled in onMouseDown for these browsers. - on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); - - // Used to suppress mouse event handling when a touch happens - var touchFinished, prevTouch = {end: 0}; - function finishTouch() { - if (d.activeTouch) { - touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000); - prevTouch = d.activeTouch; - prevTouch.end = +new Date; - } - } - function isMouseLikeTouchEvent(e) { - if (e.touches.length != 1) { return false } - var touch = e.touches[0]; - return touch.radiusX <= 1 && touch.radiusY <= 1 - } - function farAway(touch, other) { - if (other.left == null) { return true } - var dx = other.left - touch.left, dy = other.top - touch.top; - return dx * dx + dy * dy > 20 * 20 - } - on(d.scroller, "touchstart", function (e) { - if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { - d.input.ensurePolled(); - clearTimeout(touchFinished); - var now = +new Date; - d.activeTouch = {start: now, moved: false, - prev: now - prevTouch.end <= 300 ? prevTouch : null}; - if (e.touches.length == 1) { - d.activeTouch.left = e.touches[0].pageX; - d.activeTouch.top = e.touches[0].pageY; - } - } - }); - on(d.scroller, "touchmove", function () { - if (d.activeTouch) { d.activeTouch.moved = true; } - }); - on(d.scroller, "touchend", function (e) { - var touch = d.activeTouch; - if (touch && !eventInWidget(d, e) && touch.left != null && - !touch.moved && new Date - touch.start < 300) { - var pos = cm.coordsChar(d.activeTouch, "page"), range; - if (!touch.prev || farAway(touch, touch.prev)) // Single tap - { range = new Range(pos, pos); } - else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap - { range = cm.findWordAt(pos); } - else // Triple tap - { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); } - cm.setSelection(range.anchor, range.head); - cm.focus(); - e_preventDefault(e); - } - finishTouch(); - }); - on(d.scroller, "touchcancel", finishTouch); - - // Sync scrolling between fake scrollbars and real scrollable - // area, ensure viewport is updated when scrolling. - on(d.scroller, "scroll", function () { - if (d.scroller.clientHeight) { - updateScrollTop(cm, d.scroller.scrollTop); - setScrollLeft(cm, d.scroller.scrollLeft, true); - signal(cm, "scroll", cm); - } - }); - - // Listen to wheel events in order to try and update the viewport on time. - on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }); - on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }); - - // Prevent wrapper from ever scrolling - on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); - - d.dragFunctions = { - enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }}, - over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, - start: function (e) { return onDragStart(cm, e); }, - drop: operation(cm, onDrop), - leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} - }; - - var inp = d.input.getField(); - on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }); - on(inp, "keydown", operation(cm, onKeyDown)); - on(inp, "keypress", operation(cm, onKeyPress)); - on(inp, "focus", function (e) { return onFocus(cm, e); }); - on(inp, "blur", function (e) { return onBlur(cm, e); }); - } - - var initHooks = []; - CodeMirror.defineInitHook = function (f) { return initHooks.push(f); }; - - // Indent the given line. The how parameter can be "smart", - // "add"/null, "subtract", or "prev". When aggressive is false - // (typically set to true for forced single-line indents), empty - // lines are not indented, and places where the mode returns Pass - // are left alone. - function indentLine(cm, n, how, aggressive) { - var doc = cm.doc, state; - if (how == null) { how = "add"; } - if (how == "smart") { - // Fall back to "prev" when the mode doesn't have an indentation - // method. - if (!doc.mode.indent) { how = "prev"; } - else { state = getContextBefore(cm, n).state; } - } - - var tabSize = cm.options.tabSize; - var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); - if (line.stateAfter) { line.stateAfter = null; } - var curSpaceString = line.text.match(/^\s*/)[0], indentation; - if (!aggressive && !/\S/.test(line.text)) { - indentation = 0; - how = "not"; - } else if (how == "smart") { - indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); - if (indentation == Pass || indentation > 150) { - if (!aggressive) { return } - how = "prev"; - } - } - if (how == "prev") { - if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); } - else { indentation = 0; } - } else if (how == "add") { - indentation = curSpace + cm.options.indentUnit; - } else if (how == "subtract") { - indentation = curSpace - cm.options.indentUnit; - } else if (typeof how == "number") { - indentation = curSpace + how; - } - indentation = Math.max(0, indentation); - - var indentString = "", pos = 0; - if (cm.options.indentWithTabs) - { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} } - if (pos < indentation) { indentString += spaceStr(indentation - pos); } - - if (indentString != curSpaceString) { - replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); - line.stateAfter = null; - return true - } else { - // Ensure that, if the cursor was in the whitespace at the start - // of the line, it is moved to the end of that space. - for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { - var range = doc.sel.ranges[i$1]; - if (range.head.line == n && range.head.ch < curSpaceString.length) { - var pos$1 = Pos(n, curSpaceString.length); - replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); - break - } - } - } - } - - // This will be set to a {lineWise: bool, text: [string]} object, so - // that, when pasting, we know what kind of selections the copied - // text was made out of. - var lastCopied = null; - - function setLastCopied(newLastCopied) { - lastCopied = newLastCopied; - } - - function applyTextInput(cm, inserted, deleted, sel, origin) { - var doc = cm.doc; - cm.display.shift = false; - if (!sel) { sel = doc.sel; } - - var recent = +new Date - 200; - var paste = origin == "paste" || cm.state.pasteIncoming > recent; - var textLines = splitLinesAuto(inserted), multiPaste = null; - // When pasting N lines into N selections, insert one line per selection - if (paste && sel.ranges.length > 1) { - if (lastCopied && lastCopied.text.join("\n") == inserted) { - if (sel.ranges.length % lastCopied.text.length == 0) { - multiPaste = []; - for (var i = 0; i < lastCopied.text.length; i++) - { multiPaste.push(doc.splitLines(lastCopied.text[i])); } - } - } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { - multiPaste = map(textLines, function (l) { return [l]; }); - } - } - - var updateInput = cm.curOp.updateInput; - // Normal behavior is to insert the new text into every selection - for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { - var range$$1 = sel.ranges[i$1]; - var from = range$$1.from(), to = range$$1.to(); - if (range$$1.empty()) { - if (deleted && deleted > 0) // Handle deletion - { from = Pos(from.line, from.ch - deleted); } - else if (cm.state.overwrite && !paste) // Handle overwrite - { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } - else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted) - { from = to = Pos(from.line, 0); } - } - var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, - origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")}; - makeChange(cm.doc, changeEvent); - signalLater(cm, "inputRead", cm, changeEvent); - } - if (inserted && !paste) - { triggerElectric(cm, inserted); } - - ensureCursorVisible(cm); - if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; } - cm.curOp.typing = true; - cm.state.pasteIncoming = cm.state.cutIncoming = -1; - } - - function handlePaste(e, cm) { - var pasted = e.clipboardData && e.clipboardData.getData("Text"); - if (pasted) { - e.preventDefault(); - if (!cm.isReadOnly() && !cm.options.disableInput) - { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); } - return true - } - } - - function triggerElectric(cm, inserted) { - // When an 'electric' character is inserted, immediately trigger a reindent - if (!cm.options.electricChars || !cm.options.smartIndent) { return } - var sel = cm.doc.sel; - - for (var i = sel.ranges.length - 1; i >= 0; i--) { - var range$$1 = sel.ranges[i]; - if (range$$1.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range$$1.head.line)) { continue } - var mode = cm.getModeAt(range$$1.head); - var indented = false; - if (mode.electricChars) { - for (var j = 0; j < mode.electricChars.length; j++) - { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { - indented = indentLine(cm, range$$1.head.line, "smart"); - break - } } - } else if (mode.electricInput) { - if (mode.electricInput.test(getLine(cm.doc, range$$1.head.line).text.slice(0, range$$1.head.ch))) - { indented = indentLine(cm, range$$1.head.line, "smart"); } - } - if (indented) { signalLater(cm, "electricInput", cm, range$$1.head.line); } - } - } - - function copyableRanges(cm) { - var text = [], ranges = []; - for (var i = 0; i < cm.doc.sel.ranges.length; i++) { - var line = cm.doc.sel.ranges[i].head.line; - var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; - ranges.push(lineRange); - text.push(cm.getRange(lineRange.anchor, lineRange.head)); - } - return {text: text, ranges: ranges} - } - - function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { - field.setAttribute("autocorrect", autocorrect ? "" : "off"); - field.setAttribute("autocapitalize", autocapitalize ? "" : "off"); - field.setAttribute("spellcheck", !!spellcheck); - } - - function hiddenTextarea() { - var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"); - var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); - // The textarea is kept positioned near the cursor to prevent the - // fact that it'll be scrolled into view on input from scrolling - // our fake cursor out of view. On webkit, when wrap=off, paste is - // very slow. So make the area wide instead. - if (webkit) { te.style.width = "1000px"; } - else { te.setAttribute("wrap", "off"); } - // If border: 0; -- iOS fails to open keyboard (issue #1287) - if (ios) { te.style.border = "1px solid black"; } - disableBrowserMagic(te); - return div - } - - // The publicly visible API. Note that methodOp(f) means - // 'wrap f in an operation, performed on its `this` parameter'. - - // This is not the complete set of editor methods. Most of the - // methods defined on the Doc type are also injected into - // CodeMirror.prototype, for backwards compatibility and - // convenience. - - function addEditorMethods(CodeMirror) { - var optionHandlers = CodeMirror.optionHandlers; - - var helpers = CodeMirror.helpers = {}; - - CodeMirror.prototype = { - constructor: CodeMirror, - focus: function(){window.focus(); this.display.input.focus();}, - - setOption: function(option, value) { - var options = this.options, old = options[option]; - if (options[option] == value && option != "mode") { return } - options[option] = value; - if (optionHandlers.hasOwnProperty(option)) - { operation(this, optionHandlers[option])(this, value, old); } - signal(this, "optionChange", this, option); - }, - - getOption: function(option) {return this.options[option]}, - getDoc: function() {return this.doc}, - - addKeyMap: function(map$$1, bottom) { - this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map$$1)); - }, - removeKeyMap: function(map$$1) { - var maps = this.state.keyMaps; - for (var i = 0; i < maps.length; ++i) - { if (maps[i] == map$$1 || maps[i].name == map$$1) { - maps.splice(i, 1); - return true - } } - }, - - addOverlay: methodOp(function(spec, options) { - var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); - if (mode.startState) { throw new Error("Overlays may not be stateful.") } - insertSorted(this.state.overlays, - {mode: mode, modeSpec: spec, opaque: options && options.opaque, - priority: (options && options.priority) || 0}, - function (overlay) { return overlay.priority; }); - this.state.modeGen++; - regChange(this); - }), - removeOverlay: methodOp(function(spec) { - var this$1 = this; - - var overlays = this.state.overlays; - for (var i = 0; i < overlays.length; ++i) { - var cur = overlays[i].modeSpec; - if (cur == spec || typeof spec == "string" && cur.name == spec) { - overlays.splice(i, 1); - this$1.state.modeGen++; - regChange(this$1); - return - } - } - }), - - indentLine: methodOp(function(n, dir, aggressive) { - if (typeof dir != "string" && typeof dir != "number") { - if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; } - else { dir = dir ? "add" : "subtract"; } - } - if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); } - }), - indentSelection: methodOp(function(how) { - var this$1 = this; - - var ranges = this.doc.sel.ranges, end = -1; - for (var i = 0; i < ranges.length; i++) { - var range$$1 = ranges[i]; - if (!range$$1.empty()) { - var from = range$$1.from(), to = range$$1.to(); - var start = Math.max(end, from.line); - end = Math.min(this$1.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; - for (var j = start; j < end; ++j) - { indentLine(this$1, j, how); } - var newRanges = this$1.doc.sel.ranges; - if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) - { replaceOneSelection(this$1.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } - } else if (range$$1.head.line > end) { - indentLine(this$1, range$$1.head.line, how, true); - end = range$$1.head.line; - if (i == this$1.doc.sel.primIndex) { ensureCursorVisible(this$1); } - } - } - }), - - // Fetch the parser token for a given character. Useful for hacks - // that want to inspect the mode state (say, for completion). - getTokenAt: function(pos, precise) { - return takeToken(this, pos, precise) - }, - - getLineTokens: function(line, precise) { - return takeToken(this, Pos(line), precise, true) - }, - - getTokenTypeAt: function(pos) { - pos = clipPos(this.doc, pos); - var styles = getLineStyles(this, getLine(this.doc, pos.line)); - var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; - var type; - if (ch == 0) { type = styles[2]; } - else { for (;;) { - var mid = (before + after) >> 1; - if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; } - else if (styles[mid * 2 + 1] < ch) { before = mid + 1; } - else { type = styles[mid * 2 + 2]; break } - } } - var cut = type ? type.indexOf("overlay ") : -1; - return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) - }, - - getModeAt: function(pos) { - var mode = this.doc.mode; - if (!mode.innerMode) { return mode } - return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode - }, - - getHelper: function(pos, type) { - return this.getHelpers(pos, type)[0] - }, - - getHelpers: function(pos, type) { - var this$1 = this; - - var found = []; - if (!helpers.hasOwnProperty(type)) { return found } - var help = helpers[type], mode = this.getModeAt(pos); - if (typeof mode[type] == "string") { - if (help[mode[type]]) { found.push(help[mode[type]]); } - } else if (mode[type]) { - for (var i = 0; i < mode[type].length; i++) { - var val = help[mode[type][i]]; - if (val) { found.push(val); } - } - } else if (mode.helperType && help[mode.helperType]) { - found.push(help[mode.helperType]); - } else if (help[mode.name]) { - found.push(help[mode.name]); - } - for (var i$1 = 0; i$1 < help._global.length; i$1++) { - var cur = help._global[i$1]; - if (cur.pred(mode, this$1) && indexOf(found, cur.val) == -1) - { found.push(cur.val); } - } - return found - }, - - getStateAfter: function(line, precise) { - var doc = this.doc; - line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); - return getContextBefore(this, line + 1, precise).state - }, - - cursorCoords: function(start, mode) { - var pos, range$$1 = this.doc.sel.primary(); - if (start == null) { pos = range$$1.head; } - else if (typeof start == "object") { pos = clipPos(this.doc, start); } - else { pos = start ? range$$1.from() : range$$1.to(); } - return cursorCoords(this, pos, mode || "page") - }, - - charCoords: function(pos, mode) { - return charCoords(this, clipPos(this.doc, pos), mode || "page") - }, - - coordsChar: function(coords, mode) { - coords = fromCoordSystem(this, coords, mode || "page"); - return coordsChar(this, coords.left, coords.top) - }, - - lineAtHeight: function(height, mode) { - height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; - return lineAtHeight(this.doc, height + this.display.viewOffset) - }, - heightAtLine: function(line, mode, includeWidgets) { - var end = false, lineObj; - if (typeof line == "number") { - var last = this.doc.first + this.doc.size - 1; - if (line < this.doc.first) { line = this.doc.first; } - else if (line > last) { line = last; end = true; } - lineObj = getLine(this.doc, line); - } else { - lineObj = line; - } - return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top + - (end ? this.doc.height - heightAtLine(lineObj) : 0) - }, - - defaultTextHeight: function() { return textHeight(this.display) }, - defaultCharWidth: function() { return charWidth(this.display) }, - - getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, - - addWidget: function(pos, node, scroll, vert, horiz) { - var display = this.display; - pos = cursorCoords(this, clipPos(this.doc, pos)); - var top = pos.bottom, left = pos.left; - node.style.position = "absolute"; - node.setAttribute("cm-ignore-events", "true"); - this.display.input.setUneditable(node); - display.sizer.appendChild(node); - if (vert == "over") { - top = pos.top; - } else if (vert == "above" || vert == "near") { - var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), - hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); - // Default to positioning above (if specified and possible); otherwise default to positioning below - if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) - { top = pos.top - node.offsetHeight; } - else if (pos.bottom + node.offsetHeight <= vspace) - { top = pos.bottom; } - if (left + node.offsetWidth > hspace) - { left = hspace - node.offsetWidth; } - } - node.style.top = top + "px"; - node.style.left = node.style.right = ""; - if (horiz == "right") { - left = display.sizer.clientWidth - node.offsetWidth; - node.style.right = "0px"; - } else { - if (horiz == "left") { left = 0; } - else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; } - node.style.left = left + "px"; - } - if (scroll) - { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); } - }, - - triggerOnKeyDown: methodOp(onKeyDown), - triggerOnKeyPress: methodOp(onKeyPress), - triggerOnKeyUp: onKeyUp, - triggerOnMouseDown: methodOp(onMouseDown), - - execCommand: function(cmd) { - if (commands.hasOwnProperty(cmd)) - { return commands[cmd].call(null, this) } - }, - - triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), - - findPosH: function(from, amount, unit, visually) { - var this$1 = this; - - var dir = 1; - if (amount < 0) { dir = -1; amount = -amount; } - var cur = clipPos(this.doc, from); - for (var i = 0; i < amount; ++i) { - cur = findPosH(this$1.doc, cur, dir, unit, visually); - if (cur.hitSide) { break } - } - return cur - }, - - moveH: methodOp(function(dir, unit) { - var this$1 = this; - - this.extendSelectionsBy(function (range$$1) { - if (this$1.display.shift || this$1.doc.extend || range$$1.empty()) - { return findPosH(this$1.doc, range$$1.head, dir, unit, this$1.options.rtlMoveVisually) } - else - { return dir < 0 ? range$$1.from() : range$$1.to() } - }, sel_move); - }), - - deleteH: methodOp(function(dir, unit) { - var sel = this.doc.sel, doc = this.doc; - if (sel.somethingSelected()) - { doc.replaceSelection("", null, "+delete"); } - else - { deleteNearSelection(this, function (range$$1) { - var other = findPosH(doc, range$$1.head, dir, unit, false); - return dir < 0 ? {from: other, to: range$$1.head} : {from: range$$1.head, to: other} - }); } - }), - - findPosV: function(from, amount, unit, goalColumn) { - var this$1 = this; - - var dir = 1, x = goalColumn; - if (amount < 0) { dir = -1; amount = -amount; } - var cur = clipPos(this.doc, from); - for (var i = 0; i < amount; ++i) { - var coords = cursorCoords(this$1, cur, "div"); - if (x == null) { x = coords.left; } - else { coords.left = x; } - cur = findPosV(this$1, coords, dir, unit); - if (cur.hitSide) { break } - } - return cur - }, - - moveV: methodOp(function(dir, unit) { - var this$1 = this; - - var doc = this.doc, goals = []; - var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); - doc.extendSelectionsBy(function (range$$1) { - if (collapse) - { return dir < 0 ? range$$1.from() : range$$1.to() } - var headPos = cursorCoords(this$1, range$$1.head, "div"); - if (range$$1.goalColumn != null) { headPos.left = range$$1.goalColumn; } - goals.push(headPos.left); - var pos = findPosV(this$1, headPos, dir, unit); - if (unit == "page" && range$$1 == doc.sel.primary()) - { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); } - return pos - }, sel_move); - if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) - { doc.sel.ranges[i].goalColumn = goals[i]; } } - }), - - // Find the word at the given position (as returned by coordsChar). - findWordAt: function(pos) { - var doc = this.doc, line = getLine(doc, pos.line).text; - var start = pos.ch, end = pos.ch; - if (line) { - var helper = this.getHelper(pos, "wordChars"); - if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; } - var startChar = line.charAt(start); - var check = isWordChar(startChar, helper) - ? function (ch) { return isWordChar(ch, helper); } - : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } - : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); }; - while (start > 0 && check(line.charAt(start - 1))) { --start; } - while (end < line.length && check(line.charAt(end))) { ++end; } - } - return new Range(Pos(pos.line, start), Pos(pos.line, end)) - }, - - toggleOverwrite: function(value) { - if (value != null && value == this.state.overwrite) { return } - if (this.state.overwrite = !this.state.overwrite) - { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); } - else - { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); } - - signal(this, "overwriteToggle", this, this.state.overwrite); - }, - hasFocus: function() { return this.display.input.getField() == activeElt() }, - isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, - - scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }), - getScrollInfo: function() { - var scroller = this.display.scroller; - return {left: scroller.scrollLeft, top: scroller.scrollTop, - height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, - width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, - clientHeight: displayHeight(this), clientWidth: displayWidth(this)} - }, - - scrollIntoView: methodOp(function(range$$1, margin) { - if (range$$1 == null) { - range$$1 = {from: this.doc.sel.primary().head, to: null}; - if (margin == null) { margin = this.options.cursorScrollMargin; } - } else if (typeof range$$1 == "number") { - range$$1 = {from: Pos(range$$1, 0), to: null}; - } else if (range$$1.from == null) { - range$$1 = {from: range$$1, to: null}; - } - if (!range$$1.to) { range$$1.to = range$$1.from; } - range$$1.margin = margin || 0; - - if (range$$1.from.line != null) { - scrollToRange(this, range$$1); - } else { - scrollToCoordsRange(this, range$$1.from, range$$1.to, range$$1.margin); - } - }), - - setSize: methodOp(function(width, height) { - var this$1 = this; - - var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; }; - if (width != null) { this.display.wrapper.style.width = interpret(width); } - if (height != null) { this.display.wrapper.style.height = interpret(height); } - if (this.options.lineWrapping) { clearLineMeasurementCache(this); } - var lineNo$$1 = this.display.viewFrom; - this.doc.iter(lineNo$$1, this.display.viewTo, function (line) { - if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) - { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo$$1, "widget"); break } } } - ++lineNo$$1; - }); - this.curOp.forceUpdate = true; - signal(this, "refresh", this); - }), - - operation: function(f){return runInOp(this, f)}, - startOperation: function(){return startOperation(this)}, - endOperation: function(){return endOperation(this)}, - - refresh: methodOp(function() { - var oldHeight = this.display.cachedTextHeight; - regChange(this); - this.curOp.forceUpdate = true; - clearCaches(this); - scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); - updateGutterSpace(this.display); - if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5) - { estimateLineHeights(this); } - signal(this, "refresh", this); - }), - - swapDoc: methodOp(function(doc) { - var old = this.doc; - old.cm = null; - // Cancel the current text selection if any (#5821) - if (this.state.selectingText) { this.state.selectingText(); } - attachDoc(this, doc); - clearCaches(this); - this.display.input.reset(); - scrollToCoords(this, doc.scrollLeft, doc.scrollTop); - this.curOp.forceScroll = true; - signalLater(this, "swapDoc", this, old); - return old - }), - - phrase: function(phraseText) { - var phrases = this.options.phrases; - return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText - }, - - getInputField: function(){return this.display.input.getField()}, - getWrapperElement: function(){return this.display.wrapper}, - getScrollerElement: function(){return this.display.scroller}, - getGutterElement: function(){return this.display.gutters} - }; - eventMixin(CodeMirror); - - CodeMirror.registerHelper = function(type, name, value) { - if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; } - helpers[type][name] = value; - }; - CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { - CodeMirror.registerHelper(type, name, value); - helpers[type]._global.push({pred: predicate, val: value}); - }; - } - - // Used for horizontal relative motion. Dir is -1 or 1 (left or - // right), unit can be "char", "column" (like char, but doesn't - // cross line boundaries), "word" (across next word), or "group" (to - // the start of next group of word or non-word-non-whitespace - // chars). The visually param controls whether, in right-to-left - // text, direction 1 means to move towards the next index in the - // string, or towards the character to the right of the current - // position. The resulting position will have a hitSide=true - // property if it reached the end of the document. - function findPosH(doc, pos, dir, unit, visually) { - var oldPos = pos; - var origDir = dir; - var lineObj = getLine(doc, pos.line); - function findNextLine() { - var l = pos.line + dir; - if (l < doc.first || l >= doc.first + doc.size) { return false } - pos = new Pos(l, pos.ch, pos.sticky); - return lineObj = getLine(doc, l) - } - function moveOnce(boundToLine) { - var next; - if (visually) { - next = moveVisually(doc.cm, lineObj, pos, dir); - } else { - next = moveLogically(lineObj, pos, dir); - } - if (next == null) { - if (!boundToLine && findNextLine()) - { pos = endOfLine(visually, doc.cm, lineObj, pos.line, dir); } - else - { return false } - } else { - pos = next; - } - return true - } - - if (unit == "char") { - moveOnce(); - } else if (unit == "column") { - moveOnce(true); - } else if (unit == "word" || unit == "group") { - var sawType = null, group = unit == "group"; - var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); - for (var first = true;; first = false) { - if (dir < 0 && !moveOnce(!first)) { break } - var cur = lineObj.text.charAt(pos.ch) || "\n"; - var type = isWordChar(cur, helper) ? "w" - : group && cur == "\n" ? "n" - : !group || /\s/.test(cur) ? null - : "p"; - if (group && !first && !type) { type = "s"; } - if (sawType && sawType != type) { - if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";} - break - } - - if (type) { sawType = type; } - if (dir > 0 && !moveOnce(!first)) { break } - } - } - var result = skipAtomic(doc, pos, oldPos, origDir, true); - if (equalCursorPos(oldPos, result)) { result.hitSide = true; } - return result - } - - // For relative vertical movement. Dir may be -1 or 1. Unit can be - // "page" or "line". The resulting position will have a hitSide=true - // property if it reached the end of the document. - function findPosV(cm, pos, dir, unit) { - var doc = cm.doc, x = pos.left, y; - if (unit == "page") { - var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); - var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); - y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; - - } else if (unit == "line") { - y = dir > 0 ? pos.bottom + 3 : pos.top - 3; - } - var target; - for (;;) { - target = coordsChar(cm, x, y); - if (!target.outside) { break } - if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } - y += dir * 5; - } - return target - } - - // CONTENTEDITABLE INPUT STYLE - - var ContentEditableInput = function(cm) { - this.cm = cm; - this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; - this.polling = new Delayed(); - this.composing = null; - this.gracePeriod = false; - this.readDOMTimeout = null; - }; - - ContentEditableInput.prototype.init = function (display) { - var this$1 = this; - - var input = this, cm = input.cm; - var div = input.div = display.lineDiv; - disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); - - on(div, "paste", function (e) { - if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } - // IE doesn't fire input events, so we schedule a read for the pasted content in this way - if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); } - }); - - on(div, "compositionstart", function (e) { - this$1.composing = {data: e.data, done: false}; - }); - on(div, "compositionupdate", function (e) { - if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; } - }); - on(div, "compositionend", function (e) { - if (this$1.composing) { - if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); } - this$1.composing.done = true; - } - }); - - on(div, "touchstart", function () { return input.forceCompositionEnd(); }); - - on(div, "input", function () { - if (!this$1.composing) { this$1.readFromDOMSoon(); } - }); - - function onCopyCut(e) { - if (signalDOMEvent(cm, e)) { return } - if (cm.somethingSelected()) { - setLastCopied({lineWise: false, text: cm.getSelections()}); - if (e.type == "cut") { cm.replaceSelection("", null, "cut"); } - } else if (!cm.options.lineWiseCopyCut) { - return - } else { - var ranges = copyableRanges(cm); - setLastCopied({lineWise: true, text: ranges.text}); - if (e.type == "cut") { - cm.operation(function () { - cm.setSelections(ranges.ranges, 0, sel_dontScroll); - cm.replaceSelection("", null, "cut"); - }); - } - } - if (e.clipboardData) { - e.clipboardData.clearData(); - var content = lastCopied.text.join("\n"); - // iOS exposes the clipboard API, but seems to discard content inserted into it - e.clipboardData.setData("Text", content); - if (e.clipboardData.getData("Text") == content) { - e.preventDefault(); - return - } - } - // Old-fashioned briefly-focus-a-textarea hack - var kludge = hiddenTextarea(), te = kludge.firstChild; - cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); - te.value = lastCopied.text.join("\n"); - var hadFocus = document.activeElement; - selectInput(te); - setTimeout(function () { - cm.display.lineSpace.removeChild(kludge); - hadFocus.focus(); - if (hadFocus == div) { input.showPrimarySelection(); } - }, 50); - } - on(div, "copy", onCopyCut); - on(div, "cut", onCopyCut); - }; - - ContentEditableInput.prototype.prepareSelection = function () { - var result = prepareSelection(this.cm, false); - result.focus = this.cm.state.focused; - return result - }; - - ContentEditableInput.prototype.showSelection = function (info, takeFocus) { - if (!info || !this.cm.display.view.length) { return } - if (info.focus || takeFocus) { this.showPrimarySelection(); } - this.showMultipleSelections(info); - }; - - ContentEditableInput.prototype.getSelection = function () { - return this.cm.display.wrapper.ownerDocument.getSelection() - }; - - ContentEditableInput.prototype.showPrimarySelection = function () { - var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); - var from = prim.from(), to = prim.to(); - - if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { - sel.removeAllRanges(); - return - } - - var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); - var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); - if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && - cmp(minPos(curAnchor, curFocus), from) == 0 && - cmp(maxPos(curAnchor, curFocus), to) == 0) - { return } - - var view = cm.display.view; - var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) || - {node: view[0].measure.map[2], offset: 0}; - var end = to.line < cm.display.viewTo && posToDOM(cm, to); - if (!end) { - var measure = view[view.length - 1].measure; - var map$$1 = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; - end = {node: map$$1[map$$1.length - 1], offset: map$$1[map$$1.length - 2] - map$$1[map$$1.length - 3]}; - } - - if (!start || !end) { - sel.removeAllRanges(); - return - } - - var old = sel.rangeCount && sel.getRangeAt(0), rng; - try { rng = range(start.node, start.offset, end.offset, end.node); } - catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible - if (rng) { - if (!gecko && cm.state.focused) { - sel.collapse(start.node, start.offset); - if (!rng.collapsed) { - sel.removeAllRanges(); - sel.addRange(rng); - } - } else { - sel.removeAllRanges(); - sel.addRange(rng); - } - if (old && sel.anchorNode == null) { sel.addRange(old); } - else if (gecko) { this.startGracePeriod(); } - } - this.rememberSelection(); - }; - - ContentEditableInput.prototype.startGracePeriod = function () { - var this$1 = this; - - clearTimeout(this.gracePeriod); - this.gracePeriod = setTimeout(function () { - this$1.gracePeriod = false; - if (this$1.selectionChanged()) - { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); } - }, 20); - }; - - ContentEditableInput.prototype.showMultipleSelections = function (info) { - removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); - removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); - }; - - ContentEditableInput.prototype.rememberSelection = function () { - var sel = this.getSelection(); - this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; - this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; - }; - - ContentEditableInput.prototype.selectionInEditor = function () { - var sel = this.getSelection(); - if (!sel.rangeCount) { return false } - var node = sel.getRangeAt(0).commonAncestorContainer; - return contains(this.div, node) - }; - - ContentEditableInput.prototype.focus = function () { - if (this.cm.options.readOnly != "nocursor") { - if (!this.selectionInEditor()) - { this.showSelection(this.prepareSelection(), true); } - this.div.focus(); - } - }; - ContentEditableInput.prototype.blur = function () { this.div.blur(); }; - ContentEditableInput.prototype.getField = function () { return this.div }; - - ContentEditableInput.prototype.supportsTouch = function () { return true }; - - ContentEditableInput.prototype.receivedFocus = function () { - var input = this; - if (this.selectionInEditor()) - { this.pollSelection(); } - else - { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); } - - function poll() { - if (input.cm.state.focused) { - input.pollSelection(); - input.polling.set(input.cm.options.pollInterval, poll); - } - } - this.polling.set(this.cm.options.pollInterval, poll); - }; - - ContentEditableInput.prototype.selectionChanged = function () { - var sel = this.getSelection(); - return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || - sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset - }; - - ContentEditableInput.prototype.pollSelection = function () { - if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return } - var sel = this.getSelection(), cm = this.cm; - // On Android Chrome (version 56, at least), backspacing into an - // uneditable block element will put the cursor in that element, - // and then, because it's not editable, hide the virtual keyboard. - // Because Android doesn't allow us to actually detect backspace - // presses in a sane way, this code checks for when that happens - // and simulates a backspace press in this case. - if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { - this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs}); - this.blur(); - this.focus(); - return - } - if (this.composing) { return } - this.rememberSelection(); - var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); - var head = domToPos(cm, sel.focusNode, sel.focusOffset); - if (anchor && head) { runInOp(cm, function () { - setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); - if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; } - }); } - }; - - ContentEditableInput.prototype.pollContent = function () { - if (this.readDOMTimeout != null) { - clearTimeout(this.readDOMTimeout); - this.readDOMTimeout = null; - } - - var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); - var from = sel.from(), to = sel.to(); - if (from.ch == 0 && from.line > cm.firstLine()) - { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); } - if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) - { to = Pos(to.line + 1, 0); } - if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } - - var fromIndex, fromLine, fromNode; - if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { - fromLine = lineNo(display.view[0].line); - fromNode = display.view[0].node; - } else { - fromLine = lineNo(display.view[fromIndex].line); - fromNode = display.view[fromIndex - 1].node.nextSibling; - } - var toIndex = findViewIndex(cm, to.line); - var toLine, toNode; - if (toIndex == display.view.length - 1) { - toLine = display.viewTo - 1; - toNode = display.lineDiv.lastChild; - } else { - toLine = lineNo(display.view[toIndex + 1].line) - 1; - toNode = display.view[toIndex + 1].node.previousSibling; - } - - if (!fromNode) { return false } - var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); - var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); - while (newText.length > 1 && oldText.length > 1) { - if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } - else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } - else { break } - } - - var cutFront = 0, cutEnd = 0; - var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); - while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) - { ++cutFront; } - var newBot = lst(newText), oldBot = lst(oldText); - var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), - oldBot.length - (oldText.length == 1 ? cutFront : 0)); - while (cutEnd < maxCutEnd && - newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) - { ++cutEnd; } - // Try to move start of change to start of selection if ambiguous - if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { - while (cutFront && cutFront > from.ch && - newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { - cutFront--; - cutEnd++; - } - } - - newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); - newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); - - var chFrom = Pos(fromLine, cutFront); - var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); - if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { - replaceRange(cm.doc, newText, chFrom, chTo, "+input"); - return true - } - }; - - ContentEditableInput.prototype.ensurePolled = function () { - this.forceCompositionEnd(); - }; - ContentEditableInput.prototype.reset = function () { - this.forceCompositionEnd(); - }; - ContentEditableInput.prototype.forceCompositionEnd = function () { - if (!this.composing) { return } - clearTimeout(this.readDOMTimeout); - this.composing = null; - this.updateFromDOM(); - this.div.blur(); - this.div.focus(); - }; - ContentEditableInput.prototype.readFromDOMSoon = function () { - var this$1 = this; - - if (this.readDOMTimeout != null) { return } - this.readDOMTimeout = setTimeout(function () { - this$1.readDOMTimeout = null; - if (this$1.composing) { - if (this$1.composing.done) { this$1.composing = null; } - else { return } - } - this$1.updateFromDOM(); - }, 80); - }; - - ContentEditableInput.prototype.updateFromDOM = function () { - var this$1 = this; - - if (this.cm.isReadOnly() || !this.pollContent()) - { runInOp(this.cm, function () { return regChange(this$1.cm); }); } - }; - - ContentEditableInput.prototype.setUneditable = function (node) { - node.contentEditable = "false"; - }; - - ContentEditableInput.prototype.onKeyPress = function (e) { - if (e.charCode == 0 || this.composing) { return } - e.preventDefault(); - if (!this.cm.isReadOnly()) - { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); } - }; - - ContentEditableInput.prototype.readOnlyChanged = function (val) { - this.div.contentEditable = String(val != "nocursor"); - }; - - ContentEditableInput.prototype.onContextMenu = function () {}; - ContentEditableInput.prototype.resetPosition = function () {}; - - ContentEditableInput.prototype.needsContentAttribute = true; - - function posToDOM(cm, pos) { - var view = findViewForLine(cm, pos.line); - if (!view || view.hidden) { return null } - var line = getLine(cm.doc, pos.line); - var info = mapFromLineView(view, line, pos.line); - - var order = getOrder(line, cm.doc.direction), side = "left"; - if (order) { - var partPos = getBidiPartAt(order, pos.ch); - side = partPos % 2 ? "right" : "left"; - } - var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); - result.offset = result.collapse == "right" ? result.end : result.start; - return result - } - - function isInGutter(node) { - for (var scan = node; scan; scan = scan.parentNode) - { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } } - return false - } - - function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } - - function domTextBetween(cm, from, to, fromLine, toLine) { - var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false; - function recognizeMarker(id) { return function (marker) { return marker.id == id; } } - function close() { - if (closing) { - text += lineSep; - if (extraLinebreak) { text += lineSep; } - closing = extraLinebreak = false; - } - } - function addText(str) { - if (str) { - close(); - text += str; - } - } - function walk(node) { - if (node.nodeType == 1) { - var cmText = node.getAttribute("cm-text"); - if (cmText) { - addText(cmText); - return - } - var markerID = node.getAttribute("cm-marker"), range$$1; - if (markerID) { - var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); - if (found.length && (range$$1 = found[0].find(0))) - { addText(getBetween(cm.doc, range$$1.from, range$$1.to).join(lineSep)); } - return - } - if (node.getAttribute("contenteditable") == "false") { return } - var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); - if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return } - - if (isBlock) { close(); } - for (var i = 0; i < node.childNodes.length; i++) - { walk(node.childNodes[i]); } - - if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; } - if (isBlock) { closing = true; } - } else if (node.nodeType == 3) { - addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); - } - } - for (;;) { - walk(from); - if (from == to) { break } - from = from.nextSibling; - extraLinebreak = false; - } - return text - } - - function domToPos(cm, node, offset) { - var lineNode; - if (node == cm.display.lineDiv) { - lineNode = cm.display.lineDiv.childNodes[offset]; - if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } - node = null; offset = 0; - } else { - for (lineNode = node;; lineNode = lineNode.parentNode) { - if (!lineNode || lineNode == cm.display.lineDiv) { return null } - if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } - } - } - for (var i = 0; i < cm.display.view.length; i++) { - var lineView = cm.display.view[i]; - if (lineView.node == lineNode) - { return locateNodeInLineView(lineView, node, offset) } - } - } - - function locateNodeInLineView(lineView, node, offset) { - var wrapper = lineView.text.firstChild, bad = false; - if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } - if (node == wrapper) { - bad = true; - node = wrapper.childNodes[offset]; - offset = 0; - if (!node) { - var line = lineView.rest ? lst(lineView.rest) : lineView.line; - return badPos(Pos(lineNo(line), line.text.length), bad) - } - } - - var textNode = node.nodeType == 3 ? node : null, topNode = node; - if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { - textNode = node.firstChild; - if (offset) { offset = textNode.nodeValue.length; } - } - while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; } - var measure = lineView.measure, maps = measure.maps; - - function find(textNode, topNode, offset) { - for (var i = -1; i < (maps ? maps.length : 0); i++) { - var map$$1 = i < 0 ? measure.map : maps[i]; - for (var j = 0; j < map$$1.length; j += 3) { - var curNode = map$$1[j + 2]; - if (curNode == textNode || curNode == topNode) { - var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); - var ch = map$$1[j] + offset; - if (offset < 0 || curNode != textNode) { ch = map$$1[j + (offset ? 1 : 0)]; } - return Pos(line, ch) - } - } - } - } - var found = find(textNode, topNode, offset); - if (found) { return badPos(found, bad) } - - // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems - for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { - found = find(after, after.firstChild, 0); - if (found) - { return badPos(Pos(found.line, found.ch - dist), bad) } - else - { dist += after.textContent.length; } - } - for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { - found = find(before, before.firstChild, -1); - if (found) - { return badPos(Pos(found.line, found.ch + dist$1), bad) } - else - { dist$1 += before.textContent.length; } - } - } - - // TEXTAREA INPUT STYLE - - var TextareaInput = function(cm) { - this.cm = cm; - // See input.poll and input.reset - this.prevInput = ""; - - // Flag that indicates whether we expect input to appear real soon - // now (after some event like 'keypress' or 'input') and are - // polling intensively. - this.pollingFast = false; - // Self-resetting timeout for the poller - this.polling = new Delayed(); - // Used to work around IE issue with selection being forgotten when focus moves away from textarea - this.hasSelection = false; - this.composing = null; - }; - - TextareaInput.prototype.init = function (display) { - var this$1 = this; - - var input = this, cm = this.cm; - this.createField(display); - var te = this.textarea; - - display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); - - // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) - if (ios) { te.style.width = "0px"; } - - on(te, "input", function () { - if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; } - input.poll(); - }); - - on(te, "paste", function (e) { - if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } - - cm.state.pasteIncoming = +new Date; - input.fastPoll(); - }); - - function prepareCopyCut(e) { - if (signalDOMEvent(cm, e)) { return } - if (cm.somethingSelected()) { - setLastCopied({lineWise: false, text: cm.getSelections()}); - } else if (!cm.options.lineWiseCopyCut) { - return - } else { - var ranges = copyableRanges(cm); - setLastCopied({lineWise: true, text: ranges.text}); - if (e.type == "cut") { - cm.setSelections(ranges.ranges, null, sel_dontScroll); - } else { - input.prevInput = ""; - te.value = ranges.text.join("\n"); - selectInput(te); - } - } - if (e.type == "cut") { cm.state.cutIncoming = +new Date; } - } - on(te, "cut", prepareCopyCut); - on(te, "copy", prepareCopyCut); - - on(display.scroller, "paste", function (e) { - if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } - if (!te.dispatchEvent) { - cm.state.pasteIncoming = +new Date; - input.focus(); - return - } - - // Pass the `paste` event to the textarea so it's handled by its event listener. - var event = new Event("paste"); - event.clipboardData = e.clipboardData; - te.dispatchEvent(event); - }); - - // Prevent normal selection in the editor (we handle our own) - on(display.lineSpace, "selectstart", function (e) { - if (!eventInWidget(display, e)) { e_preventDefault(e); } - }); - - on(te, "compositionstart", function () { - var start = cm.getCursor("from"); - if (input.composing) { input.composing.range.clear(); } - input.composing = { - start: start, - range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) - }; - }); - on(te, "compositionend", function () { - if (input.composing) { - input.poll(); - input.composing.range.clear(); - input.composing = null; - } - }); - }; - - TextareaInput.prototype.createField = function (_display) { - // Wraps and hides input textarea - this.wrapper = hiddenTextarea(); - // The semihidden textarea that is focused when the editor is - // focused, and receives input. - this.textarea = this.wrapper.firstChild; - }; - - TextareaInput.prototype.prepareSelection = function () { - // Redraw the selection and/or cursor - var cm = this.cm, display = cm.display, doc = cm.doc; - var result = prepareSelection(cm); - - // Move the hidden textarea near the cursor to prevent scrolling artifacts - if (cm.options.moveInputWithCursor) { - var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); - var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); - result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, - headPos.top + lineOff.top - wrapOff.top)); - result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, - headPos.left + lineOff.left - wrapOff.left)); - } - - return result - }; - - TextareaInput.prototype.showSelection = function (drawn) { - var cm = this.cm, display = cm.display; - removeChildrenAndAdd(display.cursorDiv, drawn.cursors); - removeChildrenAndAdd(display.selectionDiv, drawn.selection); - if (drawn.teTop != null) { - this.wrapper.style.top = drawn.teTop + "px"; - this.wrapper.style.left = drawn.teLeft + "px"; - } - }; - - // Reset the input to correspond to the selection (or to be empty, - // when not typing and nothing is selected) - TextareaInput.prototype.reset = function (typing) { - if (this.contextMenuPending || this.composing) { return } - var cm = this.cm; - if (cm.somethingSelected()) { - this.prevInput = ""; - var content = cm.getSelection(); - this.textarea.value = content; - if (cm.state.focused) { selectInput(this.textarea); } - if (ie && ie_version >= 9) { this.hasSelection = content; } - } else if (!typing) { - this.prevInput = this.textarea.value = ""; - if (ie && ie_version >= 9) { this.hasSelection = null; } - } - }; - - TextareaInput.prototype.getField = function () { return this.textarea }; - - TextareaInput.prototype.supportsTouch = function () { return false }; - - TextareaInput.prototype.focus = function () { - if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { - try { this.textarea.focus(); } - catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM - } - }; - - TextareaInput.prototype.blur = function () { this.textarea.blur(); }; - - TextareaInput.prototype.resetPosition = function () { - this.wrapper.style.top = this.wrapper.style.left = 0; - }; - - TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); }; - - // Poll for input changes, using the normal rate of polling. This - // runs as long as the editor is focused. - TextareaInput.prototype.slowPoll = function () { - var this$1 = this; - - if (this.pollingFast) { return } - this.polling.set(this.cm.options.pollInterval, function () { - this$1.poll(); - if (this$1.cm.state.focused) { this$1.slowPoll(); } - }); - }; - - // When an event has just come in that is likely to add or change - // something in the input textarea, we poll faster, to ensure that - // the change appears on the screen quickly. - TextareaInput.prototype.fastPoll = function () { - var missed = false, input = this; - input.pollingFast = true; - function p() { - var changed = input.poll(); - if (!changed && !missed) {missed = true; input.polling.set(60, p);} - else {input.pollingFast = false; input.slowPoll();} - } - input.polling.set(20, p); - }; - - // Read input from the textarea, and update the document to match. - // When something is selected, it is present in the textarea, and - // selected (unless it is huge, in which case a placeholder is - // used). When nothing is selected, the cursor sits after previously - // seen text (can be empty), which is stored in prevInput (we must - // not reset the textarea when typing, because that breaks IME). - TextareaInput.prototype.poll = function () { - var this$1 = this; - - var cm = this.cm, input = this.textarea, prevInput = this.prevInput; - // Since this is called a *lot*, try to bail out as cheaply as - // possible when it is clear that nothing happened. hasSelection - // will be the case when there is a lot of text in the textarea, - // in which case reading its value would be expensive. - if (this.contextMenuPending || !cm.state.focused || - (hasSelection(input) && !prevInput && !this.composing) || - cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) - { return false } - - var text = input.value; - // If nothing changed, bail. - if (text == prevInput && !cm.somethingSelected()) { return false } - // Work around nonsensical selection resetting in IE9/10, and - // inexplicable appearance of private area unicode characters on - // some key combos in Mac (#2689). - if (ie && ie_version >= 9 && this.hasSelection === text || - mac && /[\uf700-\uf7ff]/.test(text)) { - cm.display.input.reset(); - return false - } - - if (cm.doc.sel == cm.display.selForContextMenu) { - var first = text.charCodeAt(0); - if (first == 0x200b && !prevInput) { prevInput = "\u200b"; } - if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } - } - // Find the part of the input that is actually new - var same = 0, l = Math.min(prevInput.length, text.length); - while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; } - - runInOp(cm, function () { - applyTextInput(cm, text.slice(same), prevInput.length - same, - null, this$1.composing ? "*compose" : null); - - // Don't leave long text in the textarea, since it makes further polling slow - if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; } - else { this$1.prevInput = text; } - - if (this$1.composing) { - this$1.composing.range.clear(); - this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), - {className: "CodeMirror-composing"}); - } - }); - return true - }; - - TextareaInput.prototype.ensurePolled = function () { - if (this.pollingFast && this.poll()) { this.pollingFast = false; } - }; - - TextareaInput.prototype.onKeyPress = function () { - if (ie && ie_version >= 9) { this.hasSelection = null; } - this.fastPoll(); - }; - - TextareaInput.prototype.onContextMenu = function (e) { - var input = this, cm = input.cm, display = cm.display, te = input.textarea; - if (input.contextMenuPending) { input.contextMenuPending(); } - var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; - if (!pos || presto) { return } // Opera is difficult. - - // Reset the current text selection only if the click is done outside of the selection - // and 'resetSelectionOnContextMenu' option is true. - var reset = cm.options.resetSelectionOnContextMenu; - if (reset && cm.doc.sel.contains(pos) == -1) - { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); } - - var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; - var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); - input.wrapper.style.cssText = "position: static"; - te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; - var oldScrollY; - if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712) - display.input.focus(); - if (webkit) { window.scrollTo(null, oldScrollY); } - display.input.reset(); - // Adds "Select all" to context menu in FF - if (!cm.somethingSelected()) { te.value = input.prevInput = " "; } - input.contextMenuPending = rehide; - display.selForContextMenu = cm.doc.sel; - clearTimeout(display.detectingSelectAll); - - // Select-all will be greyed out if there's nothing to select, so - // this adds a zero-width space so that we can later check whether - // it got selected. - function prepareSelectAllHack() { - if (te.selectionStart != null) { - var selected = cm.somethingSelected(); - var extval = "\u200b" + (selected ? te.value : ""); - te.value = "\u21da"; // Used to catch context-menu undo - te.value = extval; - input.prevInput = selected ? "" : "\u200b"; - te.selectionStart = 1; te.selectionEnd = extval.length; - // Re-set this, in case some other handler touched the - // selection in the meantime. - display.selForContextMenu = cm.doc.sel; - } - } - function rehide() { - if (input.contextMenuPending != rehide) { return } - input.contextMenuPending = false; - input.wrapper.style.cssText = oldWrapperCSS; - te.style.cssText = oldCSS; - if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); } - - // Try to detect the user choosing select-all - if (te.selectionStart != null) { - if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); } - var i = 0, poll = function () { - if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && - te.selectionEnd > 0 && input.prevInput == "\u200b") { - operation(cm, selectAll)(cm); - } else if (i++ < 10) { - display.detectingSelectAll = setTimeout(poll, 500); - } else { - display.selForContextMenu = null; - display.input.reset(); - } - }; - display.detectingSelectAll = setTimeout(poll, 200); - } - } - - if (ie && ie_version >= 9) { prepareSelectAllHack(); } - if (captureRightClick) { - e_stop(e); - var mouseup = function () { - off(window, "mouseup", mouseup); - setTimeout(rehide, 20); - }; - on(window, "mouseup", mouseup); - } else { - setTimeout(rehide, 50); - } - }; - - TextareaInput.prototype.readOnlyChanged = function (val) { - if (!val) { this.reset(); } - this.textarea.disabled = val == "nocursor"; - }; - - TextareaInput.prototype.setUneditable = function () {}; - - TextareaInput.prototype.needsContentAttribute = false; - - function fromTextArea(textarea, options) { - options = options ? copyObj(options) : {}; - options.value = textarea.value; - if (!options.tabindex && textarea.tabIndex) - { options.tabindex = textarea.tabIndex; } - if (!options.placeholder && textarea.placeholder) - { options.placeholder = textarea.placeholder; } - // Set autofocus to true if this textarea is focused, or if it has - // autofocus and no other element is focused. - if (options.autofocus == null) { - var hasFocus = activeElt(); - options.autofocus = hasFocus == textarea || - textarea.getAttribute("autofocus") != null && hasFocus == document.body; - } - - function save() {textarea.value = cm.getValue();} - - var realSubmit; - if (textarea.form) { - on(textarea.form, "submit", save); - // Deplorable hack to make the submit method do the right thing. - if (!options.leaveSubmitMethodAlone) { - var form = textarea.form; - realSubmit = form.submit; - try { - var wrappedSubmit = form.submit = function () { - save(); - form.submit = realSubmit; - form.submit(); - form.submit = wrappedSubmit; - }; - } catch(e) {} - } - } - - options.finishInit = function (cm) { - cm.save = save; - cm.getTextArea = function () { return textarea; }; - cm.toTextArea = function () { - cm.toTextArea = isNaN; // Prevent this from being ran twice - save(); - textarea.parentNode.removeChild(cm.getWrapperElement()); - textarea.style.display = ""; - if (textarea.form) { - off(textarea.form, "submit", save); - if (typeof textarea.form.submit == "function") - { textarea.form.submit = realSubmit; } - } - }; - }; - - textarea.style.display = "none"; - var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, - options); - return cm - } - - function addLegacyProps(CodeMirror) { - CodeMirror.off = off; - CodeMirror.on = on; - CodeMirror.wheelEventPixels = wheelEventPixels; - CodeMirror.Doc = Doc; - CodeMirror.splitLines = splitLinesAuto; - CodeMirror.countColumn = countColumn; - CodeMirror.findColumn = findColumn; - CodeMirror.isWordChar = isWordCharBasic; - CodeMirror.Pass = Pass; - CodeMirror.signal = signal; - CodeMirror.Line = Line; - CodeMirror.changeEnd = changeEnd; - CodeMirror.scrollbarModel = scrollbarModel; - CodeMirror.Pos = Pos; - CodeMirror.cmpPos = cmp; - CodeMirror.modes = modes; - CodeMirror.mimeModes = mimeModes; - CodeMirror.resolveMode = resolveMode; - CodeMirror.getMode = getMode; - CodeMirror.modeExtensions = modeExtensions; - CodeMirror.extendMode = extendMode; - CodeMirror.copyState = copyState; - CodeMirror.startState = startState; - CodeMirror.innerMode = innerMode; - CodeMirror.commands = commands; - CodeMirror.keyMap = keyMap; - CodeMirror.keyName = keyName; - CodeMirror.isModifierKey = isModifierKey; - CodeMirror.lookupKey = lookupKey; - CodeMirror.normalizeKeyMap = normalizeKeyMap; - CodeMirror.StringStream = StringStream; - CodeMirror.SharedTextMarker = SharedTextMarker; - CodeMirror.TextMarker = TextMarker; - CodeMirror.LineWidget = LineWidget; - CodeMirror.e_preventDefault = e_preventDefault; - CodeMirror.e_stopPropagation = e_stopPropagation; - CodeMirror.e_stop = e_stop; - CodeMirror.addClass = addClass; - CodeMirror.contains = contains; - CodeMirror.rmClass = rmClass; - CodeMirror.keyNames = keyNames; - } - - // EDITOR CONSTRUCTOR - - defineOptions(CodeMirror); - - addEditorMethods(CodeMirror); - - // Set up methods on CodeMirror's prototype to redirect to the editor's document. - var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); - for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) - { CodeMirror.prototype[prop] = (function(method) { - return function() {return method.apply(this.doc, arguments)} - })(Doc.prototype[prop]); } } - - eventMixin(Doc); - CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; - - // Extra arguments are stored as the mode's dependencies, which is - // used by (legacy) mechanisms like loadmode.js to automatically - // load a mode. (Preferred mechanism is the require/define calls.) - CodeMirror.defineMode = function(name/*, mode, …*/) { - if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; } - defineMode.apply(this, arguments); - }; - - CodeMirror.defineMIME = defineMIME; - - // Minimal default mode. - CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); - CodeMirror.defineMIME("text/plain", "null"); - - // EXTENSIONS - - CodeMirror.defineExtension = function (name, func) { - CodeMirror.prototype[name] = func; - }; - CodeMirror.defineDocExtension = function (name, func) { - Doc.prototype[name] = func; - }; - - CodeMirror.fromTextArea = fromTextArea; - - addLegacyProps(CodeMirror); - - CodeMirror.version = "5.48.4"; - - return CodeMirror; - -}))); diff --git a/spider/resources/static/js/codemirror/idea.css b/spider/resources/static/js/codemirror/idea.css deleted file mode 100644 index eab3671..0000000 --- a/spider/resources/static/js/codemirror/idea.css +++ /dev/null @@ -1,42 +0,0 @@ -/** - Name: IDEA default theme - From IntelliJ IDEA by JetBrains - */ - -.cm-s-idea span.cm-meta { color: #808000; } -.cm-s-idea span.cm-number { color: #0000FF; } -.cm-s-idea span.cm-keyword { line-height: 1em; font-weight: bold; color: #000080; } -.cm-s-idea span.cm-atom { font-weight: bold; color: #000080; } -.cm-s-idea span.cm-def { color: #000000; } -.cm-s-idea span.cm-variable { color: black; } -.cm-s-idea span.cm-variable-2 { color: black; } -.cm-s-idea span.cm-variable-3, .cm-s-idea span.cm-type { color: black; } -.cm-s-idea span.cm-property { color: black; } -.cm-s-idea span.cm-operator { color: black; } -.cm-s-idea span.cm-comment { color: #808080; } -.cm-s-idea span.cm-string { color: #008000; } -.cm-s-idea span.cm-string-2 { color: #008000; } -.cm-s-idea span.cm-qualifier { color: #555; } -.cm-s-idea span.cm-error { color: #FF0000; } -.cm-s-idea span.cm-attribute { color: #0000FF; } -.cm-s-idea span.cm-tag { color: #000080; } -.cm-s-idea span.cm-link { color: #0000FF; } -.cm-s-idea .CodeMirror-activeline-background { background: #FFFAE3; } - -.cm-s-idea span.cm-builtin { color: #30a; } -.cm-s-idea span.cm-bracket { color: #cc7; } -.cm-s-idea { font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;} - - -.cm-s-idea .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } - -.CodeMirror-hints.idea { - font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; - color: #616569; - background-color: #ebf3fd !important; -} - -.CodeMirror-hints.idea .CodeMirror-hint-active { - background-color: #a2b8c9 !important; - color: #5c6065 !important; -} \ No newline at end of file diff --git a/spider/resources/static/js/codemirror/placeholder.js b/spider/resources/static/js/codemirror/placeholder.js deleted file mode 100644 index e3f95a4..0000000 --- a/spider/resources/static/js/codemirror/placeholder.js +++ /dev/null @@ -1,63 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: https://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - CodeMirror.defineOption("placeholder", "", function(cm, val, old) { - var prev = old && old != CodeMirror.Init; - if (val && !prev) { - cm.on("blur", onBlur); - cm.on("change", onChange); - cm.on("swapDoc", onChange); - onChange(cm); - } else if (!val && prev) { - cm.off("blur", onBlur); - cm.off("change", onChange); - cm.off("swapDoc", onChange); - clearPlaceholder(cm); - var wrapper = cm.getWrapperElement(); - wrapper.className = wrapper.className.replace(" CodeMirror-empty", ""); - } - - if (val && !cm.hasFocus()) onBlur(cm); - }); - - function clearPlaceholder(cm) { - if (cm.state.placeholder) { - cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); - cm.state.placeholder = null; - } - } - function setPlaceholder(cm) { - clearPlaceholder(cm); - var elt = cm.state.placeholder = document.createElement("pre"); - elt.style.cssText = "height: 0; overflow: visible"; - elt.style.direction = cm.getOption("direction"); - elt.className = "CodeMirror-placeholder CodeMirror-line-like"; - var placeHolder = cm.getOption("placeholder") - if (typeof placeHolder == "string") placeHolder = document.createTextNode(placeHolder) - elt.appendChild(placeHolder) - cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); - } - - function onBlur(cm) { - if (isEmpty(cm)) setPlaceholder(cm); - } - function onChange(cm) { - var wrapper = cm.getWrapperElement(), empty = isEmpty(cm); - wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : ""); - - if (empty) setPlaceholder(cm); - else clearPlaceholder(cm); - } - - function isEmpty(cm) { - return (cm.lineCount() === 1) && (cm.getLine(0) === ""); - } -}); \ No newline at end of file diff --git a/spider/resources/static/js/codemirror/show-hint.css b/spider/resources/static/js/codemirror/show-hint.css deleted file mode 100644 index 0e817a1..0000000 --- a/spider/resources/static/js/codemirror/show-hint.css +++ /dev/null @@ -1,36 +0,0 @@ -.CodeMirror-hints { - position: absolute; - z-index: 214483647; - /*overflow: hidden;*/ - list-style: none; - - margin: 0; - padding: 2px; - - -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); - -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); - box-shadow: 2px 3px 5px rgba(0,0,0,.2); - border-radius: 3px; - border: 1px solid silver; - - background: white; - font-size: 90%; - font-family: monospace; - - max-height: 20em; - overflow-y: auto; -} - -.CodeMirror-hint { - margin: 0; - padding: 0 4px; - border-radius: 2px; - /*white-space: pre;*/ - color: black; - cursor: pointer; -} - -li.CodeMirror-hint-active { - background: #08f; - color: white; -} diff --git a/spider/resources/static/js/codemirror/show-hint.js b/spider/resources/static/js/codemirror/show-hint.js deleted file mode 100644 index 48bd869..0000000 --- a/spider/resources/static/js/codemirror/show-hint.js +++ /dev/null @@ -1,744 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - var HINT_ELEMENT_CLASS = "CodeMirror-hint"; - var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active"; - - // This is the old interface, kept around for now to stay - // backwards-compatible. - CodeMirror.showHint = function(cm, getHints, options) { - if (!getHints) return cm.showHint(options); - if (options && options.async) getHints.async = true; - var newOpts = {hint: getHints}; - if (options) for (var prop in options) newOpts[prop] = options[prop]; - return cm.showHint(newOpts); - }; - - CodeMirror.defineExtension("showHint", function(options) { - options = parseOptions(this, this.getCursor("start"), options); - var selections = this.listSelections() - if (selections.length > 1) return; - // By default, don't allow completion when something is selected. - // A hint function can have a `supportsSelection` property to - // indicate that it can handle selections. - if (this.somethingSelected()) { - if (!options.hint.supportsSelection) return; - // Don't try with cross-line selections - for (var i = 0; i < selections.length; i++) - if (selections[i].head.line != selections[i].anchor.line) return; - } - - if (this.state.completionActive) this.state.completionActive.close(); - var completion = this.state.completionActive = new Completion(this, options); - if (!completion.options.hint) return; - - CodeMirror.signal(this, "startCompletion", this); - completion.update(true); - }); - CodeMirror.defineExtension("showHint1", function(options,datas) { - options = parseOptions(this, this.getCursor("start"), options); - var selections = this.listSelections() - if (selections.length > 1) return; - // By default, don't allow completion when something is selected. - // A hint function can have a `supportsSelection` property to - // indicate that it can handle selections. - if (this.somethingSelected()) { - if (!options.hint.supportsSelection) return; - // Don't try with cross-line selections - for (var i = 0; i < selections.length; i++) - if (selections[i].head.line != selections[i].anchor.line) return; - } - if (this.state.completionActive) this.state.completionActive.close(); - var completion = this.state.completionActive = new Completion(this, options); - if (!completion.options.hint) return; - - CodeMirror.signal(this, "startCompletion", this); - completion.update1(true,datas); - }); - function Completion(cm, options) { - this.cm = cm; - this.options = options; - this.widget = null; - this.comments = this.options.comments; - //this.widget1 = null; - this.debounce = 0; - this.tick = 0; - this.startPos = this.cm.getCursor("start"); - this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length; - - var self = this; - cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); }); - } - - var requestAnimationFrame = window.requestAnimationFrame || function(fn) { - return setTimeout(fn, 1000/60); - }; - var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; - - Completion.prototype = { - close: function() { - if (!this.active()) return; - this.cm.state.completionActive = null; - this.tick = null; - this.cm.off("cursorActivity", this.activityFunc); - - if (this.widget && this.data) CodeMirror.signal(this.data, "close"); - if (this.widget) { - this.widget.close(); - } - CodeMirror.signal(this.cm, "endCompletion", this.cm); - }, - - active: function() { - return this.cm.state.completionActive == this; - }, - - pick: function(data, i) { - var completion = data.list[i]; - if (completion.hint) completion.hint(this.cm, data, completion); - else this.cm.replaceRange(getText(completion), completion.from || data.from, - completion.to || data.to, "complete"); - CodeMirror.signal(data, "pick", completion); - this.close(); - }, - - cursorActivity: function() { - if (this.debounce) { - cancelAnimationFrame(this.debounce); - this.debounce = 0; - } - - var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line); - if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch || - pos.ch < this.startPos.ch || this.cm.somethingSelected() || - (pos.ch && this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) { - this.close(); - } else { - var self = this; - this.debounce = requestAnimationFrame(function() {self.update();}); - if (this.widget) - { - this.widget.disable(); - } - - } - }, - - update: function(first) { - if (this.tick == null) return; - if (!this.options.hint.async) { - this.finishUpdate(this.options.hint(this.cm, this.options), first); - } else { - var myTick = ++this.tick, self = this; - this.options.hint(this.cm, function(data) { - if (self.tick == myTick) self.finishUpdate(data, first); - }, this.options); - } - }, - update1: function(first,datas) { - if (this.tick == null) return; - if (!this.options.hint.async) { - // - //datas = JSON.parse(datas); - this.finishUpdate1(datas, first); - } else { - var myTick = ++this.tick, self = this; - this.options.hint(this.cm, function(data) { - if (self.tick == myTick) self.finishUpdate(data, first); - }, this.options); - } - }, - finishUpdate1: function(data, first) { - if (this.data) - { - CodeMirror.signal(this.data, "update"); - } - - var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle); - if (this.widget) - { - this.widget.close(); - } - if (data && this.data && isNewCompletion(this.data, data)) - { - return; - } - this.data = data; - - - if (data && data.list.length) { - if (picked && data.list.length == 1) { - - this.pick(data, 0); - } else { - this.widget = new Widget1(this, data,this.comments); - CodeMirror.signal(data, "shown"); - } - } - }, - finishUpdate: function(data, first) { - if (this.data) - { - CodeMirror.signal(this.data, "update"); - } - - var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle); - if (this.widget) - { - this.widget.close(); - } - - if (data && this.data && isNewCompletion(this.data, data)) - { - return; - } - this.data = data; - - - if (data && data.list.length) { - if (picked && data.list.length == 1) { - this.pick(data, 0); - } else { - this.widget = new Widget(this, data); - CodeMirror.signal(data, "shown"); - } - } - } - }; - - function isNewCompletion(old, nw) { - var moved = CodeMirror.cmpPos(nw.from, old.from) - return moved > 0 && old.to.ch - old.from.ch != nw.to.ch - nw.from.ch - } - - function parseOptions(cm, pos, options) { - var editor = cm.options.hintOptions; - var out = {}; - for (var prop in defaultOptions) out[prop] = defaultOptions[prop]; - if (editor) for (var prop in editor) - if (editor[prop] !== undefined) out[prop] = editor[prop]; - if (options) for (var prop in options) - if (options[prop] !== undefined) out[prop] = options[prop]; - if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos) - return out; - } - - function getText(completion) { - if (typeof completion == "string") return completion; - else return completion.text; - } - - function buildKeyMap(completion, handle) { - var baseMap = { - Up: function() {handle.moveFocus(-1);}, - Down: function() {handle.moveFocus(1);}, - PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);}, - PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);}, - Home: function() {handle.setFocus(0);}, - End: function() {handle.setFocus(handle.length - 1);}, - Enter: handle.pick, - Tab: handle.pick, - Esc: handle.close - }; - var custom = completion.options.customKeys; - var ourMap = custom ? {} : baseMap; - function addBinding(key, val) { - var bound; - if (typeof val != "string") - bound = function(cm) { return val(cm, handle); }; - // This mechanism is deprecated - else if (baseMap.hasOwnProperty(val)) - bound = baseMap[val]; - else - bound = val; - ourMap[key] = bound; - } - if (custom) - for (var key in custom) if (custom.hasOwnProperty(key)) - addBinding(key, custom[key]); - var extra = completion.options.extraKeys; - if (extra) - for (var key in extra) if (extra.hasOwnProperty(key)) - addBinding(key, extra[key]); - return ourMap; - } - - function getHintElement(hintsElement, el) { - while (el && el != hintsElement) { - if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el; - el = el.parentNode; - } - } - function Widget1(completion, data,comments) { - this.completion = completion; - this.data = data; - this.comments = comments; - this.picked = false; - var widget = this, cm = completion.cm; - var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); - var hints = this.hints = document.createElement("ul"); - var hints2 = this.hints2 = document.createElement("ul"); - //文档说明提示框 - var completions = data.list; - hints.className = "CodeMirror-hints"; - this.selectedHint = data.selectedHint || 0; - - var completions = data.list; - for (var i = 0; i < completions.length; ++i) { - var cur = completions[i]; - if(!cur){ - continue; - } - var elt = hints.appendChild(document.createElement("li")); - var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); - if (cur.className != null) className = cur.className + " " + className; - elt.className = className; - if (cur.render) cur.render(elt, data, cur); - else elt.appendChild(document.createTextNode(cur.displayText || getText(cur))); - elt.hintId = i; - } - - var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); - var left = pos.left, top = pos.bottom, below = true; - hints.style.left = left + "px"; - hints.style.top = top + "px"; - - - // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. - // var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); - var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight); - (completion.options.container || document.body).appendChild(hints); - var hintsWidth = 0; - var box = hints.getBoundingClientRect(); - var overlapY = box.bottom - winH; - if (overlapY > 0) { - var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top); - if (curTop - height > 0) { // Fits above cursor - hints.style.top = (top = pos.top - height) + "px"; - hints2.style.top = (top = pos.top - height) + "px"; - below = false; - } else if (height > winH) { - hints.style.height = (winH - 5) + "px"; - hints.style.top = (top = pos.bottom - box.top) + "px"; - hints2.style.top = (top = pos.bottom - box.top) + "px"; - var cursor = cm.getCursor(); - if (data.from.ch != cursor.ch) { - pos = cm.cursorCoords(cursor); - hints.style.left = (left = pos.left) + "px"; - box = hints.getBoundingClientRect(); - } - } - } - hintsWidth = box.width; - var overlapX = box.right - winW; - if (overlapX > 0) { - if (box.right - box.left > winW) { - hints.style.width = (winW - 5) + "px"; - overlapX -= (box.right - box.left) - winW; - hintsWidth = minW - 5; - } - hints.style.left = (left = pos.left - overlapX) + "px"; - } - - try{ - hints2.className = "CodeMirror-hints"; - - var elt = hints2.appendChild(document.createElement("li")), cur = completions[0]; - var key = data.key; - var index = 0; - if(typeof(key) != "undefined"){ - var showList = data.showList; - index = showList[0]; - if (cur.render) cur.render(elt, data, cur); - else elt.innerHTML = comments[key][index] || ''; - elt.hintId = i; - var left = hints.style.left; - left = Number(left.substring(0,left.length-2)); - var top = hints.style.top; - top = Number(top.substring(0,top.length-2)); - if(document.documentElement.clientWidth - left < 210){ - left = left - 207; - }else{ - left = left + hintsWidth; - } - hints2.style.left = left + "px"; - hints2.style.height = 200 + "px"; - hints2.style.width = 200 + "px"; - hints2.style.top = top + "px"; - (completion.options.container || document.body).appendChild(hints2); - } - }catch(e) - { - } - - - cm.addKeyMap(this.keyMap = buildKeyMap(completion, { - moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); }, - setFocus: function(n) { widget.changeActive(n); }, - menuSize: function() { return widget.screenAmount(); }, - length: completions.length, - close: function() { completion.close(); }, - pick: function() { widget.pick(); }, - data: data - })); - - if (completion.options.closeOnUnfocus) { - var closingOnBlur; - cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); }); - cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); }); - } - - var startScroll = cm.getScrollInfo(); - cm.on("scroll", this.onScroll = function() { - var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect(); - var newTop = top + startScroll.top - curScroll.top; - var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop); - if (!below) point += hints.offsetHeight; - if (point <= editor.top || point >= editor.bottom) return completion.close(); - hints.style.top = newTop + "px"; - hints.style.left = (left + startScroll.left - curScroll.left) + "px"; - }); - CodeMirror.on(hints, "dblclick", function(e) { - var t = getHintElement(hints, e.target || e.srcElement); - if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();} - }); - - CodeMirror.on(hints, "click", function(e) { - var t = getHintElement(hints, e.target || e.srcElement); - if (t && t.hintId != null) { - widget.changeActive(t.hintId); - if (completion.options.completeOnSingleClick) widget.pick(); - } - }); - - CodeMirror.on(hints, "mousedown", function() { - setTimeout(function(){cm.focus();}, 20); - }); - - CodeMirror.signal(data, "select", completions[0], hints.firstChild); - return true; - } - function Widget(completion, data) { - this.completion = completion; - this.data = data; - this.picked = false; - var widget = this, cm = completion.cm; - - var hints = this.hints = document.createElement("ul"); - hints.className = "CodeMirror-hints"; - this.selectedHint = data.selectedHint || 0; - - var completions = data.list; - for (var i = 0; i < completions.length; ++i) { - var elt = hints.appendChild(document.createElement("li")), cur = completions[i]; - var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); - if (cur.className != null) className = cur.className + " " + className; - elt.className = className; - if (cur.render) cur.render(elt, data, cur); - else elt.appendChild(document.createTextNode(cur.displayText || getText(cur))); - elt.hintId = i; - } - - var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); - var left = pos.left, top = pos.bottom, below = true; - hints.style.left = left + "px"; - hints.style.top = top + "px"; - - // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. - var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); - var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight); - (completion.options.container || document.body).appendChild(hints); - var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH; - if (overlapY > 0) { - var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top); - if (curTop - height > 0) { // Fits above cursor - hints.style.top = (top = pos.top - height) + "px"; - below = false; - } else if (height > winH) { - hints.style.height = (winH - 5) + "px"; - hints.style.top = (top = pos.bottom - box.top) + "px"; - var cursor = cm.getCursor(); - if (data.from.ch != cursor.ch) { - pos = cm.cursorCoords(cursor); - hints.style.left = (left = pos.left) + "px"; - box = hints.getBoundingClientRect(); - } - } - } - var overlapX = box.right - winW; - if (overlapX > 0) { - if (box.right - box.left > winW) { - hints.style.width = (winW - 5) + "px"; - overlapX -= (box.right - box.left) - winW; - } - hints.style.left = (left = pos.left - overlapX) + "px"; - } - - cm.addKeyMap(this.keyMap = buildKeyMap(completion, { - moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); }, - setFocus: function(n) { widget.changeActive(n); }, - menuSize: function() { return widget.screenAmount(); }, - length: completions.length, - close: function() { completion.close(); }, - pick: function() { widget.pick(); }, - data: data - })); - - if (completion.options.closeOnUnfocus) { - var closingOnBlur; - cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); }); - cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); }); - } - - var startScroll = cm.getScrollInfo(); - cm.on("scroll", this.onScroll = function() { - var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect(); - var newTop = top + startScroll.top - curScroll.top; - var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop); - if (!below) point += hints.offsetHeight; - if (point <= editor.top || point >= editor.bottom) return completion.close(); - hints.style.top = newTop + "px"; - hints.style.left = (left + startScroll.left - curScroll.left) + "px"; - }); - - CodeMirror.on(hints, "dblclick", function(e) { - var t = getHintElement(hints, e.target || e.srcElement); - if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();} - }); - - CodeMirror.on(hints, "click", function(e) { - var t = getHintElement(hints, e.target || e.srcElement); - if (t && t.hintId != null) { - widget.changeActive(t.hintId); - if (completion.options.completeOnSingleClick) widget.pick(); - } - }); - - CodeMirror.on(hints, "mousedown", function() { - setTimeout(function(){cm.focus();}, 20); - }); - - CodeMirror.signal(data, "select", completions[0], hints.firstChild); - return true; - } - Widget.prototype = { - close: function() { - if (this.completion.widget != this) return; - this.completion.widget = null; - this.hints.parentNode.removeChild(this.hints); - try{ - this.hints2.parentNode.removeChild(this.hints2);//此处消失 - }catch(e){ - - } - this.completion.cm.removeKeyMap(this.keyMap); - - var cm = this.completion.cm; - if (this.completion.options.closeOnUnfocus) { - cm.off("blur", this.onBlur); - cm.off("focus", this.onFocus); - } - cm.off("scroll", this.onScroll); - }, - - disable: function() { - this.completion.cm.removeKeyMap(this.keyMap); - var widget = this; - this.keyMap = {Enter: function() { widget.picked = true; }}; - this.completion.cm.addKeyMap(this.keyMap); - }, - - pick: function() { - this.completion.pick(this.data, this.selectedHint); - }, - - changeActive: function(i, avoidWrap) { - if (i >= this.data.list.length) - i = avoidWrap ? this.data.list.length - 1 : 0; - else if (i < 0) - i = avoidWrap ? 0 : this.data.list.length - 1; - if (this.selectedHint == i) return; - var node = this.hints.childNodes[this.selectedHint]; - node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); - node = this.hints.childNodes[this.selectedHint = i]; - node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; - if (node.offsetTop < this.hints.scrollTop) - this.hints.scrollTop = node.offsetTop - 3; - else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) - this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3; - CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); - }, - - screenAmount: function() { - return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; - } - }; - Widget1.prototype = { - close: function() { - if (this.completion.widget != this) return; - this.completion.widget = null; - this.hints.parentNode.removeChild(this.hints); - try{ - this.hints2.parentNode.removeChild(this.hints2);//此处消失 - }catch(e){ - - } - this.completion.cm.removeKeyMap(this.keyMap); - var cm = this.completion.cm; - if (this.completion.options.closeOnUnfocus) { - cm.off("blur", this.onBlur); - cm.off("focus", this.onFocus); - } - cm.off("scroll", this.onScroll); - }, - - disable: function() { - this.completion.cm.removeKeyMap(this.keyMap); - var widget = this; - this.keyMap = {Enter: function() { widget.picked = true; }}; - this.completion.cm.addKeyMap(this.keyMap); - }, - - pick: function() { - this.completion.pick(this.data, this.selectedHint); - }, - - changeActive: function(i, avoidWrap) { - if (i >= this.hints.childNodes.length) - i = avoidWrap ? this.hints.childNodes.length - 1 : 0; - else if (i < 0) - i = avoidWrap ? 0 : this.hints.childNodes.length - 1; - try{ - - this.hints2.innerHTML = ""; - var key = this.data.key; - var index = i; - if(typeof(key) != "undefined"){ - var showList = this.data.showList; - index = showList[i]; - var elt = this.hints2.appendChild(document.createElement("li")); - elt.innerHTML = this.comments[key][index] || ''; - } - }catch(e){ - - } - if (this.selectedHint == i) return; - var node = this.hints.childNodes[this.selectedHint]; - //if(!node) return; - node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); - node = this.hints.childNodes[this.selectedHint = i]; - //if(!node) return; - node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; - if (node.offsetTop < this.hints.scrollTop) - this.hints.scrollTop = node.offsetTop - 3; - else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) - this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3; - CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); - }, - - screenAmount: function() { - return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; - } - }; - - function applicableHelpers(cm, helpers) { - if (!cm.somethingSelected()) return helpers - var result = [] - for (var i = 0; i < helpers.length; i++) - if (helpers[i].supportsSelection) result.push(helpers[i]) - return result - } - - function resolveAutoHints(cm, pos) { - var helpers = cm.getHelpers(pos, "hint"), words - if (helpers.length) { - var async = false, resolved - for (var i = 0; i < helpers.length; i++) if (helpers[i].async) async = true - if (async) { - resolved = function(cm, callback, options) { - var app = applicableHelpers(cm, helpers) - function run(i, result) { - if (i == app.length) return callback(null) - var helper = app[i] - if (helper.async) { - helper(cm, function(result) { - if (result) callback(result) - else run(i + 1) - }, options) - } else { - var result = helper(cm, options) - if (result) callback(result) - else run(i + 1) - } - } - run(0) - } - resolved.async = true - } else { - resolved = function(cm, options) { - var app = applicableHelpers(cm, helpers) - for (var i = 0; i < app.length; i++) { - var cur = app[i](cm, options) - if (cur && cur.list.length) return cur - } - } - } - resolved.supportsSelection = true - return resolved - } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) { - return function(cm) { return CodeMirror.hint.fromList(cm, {words: words}) } - } else if (CodeMirror.hint.anyword) { - return function(cm, options) { return CodeMirror.hint.anyword(cm, options) } - } else { - return function() {} - } - } - - CodeMirror.registerHelper("hint", "auto", { - resolve: resolveAutoHints - }); - - CodeMirror.registerHelper("hint", "fromList", function(cm, options) { - var cur = cm.getCursor(), token = cm.getTokenAt(cur); - var to = CodeMirror.Pos(cur.line, token.end); - if (token.string && /\w/.test(token.string[token.string.length - 1])) { - var term = token.string, from = CodeMirror.Pos(cur.line, token.start); - } else { - var term = "", from = to; - } - var found = []; - for (var i = 0; i < options.words.length; i++) { - var word = options.words[i]; - if (word.slice(0, term.length) == term) - found.push(word); - } - - if (found.length) return {list: found, from: from, to: to}; - }); - - CodeMirror.commands.autocomplete = CodeMirror.showHint; - - var defaultOptions = { - hint: CodeMirror.hint.auto, - completeSingle: true, - alignWithWord: true, - closeCharacters: /[\s()\[\]{};:>,]/, - closeOnUnfocus: true, - completeOnSingleClick: true, - container: null, - customKeys: null, - extraKeys: null - }; - - CodeMirror.defineOption("hintOptions", null); -}); \ No newline at end of file diff --git a/spider/resources/static/js/codemirror/spiderflow-hint.js b/spider/resources/static/js/codemirror/spiderflow-hint.js deleted file mode 100644 index 49676a9..0000000 --- a/spider/resources/static/js/codemirror/spiderflow-hint.js +++ /dev/null @@ -1,131 +0,0 @@ -var grammers = []; -$.ajax({ - url : 'spider/grammers', - type : 'post', - dataType : 'json', - success : function(json){ - if(json.code == 1){ - grammers = json.data; - for(var i =0,len = grammers.length;i 3&&grammer.method.indexOf("get") == 0){ - grammer.method = grammer.method.substring(3,4).toLowerCase() + grammer.method.substring(4); - }else if(grammer&&grammer.method){ - grammer.method = grammer.method + '()'; - } - } - } - grammers = grammers || []; - } -}) -function searchGrammer(keyword,isClass){ - var list1 = []; - var list2 = {}; - for(var i =0,len = grammers.length;i -1))){ - list1.push(grammer.method); - list2[grammer.method] = list2[grammer.method] || []; - list2[grammer.method].push(grammer); - }else if(keyword == null || (grammer['function']&&grammer['function'].indexOf(keyword) > -1)){ - if(grammer['function']&&grammer.method == null){ - list1.push(grammer['function']); - list2[grammer['function']] = list2[grammer['function']] || []; - list2[grammer['function']][0] = {owner:grammer.owner,comment : grammer.comment}; - } - } - } - list1 = list1.sort(); - var set = []; - if(list1.length > 0){ - set.push(list1[0]); - } - for (var i=1, len=list1.length; i'; - } - if(grammer.comment){ - html+= '
    说明:'+grammer.comment.replace('<','<')+'
    '; - } - if(grammer.example){ - html+= '
    '+grammer.example.replace('<','<')+'
    '; - } - if(grammer.returns){ - html+= '
    返回值:'+grammer.returns.join("/").replace('<','<')+'
    '; - } - html+= ''; - } - list2[key] = html; - } - return [set,list2]; -} -function initHint(cm){ - cm.on('keyup',function(cm,e){ - if(e.keyCode ==38 || e.keyCode ==40 || e.keyCode == 13){ - return; - } - var cur = cm.getCursor(); - var ch = cur.ch; - var token = cm.getTokenAt(cur); - var curLine = cm.getLine(cur.line); - var str1 = curLine.charAt(cur.ch - 1); - var str2 = curLine.charAt(cur.ch - 2); - if((str1=='{' &&str2=='$')){ - var ret = searchGrammer(null,true); - var datas = {}; - datas.list = ret[0]; - datas.from = {}; - datas.from.line = cur.line; - datas.from.ch = ch; - datas.to = {}; - datas.to.line = cur.line; - datas.to.ch = ch; - datas.showList = ret[0]; - datas.key = '.'; - cm.showHint1({completeSingle: false,comments : {'.':ret[1]}},datas); - }if(str1 == '.'){ - var ret = searchGrammer(null); - var datas = {}; - datas.list = ret[0]; - datas.from = {}; - datas.from.line = cur.line; - datas.from.ch = ch; - datas.to = {}; - datas.to.line = cur.line; - datas.to.ch = ch; - datas.showList = ret[0]; - datas.key = '.'; - cm.showHint1({completeSingle: false,comments : {'.':ret[1]}},datas); - }else{ - var regx = /(\w+)$/g; - var line = curLine.substring(0,cur.ch); - var keyword = regx.exec(line); - if(keyword&&keyword[1]){ - keyword = keyword[1]; - var ret = searchGrammer(keyword); - var datas = {}; - datas.list = ret[0]; - datas.from = {}; - datas.from.line = cur.line; - datas.from.ch = token.start; - datas.to = {}; - datas.to.line = cur.line; - datas.to.ch = token.end; - datas.showList = ret[0]; - datas.key = keyword; - var comments = {}; - comments[keyword] = ret[1]; - cm.showHint1({completeSingle: false,comments : comments},datas); - } - - } - }) -} \ No newline at end of file diff --git a/spider/resources/static/js/codemirror/spiderflow.js b/spider/resources/static/js/codemirror/spiderflow.js deleted file mode 100644 index 4dd7726..0000000 --- a/spider/resources/static/js/codemirror/spiderflow.js +++ /dev/null @@ -1,286 +0,0 @@ -/** - * freemarker - */ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object" ) // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd ) // AMD - define([ "../../lib/codemirror" ], mod); - else - // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("spiderflow", function(config) { - "use strict"; - - // our default settings; check to see if they're overridden - var settings = { - leftDelimiter : '<', rightDelimiter : '>', tagSyntax : 1 - // 1 angle_bracket,2 square_bracket - }; - if (config.hasOwnProperty("tagSyntax") ) { - if (config.tagSyntax === 2 ) { - settings.tagSyntax = 2; - settings.leftDelimiter = '['; - settings.rightDelimiter = ']'; - } - } - - var keyFunctions = [ "assign", "attempt", "autoesc", "break", "case", "compress", "default", "else", - "elseif", "escape", "fallback", "function", "flush", "ftl", "global", "if", "import", - "include", "items", "list", "local", "lt", "macro", "nested","noautoesc", "noescape", "noparse", "nt","outputformat", - "recover", "recurse", "return", "rt", "sep", "setting", "stop", "switch", "t", "visit" ]; - var specialVariables = [ "auto_esc" , "current_template_name", "data_model", "error", "globals", "lang", "locale", - "locale_object", "locals", "main", "main_template_name", "namespace", "node", "now", - "output_encoding " , "output_format" , "template_name", "url_escaping_charset", "vars", "version" ]; - - var freemarkerStartTagArray = [ "#", "@" ]; - - var freemarkerEndTagArray = [ "/#", "/@", "/>" ]; - - var last; - var freemarkerMode; - var regs = { - operatorChars : /[+\-*&%=<>!?:;,|&]/, validIdentifier : /[a-zA-Z0-9_]/, stringChar : /['"]/ - }; - - var helpers = { - cont : function(style, lastType, lastFreemarkerMode) { - last = lastType; - freemarkerMode = lastFreemarkerMode; - return style; - }, chain : function(stream, state, parser) { - state.tokenize = parser; - return parser(stream, state); - } - }; - - // our various parsers - var parsers = { - - // the main tokenizer - tokenizer : function(stream, state) { - if (stream.match(settings.leftDelimiter, true) ) { - if (stream.match("#--", true) ) { - return helpers.chain(stream, state, parsers.inBlock("comment", "--" - + settings.rightDelimiter)); - } else { - for (var i = 0; i < freemarkerStartTagArray.length; i++) { - if (stream.match(freemarkerStartTagArray[i], false) ) { - state.tokenize = parsers.freemarkerTemplate; - if (freemarkerStartTagArray[i] == "@" ) { - freemarkerMode = "macro"; - } else { - freemarkerMode = "tag"; - } - last = "startTag"; - return "tag"; - } - } - for (var i = 0; i < freemarkerEndTagArray.length; i++) { - if (stream.match(freemarkerEndTagArray[i], false) ) { - state.tokenize = parsers.freemarkerTemplate; - if (freemarkerEndTagArray[i] == "/@" ) { - freemarkerMode = "macro"; - } else { - freemarkerMode = "tag"; - } - last = "endTag"; - return "tag"; - } - } - } - } else if (stream.match("${", false) ) { - state.tokenize = parsers.freemarkerTemplate; - last = "startTag"; - freemarkerMode = "echo"; - return "keyword"; - } - stream.next(); - return null; - }, - - // parsing freemarker content - freemarkerTemplate : function(stream, state) { - if (stream.match(settings.rightDelimiter, true) ) { - state.depth--; - if (state.depth <= 0 ) { - state.tokenize = parsers.tokenizer; - } - return helpers.cont("tag", null, null); - } else if ("echo" == state.freemarkerMode && stream.match("}", true) ) { - state.depth--; - if (state.depth <= 0 ) { - state.tokenize = parsers.tokenizer; - } - return helpers.cont("keyword", null, null); - } - - if (stream.match(settings.leftDelimiter, true) ) { - for (var i = 0; i < freemarkerStartTagArray.length; i++) { - if (stream.match(freemarkerStartTagArray[i], false) ) { - state.depth++; - if (freemarkerStartTagArray[i] == "@" ) { - return helpers.cont("tag", "startTag", "macro"); - } else { - return helpers.cont("tag", "startTag", "tag"); - } - } - } - for (var i = 0; i < freemarkerEndTagArray.length; i++) { - if (stream.match(freemarkerEndTagArray[i], false) ) { - state.depth++; - if (freemarkerEndTagArray[i] == "/@" ) { - return helpers.cont("tag", "endTag", "macro"); - } else { - return helpers.cont("tag", "endTag", "tag"); - } - } - } - } else if (stream.match("${", true) ) { - state.depth++; - return helpers.cont("keyword", "startTag", "echo"); - } - var ch = stream.next(); - if ("." == ch ) { - if("echo" == state.freemarkerMode || "whitespace" == state.last ||"operator"== state.last){ - for (var i = 0; i < specialVariables.length; i++) { - if(stream.match(specialVariables[i],true)){ - return helpers.cont("keyword", "variable", state.freemarkerMode); - } - } - } - if("keyword"==state.last && stream.eatWhile(regs.validIdentifier)){ - return helpers.cont("keyword", null, state.freemarkerMode); - }else{ - return helpers.cont("operator", "childVariable", state.freemarkerMode); - } - } else if (regs.stringChar.test(ch) ) { - state.tokenize = parsers.inAttribute(ch); - return helpers.cont("string", "string", state.freemarkerMode); - } else if (regs.operatorChars.test(ch) ) { - if ("?" === ch ) { - return helpers.cont("operator", "builtin", state.freemarkerMode); - } else { - return helpers.cont("operator", "operator", state.freemarkerMode); - } - } else if ("[" == ch || "{" == ch|| "(" == ch ) { - return helpers.cont("bracket", "bracket", state.freemarkerMode); - } else if ("]" == ch || "}" == ch || ")" == ch ) { - return helpers.cont("bracket", "variable", state.freemarkerMode); - } else if ("/" == ch ) { - return helpers.cont("tag", "endTag", state.freemarkerMode); - } else if ("@" == ch && "macro" == state.freemarkerMode ) { - stream.eatWhile(regs.validIdentifier) - return helpers.cont("keyword", "keyword", state.freemarkerMode); - } else if (/\d/.test(ch) ) { - stream.eat(/x/i) - stream.eatWhile(/\d/); - return helpers.cont("number", "number", state.freemarkerMode); - } else if("tag" == state.freemarkerMode && "whitespace" == state.last && (stream.match("as",true) || stream.match("in",true)|| stream.match("using",true) )) { - return helpers.cont("keyword", "operator", state.freemarkerMode); - } else if("tag" == state.freemarkerMode && "whitespace" == state.last && (stream.match("gte",true) || stream.match("lte",true) || stream.match("gt",true) || stream.match("lt",true) )) { - return helpers.cont("operator", "operator", state.freemarkerMode); - } else { - if ("builtin" == state.last ) { - stream.eat("?"); - stream.eatWhile(regs.validIdentifier); - return helpers.cont("builtin", "variable", state.freemarkerMode); - } else if ("whitespace" == state.last||"bracket" == state.last) { - if ("macro" == state.freemarkerMode ) { - stream.eatWhile(regs.validIdentifier); - return helpers.cont("attribute", "attribute", state.freemarkerMode); - } else { - stream.eatWhile(regs.validIdentifier); - return helpers.cont("variable-2", "variable", state.freemarkerMode); - } - } else if ("operator" == state.last ) { - stream.eatWhile(regs.validIdentifier); - return helpers.cont("variable-2", "variable", state.freemarkerMode); - } else if ("childVariable" == state.last ) { - stream.eatWhile(regs.validIdentifier); - return helpers.cont("variable-3", "variable", state.freemarkerMode); - } else if (/\s/.test(ch) ) { - last = "whitespace"; - return null; - } else if ("string" == state.last ) { - stream.eatWhile(regs.validIdentifier); - return helpers.cont("attribute", "attribute", state.freemarkerMode); - } else { - if ("startTag" == state.last || "endTag" == state.last ) { - if ("echo" == state.freemarkerMode ) { - stream.eatWhile(regs.validIdentifier) - return helpers.cont("variable-2", "variable", state.freemarkerMode); - } - } - if ("tag" == state.freemarkerMode ) { - var str = ""; - if (ch != "/" ) { - str += ch; - } - var c = null; - while (c = stream.eat(regs.validIdentifier)) { - str += c; - } - for (var i = 0 ; i < keyFunctions.length; i++) { - if ("#"+keyFunctions[i] == str ) { - return helpers.cont("keyword", "keyword", state.freemarkerMode); - } - } - } - } - return helpers.cont("error", "tag", state.freemarkerMode); - } - }, - - inAttribute : function(quote) { - return function(stream, state) { - var prevChar = null; - var currChar = null; - while (!stream.eol()) { - currChar = stream.peek(); - if (stream.next() == quote && '\\' !== prevChar ) { - state.tokenize = parsers.freemarkerTemplate; - break; - } - prevChar = currChar; - } - return "string"; - }; - }, - - inBlock : function(style, terminator) { - return function(stream, state) { - while (!stream.eol()) { - if (stream.match(terminator) ) { - state.tokenize = parsers.tokenizer; - break; - } - stream.next(); - } - return style; - }; - } - }; - - // the public API for CodeMirror - return { - startState : function() { - return { - tokenize : parsers.tokenizer, mode : "freemarker", last : null, freemarkerMode : null, - depth : 0 - }; - }, token : function(stream, state) { - state.last = last; - state.freemarkerMode = freemarkerMode; - return state.tokenize(stream, state); - }, electricChars : "" - }; - }); - - CodeMirror.defineMIME("text/spiderflow", "spiderflow"); - -}); \ No newline at end of file diff --git a/spider/resources/static/js/codemirror/sql.js b/spider/resources/static/js/codemirror/sql.js deleted file mode 100644 index 35902bb..0000000 --- a/spider/resources/static/js/codemirror/sql.js +++ /dev/null @@ -1,494 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: https://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("sql", function(config, parserConfig) { - var client = parserConfig.client || {}, - atoms = parserConfig.atoms || {"false": true, "true": true, "null": true}, - builtin = parserConfig.builtin || set(defaultBuiltin), - keywords = parserConfig.keywords || set(sqlKeywords), - operatorChars = parserConfig.operatorChars || /^[*+\-%<>!=&|~^\/]/, - support = parserConfig.support || {}, - hooks = parserConfig.hooks || {}, - dateSQL = parserConfig.dateSQL || {"date" : true, "time" : true, "timestamp" : true}, - backslashStringEscapes = parserConfig.backslashStringEscapes !== false, - brackets = parserConfig.brackets || /^[\{}\(\)\[\]]/, - punctuation = parserConfig.punctuation || /^[;.,:]/ - - function tokenBase(stream, state) { - var ch = stream.next(); - - // call hooks from the mime type - if (hooks[ch]) { - var result = hooks[ch](stream, state); - if (result !== false) return result; - } - - if (support.hexNumber && - ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) - || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) { - // hex - // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html - return "number"; - } else if (support.binaryNumber && - (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/)) - || (ch == "0" && stream.match(/^b[01]+/)))) { - // bitstring - // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html - return "number"; - } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) { - // numbers - // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html - stream.match(/^[0-9]*(\.[0-9]+)?([eE][-+]?[0-9]+)?/); - support.decimallessFloat && stream.match(/^\.(?!\.)/); - return "number"; - } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) { - // placeholders - return "variable-3"; - } else if (ch == "'" || (ch == '"' && support.doubleQuote)) { - // strings - // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html - state.tokenize = tokenLiteral(ch); - return state.tokenize(stream, state); - } else if ((((support.nCharCast && (ch == "n" || ch == "N")) - || (support.charsetCast && ch == "_" && stream.match(/[a-z][a-z0-9]*/i))) - && (stream.peek() == "'" || stream.peek() == '"'))) { - // charset casting: _utf8'str', N'str', n'str' - // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html - return "keyword"; - } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) { - // 1-line comment - stream.skipToEnd(); - return "comment"; - } else if ((support.commentHash && ch == "#") - || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) { - // 1-line comments - // ref: https://kb.askmonty.org/en/comment-syntax/ - stream.skipToEnd(); - return "comment"; - } else if (ch == "/" && stream.eat("*")) { - // multi-line comments - // ref: https://kb.askmonty.org/en/comment-syntax/ - state.tokenize = tokenComment(1); - return state.tokenize(stream, state); - } else if (ch == ".") { - // .1 for 0.1 - if (support.zerolessFloat && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) - return "number"; - if (stream.match(/^\.+/)) - return null - // .table_name (ODBC) - // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html - if (support.ODBCdotTable && stream.match(/^[\w\d_]+/)) - return "variable-2"; - } else if (operatorChars.test(ch)) { - // operators - stream.eatWhile(operatorChars); - return "operator"; - } else if (brackets.test(ch)) { - // brackets - return "bracket"; - } else if (punctuation.test(ch)) { - // punctuation - stream.eatWhile(punctuation); - return "punctuation"; - } else if (ch == '{' && - (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) { - // dates (weird ODBC syntax) - // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html - return "number"; - } else { - stream.eatWhile(/^[_\w\d]/); - var word = stream.current().toLowerCase(); - // dates (standard SQL syntax) - // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html - if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/))) - return "number"; - if (atoms.hasOwnProperty(word)) return "atom"; - if (builtin.hasOwnProperty(word)) return "builtin"; - if (keywords.hasOwnProperty(word)) return "keyword"; - if (client.hasOwnProperty(word)) return "string-2"; - return null; - } - } - - // 'string', with char specified in quote escaped by '\' - function tokenLiteral(quote) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && !escaped) { - state.tokenize = tokenBase; - break; - } - escaped = backslashStringEscapes && !escaped && ch == "\\"; - } - return "string"; - }; - } - function tokenComment(depth) { - return function(stream, state) { - var m = stream.match(/^.*?(\/\*|\*\/)/) - if (!m) stream.skipToEnd() - else if (m[1] == "/*") state.tokenize = tokenComment(depth + 1) - else if (depth > 1) state.tokenize = tokenComment(depth - 1) - else state.tokenize = tokenBase - return "comment" - } - } - - function pushContext(stream, state, type) { - state.context = { - prev: state.context, - indent: stream.indentation(), - col: stream.column(), - type: type - }; - } - - function popContext(state) { - state.indent = state.context.indent; - state.context = state.context.prev; - } - - return { - startState: function() { - return {tokenize: tokenBase, context: null}; - }, - - token: function(stream, state) { - if (stream.sol()) { - if (state.context && state.context.align == null) - state.context.align = false; - } - if (state.tokenize == tokenBase && stream.eatSpace()) return null; - - var style = state.tokenize(stream, state); - if (style == "comment") return style; - - if (state.context && state.context.align == null) - state.context.align = true; - - var tok = stream.current(); - if (tok == "(") - pushContext(stream, state, ")"); - else if (tok == "[") - pushContext(stream, state, "]"); - else if (state.context && state.context.type == tok) - popContext(state); - return style; - }, - - indent: function(state, textAfter) { - var cx = state.context; - if (!cx) return CodeMirror.Pass; - var closing = textAfter.charAt(0) == cx.type; - if (cx.align) return cx.col + (closing ? 0 : 1); - else return cx.indent + (closing ? 0 : config.indentUnit); - }, - - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: support.commentSlashSlash ? "//" : support.commentHash ? "#" : "--", - closeBrackets: "()[]{}''\"\"``" - }; -}); - - // `identifier` - function hookIdentifier(stream) { - // MySQL/MariaDB identifiers - // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html - var ch; - while ((ch = stream.next()) != null) { - if (ch == "`" && !stream.eat("`")) return "variable-2"; - } - stream.backUp(stream.current().length - 1); - return stream.eatWhile(/\w/) ? "variable-2" : null; - } - - // "identifier" - function hookIdentifierDoublequote(stream) { - // Standard SQL /SQLite identifiers - // ref: http://web.archive.org/web/20160813185132/http://savage.net.au/SQL/sql-99.bnf.html#delimited%20identifier - // ref: http://sqlite.org/lang_keywords.html - var ch; - while ((ch = stream.next()) != null) { - if (ch == "\"" && !stream.eat("\"")) return "variable-2"; - } - stream.backUp(stream.current().length - 1); - return stream.eatWhile(/\w/) ? "variable-2" : null; - } - - // variable token - function hookVar(stream) { - // variables - // @@prefix.varName @varName - // varName can be quoted with ` or ' or " - // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html - if (stream.eat("@")) { - stream.match(/^session\./); - stream.match(/^local\./); - stream.match(/^global\./); - } - - if (stream.eat("'")) { - stream.match(/^.*'/); - return "variable-2"; - } else if (stream.eat('"')) { - stream.match(/^.*"/); - return "variable-2"; - } else if (stream.eat("`")) { - stream.match(/^.*`/); - return "variable-2"; - } else if (stream.match(/^[0-9a-zA-Z$\.\_]+/)) { - return "variable-2"; - } - return null; - }; - - // short client keyword token - function hookClient(stream) { - // \N means NULL - // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html - if (stream.eat("N")) { - return "atom"; - } - // \g, etc - // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html - return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null; - } - - // these keywords are used by all SQL dialects (however, a mode can still overwrite it) - var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit "; - - // turn a space-separated list into an array - function set(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - var defaultBuiltin = "bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric" - - // A generic SQL Mode. It's not a standard, it just try to support what is generally supported - CodeMirror.defineMIME("text/x-sql", { - name: "sql", - keywords: set(sqlKeywords + "begin"), - builtin: set(defaultBuiltin), - atoms: set("false true null unknown"), - dateSQL: set("date time timestamp"), - support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") - }); - - CodeMirror.defineMIME("text/x-mssql", { - name: "sql", - client: set("$partition binary_checksum checksum connectionproperty context_info current_request_id error_line error_message error_number error_procedure error_severity error_state formatmessage get_filestream_transaction_context getansinull host_id host_name isnull isnumeric min_active_rowversion newid newsequentialid rowcount_big xact_state object_id"), - keywords: set(sqlKeywords + "begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare exec go if use index holdlock nolock nowait paglock readcommitted readcommittedlock readpast readuncommitted repeatableread rowlock serializable snapshot tablock tablockx updlock with"), - builtin: set("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "), - atoms: set("is not null like and or in left right between inner outer join all any some cross unpivot pivot exists"), - operatorChars: /^[*+\-%<>!=^\&|\/]/, - brackets: /^[\{}\(\)]/, - punctuation: /^[;.,:/]/, - backslashStringEscapes: false, - dateSQL: set("date datetimeoffset datetime2 smalldatetime datetime time"), - hooks: { - "@": hookVar - } - }); - - CodeMirror.defineMIME("text/x-mysql", { - name: "sql", - client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), - keywords: set(sqlKeywords + "accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), - builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), - atoms: set("false true null unknown"), - operatorChars: /^[*+\-%<>!=&|^]/, - dateSQL: set("date time timestamp"), - support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), - hooks: { - "@": hookVar, - "`": hookIdentifier, - "\\": hookClient - } - }); - - CodeMirror.defineMIME("text/x-mariadb", { - name: "sql", - client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), - keywords: set(sqlKeywords + "accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), - builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), - atoms: set("false true null unknown"), - operatorChars: /^[*+\-%<>!=&|^]/, - dateSQL: set("date time timestamp"), - support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), - hooks: { - "@": hookVar, - "`": hookIdentifier, - "\\": hookClient - } - }); - - // provided by the phpLiteAdmin project - phpliteadmin.org - CodeMirror.defineMIME("text/x-sqlite", { - name: "sql", - // commands of the official SQLite client, ref: https://www.sqlite.org/cli.html#dotcmd - client: set("auth backup bail binary changes check clone databases dbinfo dump echo eqp exit explain fullschema headers help import imposter indexes iotrace limit lint load log mode nullvalue once open output print prompt quit read restore save scanstats schema separator session shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width"), - // ref: http://sqlite.org/lang_keywords.html - keywords: set(sqlKeywords + "abort action add after all analyze attach autoincrement before begin cascade case cast check collate column commit conflict constraint cross current_date current_time current_timestamp database default deferrable deferred detach each else end escape except exclusive exists explain fail for foreign full glob if ignore immediate index indexed initially inner instead intersect isnull key left limit match natural no notnull null of offset outer plan pragma primary query raise recursive references regexp reindex release rename replace restrict right rollback row savepoint temp temporary then to transaction trigger unique using vacuum view virtual when with without"), - // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types. - builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text clob bigint int int2 int8 integer float double char varchar date datetime year unsigned signed numeric real"), - // ref: http://sqlite.org/syntax/literal-value.html - atoms: set("null current_date current_time current_timestamp"), - // ref: http://sqlite.org/lang_expr.html#binaryops - operatorChars: /^[*+\-%<>!=&|/~]/, - // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types. - dateSQL: set("date time timestamp datetime"), - support: set("decimallessFloat zerolessFloat"), - identifierQuote: "\"", //ref: http://sqlite.org/lang_keywords.html - hooks: { - // bind-parameters ref:http://sqlite.org/lang_expr.html#varparam - "@": hookVar, - ":": hookVar, - "?": hookVar, - "$": hookVar, - // The preferred way to escape Identifiers is using double quotes, ref: http://sqlite.org/lang_keywords.html - "\"": hookIdentifierDoublequote, - // there is also support for backtics, ref: http://sqlite.org/lang_keywords.html - "`": hookIdentifier - } - }); - - // the query language used by Apache Cassandra is called CQL, but this mime type - // is called Cassandra to avoid confusion with Contextual Query Language - CodeMirror.defineMIME("text/x-cassandra", { - name: "sql", - client: { }, - keywords: set("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"), - builtin: set("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"), - atoms: set("false true infinity NaN"), - operatorChars: /^[<>=]/, - dateSQL: { }, - support: set("commentSlashSlash decimallessFloat"), - hooks: { } - }); - - // this is based on Peter Raganitsch's 'plsql' mode - CodeMirror.defineMIME("text/x-plsql", { - name: "sql", - client: set("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"), - keywords: set("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"), - builtin: set("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"), - operatorChars: /^[*\/+\-%<>!=~]/, - dateSQL: set("date time timestamp"), - support: set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber") - }); - - // Created to support specific hive keywords - CodeMirror.defineMIME("text/x-hive", { - name: "sql", - keywords: set("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with admin authorization char compact compactions conf cube current current_date current_timestamp day decimal defined dependency directories elem_type exchange file following for grouping hour ignore inner interval jar less logical macro minute month more none noscan over owner partialscan preceding pretty principals protection reload rewrite role roles rollup rows second server sets skewed transactions truncate unbounded unset uri user values window year"), - builtin: set("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype key_type utctimestamp value_type varchar"), - atoms: set("false true null unknown"), - operatorChars: /^[*+\-%<>!=]/, - dateSQL: set("date timestamp"), - support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") - }); - - CodeMirror.defineMIME("text/x-pgsql", { - name: "sql", - client: set("source"), - // For PostgreSQL - https://www.postgresql.org/docs/11/sql-keywords-appendix.html - // For pl/pgsql lang - https://github.com/postgres/postgres/blob/REL_11_2/src/pl/plpgsql/src/pl_scanner.c - keywords: set(sqlKeywords + "a abort abs absent absolute access according action ada add admin after aggregate alias all allocate also alter always analyse analyze and any are array array_agg array_max_cardinality as asc asensitive assert assertion assignment asymmetric at atomic attach attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli between bigint binary bit bit_length blob blocked bom boolean both breadth by c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain char char_length character character_length character_set_catalog character_set_name character_set_schema characteristics characters check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column column_name columns command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constant constraint constraint_catalog constraint_name constraint_schema constraints constructor contains content continue control conversion convert copy corr corresponding cost count covar_pop covar_samp create cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datatype date datetime_interval_code datetime_interval_precision day db deallocate debug dec decimal declare default defaults deferrable deferred defined definer degree delete delimiter delimiters dense_rank depends depth deref derived desc describe descriptor detach detail deterministic diagnostics dictionary disable discard disconnect dispatch distinct dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain double drop dump dynamic dynamic_function dynamic_function_code each element else elseif elsif empty enable encoding encrypted end end_frame end_partition endexec enforced enum equals errcode error escape event every except exception exclude excluding exclusive exec execute exists exit exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreach foreign fortran forward found frame_row free freeze from fs full function functions fusion g general generated get global go goto grant granted greatest group grouping groups handler having header hex hierarchy hint hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import in include including increment indent index indexes indicator info inherit inherits initially inline inner inout input insensitive insert instance instantiable instead int integer integrity intersect intersection interval into invoker is isnull isolation join k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like like_regex limit link listen ln load local localtime localtimestamp location locator lock locked log logged loop lower m map mapping match matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized not nothing notice notify notnull nowait nth_value ntile null nullable nullif nulls number numeric object occurrences_regex octet_length octets of off offset oids old on only open operator option options or order ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parallel parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password path percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding precision prepare prepared preserve primary print_strict_params prior privileges procedural procedure procedures program public publication query quote raise range rank read reads real reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result result_oid return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns reverse revoke right role rollback rollup routine routine_catalog routine_name routine_schema routines row row_count row_number rows rowtype rule savepoint scale schema schema_name schemas scope scope_catalog scope_name scope_schema scroll search second section security select selective self sensitive sequence sequences serializable server server_name session session_user set setof sets share show similar simple size skip slice smallint snapshot some source space specific specific_name specifictype sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable stacked standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time system_user t table table_name tables tablesample tablespace temp template temporary text then ties time timestamp timezone_hour timezone_minute to token top_level_count trailing transaction transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted union unique unknown unlink unlisten unlogged unnamed unnest until untyped update upper uri usage use_column use_variable user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of values var_pop var_samp varbinary varchar variable_conflict variadic varying verbose version versioning view views volatile warning when whenever where while whitespace width_bucket window with within without work wrapper write xml xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes zone"), - // https://www.postgresql.org/docs/11/datatype.html - builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"), - atoms: set("false true null unknown"), - operatorChars: /^[*\/+\-%<>!=&|^\/#@?~]/, - dateSQL: set("date time timestamp"), - support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast") - }); - - // Google's SQL-like query language, GQL - CodeMirror.defineMIME("text/x-gql", { - name: "sql", - keywords: set("ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where"), - atoms: set("false true"), - builtin: set("blob datetime first key __key__ string integer double boolean null"), - operatorChars: /^[*+\-%<>!=]/ - }); - - // Greenplum - CodeMirror.defineMIME("text/x-gpsql", { - name: "sql", - client: set("source"), - //https://github.com/greenplum-db/gpdb/blob/master/src/include/parser/kwlist.h - keywords: set("abort absolute access action active add admin after aggregate all also alter always analyse analyze and any array as asc assertion assignment asymmetric at authorization backward before begin between bigint binary bit boolean both by cache called cascade cascaded case cast chain char character characteristics check checkpoint class close cluster coalesce codegen collate column comment commit committed concurrency concurrently configuration connection constraint constraints contains content continue conversion copy cost cpu_rate_limit create createdb createexttable createrole createuser cross csv cube current current_catalog current_date current_role current_schema current_time current_timestamp current_user cursor cycle data database day deallocate dec decimal declare decode default defaults deferrable deferred definer delete delimiter delimiters deny desc dictionary disable discard distinct distributed do document domain double drop dxl each else enable encoding encrypted end enum errors escape every except exchange exclude excluding exclusive execute exists explain extension external extract false family fetch fields filespace fill filter first float following for force foreign format forward freeze from full function global grant granted greatest group group_id grouping handler hash having header hold host hour identity if ignore ilike immediate immutable implicit in including inclusive increment index indexes inherit inherits initially inline inner inout input insensitive insert instead int integer intersect interval into invoker is isnull isolation join key language large last leading least left level like limit list listen load local localtime localtimestamp location lock log login mapping master match maxvalue median merge minute minvalue missing mode modifies modify month move name names national natural nchar new newline next no nocreatedb nocreateexttable nocreaterole nocreateuser noinherit nologin none noovercommit nosuperuser not nothing notify notnull nowait null nullif nulls numeric object of off offset oids old on only operator option options or order ordered others out outer over overcommit overlaps overlay owned owner parser partial partition partitions passing password percent percentile_cont percentile_disc placing plans position preceding precision prepare prepared preserve primary prior privileges procedural procedure protocol queue quote randomly range read readable reads real reassign recheck recursive ref references reindex reject relative release rename repeatable replace replica reset resource restart restrict returning returns revoke right role rollback rollup rootpartition row rows rule savepoint scatter schema scroll search second security segment select sequence serializable session session_user set setof sets share show similar simple smallint some split sql stable standalone start statement statistics stdin stdout storage strict strip subpartition subpartitions substring superuser symmetric sysid system table tablespace temp template temporary text then threshold ties time timestamp to trailing transaction treat trigger trim true truncate trusted type unbounded uncommitted unencrypted union unique unknown unlisten until update user using vacuum valid validation validator value values varchar variadic varying verbose version view volatile web when where whitespace window with within without work writable write xml xmlattributes xmlconcat xmlelement xmlexists xmlforest xmlparse xmlpi xmlroot xmlserialize year yes zone"), - builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"), - atoms: set("false true null unknown"), - operatorChars: /^[*+\-%<>!=&|^\/#@?~]/, - dateSQL: set("date time timestamp"), - support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast") - }); - - // Spark SQL - CodeMirror.defineMIME("text/x-sparksql", { - name: "sql", - keywords: set("add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases datata dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with"), - builtin: set("tinyint smallint int bigint boolean float double string binary timestamp decimal array map struct uniontype delimited serde sequencefile textfile rcfile inputformat outputformat"), - atoms: set("false true null"), - operatorChars: /^[*\/+\-%<>!=~&|^]/, - dateSQL: set("date time timestamp"), - support: set("ODBCdotTable doubleQuote zerolessFloat") - }); - - // Esper - CodeMirror.defineMIME("text/x-esper", { - name: "sql", - client: set("source"), - // http://www.espertech.com/esper/release-5.5.0/esper-reference/html/appendix_keywords.html - keywords: set("alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit after all and as at asc avedev avg between by case cast coalesce count create current_timestamp day days delete define desc distinct else end escape events every exists false first from full group having hour hours in inner insert instanceof into irstream is istream join last lastweekday left limit like max match_recognize matches median measures metadatasql min minute minutes msec millisecond milliseconds not null offset on or order outer output partition pattern prev prior regexp retain-union retain-intersection right rstream sec second seconds select set some snapshot sql stddev sum then true unidirectional until update variable weekday when where window"), - builtin: {}, - atoms: set("false true null"), - operatorChars: /^[*+\-%<>!=&|^\/#@?~]/, - dateSQL: set("time"), - support: set("decimallessFloat zerolessFloat binaryNumber hexNumber") - }); -}); - -/* - How Properties of Mime Types are used by SQL Mode - ================================================= - - keywords: - A list of keywords you want to be highlighted. - builtin: - A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword"). - operatorChars: - All characters that must be handled as operators. - client: - Commands parsed and executed by the client (not the server). - support: - A list of supported syntaxes which are not common, but are supported by more than 1 DBMS. - * ODBCdotTable: .tableName - * zerolessFloat: .1 - * doubleQuote - * nCharCast: N'string' - * charsetCast: _utf8'string' - * commentHash: use # char for comments - * commentSlashSlash: use // for comments - * commentSpaceRequired: require a space after -- for comments - atoms: - Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others: - UNKNOWN, INFINITY, UNDERFLOW, NaN... - dateSQL: - Used for date/time SQL standard syntax, because not all DBMS's support same temporal types. -*/ diff --git a/spider/resources/static/js/common.js b/spider/resources/static/js/common.js deleted file mode 100644 index 32e273b..0000000 --- a/spider/resources/static/js/common.js +++ /dev/null @@ -1,47 +0,0 @@ -function getQueryString(name) { - var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'); - var r = window.location.search.substr(1).match(reg); - if (r != null) { - return unescape(r[2]); - } - return null; -} -var sf = {}; -sf.ajax = function(options){ - var loading; - var loadingInterval; - var closeClear = function(){ - layui.layer.close(loading); - clearInterval(loadingInterval); - } - var beginTime = +new Date(); - var url = options.url; - var type = options.type; - var data = options.data; - var success = options.success; - var error = options.error; - $.ajax({ - url:url, - type:type, - data:data, - success:function(result){ - closeClear(); - success && success(result); - }, - error:function(errorInfo){ - closeClear(); - error && error(errorInfo); - }, - beforeSend:function(){ - loadingInterval = setInterval(function(){ - var endTime = +new Date(); - if((endTime-beginTime) > 500){ - loading = layui.layer.load(1, { - shade: [0.1,'#fff'] - }); - clearInterval(loadingInterval); - } - },100); - } - }) -} \ No newline at end of file diff --git a/spider/resources/static/js/cron/cron.js b/spider/resources/static/js/cron/cron.js deleted file mode 100644 index 898b109..0000000 --- a/spider/resources/static/js/cron/cron.js +++ /dev/null @@ -1,497 +0,0 @@ -function btnFan() { - // 获取参数中表达式的值 - var txt = $("#cron").val(); - if (txt) { - var regs = txt.split(' '); - $("input[name=v_second]").val(regs[0]); - $("input[name=v_min]").val(regs[1]); - $("input[name=v_hour]").val(regs[2]); - $("input[name=v_day]").val(regs[3]); - $("input[name=v_mouth]").val(regs[4]); - $("input[name=v_week]").val(regs[5]); - - initObj(regs[0], "second"); - initObj(regs[1], "min"); - initObj(regs[2], "hour"); - initDay(regs[3]); - initMonth(regs[4]); - initWeek(regs[5]); - - if (regs.length > 6) { - $("input[name=v_year]").val(regs[6]); - initYear(regs[6]); - } - } -} - -function initObj(strVal, strid) { - var ary = null; - var objRadio = $("input[name='" + strid + "'"); - if (strVal == "*") { - objRadio.eq(0).attr("checked", "checked"); - } else if (strVal.split('-').length > 1) { - ary = strVal.split('-'); - objRadio.eq(1).attr("checked", "checked"); - $("#" + strid + "Start_0").numberspinner('setValue', ary[0]); - $("#" + strid + "End_0").numberspinner('setValue', ary[1]); - } else if (strVal.split('/').length > 1) { - ary = strVal.split('/'); - objRadio.eq(2).attr("checked", "checked"); - $("#" + strid + "Start_1").numberspinner('setValue', ary[0]); - $("#" + strid + "End_1").numberspinner('setValue', ary[1]); - } else { - objRadio.eq(3).attr("checked", "checked"); - if (strVal != "?") { - ary = strVal.split(","); - for (var i = 0; i < ary.length; i++) { - $("." + strid + "List input[value='" + ary[i] + "']").attr( - "checked", "checked"); - } - } - } -} - -function initDay(strVal) { - var ary = null; - var objRadio = $("input[name='day'"); - if (strVal == "*") { - objRadio.eq(0).attr("checked", "checked"); - } else if (strVal == "?") { - objRadio.eq(1).attr("checked", "checked"); - } else if (strVal.split('-').length > 1) { - ary = strVal.split('-'); - objRadio.eq(2).attr("checked", "checked"); - $("#dayStart_0").numberspinner('setValue', ary[0]); - $("#dayEnd_0").numberspinner('setValue', ary[1]); - } else if (strVal.split('/').length > 1) { - ary = strVal.split('/'); - objRadio.eq(3).attr("checked", "checked"); - $("#dayStart_1").numberspinner('setValue', ary[0]); - $("#dayEnd_1").numberspinner('setValue', ary[1]); - } else if (strVal.split('W').length > 1) { - ary = strVal.split('W'); - objRadio.eq(4).attr("checked", "checked"); - $("#dayStart_2").numberspinner('setValue', ary[0]); - } else if (strVal == "L") { - objRadio.eq(5).attr("checked", "checked"); - } else { - objRadio.eq(6).attr("checked", "checked"); - ary = strVal.split(","); - for (var i = 0; i < ary.length; i++) { - $(".dayList input[value='" + ary[i] + "']").attr("checked", - "checked"); - } - } -} - -function initMonth(strVal) { - var ary = null; - var objRadio = $("input[name='mouth'"); - if (strVal == "*") { - objRadio.eq(0).attr("checked", "checked"); - } else if (strVal == "?") { - objRadio.eq(1).attr("checked", "checked"); - } else if (strVal.split('-').length > 1) { - ary = strVal.split('-'); - objRadio.eq(2).attr("checked", "checked"); - $("#mouthStart_0").numberspinner('setValue', ary[0]); - $("#mouthEnd_0").numberspinner('setValue', ary[1]); - } else if (strVal.split('/').length > 1) { - ary = strVal.split('/'); - objRadio.eq(3).attr("checked", "checked"); - $("#mouthStart_1").numberspinner('setValue', ary[0]); - $("#mouthEnd_1").numberspinner('setValue', ary[1]); - - } else { - objRadio.eq(4).attr("checked", "checked"); - - ary = strVal.split(","); - for (var i = 0; i < ary.length; i++) { - $(".mouthList input[value='" + ary[i] + "']").attr("checked", - "checked"); - } - } -} - -function initWeek(strVal) { - var ary = null; - var objRadio = $("input[name='week'"); - if (strVal == "*") { - objRadio.eq(0).attr("checked", "checked"); - } else if (strVal == "?") { - objRadio.eq(1).attr("checked", "checked"); - } else if (strVal.split('/').length > 1) { - ary = strVal.split('/'); - objRadio.eq(2).attr("checked", "checked"); - $("#weekStart_0").numberspinner('setValue', ary[0]); - $("#weekEnd_0").numberspinner('setValue', ary[1]); - } else if (strVal.split('-').length > 1) { - ary = strVal.split('-'); - objRadio.eq(3).attr("checked", "checked"); - $("#weekStart_1").numberspinner('setValue', ary[0]); - $("#weekEnd_1").numberspinner('setValue', ary[1]); - } else if (strVal.split('L').length > 1) { - ary = strVal.split('L'); - objRadio.eq(4).attr("checked", "checked"); - $("#weekStart_2").numberspinner('setValue', ary[0]); - } else { - objRadio.eq(5).attr("checked", "checked"); - ary = strVal.split(","); - for (var i = 0; i < ary.length; i++) { - $(".weekList input[value='" + ary[i] + "']").attr("checked", - "checked"); - } - } -} - -function initYear(strVal) { - var ary = null; - var objRadio = $("input[name='year'"); - if (strVal == "*") { - objRadio.eq(1).attr("checked", "checked"); - } else if (strVal.split('-').length > 1) { - ary = strVal.split('-'); - objRadio.eq(2).attr("checked", "checked"); - $("#yearStart_0").numberspinner('setValue', ary[0]); - $("#yearEnd_0").numberspinner('setValue', ary[1]); - } -} -/** - * 每周期 - */ -function everyTime(dom) { - var item = $("input[name=v_" + dom.name + "]"); - item.val("*"); - item.change(); -} - -/** - * 不指定 - */ -function unAppoint(dom) { - var name = dom.name; - var val = "?"; - if (name == "year") - val = ""; - var item = $("input[name=v_" + name + "]"); - item.val(val); - item.change(); -} - -function appoint(dom) { - -} - -/** - * 周期 - */ -function cycle(dom) { - var name = dom.name; - var ns = $(dom).parent().find(".numberspinner"); - var start = ns.eq(0).numberspinner("getValue"); - var end = ns.eq(1).numberspinner("getValue"); - var item = $("input[name=v_" + name + "]"); - item.val(start + "-" + end); - item.change(); -} - -/** - * 从开始 - */ -function startOn(dom) { - var name = dom.name; - var ns = $(dom).parent().find(".numberspinner"); - var start = ns.eq(0).numberspinner("getValue"); - var end = ns.eq(1).numberspinner("getValue"); - var item = $("input[name=v_" + name + "]"); - item.val(start + "/" + end); - item.change(); -} - -function lastDay(dom) { - var item = $("input[name=v_" + dom.name + "]"); - item.val("L"); - item.change(); -} - -function weekOfDay(dom) { - var name = dom.name; - var ns = $(dom).parent().find(".numberspinner"); - var start = ns.eq(0).numberspinner("getValue"); - var end = ns.eq(1).numberspinner("getValue"); - var item = $("input[name=v_" + name + "]"); - item.val(start + "#" + end); - item.change(); -} - -function lastWeek(dom) { - var item = $("input[name=v_" + dom.name + "]"); - var ns = $(dom).parent().find(".numberspinner"); - var start = ns.eq(0).numberspinner("getValue"); - item.val(start + "L"); - item.change(); -} - -function workDay(dom) { - var name = dom.name; - var ns = $(dom).parent().find(".numberspinner"); - var start = ns.eq(0).numberspinner("getValue"); - var item = $("input[name=v_" + name + "]"); - item.val(start + "W"); - item.change(); -} -$(function() { - $(".numberspinner").numberspinner({ - onChange : function() { - $(this).closest("div.line").children().eq(0).click(); - } - }); - - var vals = $("input[name^='v_']"); - var cron = $("#cron"); - vals.change(function() { - var item = []; - vals.each(function() { - item.push(this.value); - }); - // 修复表达式错误BUG,如果后一项不为* 那么前一项肯定不为为*,要不然就成了每秒执行了 - // 获取当前选中tab - var currentIndex = 0; - $(".tabs>li").each(function(i, item) { - if ($(item).hasClass("tabs-selected")) { - currentIndex = i; - return false; - } - - }); - // 当前选中项之前的如果为*,则都设置成0 - for (var i = currentIndex; i >= 1; i--) { - if (item[i] != "*" && item[i - 1] == "*") { - item[i - 1] = "0"; - } - } - // 当前选中项之后的如果不为*则都设置成* - if (item[currentIndex] == "*") { - for (var i = currentIndex + 1; i < item.length; i++) { - if (i == 5) { - item[i] = "?"; - } else { - item[i] = "*"; - } - } - } - cron.val(item.join(" ")).change(); - }); - - cron.change(function() { - // 获取参数中表达式的值 - btnFan(); - // 设置最近五次运行时间 - $.ajax({ - type : 'get', - url : "/spider/recent5TriggerTime", - dataType : "json", - data : { - "cron" : $("#cron").val() - }, - success : function(data) { - if (data && data.length == 5) { - var strHTML = "
      "; - for (var i = 0; i < data.length; i++) { - strHTML += "
    • " + data[i] + "
    • "; - } - strHTML += "
    " - $("#runTime").html(strHTML); - } else { - $("#runTime").html(""); - } - } - }); - }); - - var secondList = $(".secondList").children(); - $("#sencond_appoint").click(function() { - if (this.checked) { - if ($(secondList).filter(":checked").length == 0) { - $(secondList.eq(0)).attr("checked", true); - } - secondList.eq(0).change(); - } - }); - - secondList.change(function() { - var sencond_appoint = $("#sencond_appoint").prop("checked"); - if (sencond_appoint) { - var vals = []; - secondList.each(function() { - if (this.checked) { - vals.push(this.value); - } - }); - var val = "?"; - if (vals.length > 0 && vals.length < 59) { - val = vals.join(","); - } else if (vals.length == 59) { - val = "*"; - } - var item = $("input[name=v_second]"); - item.val(val); - item.change(); - } - }); - - var minList = $(".minList").children(); - $("#min_appoint").click(function() { - if (this.checked) { - if ($(minList).filter(":checked").length == 0) { - $(minList.eq(0)).attr("checked", true); - } - minList.eq(0).change(); - } - }); - - minList.change(function() { - var min_appoint = $("#min_appoint").prop("checked"); - if (min_appoint) { - var vals = []; - minList.each(function() { - if (this.checked) { - vals.push(this.value); - } - }); - var val = "?"; - if (vals.length > 0 && vals.length < 59) { - val = vals.join(","); - } else if (vals.length == 59) { - val = "*"; - } - var item = $("input[name=v_min]"); - item.val(val); - item.change(); - } - }); - - var hourList = $(".hourList").children(); - $("#hour_appoint").click(function() { - if (this.checked) { - if ($(hourList).filter(":checked").length == 0) { - $(hourList.eq(0)).attr("checked", true); - } - hourList.eq(0).change(); - } - }); - - hourList.change(function() { - var hour_appoint = $("#hour_appoint").prop("checked"); - if (hour_appoint) { - var vals = []; - hourList.each(function() { - if (this.checked) { - vals.push(this.value); - } - }); - var val = "?"; - if (vals.length > 0 && vals.length < 24) { - val = vals.join(","); - } else if (vals.length == 24) { - val = "*"; - } - var item = $("input[name=v_hour]"); - item.val(val); - item.change(); - } - }); - - var dayList = $(".dayList").children(); - $("#day_appoint").click(function() { - if (this.checked) { - if ($(dayList).filter(":checked").length == 0) { - $(dayList.eq(0)).attr("checked", true); - } - dayList.eq(0).change(); - } - }); - - dayList.change(function() { - var day_appoint = $("#day_appoint").prop("checked"); - if (day_appoint) { - var vals = []; - dayList.each(function() { - if (this.checked) { - vals.push(this.value); - } - }); - var val = "?"; - if (vals.length > 0 && vals.length < 31) { - val = vals.join(","); - } else if (vals.length == 31) { - val = "*"; - } - var item = $("input[name=v_day]"); - item.val(val); - item.change(); - } - }); - - var mouthList = $(".mouthList").children(); - $("#mouth_appoint").click(function() { - if (this.checked) { - if ($(mouthList).filter(":checked").length == 0) { - $(mouthList.eq(0)).attr("checked", true); - } - mouthList.eq(0).change(); - } - }); - - mouthList.change(function() { - var mouth_appoint = $("#mouth_appoint").prop("checked"); - if (mouth_appoint) { - var vals = []; - mouthList.each(function() { - if (this.checked) { - vals.push(this.value); - } - }); - var val = "?"; - if (vals.length > 0 && vals.length < 12) { - val = vals.join(","); - } else if (vals.length == 12) { - val = "*"; - } - var item = $("input[name=v_mouth]"); - item.val(val); - item.change(); - } - }); - - var weekList = $(".weekList").children(); - $("#week_appoint").click(function() { - if (this.checked) { - if ($(weekList).filter(":checked").length == 0) { - $(weekList.eq(0)).attr("checked", true); - } - weekList.eq(0).change(); - } - }); - - weekList.change(function() { - var week_appoint = $("#week_appoint").prop("checked"); - if (week_appoint) { - var vals = []; - weekList.each(function() { - if (this.checked) { - vals.push(this.value); - } - }); - var val = "?"; - if (vals.length > 0 && vals.length < 7) { - val = vals.join(","); - } else if (vals.length == 7) { - val = "*"; - } - var item = $("input[name=v_week]"); - item.val(val); - item.change(); - } - }); -}); \ No newline at end of file diff --git a/spider/resources/static/js/cron/easyui.min.css b/spider/resources/static/js/cron/easyui.min.css deleted file mode 100644 index 92231dd..0000000 --- a/spider/resources/static/js/cron/easyui.min.css +++ /dev/null @@ -1,2316 +0,0 @@ -.panel { - overflow: hidden; - text-align: left; -} -.panel-header, -.panel-body { - border-width: 1px; - border-style: solid; -} -.panel-header { - padding: 5px; - position: relative; -} -.panel-title { - background: url('images/blank.gif') no-repeat; -} -.panel-header-noborder { - border-width: 0 0 1px 0; -} -.panel-body { - overflow: auto; - border-top-width: 0px; -} -.panel-body-noheader { - border-top-width: 1px; -} -.panel-body-noborder { - border-width: 0px; -} -.panel-with-icon { - padding-left: 18px; -} -.panel-icon, -.panel-tool { - position: absolute; - top: 50%; - margin-top: -8px; - height: 16px; - overflow: hidden; -} -.panel-icon { - left: 5px; - width: 16px; -} -.panel-tool { - right: 5px; - width: auto; -} -.panel-tool a { - display: inline-block; - width: 16px; - height: 16px; - opacity: 0.6; - filter: alpha(opacity=60); - margin: 0 0 0 2px; - vertical-align: top; -} -.panel-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - background-color: #e6e6e6; - -moz-border-radius: 3px 3px 3px 3px; - -webkit-border-radius: 3px 3px 3px 3px; - border-radius: 3px 3px 3px 3px; -} -.panel-loading { - padding: 11px 0px 10px 30px; -} -.panel-noscroll { - overflow: hidden; -} -.panel-fit, -.panel-fit body { - height: 100%; - margin: 0; - padding: 0; - border: 0; - overflow: hidden; -} -.panel-loading { - background: url('images/loading.gif') no-repeat 10px 10px; -} -.panel-tool-close { - background: url('images/panel_tools.png') no-repeat -16px 0px; -} -.panel-tool-min { - background: url('images/panel_tools.png') no-repeat 0px 0px; -} -.panel-tool-max { - background: url('images/panel_tools.png') no-repeat 0px -16px; -} -.panel-tool-restore { - background: url('images/panel_tools.png') no-repeat -16px -16px; -} -.panel-tool-collapse { - background: url('images/panel_tools.png') no-repeat -32px 0; -} -.panel-tool-expand { - background: url('images/panel_tools.png') no-repeat -32px -16px; -} -.panel-header, -.panel-body { - border-color: #D4D4D4; -} -.panel-header { - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.panel-body { - background-color: #ffffff; - color: #333; - font-size: 12px; -} -.panel-title { - font-size: 12px; - font-weight: bold; - color: #777; - height: 16px; - line-height: 16px; -} -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #D4D4D4; -} -.accordion .accordion-header { - background: #F2F2F2; - filter: none; -} -.accordion .accordion-header-selected { - background: #0081c2; -} -.accordion .accordion-header-selected .panel-title { - color: #fff; -} -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - *zoom: 1; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.window-shadow { - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #D4D4D4; -} -.window { - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 20%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 20%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 20%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 20%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.window-proxy { - border: 1px dashed #D4D4D4; -} -.window-proxy-mask, -.window-mask { - background: #ccc; -} -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #F5F5F5; -} -.dialog-toolbar { - border-bottom: 1px solid #e6e6e6; -} -.dialog-button { - border-top: 1px solid #e6e6e6; -} -.combo { - display: inline-block; - white-space: nowrap; - margin: 0; - padding: 0; - border-width: 1px; - border-style: solid; - overflow: hidden; - vertical-align: middle; -} -.combo .combo-text { - font-size: 12px; - border: 0px; - line-height: 20px; - height: 20px; - margin: 0; - padding: 0px 2px; - *margin-top: -1px; - *height: 18px; - *line-height: 18px; - _height: 18px; - _line-height: 18px; - vertical-align: baseline; -} -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo, -.combo-panel { - background-color: #ffffff; -} -.combo { - border-color: #D4D4D4; - background-color: #ffffff; -} -.combo-arrow { - background-color: #F2F2F2; -} -.combo-arrow-hover { - background-color: #e6e6e6; -} -.combobox-item { - padding: 2px; - font-size: 12px; - padding: 3px; - padding-right: 0px; -} -.combobox-item-hover { - background-color: #e6e6e6; - color: #00438a; -} -.combobox-item-selected { - background-color: #0081c2; - color: #fff; -} -.layout { - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - z-index: 0; -} -.layout-panel { - position: absolute; - overflow: hidden; -} -.layout-panel-east, -.layout-panel-west { - z-index: 2; -} -.layout-panel-north, -.layout-panel-south { - z-index: 3; -} -.layout-expand { - position: absolute; - padding: 0px; - font-size: 1px; - cursor: pointer; - z-index: 1; -} -.layout-expand .panel-header, -.layout-expand .panel-body { - background: transparent; - filter: none; - overflow: hidden; -} -.layout-expand .panel-header { - border-bottom-width: 0px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - position: absolute; - font-size: 1px; - display: none; - z-index: 5; -} -.layout-split-proxy-h { - width: 5px; - cursor: e-resize; -} -.layout-split-proxy-v { - height: 5px; - cursor: n-resize; -} -.layout-mask { - position: absolute; - background: #fafafa; - filter: alpha(opacity=10); - opacity: 0.10; - z-index: 4; -} -.layout-button-up { - background: url('images/layout_arrows.png') no-repeat -16px -16px; -} -.layout-button-down { - background: url('images/layout_arrows.png') no-repeat -16px 0; -} -.layout-button-left { - background: url('images/layout_arrows.png') no-repeat 0 0; -} -.layout-button-right { - background: url('images/layout_arrows.png') no-repeat 0 -16px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - background-color: #bbb; -} -.layout-split-north { - border-bottom: 5px solid #eee; -} -.layout-split-south { - border-top: 5px solid #eee; -} -.layout-split-east { - border-left: 5px solid #eee; -} -.layout-split-west { - border-right: 5px solid #eee; -} -.layout-expand { - background-color: #F2F2F2; -} -.layout-expand-over { - background-color: #F2F2F2; -} -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-header-plain { - border: 0; - background: transparent; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - height: 28px !important; - height: 30px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-header-plain .tabs-scroller-left, -.tabs-header-plain .tabs-scroller-right { - height: 25px !important; - height: 27px; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 5000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 12px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 5px 5px; - -webkit-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 4px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 4px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-scroller-left { - background: #F2F2F2 url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #F2F2F2 url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #e6e6e6; - color: #00438a; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #777; - background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: linear-gradient(to right,#ffffff 0,#ffffff 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: linear-gradient(to right,#ffffff 0,#ffffff 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); -} -.tabs li a.tabs-inner { - color: #777; - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.tabs-header, -.tabs-tool { - background-color: #F2F2F2; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #D4D4D4; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #e6e6e6; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -a.l-btn { - background-position: right 0; - text-decoration: none; - display: inline-block; - zoom: 1; - height: 24px; - padding-right: 18px; - cursor: pointer; - outline: none; -} -a.l-btn-plain { - padding-right: 5px; - border: 0; - padding: 1px 6px 1px 1px; -} -a.l-btn-disabled { - color: #ccc; - opacity: 0.5; - filter: alpha(opacity=50); - cursor: default; -} -a.l-btn span.l-btn-left { - display: inline-block; - background-position: 0 -48px; - padding: 4px 0px 4px 18px; - line-height: 16px; - height: 16px; -} -a.l-btn-plain span.l-btn-left { - padding-left: 5px; -} -a.l-btn span span.l-btn-text { - display: inline-block; - vertical-align: baseline; - width: auto; - height: 16px; - line-height: 16px; - font-size: 12px; - padding: 0; - margin: 0; -} -a.l-btn span span.l-btn-icon-left { - padding: 0 0 0 20px; - background-position: left center; -} -a.l-btn span span.l-btn-icon-right { - padding: 0 20px 0 0; - background-position: right center; -} -a.l-btn span span span.l-btn-empty { - display: inline-block; - margin: 0; - padding: 0; - width: 16px; -} -a:hover.l-btn { - background-position: right -24px; - outline: none; - text-decoration: none; -} -a:hover.l-btn span.l-btn-left { - background-position: 0 bottom; -} -a:hover.l-btn-plain { - padding: 0 5px 0 0; -} -a:hover.l-btn-disabled { - background-position: right 0; -} -a:hover.l-btn-disabled span.l-btn-left { - background-position: 0 -48px; -} -a.l-btn .l-btn-focus { - outline: #0000FF dotted thin; -} -a.l-btn { - color: #444; - background-image: url('images/linkbutton_bg.png'); - background-repeat: no-repeat; - background: #f5f5f5; - background-repeat: repeat-x; - border: 1px solid #bbb; - background: -webkit-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: -moz-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: -o-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: linear-gradient(to bottom,#ffffff 0,#e6e6e6 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0); - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -a.l-btn span.l-btn-left { - background-image: url('images/linkbutton_bg.png'); - background-repeat: no-repeat; - background-image: none; -} -a:hover.l-btn { - background: #e6e6e6; - color: #00438a; - border: 1px solid #ddd; - filter: none; -} -a.l-btn-plain, -a.l-btn-plain span.l-btn-left { - background: transparent; - border: 0; - filter: none; -} -a:hover.l-btn-plain { - background: #e6e6e6; - color: #00438a; - border: 1px solid #ddd; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -a.l-btn-disabled, -a:hover.l-btn-disabled { - color: #444; - filter: alpha(opacity=50); - background: #f5f5f5; - color: #444; - background: -webkit-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: -moz-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: -o-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: linear-gradient(to bottom,#ffffff 0,#e6e6e6 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0); - filter: alpha(opacity=50) progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0); -} -a.l-btn-plain-disabled, -a:hover.l-btn-plain-disabled { - background: transparent; - filter: alpha(opacity=50); -} -a.l-btn-selected, -a:hover.l-btn-selected { - background-position: right -24px; - background: #ddd; - filter: none; -} -a.l-btn-selected span.l-btn-left, -a:hover.l-btn-selected span.l-btn-left { - background-position: 0 bottom; - background-image: none; -} -a.l-btn-plain-selected, -a:hover.l-btn-plain-selected { - background: #ddd; -} -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 12px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-sort-icon { - padding: 0; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 25px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-weight: normal; - font-size: 12px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 12px; -} -.datagrid-cell-group { - text-align: center; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 25px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable .datagrid-editable-input { - margin: 0; - padding: 2px; - border-width: 1px; - border-style: solid; -} -.datagrid-sort-desc .datagrid-sort-icon { - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.datagrid-cell-rownumber { - color: #333; -} -.datagrid-resize-proxy { - background: #bbb; -} -.datagrid-mask { - background: #ccc; -} -.datagrid-mask-msg { - border-color: #D4D4D4; -} -.datagrid-toolbar, -.datagrid-pager { - background: #F5F5F5; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #e6e6e6; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ccc; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #333; -} -.datagrid-row-alt { - background: #F5F5F5; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #e6e6e6; - color: #00438a; - cursor: default; -} -.datagrid-row-selected { - background: #0081c2; - color: #fff; -} -.datagrid-body .datagrid-editable .datagrid-editable-input { - border-color: #D4D4D4; -} -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - height: 21px; - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #e6e6e6; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #F2F2F2; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #e6e6e6; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #F2F2F2; -} -.pagination { - zoom: 1; -} -.pagination table { - float: left; - height: 30px; -} -.pagination td { - border: 0; -} -.pagination-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 3px 1px; -} -.pagination .pagination-num { - border-width: 1px; - border-style: solid; - margin: 0 2px; - padding: 2px; - width: 2em; - height: auto; -} -.pagination-page-list { - margin: 0px 6px; - padding: 1px 2px; - width: auto; - height: auto; - border-width: 1px; - border-style: solid; -} -.pagination-info { - float: right; - margin: 0 6px 0 0; - padding: 0; - height: 30px; - line-height: 30px; - font-size: 12px; -} -.pagination span { - font-size: 12px; -} -.pagination-first { - background: url('images/pagination_icons.png') no-repeat 0 0; -} -.pagination-prev { - background: url('images/pagination_icons.png') no-repeat -16px 0; -} -.pagination-next { - background: url('images/pagination_icons.png') no-repeat -32px 0; -} -.pagination-last { - background: url('images/pagination_icons.png') no-repeat -48px 0; -} -.pagination-load { - background: url('images/pagination_icons.png') no-repeat -64px 0; -} -.pagination-loading { - background: url('images/loading.gif') no-repeat; -} -.pagination-page-list, -.pagination .pagination-num { - border-color: #D4D4D4; -} -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - border-collapse: separate; - font-size: 12px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 12px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 22px; -} -.calendar-title { - text-align: center; - height: 22px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 2px; - padding: 0 3px; - height: 18px; - line-height: 18px; - font-size: 12px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -7px; - width: 14px; - height: 14px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -18px -2px; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -34px -2px; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat -1px -2px; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -49px -2px; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 12px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 40px; - text-align: center; - border-width: 1px; - border-style: solid; - margin: 0; - padding: 2px; - font-weight: bold; - font-size: 12px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 21px; - height: 21px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 2px 2px; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -45px 2px; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-body th, -.calendar-menu-month { - color: #808080; -} -.calendar-day { - color: #333; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #D4D4D4; -} -.calendar { - border-color: #D4D4D4; -} -.calendar-header { - background: #F2F2F2; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #F5F5F5; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #e6e6e6; - color: #00438a; -} -.calendar-hover { - border: 1px solid #ddd; - padding: 0; -} -.calendar-selected { - background-color: #0081c2; - color: #fff; - border: 1px solid #0070a9; - padding: 0; -} -.datebox-calendar-inner { - height: 180px; -} -.datebox-button { - height: 18px; - padding: 2px 5px; - text-align: center; -} -.datebox-button a { - font-size: 12px; -} -.datebox-current, -.datebox-close, -.datebox-ok { - text-decoration: none; - font-weight: bold; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #F5F5F5; -} -.datebox-current, -.datebox-close, -.datebox-ok { - color: #444; -} -.spinner { - display: inline-block; - white-space: nowrap; - margin: 0; - padding: 0; - border-width: 1px; - border-style: solid; - overflow: hidden; - vertical-align: middle; -} -.spinner .spinner-text { - font-size: 12px; - border: 0px; - line-height: 20px; - height: 20px; - margin: 0; - padding: 0 2px; - *margin-top: -1px; - *height: 18px; - *line-height: 18px; - _height: 18px; - _line-height: 18px; - vertical-align: baseline; -} -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; -} -.spinner-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; -} -.spinner { - border-color: #D4D4D4; -} -.spinner-arrow { - background-color: #F2F2F2; -} -.spinner-arrow-hover { - background-color: #e6e6e6; -} -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - overflow: hidden; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.progressbar { - border-color: #D4D4D4; -} -.progressbar-text { - color: #333; - font-size: 12px; -} -.progressbar-value .progressbar-text { - background-color: #0081c2; - color: #fff; -} -.searchbox { - display: inline-block; - white-space: nowrap; - margin: 0; - padding: 0; - border-width: 1px; - border-style: solid; - overflow: hidden; -} -.searchbox .searchbox-text { - font-size: 12px; - border: 0; - margin: 0; - padding: 0; - line-height: 20px; - height: 20px; - *margin-top: -1px; - *height: 18px; - *line-height: 18px; - _height: 18px; - _line-height: 18px; - vertical-align: baseline; -} -.searchbox .searchbox-prompt { - font-size: 12px; - color: #ccc; -} -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox a.l-btn-plain { - height: 20px; - border: 0; - padding: 0 6px 0 0; - vertical-align: top; - -moz-border-radius: 0; - -webkit-border-radius: 0; - border-radius: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox a.l-btn .l-btn-left { - padding: 2px 0 2px 4px; -} -.searchbox a.l-btn-plain:hover { - -moz-border-radius: 0; - -webkit-border-radius: 0; - border-radius: 0; - border: 0; - padding: 0 6px 0 0; - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0; - -webkit-border-radius: 0; - border-radius: 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox { - border-color: #D4D4D4; - background-color: #fff; -} -.searchbox a.l-btn-plain { - background: #F2F2F2; -} -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 5px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: -7px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 12px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 12px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 3px; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #D4D4D4; - background: #F2F2F2; -} -.slider-rule span { - border-color: #D4D4D4; -} -.slider-rulelabel span { - color: #333; -} -.menu { - position: absolute; - margin: 0; - padding: 2px; - border-width: 1px; - border-style: solid; - overflow: hidden; -} -.menu-item { - position: relative; - margin: 0; - padding: 0; - overflow: hidden; - white-space: nowrap; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.menu-text { - height: 20px; - line-height: 20px; - float: left; - padding-left: 28px; -} -.menu-icon { - position: absolute; - width: 16px; - height: 16px; - left: 2px; - top: 50%; - margin-top: -8px; -} -.menu-rightarrow { - position: absolute; - width: 16px; - height: 16px; - right: 0; - top: 50%; - margin-top: -8px; -} -.menu-line { - position: absolute; - left: 26px; - top: 0; - height: 2000px; - font-size: 1px; -} -.menu-sep { - margin: 3px 0px 3px 25px; - font-size: 1px; -} -.menu-active { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.menu-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); - cursor: default; -} -.menu-text, -.menu-text span { - font-size: 12px; -} -.menu-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.menu-rightarrow { - background: url('images/menu_arrows.png') no-repeat -32px center; -} -.menu-line { - border-left: 1px solid #ccc; - border-right: 1px solid #fff; -} -.menu-sep { - border-top: 1px solid #ccc; - border-bottom: 1px solid #fff; -} -.menu { - background-color: #fff; - border-color: #e6e6e6; - color: #333; -} -.menu-content { - background: #ffffff; -} -.menu-item { - border-color: transparent; - _border-color: #fff; -} -.menu-active { - border-color: #ddd; - color: #00438a; - background: #e6e6e6; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #333; -} -.m-btn-downarrow { - display: inline-block; - width: 16px; - height: 16px; - line-height: 16px; - font-size: 12px; - _vertical-align: middle; -} -a.m-btn-active { - background-position: bottom right; -} -a.m-btn-active span.l-btn-left { - background-position: bottom left; -} -a.m-btn-plain-active { - background: transparent; - padding: 0 5px 0 0; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.m-btn-downarrow { - background: url('images/menu_arrows.png') no-repeat 2px center; -} -a.m-btn-plain-active { - border-color: #ddd; - background-color: #e6e6e6; - color: #00438a; -} -.s-btn-downarrow { - display: inline-block; - margin: 0 0 0 4px; - padding: 0 0 0 1px; - width: 14px; - height: 16px; - line-height: 16px; - border-width: 0; - border-style: solid; - font-size: 12px; - _vertical-align: middle; -} -a.s-btn-active { - background-position: bottom right; -} -a.s-btn-active span.l-btn-left { - background-position: bottom left; -} -a.s-btn-plain-active { - background: transparent; - padding: 0 5px 0 0; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.s-btn-downarrow { - background: url('images/menu_arrows.png') no-repeat 2px center; - border-color: #bbb; -} -a:hover.l-btn .s-btn-downarrow, -a.s-btn-active .s-btn-downarrow, -a.s-btn-plain-active .s-btn-downarrow { - background-position: 1px center; - padding: 0; - border-width: 0 0 0 1px; -} -a.s-btn-plain-active { - border-color: #ddd; - background-color: #e6e6e6; - color: #00438a; -} -.messager-body { - padding: 10px; - overflow: hidden; -} -.messager-button { - text-align: center; - padding-top: 10px; -} -.messager-icon { - float: left; - width: 32px; - height: 32px; - margin: 0 10px 10px 0; -} -.messager-error { - background: url('images/messager_icons.png') no-repeat scroll -64px 0; -} -.messager-info { - background: url('images/messager_icons.png') no-repeat scroll 0 0; -} -.messager-question { - background: url('images/messager_icons.png') no-repeat scroll -32px 0; -} -.messager-warning { - background: url('images/messager_icons.png') no-repeat scroll -96px 0; -} -.messager-progress { - padding: 10px; -} -.messager-p-msg { - margin-bottom: 5px; -} -.messager-body .messager-input { - width: 100%; - padding: 1px 0; - border: 1px solid #D4D4D4; -} -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 18px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - vertical-align: top; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 12px; - display: inline-block; - text-decoration: none; - vertical-align: top; - white-space: nowrap; - padding: 0 2px; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 12px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #ccc; - font-size: 12px; - height: 14px !important; - height: 18px; - line-height: 14px; - padding: 1px 2px; - width: 80px; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #333; - border-color: #D4D4D4; -} -.tree-node-hover { - background: #e6e6e6; - color: #00438a; -} -.tree-node-selected { - background: #0081c2; - color: #fff; -} -.validatebox-invalid { - background-image: url('images/validatebox_warning.png'); - background-repeat: no-repeat; - background-position: right center; - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tooltip-content { - font-size: 12px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #D4D4D4; - color: #333; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #D4D4D4; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #D4D4D4; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #D4D4D4; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #D4D4D4; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} -.tabs-panels { - border-color: transparent; -} -.tabs li a.tabs-inner { - border-color: transparent; - background: transparent; - filter: none; - color: #0088CC; -} -.menu-active { - background-color: #0081C2; - border-color: #0081C2; - color: #fff; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #333; -} diff --git a/spider/resources/static/js/cron/images/spinner_arrows.png b/spider/resources/static/js/cron/images/spinner_arrows.png deleted file mode 100644 index b68592de3200fbe1f7defe98a2b59b0398b1b737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel$EE8V@SoV_tDnm{r-UW|t3f!- diff --git a/spider/resources/static/js/cron/jquery-2.1.4.min.js b/spider/resources/static/js/cron/jquery-2.1.4.min.js deleted file mode 100644 index 49990d6..0000000 --- a/spider/resources/static/js/cron/jquery-2.1.4.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){ -return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("").attr("src",window.ActiveXObject?"javascript:false":"about:blank").css({position:"absolute",top:-1000,left:-1000}); -var t=form.attr("target"),a=form.attr("action"); -form.attr("target",_3f3); -var _3f5=$(); -try{ -_3f4.appendTo("body"); -_3f4.bind("load",cb); -for(var n in _3f2){ -var f=$("").val(_3f2[n]).appendTo(form); -_3f5=_3f5.add(f); -} -form[0].submit(); -} -finally{ -form.attr("action",a); -t?form.attr("target",t):form.removeAttr("target"); -_3f5.remove(); -} -var _3f6=10; -function cb(){ -_3f4.unbind(); -var body=$("#"+_3f3).contents().find("body"); -var data=body.html(); -if(data==""){ -if(--_3f6){ -setTimeout(cb,100); -return; -} -return; -} -var ta=body.find(">textarea"); -if(ta.length){ -data=ta.val(); -}else{ -var pre=body.find(">pre"); -if(pre.length){ -data=pre.html(); -} -} -if(_3f1.success){ -_3f1.success(data); -} -setTimeout(function(){ -_3f4.unbind(); -_3f4.remove(); -},100); -}; -}; -function load(_3f7,data){ -if(!$.data(_3f7,"form")){ -$.data(_3f7,"form",{options:$.extend({},$.fn.form.defaults)}); -} -var opts=$.data(_3f7,"form").options; -if(typeof data=="string"){ -var _3f8={}; -if(opts.onBeforeLoad.call(_3f7,_3f8)==false){ -return; -} -$.ajax({url:data,data:_3f8,dataType:"json",success:function(data){ -_3f9(data); -},error:function(){ -opts.onLoadError.apply(_3f7,arguments); -}}); -}else{ -_3f9(data); -} -function _3f9(data){ -var form=$(_3f7); -for(var name in data){ -var val=data[name]; -var rr=_3fa(name,val); -if(!rr.length){ -var f=form.find("input[numberboxName=\""+name+"\"]"); -if(f.length){ -f.numberbox("setValue",val); -}else{ -$("input[name=\""+name+"\"]",form).val(val); -$("textarea[name=\""+name+"\"]",form).val(val); -$("select[name=\""+name+"\"]",form).val(val); -} -} -_3fb(name,val); -} -opts.onLoadSuccess.call(_3f7,data); -_3fe(_3f7); -}; -function _3fa(name,val){ -var rr=$(_3f7).find("input[name=\""+name+"\"][type=radio], input[name=\""+name+"\"][type=checkbox]"); -rr._propAttr("checked",false); -rr.each(function(){ -var f=$(this); -if(f.val()==String(val)||$.inArray(f.val(),val)>=0){ -f._propAttr("checked",true); -} -}); -return rr; -}; -function _3fb(name,val){ -var form=$(_3f7); -var cc=["combobox","combotree","combogrid","datetimebox","datebox","combo"]; -var c=form.find("[comboName=\""+name+"\"]"); -if(c.length){ -for(var i=0;i").insertAfter(_40b); -var name=$(_40b).attr("name"); -if(name){ -v.attr("name",name); -$(_40b).removeAttr("name").attr("numberboxName",name); -} -return v; -}; -function _40c(_40d){ -var opts=$.data(_40d,"numberbox").options; -var fn=opts.onChange; -opts.onChange=function(){ -}; -_40e(_40d,opts.parser.call(_40d,opts.value)); -opts.onChange=fn; -opts.originalValue=_40f(_40d); -}; -function _40f(_410){ -return $.data(_410,"numberbox").field.val(); -}; -function _40e(_411,_412){ -var _413=$.data(_411,"numberbox"); -var opts=_413.options; -var _414=_40f(_411); -_412=opts.parser.call(_411,_412); -opts.value=_412; -_413.field.val(_412); -$(_411).val(opts.formatter.call(_411,_412)); -if(_414!=_412){ -opts.onChange.call(_411,_412,_414); -} -}; -function _415(_416){ -var opts=$.data(_416,"numberbox").options; -$(_416).unbind(".numberbox").bind("keypress.numberbox",function(e){ -return opts.filter.call(_416,e); -}).bind("blur.numberbox",function(){ -_40e(_416,$(this).val()); -$(this).val(opts.formatter.call(_416,_40f(_416))); -}).bind("focus.numberbox",function(){ -var vv=_40f(_416); -if(vv!=opts.parser.call(_416,$(this).val())){ -$(this).val(opts.formatter.call(_416,vv)); -} -}); -}; -function _417(_418){ -if($.fn.validatebox){ -var opts=$.data(_418,"numberbox").options; -$(_418).validatebox(opts); -} -}; -function _419(_41a,_41b){ -var opts=$.data(_41a,"numberbox").options; -if(_41b){ -opts.disabled=true; -$(_41a).attr("disabled",true); -}else{ -opts.disabled=false; -$(_41a).removeAttr("disabled"); -} -}; -$.fn.numberbox=function(_41c,_41d){ -if(typeof _41c=="string"){ -var _41e=$.fn.numberbox.methods[_41c]; -if(_41e){ -return _41e(this,_41d); -}else{ -return this.validatebox(_41c,_41d); -} -} -_41c=_41c||{}; -return this.each(function(){ -var _41f=$.data(this,"numberbox"); -if(_41f){ -$.extend(_41f.options,_41c); -}else{ -_41f=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_41c),field:init(this)}); -$(this).removeAttr("disabled"); -$(this).css({imeMode:"disabled"}); -} -_419(this,_41f.options.disabled); -_415(this); -_417(this); -_40c(this); -}); -}; -$.fn.numberbox.methods={options:function(jq){ -return $.data(jq[0],"numberbox").options; -},destroy:function(jq){ -return jq.each(function(){ -$.data(this,"numberbox").field.remove(); -$(this).validatebox("destroy"); -$(this).remove(); -}); -},disable:function(jq){ -return jq.each(function(){ -_419(this,true); -}); -},enable:function(jq){ -return jq.each(function(){ -_419(this,false); -}); -},fix:function(jq){ -return jq.each(function(){ -_40e(this,$(this).val()); -}); -},setValue:function(jq,_420){ -return jq.each(function(){ -_40e(this,_420); -}); -},getValue:function(jq){ -return _40f(jq[0]); -},clear:function(jq){ -return jq.each(function(){ -var _421=$.data(this,"numberbox"); -_421.field.val(""); -$(this).val(""); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).numberbox("options"); -$(this).numberbox("setValue",opts.originalValue); -}); -}}; -$.fn.numberbox.parseOptions=function(_422){ -var t=$(_422); -return $.extend({},$.fn.validatebox.parseOptions(_422),$.parser.parseOptions(_422,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined),disabled:(t.attr("disabled")?true:undefined),value:(t.val()||undefined)}); -}; -$.fn.numberbox.defaults=$.extend({},$.fn.validatebox.defaults,{disabled:false,value:"",min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",filter:function(e){ -var opts=$(this).numberbox("options"); -if(e.which==45){ -return ($(this).val().indexOf("-")==-1?true:false); -} -var c=String.fromCharCode(e.which); -if(c==opts.decimalSeparator){ -return ($(this).val().indexOf(c)==-1?true:false); -}else{ -if(c==opts.groupSeparator){ -return true; -}else{ -if((e.which>=48&&e.which<=57&&e.ctrlKey==false&&e.shiftKey==false)||e.which==0||e.which==8){ -return true; -}else{ -if(e.ctrlKey==true&&(e.which==99||e.which==118)){ -return true; -}else{ -return false; -} -} -} -} -},formatter:function(_423){ -if(!_423){ -return _423; -} -_423=_423+""; -var opts=$(this).numberbox("options"); -var s1=_423,s2=""; -var dpos=_423.indexOf("."); -if(dpos>=0){ -s1=_423.substring(0,dpos); -s2=_423.substring(dpos+1,_423.length); -} -if(opts.groupSeparator){ -var p=/(\d+)(\d{3})/; -while(p.test(s1)){ -s1=s1.replace(p,"$1"+opts.groupSeparator+"$2"); -} -} -if(s2){ -return opts.prefix+s1+opts.decimalSeparator+s2+opts.suffix; -}else{ -return opts.prefix+s1+opts.suffix; -} -},parser:function(s){ -s=s+""; -var opts=$(this).numberbox("options"); -if(parseFloat(s)!=s){ -if(opts.prefix){ -s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.prefix),"g"),"")); -} -if(opts.suffix){ -s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.suffix),"g"),"")); -} -if(opts.groupSeparator){ -s=$.trim(s.replace(new RegExp("\\"+opts.groupSeparator,"g"),"")); -} -if(opts.decimalSeparator){ -s=$.trim(s.replace(new RegExp("\\"+opts.decimalSeparator,"g"),".")); -} -s=s.replace(/\s/g,""); -} -var val=parseFloat(s).toFixed(opts.precision); -if(isNaN(val)){ -val=""; -}else{ -if(typeof (opts.min)=="number"&&valopts.max){ -val=opts.max.toFixed(opts.precision); -} -} -} -return val; -},onChange:function(_424,_425){ -}}); -})(jQuery); -(function($){ -function _426(_427){ -var opts=$.data(_427,"calendar").options; -var t=$(_427); -if(opts.fit==true){ -var p=t.parent(); -opts.width=p.width(); -opts.height=p.height(); -} -var _428=t.find(".calendar-header"); -t._outerWidth(opts.width); -t._outerHeight(opts.height); -t.find(".calendar-body")._outerHeight(t.height()-_428._outerHeight()); -}; -function init(_429){ -$(_429).addClass("calendar").html("
    "+"
    "+"
    "+"
    "+"
    "+"
    "+"Aprial 2010"+"
    "+"
    "+"
    "+"
    "+"
    "+""+""+""+"
    "+"
    "+"
    "+"
    "+"
    "); -$(_429).find(".calendar-title span").hover(function(){ -$(this).addClass("calendar-menu-hover"); -},function(){ -$(this).removeClass("calendar-menu-hover"); -}).click(function(){ -var menu=$(_429).find(".calendar-menu"); -if(menu.is(":visible")){ -menu.hide(); -}else{ -_430(_429); -} -}); -$(".calendar-prevmonth,.calendar-nextmonth,.calendar-prevyear,.calendar-nextyear",_429).hover(function(){ -$(this).addClass("calendar-nav-hover"); -},function(){ -$(this).removeClass("calendar-nav-hover"); -}); -$(_429).find(".calendar-nextmonth").click(function(){ -_42a(_429,1); -}); -$(_429).find(".calendar-prevmonth").click(function(){ -_42a(_429,-1); -}); -$(_429).find(".calendar-nextyear").click(function(){ -_42d(_429,1); -}); -$(_429).find(".calendar-prevyear").click(function(){ -_42d(_429,-1); -}); -$(_429).bind("_resize",function(){ -var opts=$.data(_429,"calendar").options; -if(opts.fit==true){ -_426(_429); -} -return false; -}); -}; -function _42a(_42b,_42c){ -var opts=$.data(_42b,"calendar").options; -opts.month+=_42c; -if(opts.month>12){ -opts.year++; -opts.month=1; -}else{ -if(opts.month<1){ -opts.year--; -opts.month=12; -} -} -show(_42b); -var menu=$(_42b).find(".calendar-menu-month-inner"); -menu.find("td.calendar-selected").removeClass("calendar-selected"); -menu.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); -}; -function _42d(_42e,_42f){ -var opts=$.data(_42e,"calendar").options; -opts.year+=_42f; -show(_42e); -var menu=$(_42e).find(".calendar-menu-year"); -menu.val(opts.year); -}; -function _430(_431){ -var opts=$.data(_431,"calendar").options; -$(_431).find(".calendar-menu").show(); -if($(_431).find(".calendar-menu-month-inner").is(":empty")){ -$(_431).find(".calendar-menu-month-inner").empty(); -var t=$("
    ").appendTo($(_431).find(".calendar-menu-month-inner")); -var idx=0; -for(var i=0;i<3;i++){ -var tr=$("").appendTo(t); -for(var j=0;j<4;j++){ -$("").html(opts.months[idx++]).attr("abbr",idx).appendTo(tr); -} -} -$(_431).find(".calendar-menu-prev,.calendar-menu-next").hover(function(){ -$(this).addClass("calendar-menu-hover"); -},function(){ -$(this).removeClass("calendar-menu-hover"); -}); -$(_431).find(".calendar-menu-next").click(function(){ -var y=$(_431).find(".calendar-menu-year"); -if(!isNaN(y.val())){ -y.val(parseInt(y.val())+1); -} -}); -$(_431).find(".calendar-menu-prev").click(function(){ -var y=$(_431).find(".calendar-menu-year"); -if(!isNaN(y.val())){ -y.val(parseInt(y.val()-1)); -} -}); -$(_431).find(".calendar-menu-year").keypress(function(e){ -if(e.keyCode==13){ -_432(); -} -}); -$(_431).find(".calendar-menu-month").hover(function(){ -$(this).addClass("calendar-menu-hover"); -},function(){ -$(this).removeClass("calendar-menu-hover"); -}).click(function(){ -var menu=$(_431).find(".calendar-menu"); -menu.find(".calendar-selected").removeClass("calendar-selected"); -$(this).addClass("calendar-selected"); -_432(); -}); -} -function _432(){ -var menu=$(_431).find(".calendar-menu"); -var year=menu.find(".calendar-menu-year").val(); -var _433=menu.find(".calendar-selected").attr("abbr"); -if(!isNaN(year)){ -opts.year=parseInt(year); -opts.month=parseInt(_433); -show(_431); -} -menu.hide(); -}; -var body=$(_431).find(".calendar-body"); -var sele=$(_431).find(".calendar-menu"); -var _434=sele.find(".calendar-menu-year-inner"); -var _435=sele.find(".calendar-menu-month-inner"); -_434.find("input").val(opts.year).focus(); -_435.find("td.calendar-selected").removeClass("calendar-selected"); -_435.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); -sele._outerWidth(body._outerWidth()); -sele._outerHeight(body._outerHeight()); -_435._outerHeight(sele.height()-_434._outerHeight()); -}; -function _436(_437,year,_438){ -var opts=$.data(_437,"calendar").options; -var _439=[]; -var _43a=new Date(year,_438,0).getDate(); -for(var i=1;i<=_43a;i++){ -_439.push([year,_438,i]); -} -var _43b=[],week=[]; -var _43c=-1; -while(_439.length>0){ -var date=_439.shift(); -week.push(date); -var day=new Date(date[0],date[1]-1,date[2]).getDay(); -if(_43c==day){ -day=0; -}else{ -if(day==(opts.firstDay==0?7:opts.firstDay)-1){ -_43b.push(week); -week=[]; -} -} -_43c=day; -} -if(week.length){ -_43b.push(week); -} -var _43d=_43b[0]; -if(_43d.length<7){ -while(_43d.length<7){ -var _43e=_43d[0]; -var date=new Date(_43e[0],_43e[1]-1,_43e[2]-1); -_43d.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -}else{ -var _43e=_43d[0]; -var week=[]; -for(var i=1;i<=7;i++){ -var date=new Date(_43e[0],_43e[1]-1,_43e[2]-i); -week.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -_43b.unshift(week); -} -var _43f=_43b[_43b.length-1]; -while(_43f.length<7){ -var _440=_43f[_43f.length-1]; -var date=new Date(_440[0],_440[1]-1,_440[2]+1); -_43f.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -if(_43b.length<6){ -var _440=_43f[_43f.length-1]; -var week=[]; -for(var i=1;i<=7;i++){ -var date=new Date(_440[0],_440[1]-1,_440[2]+i); -week.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -_43b.push(week); -} -return _43b; -}; -function show(_441){ -var opts=$.data(_441,"calendar").options; -$(_441).find(".calendar-title span").html(opts.months[opts.month-1]+" "+opts.year); -var body=$(_441).find("div.calendar-body"); -body.find(">table").remove(); -var t=$("
    ").prependTo(body); -var tr=$("").appendTo(t.find("thead")); -for(var i=opts.firstDay;i"+opts.weeks[i]+""); -} -for(var i=0;i"+opts.weeks[i]+""); -} -var _442=_436(_441,opts.year,opts.month); -for(var i=0;i<_442.length;i++){ -var week=_442[i]; -var tr=$("").appendTo(t.find("tbody")); -for(var j=0;j").attr("abbr",day[0]+","+day[1]+","+day[2]).html(day[2]).appendTo(tr); -} -} -t.find("td[abbr^=\""+opts.year+","+opts.month+"\"]").removeClass("calendar-other-month"); -var now=new Date(); -var _443=now.getFullYear()+","+(now.getMonth()+1)+","+now.getDate(); -t.find("td[abbr=\""+_443+"\"]").addClass("calendar-today"); -if(opts.current){ -t.find(".calendar-selected").removeClass("calendar-selected"); -var _444=opts.current.getFullYear()+","+(opts.current.getMonth()+1)+","+opts.current.getDate(); -t.find("td[abbr=\""+_444+"\"]").addClass("calendar-selected"); -} -var _445=6-opts.firstDay; -var _446=_445+1; -if(_445>=7){ -_445-=7; -} -if(_446>=7){ -_446-=7; -} -t.find("tr").find("td:eq("+_445+")").addClass("calendar-saturday"); -t.find("tr").find("td:eq("+_446+")").addClass("calendar-sunday"); -t.find("td").hover(function(){ -$(this).addClass("calendar-hover"); -},function(){ -$(this).removeClass("calendar-hover"); -}).click(function(){ -t.find(".calendar-selected").removeClass("calendar-selected"); -$(this).addClass("calendar-selected"); -var _447=$(this).attr("abbr").split(","); -opts.current=new Date(_447[0],parseInt(_447[1])-1,_447[2]); -opts.onSelect.call(_441,opts.current); -}); -}; -$.fn.calendar=function(_448,_449){ -if(typeof _448=="string"){ -return $.fn.calendar.methods[_448](this,_449); -} -_448=_448||{}; -return this.each(function(){ -var _44a=$.data(this,"calendar"); -if(_44a){ -$.extend(_44a.options,_448); -}else{ -_44a=$.data(this,"calendar",{options:$.extend({},$.fn.calendar.defaults,$.fn.calendar.parseOptions(this),_448)}); -init(this); -} -if(_44a.options.border==false){ -$(this).addClass("calendar-noborder"); -} -_426(this); -show(this); -$(this).find("div.calendar-menu").hide(); -}); -}; -$.fn.calendar.methods={options:function(jq){ -return $.data(jq[0],"calendar").options; -},resize:function(jq){ -return jq.each(function(){ -_426(this); -}); -},moveTo:function(jq,date){ -return jq.each(function(){ -$(this).calendar({year:date.getFullYear(),month:date.getMonth()+1,current:date}); -}); -}}; -$.fn.calendar.parseOptions=function(_44b){ -var t=$(_44b); -return $.extend({},$.parser.parseOptions(_44b,["width","height",{firstDay:"number",fit:"boolean",border:"boolean"}])); -}; -$.fn.calendar.defaults={width:180,height:180,fit:false,border:true,firstDay:0,weeks:["S","M","T","W","T","F","S"],months:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],year:new Date().getFullYear(),month:new Date().getMonth()+1,current:new Date(),onSelect:function(date){ -}}; -})(jQuery); -(function($){ -function init(_44c){ -var _44d=$(""+""+""+""+""+"").insertAfter(_44c); -$(_44c).addClass("spinner-text spinner-f").prependTo(_44d); -return _44d; -}; -function _44e(_44f,_450){ -var opts=$.data(_44f,"spinner").options; -var _451=$.data(_44f,"spinner").spinner; -if(_450){ -opts.width=_450; -} -var _452=$("
    ").insertBefore(_451); -_451.appendTo("body"); -if(isNaN(opts.width)){ -opts.width=$(_44f).outerWidth(); -} -var _453=_451.find(".spinner-arrow"); -_451._outerWidth(opts.width)._outerHeight(opts.height); -$(_44f)._outerWidth(_451.width()-_453.outerWidth()); -$(_44f).css({height:_451.height()+"px",lineHeight:_451.height()+"px"}); -_453._outerHeight(_451.height()); -_453.find("span")._outerHeight(_453.height()/2); -_451.insertAfter(_452); -_452.remove(); -}; -function _454(_455){ -var opts=$.data(_455,"spinner").options; -var _456=$.data(_455,"spinner").spinner; -_456.find(".spinner-arrow-up,.spinner-arrow-down").unbind(".spinner"); -if(!opts.disabled){ -_456.find(".spinner-arrow-up").bind("mouseenter.spinner",function(){ -$(this).addClass("spinner-arrow-hover"); -}).bind("mouseleave.spinner",function(){ -$(this).removeClass("spinner-arrow-hover"); -}).bind("click.spinner",function(){ -opts.spin.call(_455,false); -opts.onSpinUp.call(_455); -$(_455).validatebox("validate"); -}); -_456.find(".spinner-arrow-down").bind("mouseenter.spinner",function(){ -$(this).addClass("spinner-arrow-hover"); -}).bind("mouseleave.spinner",function(){ -$(this).removeClass("spinner-arrow-hover"); -}).bind("click.spinner",function(){ -opts.spin.call(_455,true); -opts.onSpinDown.call(_455); -$(_455).validatebox("validate"); -}); -} -}; -function _457(_458,_459){ -var opts=$.data(_458,"spinner").options; -if(_459){ -opts.disabled=true; -$(_458).attr("disabled",true); -}else{ -opts.disabled=false; -$(_458).removeAttr("disabled"); -} -}; -$.fn.spinner=function(_45a,_45b){ -if(typeof _45a=="string"){ -var _45c=$.fn.spinner.methods[_45a]; -if(_45c){ -return _45c(this,_45b); -}else{ -return this.validatebox(_45a,_45b); -} -} -_45a=_45a||{}; -return this.each(function(){ -var _45d=$.data(this,"spinner"); -if(_45d){ -$.extend(_45d.options,_45a); -}else{ -_45d=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_45a),spinner:init(this)}); -$(this).removeAttr("disabled"); -} -_45d.options.originalValue=_45d.options.value; -$(this).val(_45d.options.value); -$(this).attr("readonly",!_45d.options.editable); -_457(this,_45d.options.disabled); -_44e(this); -$(this).validatebox(_45d.options); -_454(this); -}); -}; -$.fn.spinner.methods={options:function(jq){ -var opts=$.data(jq[0],"spinner").options; -return $.extend(opts,{value:jq.val()}); -},destroy:function(jq){ -return jq.each(function(){ -var _45e=$.data(this,"spinner").spinner; -$(this).validatebox("destroy"); -_45e.remove(); -}); -},resize:function(jq,_45f){ -return jq.each(function(){ -_44e(this,_45f); -}); -},enable:function(jq){ -return jq.each(function(){ -_457(this,false); -_454(this); -}); -},disable:function(jq){ -return jq.each(function(){ -_457(this,true); -_454(this); -}); -},getValue:function(jq){ -return jq.val(); -},setValue:function(jq,_460){ -return jq.each(function(){ -var opts=$.data(this,"spinner").options; -opts.value=_460; -$(this).val(_460); -}); -},clear:function(jq){ -return jq.each(function(){ -var opts=$.data(this,"spinner").options; -opts.value=""; -$(this).val(""); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).spinner("options"); -$(this).spinner("setValue",opts.originalValue); -}); -}}; -$.fn.spinner.parseOptions=function(_461){ -var t=$(_461); -return $.extend({},$.fn.validatebox.parseOptions(_461),$.parser.parseOptions(_461,["width","height","min","max",{increment:"number",editable:"boolean"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.spinner.defaults=$.extend({},$.fn.validatebox.defaults,{width:"auto",height:22,deltaX:19,value:"",min:null,max:null,increment:1,editable:true,disabled:false,spin:function(down){ -},onSpinUp:function(){ -},onSpinDown:function(){ -}}); -})(jQuery); -(function($){ -function _462(_463){ -$(_463).addClass("numberspinner-f"); -var opts=$.data(_463,"numberspinner").options; -$(_463).spinner(opts).numberbox(opts); -}; -function _464(_465,down){ -var opts=$.data(_465,"numberspinner").options; -var v=parseFloat($(_465).numberbox("getValue")||opts.value)||0; -if(down==true){ -v-=opts.increment; -}else{ -v+=opts.increment; -} -$(_465).numberbox("setValue",v); -}; -$.fn.numberspinner=function(_466,_467){ -if(typeof _466=="string"){ -var _468=$.fn.numberspinner.methods[_466]; -if(_468){ -return _468(this,_467); -}else{ -return this.spinner(_466,_467); -} -} -_466=_466||{}; -return this.each(function(){ -var _469=$.data(this,"numberspinner"); -if(_469){ -$.extend(_469.options,_466); -}else{ -$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_466)}); -} -_462(this); -}); -}; -$.fn.numberspinner.methods={options:function(jq){ -var opts=$.data(jq[0],"numberspinner").options; -return $.extend(opts,{value:jq.numberbox("getValue"),originalValue:jq.numberbox("options").originalValue}); -},setValue:function(jq,_46a){ -return jq.each(function(){ -$(this).numberbox("setValue",_46a); -}); -},getValue:function(jq){ -return jq.numberbox("getValue"); -},clear:function(jq){ -return jq.each(function(){ -$(this).spinner("clear"); -$(this).numberbox("clear"); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).numberspinner("options"); -$(this).numberspinner("setValue",opts.originalValue); -}); -}}; -$.fn.numberspinner.parseOptions=function(_46b){ -return $.extend({},$.fn.spinner.parseOptions(_46b),$.fn.numberbox.parseOptions(_46b),{}); -}; -$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(down){ -_464(this,down); -}}); -})(jQuery); -(function($){ -function _46c(_46d){ -var opts=$.data(_46d,"timespinner").options; -$(_46d).addClass("timespinner-f"); -$(_46d).spinner(opts); -$(_46d).unbind(".timespinner"); -$(_46d).bind("click.timespinner",function(){ -var _46e=0; -if(this.selectionStart!=null){ -_46e=this.selectionStart; -}else{ -if(this.createTextRange){ -var _46f=_46d.createTextRange(); -var s=document.selection.createRange(); -s.setEndPoint("StartToStart",_46f); -_46e=s.text.length; -} -} -if(_46e>=0&&_46e<=2){ -opts.highlight=0; -}else{ -if(_46e>=3&&_46e<=5){ -opts.highlight=1; -}else{ -if(_46e>=6&&_46e<=8){ -opts.highlight=2; -} -} -} -_471(_46d); -}).bind("blur.timespinner",function(){ -_470(_46d); -}); -}; -function _471(_472){ -var opts=$.data(_472,"timespinner").options; -var _473=0,end=0; -if(opts.highlight==0){ -_473=0; -end=2; -}else{ -if(opts.highlight==1){ -_473=3; -end=5; -}else{ -if(opts.highlight==2){ -_473=6; -end=8; -} -} -} -if(_472.selectionStart!=null){ -_472.setSelectionRange(_473,end); -}else{ -if(_472.createTextRange){ -var _474=_472.createTextRange(); -_474.collapse(); -_474.moveEnd("character",end); -_474.moveStart("character",_473); -_474.select(); -} -} -$(_472).focus(); -}; -function _475(_476,_477){ -var opts=$.data(_476,"timespinner").options; -if(!_477){ -return null; -} -var vv=_477.split(opts.separator); -for(var i=0;itime){ -time=_47a; -} -if(_47b&&_47b"]; -for(var i=0;i<_48e.length;i++){ -_48d.cache[_48e[i][0]]={width:_48e[i][1]}; -} -var _48f=0; -for(var s in _48d.cache){ -var item=_48d.cache[s]; -item.index=_48f++; -ss.push(s+"{width:"+item.width+"}"); -} -ss.push(""); -$(ss.join("\n")).appendTo(cc); -setTimeout(function(){ -cc.children("style:not(:last)").remove(); -},0); -},getRule:function(_490){ -var _491=cc.children("style:last")[0]; -var _492=_491.styleSheet?_491.styleSheet:(_491.sheet||document.styleSheets[document.styleSheets.length-1]); -var _493=_492.cssRules||_492.rules; -return _493[_490]; -},set:function(_494,_495){ -var item=_48d.cache[_494]; -if(item){ -item.width=_495; -var rule=this.getRule(item.index); -if(rule){ -rule.style["width"]=_495; -} -} -},remove:function(_496){ -var tmp=[]; -for(var s in _48d.cache){ -if(s.indexOf(_496)==-1){ -tmp.push([s,_48d.cache[s].width]); -} -} -_48d.cache={}; -this.add(tmp); -},dirty:function(_497){ -if(_497){ -_48d.dirty.push(_497); -} -},clean:function(){ -for(var i=0;i<_48d.dirty.length;i++){ -this.remove(_48d.dirty[i]); -} -_48d.dirty=[]; -}}; -}; -function _498(_499,_49a){ -var opts=$.data(_499,"datagrid").options; -var _49b=$.data(_499,"datagrid").panel; -if(_49a){ -if(_49a.width){ -opts.width=_49a.width; -} -if(_49a.height){ -opts.height=_49a.height; -} -} -if(opts.fit==true){ -var p=_49b.panel("panel").parent(); -opts.width=p.width(); -opts.height=p.height(); -} -_49b.panel("resize",{width:opts.width,height:opts.height}); -}; -function _49c(_49d){ -var opts=$.data(_49d,"datagrid").options; -var dc=$.data(_49d,"datagrid").dc; -var wrap=$.data(_49d,"datagrid").panel; -var _49e=wrap.width(); -var _49f=wrap.height(); -var view=dc.view; -var _4a0=dc.view1; -var _4a1=dc.view2; -var _4a2=_4a0.children("div.datagrid-header"); -var _4a3=_4a1.children("div.datagrid-header"); -var _4a4=_4a2.find("table"); -var _4a5=_4a3.find("table"); -view.width(_49e); -var _4a6=_4a2.children("div.datagrid-header-inner").show(); -_4a0.width(_4a6.find("table").width()); -if(!opts.showHeader){ -_4a6.hide(); -} -_4a1.width(_49e-_4a0._outerWidth()); -_4a0.children("div.datagrid-header,div.datagrid-body,div.datagrid-footer").width(_4a0.width()); -_4a1.children("div.datagrid-header,div.datagrid-body,div.datagrid-footer").width(_4a1.width()); -var hh; -_4a2.css("height",""); -_4a3.css("height",""); -_4a4.css("height",""); -_4a5.css("height",""); -hh=Math.max(_4a4.height(),_4a5.height()); -_4a4.height(hh); -_4a5.height(hh); -_4a2.add(_4a3)._outerHeight(hh); -if(opts.height!="auto"){ -var _4a7=_49f-_4a1.children("div.datagrid-header")._outerHeight()-_4a1.children("div.datagrid-footer")._outerHeight()-wrap.children("div.datagrid-toolbar")._outerHeight(); -wrap.children("div.datagrid-pager").each(function(){ -_4a7-=$(this)._outerHeight(); -}); -dc.body1.add(dc.body2).children("table.datagrid-btable-frozen").css({position:"absolute",top:dc.header2._outerHeight()}); -var _4a8=dc.body2.children("table.datagrid-btable-frozen")._outerHeight(); -_4a0.add(_4a1).children("div.datagrid-body").css({marginTop:_4a8,height:(_4a7-_4a8)}); -} -view.height(_4a1.height()); -}; -function _4a9(_4aa,_4ab,_4ac){ -var rows=$.data(_4aa,"datagrid").data.rows; -var opts=$.data(_4aa,"datagrid").options; -var dc=$.data(_4aa,"datagrid").dc; -if(!dc.body1.is(":empty")&&(!opts.nowrap||opts.autoRowHeight||_4ac)){ -if(_4ab!=undefined){ -var tr1=opts.finder.getTr(_4aa,_4ab,"body",1); -var tr2=opts.finder.getTr(_4aa,_4ab,"body",2); -_4ad(tr1,tr2); -}else{ -var tr1=opts.finder.getTr(_4aa,0,"allbody",1); -var tr2=opts.finder.getTr(_4aa,0,"allbody",2); -_4ad(tr1,tr2); -if(opts.showFooter){ -var tr1=opts.finder.getTr(_4aa,0,"allfooter",1); -var tr2=opts.finder.getTr(_4aa,0,"allfooter",2); -_4ad(tr1,tr2); -} -} -} -_49c(_4aa); -if(opts.height=="auto"){ -var _4ae=dc.body1.parent(); -var _4af=dc.body2; -var _4b0=_4b1(_4af); -var _4b2=_4b0.height; -if(_4b0.width>_4af.width()){ -_4b2+=18; -} -_4ae.height(_4b2); -_4af.height(_4b2); -dc.view.height(dc.view2.height()); -} -dc.body2.triggerHandler("scroll"); -function _4ad(trs1,trs2){ -for(var i=0;i"); -} -_4ba(true); -_4ba(false); -_49c(_4b7); -function _4ba(_4bb){ -var _4bc=_4bb?1:2; -var tr=opts.finder.getTr(_4b7,_4b8,"body",_4bc); -(_4bb?dc.body1:dc.body2).children("table.datagrid-btable-frozen").append(tr); -}; -}; -function _4bd(_4be,_4bf){ -function _4c0(){ -var _4c1=[]; -var _4c2=[]; -$(_4be).children("thead").each(function(){ -var opt=$.parser.parseOptions(this,[{frozen:"boolean"}]); -$(this).find("tr").each(function(){ -var cols=[]; -$(this).find("th").each(function(){ -var th=$(this); -var col=$.extend({},$.parser.parseOptions(this,["field","align","halign","order",{sortable:"boolean",checkbox:"boolean",resizable:"boolean",fixed:"boolean"},{rowspan:"number",colspan:"number",width:"number"}]),{title:(th.html()||undefined),hidden:(th.attr("hidden")?true:undefined),formatter:(th.attr("formatter")?eval(th.attr("formatter")):undefined),styler:(th.attr("styler")?eval(th.attr("styler")):undefined),sorter:(th.attr("sorter")?eval(th.attr("sorter")):undefined)}); -if(th.attr("editor")){ -var s=$.trim(th.attr("editor")); -if(s.substr(0,1)=="{"){ -col.editor=eval("("+s+")"); -}else{ -col.editor=s; -} -} -cols.push(col); -}); -opt.frozen?_4c1.push(cols):_4c2.push(cols); -}); -}); -return [_4c1,_4c2]; -}; -var _4c3=$("
    "+"
    "+"
    "+"
    "+"
    "+"
    "+"
    "+"
    "+"
    "+"
    "+""+"
    "+"
    "+"
    "+"
    "+"
    "+"
    "+"
    "+"
    "+""+"
    "+"
    "+"
    "+"
    ").insertAfter(_4be); -_4c3.panel({doSize:false}); -_4c3.panel("panel").addClass("datagrid").bind("_resize",function(e,_4c4){ -var opts=$.data(_4be,"datagrid").options; -if(opts.fit==true||_4c4){ -_498(_4be); -setTimeout(function(){ -if($.data(_4be,"datagrid")){ -_4c5(_4be); -} -},0); -} -return false; -}); -$(_4be).hide().appendTo(_4c3.children("div.datagrid-view")); -var cc=_4c0(); -var view=_4c3.children("div.datagrid-view"); -var _4c6=view.children("div.datagrid-view1"); -var _4c7=view.children("div.datagrid-view2"); -var _4c8=_4c3.closest("div.datagrid-view"); -if(!_4c8.length){ -_4c8=view; -} -var ss=_48b(_4c8); -return {panel:_4c3,frozenColumns:cc[0],columns:cc[1],dc:{view:view,view1:_4c6,view2:_4c7,header1:_4c6.children("div.datagrid-header").children("div.datagrid-header-inner"),header2:_4c7.children("div.datagrid-header").children("div.datagrid-header-inner"),body1:_4c6.children("div.datagrid-body").children("div.datagrid-body-inner"),body2:_4c7.children("div.datagrid-body"),footer1:_4c6.children("div.datagrid-footer").children("div.datagrid-footer-inner"),footer2:_4c7.children("div.datagrid-footer").children("div.datagrid-footer-inner")},ss:ss}; -}; -function _4c9(_4ca){ -var _4cb=$.data(_4ca,"datagrid"); -var opts=_4cb.options; -var dc=_4cb.dc; -var _4cc=_4cb.panel; -_4cc.panel($.extend({},opts,{id:null,doSize:false,onResize:function(_4cd,_4ce){ -setTimeout(function(){ -if($.data(_4ca,"datagrid")){ -_49c(_4ca); -_4ef(_4ca); -opts.onResize.call(_4cc,_4cd,_4ce); -} -},0); -},onExpand:function(){ -_4a9(_4ca); -opts.onExpand.call(_4cc); -}})); -_4cb.rowIdPrefix="datagrid-row-r"+(++_486); -_4cb.cellClassPrefix="datagrid-cell-c"+_486; -_4cf(dc.header1,opts.frozenColumns,true); -_4cf(dc.header2,opts.columns,false); -_4d0(); -dc.header1.add(dc.header2).css("display",opts.showHeader?"block":"none"); -dc.footer1.add(dc.footer2).css("display",opts.showFooter?"block":"none"); -if(opts.toolbar){ -if(typeof opts.toolbar=="string"){ -$(opts.toolbar).addClass("datagrid-toolbar").prependTo(_4cc); -$(opts.toolbar).show(); -}else{ -$("div.datagrid-toolbar",_4cc).remove(); -var tb=$("
    ").prependTo(_4cc); -var tr=tb.find("tr"); -for(var i=0;i
    ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var tool=$("").appendTo(td); -tool[0].onclick=eval(btn.handler||function(){ -}); -tool.linkbutton($.extend({},btn,{plain:true})); -} -} -} -}else{ -$("div.datagrid-toolbar",_4cc).remove(); -} -$("div.datagrid-pager",_4cc).remove(); -if(opts.pagination){ -var _4d1=$("
    "); -if(opts.pagePosition=="bottom"){ -_4d1.appendTo(_4cc); -}else{ -if(opts.pagePosition=="top"){ -_4d1.addClass("datagrid-pager-top").prependTo(_4cc); -}else{ -var ptop=$("
    ").prependTo(_4cc); -_4d1.appendTo(_4cc); -_4d1=_4d1.add(ptop); -} -} -_4d1.pagination({total:0,pageNumber:opts.pageNumber,pageSize:opts.pageSize,pageList:opts.pageList,onSelectPage:function(_4d2,_4d3){ -opts.pageNumber=_4d2; -opts.pageSize=_4d3; -_4d1.pagination("refresh",{pageNumber:_4d2,pageSize:_4d3}); -_5b0(_4ca); -}}); -opts.pageSize=_4d1.pagination("options").pageSize; -} -function _4cf(_4d4,_4d5,_4d6){ -if(!_4d5){ -return; -} -$(_4d4).show(); -$(_4d4).empty(); -var t=$("
    ").appendTo(_4d4); -for(var i=0;i<_4d5.length;i++){ -var tr=$("").appendTo($("tbody",t)); -var cols=_4d5[i]; -for(var j=0;j").appendTo(tr); -if(col.checkbox){ -td.attr("field",col.field); -$("
    ").html("").appendTo(td); -}else{ -if(col.field){ -td.attr("field",col.field); -td.append("
    "); -$("span",td).html(col.title); -$("span.datagrid-sort-icon",td).html(" "); -var cell=td.find("div.datagrid-cell"); -if(opts.sortName==col.field){ -cell.addClass("datagrid-sort-"+opts.sortOrder); -} -if(col.resizable==false){ -cell.attr("resizable","false"); -} -if(col.width){ -cell._outerWidth(col.width); -col.boxWidth=parseInt(cell[0].style.width); -}else{ -col.auto=true; -} -cell.css("text-align",(col.halign||col.align||"")); -col.cellClass=_4cb.cellClassPrefix+"-"+col.field.replace(/[\.|\s]/g,"-"); -}else{ -$("
    ").html(col.title).appendTo(td); -} -} -if(col.hidden){ -td.hide(); -} -} -} -if(_4d6&&opts.rownumbers){ -var td=$("
    "); -if($("tr",t).length==0){ -td.wrap("").parent().appendTo($("tbody",t)); -}else{ -td.prependTo($("tr:first",t)); -} -} -}; -function _4d0(){ -var _4d7=[]; -var _4d8=_4d9(_4ca,true).concat(_4d9(_4ca)); -for(var i=0;i<_4d8.length;i++){ -var col=_4da(_4ca,_4d8[i]); -if(col&&!col.checkbox){ -_4d7.push(["."+col.cellClass,col.boxWidth?col.boxWidth+"px":"auto"]); -} -} -_4cb.ss.add(_4d7); -_4cb.ss.dirty(_4cb.cellSelectorPrefix); -_4cb.cellSelectorPrefix="."+_4cb.cellClassPrefix; -}; -}; -function _4db(_4dc){ -var _4dd=$.data(_4dc,"datagrid"); -var _4de=_4dd.panel; -var opts=_4dd.options; -var dc=_4dd.dc; -var _4df=dc.header1.add(dc.header2); -_4df.find("input[type=checkbox]").unbind(".datagrid").bind("click.datagrid",function(e){ -if(opts.singleSelect&&opts.selectOnCheck){ -return false; -} -if($(this).is(":checked")){ -_54b(_4dc); -}else{ -_551(_4dc); -} -e.stopPropagation(); -}); -var _4e0=_4df.find("div.datagrid-cell"); -_4e0.closest("td").unbind(".datagrid").bind("mouseenter.datagrid",function(){ -if(_4dd.resizing){ -return; -} -$(this).addClass("datagrid-header-over"); -}).bind("mouseleave.datagrid",function(){ -$(this).removeClass("datagrid-header-over"); -}).bind("contextmenu.datagrid",function(e){ -var _4e1=$(this).attr("field"); -opts.onHeaderContextMenu.call(_4dc,e,_4e1); -}); -_4e0.unbind(".datagrid").bind("click.datagrid",function(e){ -var p1=$(this).offset().left+5; -var p2=$(this).offset().left+$(this)._outerWidth()-5; -if(e.pageXp1){ -var _4e2=$(this).parent().attr("field"); -var col=_4da(_4dc,_4e2); -if(!col.sortable||_4dd.resizing){ -return; -} -opts.sortName=_4e2; -opts.sortOrder=col.order||"asc"; -var cls="datagrid-sort-"+opts.sortOrder; -if($(this).hasClass("datagrid-sort-asc")){ -cls="datagrid-sort-desc"; -opts.sortOrder="desc"; -}else{ -if($(this).hasClass("datagrid-sort-desc")){ -cls="datagrid-sort-asc"; -opts.sortOrder="asc"; -} -} -_4e0.removeClass("datagrid-sort-asc datagrid-sort-desc"); -$(this).addClass(cls); -if(opts.remoteSort){ -_5b0(_4dc); -}else{ -var data=$.data(_4dc,"datagrid").data; -_51b(_4dc,data); -} -opts.onSortColumn.call(_4dc,opts.sortName,opts.sortOrder); -} -}).bind("dblclick.datagrid",function(e){ -var p1=$(this).offset().left+5; -var p2=$(this).offset().left+$(this)._outerWidth()-5; -var cond=opts.resizeHandle=="right"?(e.pageX>p2):(opts.resizeHandle=="left"?(e.pageXp2)); -if(cond){ -var _4e3=$(this).parent().attr("field"); -var col=_4da(_4dc,_4e3); -if(col.resizable==false){ -return; -} -$(_4dc).datagrid("autoSizeColumn",_4e3); -col.auto=false; -} -}); -var _4e4=opts.resizeHandle=="right"?"e":(opts.resizeHandle=="left"?"w":"e,w"); -_4e0.each(function(){ -$(this).resizable({handles:_4e4,disabled:($(this).attr("resizable")?$(this).attr("resizable")=="false":false),minWidth:25,onStartResize:function(e){ -_4dd.resizing=true; -_4df.css("cursor",$("body").css("cursor")); -if(!_4dd.proxy){ -_4dd.proxy=$("
    ").appendTo(dc.view); -} -_4dd.proxy.css({left:e.pageX-$(_4de).offset().left-1,display:"none"}); -setTimeout(function(){ -if(_4dd.proxy){ -_4dd.proxy.show(); -} -},500); -},onResize:function(e){ -_4dd.proxy.css({left:e.pageX-$(_4de).offset().left-1,display:"block"}); -return false; -},onStopResize:function(e){ -_4df.css("cursor",""); -$(this).css("height",""); -var _4e5=$(this).parent().attr("field"); -var col=_4da(_4dc,_4e5); -col.width=$(this)._outerWidth(); -col.boxWidth=parseInt(this.style.width); -col.auto=undefined; -_4c5(_4dc,_4e5); -_4dd.proxy.remove(); -_4dd.proxy=null; -if($(this).parents("div:first.datagrid-header").parent().hasClass("datagrid-view1")){ -_49c(_4dc); -} -_4ef(_4dc); -opts.onResizeColumn.call(_4dc,_4e5,col.width); -setTimeout(function(){ -_4dd.resizing=false; -},0); -}}); -}); -dc.body1.add(dc.body2).unbind().bind("mouseover",function(e){ -if(_4dd.resizing){ -return; -} -var tr=$(e.target).closest("tr.datagrid-row"); -if(!_4e6(tr)){ -return; -} -var _4e7=_4e8(tr); -_533(_4dc,_4e7); -e.stopPropagation(); -}).bind("mouseout",function(e){ -var tr=$(e.target).closest("tr.datagrid-row"); -if(!_4e6(tr)){ -return; -} -var _4e9=_4e8(tr); -opts.finder.getTr(_4dc,_4e9).removeClass("datagrid-row-over"); -e.stopPropagation(); -}).bind("click",function(e){ -var tt=$(e.target); -var tr=tt.closest("tr.datagrid-row"); -if(!_4e6(tr)){ -return; -} -var _4ea=_4e8(tr); -if(tt.parent().hasClass("datagrid-cell-check")){ -if(opts.singleSelect&&opts.selectOnCheck){ -if(!opts.checkOnSelect){ -_551(_4dc,true); -} -_53e(_4dc,_4ea); -}else{ -if(tt.is(":checked")){ -_53e(_4dc,_4ea); -}else{ -_545(_4dc,_4ea); -} -} -}else{ -var row=opts.finder.getRow(_4dc,_4ea); -var td=tt.closest("td[field]",tr); -if(td.length){ -var _4eb=td.attr("field"); -opts.onClickCell.call(_4dc,_4ea,_4eb,row[_4eb]); -} -if(opts.singleSelect==true){ -_537(_4dc,_4ea); -}else{ -if(tr.hasClass("datagrid-row-selected")){ -_53f(_4dc,_4ea); -}else{ -_537(_4dc,_4ea); -} -} -opts.onClickRow.call(_4dc,_4ea,row); -} -e.stopPropagation(); -}).bind("dblclick",function(e){ -var tt=$(e.target); -var tr=tt.closest("tr.datagrid-row"); -if(!_4e6(tr)){ -return; -} -var _4ec=_4e8(tr); -var row=opts.finder.getRow(_4dc,_4ec); -var td=tt.closest("td[field]",tr); -if(td.length){ -var _4ed=td.attr("field"); -opts.onDblClickCell.call(_4dc,_4ec,_4ed,row[_4ed]); -} -opts.onDblClickRow.call(_4dc,_4ec,row); -e.stopPropagation(); -}).bind("contextmenu",function(e){ -var tr=$(e.target).closest("tr.datagrid-row"); -if(!_4e6(tr)){ -return; -} -var _4ee=_4e8(tr); -var row=opts.finder.getRow(_4dc,_4ee); -opts.onRowContextMenu.call(_4dc,e,_4ee,row); -e.stopPropagation(); -}); -dc.body2.bind("scroll",function(){ -var b1=dc.view1.children("div.datagrid-body"); -b1.scrollTop($(this).scrollTop()); -var c1=dc.body1.children(":first"); -var c2=dc.body2.children(":first"); -if(c1.length&&c2.length){ -var top1=c1.offset().top; -var top2=c2.offset().top; -if(top1!=top2){ -b1.scrollTop(b1.scrollTop()+top1-top2); -} -} -dc.view2.children("div.datagrid-header,div.datagrid-footer")._scrollLeft($(this)._scrollLeft()); -dc.body2.children("table.datagrid-btable-frozen").css("left",-$(this)._scrollLeft()); -}); -function _4e8(tr){ -if(tr.attr("datagrid-row-index")){ -return parseInt(tr.attr("datagrid-row-index")); -}else{ -return tr.attr("node-id"); -} -}; -function _4e6(tr){ -return tr.length&&tr.parent().length; -}; -}; -function _4ef(_4f0){ -var opts=$.data(_4f0,"datagrid").options; -var dc=$.data(_4f0,"datagrid").dc; -dc.body2.css("overflow-x",opts.fitColumns?"hidden":""); -if(!opts.fitColumns){ -return; -} -var _4f1=dc.view2.children("div.datagrid-header"); -var _4f2=0; -var _4f3; -var _4f4=_4d9(_4f0,false); -for(var i=0;i<_4f4.length;i++){ -var col=_4da(_4f0,_4f4[i]); -if(_4f5(col)){ -_4f2+=col.width; -_4f3=col; -} -} -var _4f6=_4f1.children("div.datagrid-header-inner").show(); -var _4f7=_4f1.width()-_4f1.find("table").width()-opts.scrollbarSize; -var rate=_4f7/_4f2; -if(!opts.showHeader){ -_4f6.hide(); -} -for(var i=0;i<_4f4.length;i++){ -var col=_4da(_4f0,_4f4[i]); -if(_4f5(col)){ -var _4f8=Math.floor(col.width*rate); -_4f9(col,_4f8); -_4f7-=_4f8; -} -} -if(_4f7&&_4f3){ -_4f9(_4f3,_4f7); -} -_4c5(_4f0); -function _4f9(col,_4fa){ -col.width+=_4fa; -col.boxWidth+=_4fa; -_4f1.find("td[field=\""+col.field+"\"] div.datagrid-cell").width(col.boxWidth); -}; -function _4f5(col){ -if(!col.hidden&&!col.checkbox&&!col.auto&&!col.fixed){ -return true; -} -}; -}; -function _4fb(_4fc,_4fd){ -var opts=$.data(_4fc,"datagrid").options; -var dc=$.data(_4fc,"datagrid").dc; -if(_4fd){ -_498(_4fd); -if(opts.fitColumns){ -_49c(_4fc); -_4ef(_4fc); -} -}else{ -var _4fe=false; -var _4ff=_4d9(_4fc,true).concat(_4d9(_4fc,false)); -for(var i=0;i<_4ff.length;i++){ -var _4fd=_4ff[i]; -var col=_4da(_4fc,_4fd); -if(col.auto){ -_498(_4fd); -_4fe=true; -} -} -if(_4fe&&opts.fitColumns){ -_49c(_4fc); -_4ef(_4fc); -} -} -function _498(_500){ -var _501=dc.view.find("div.datagrid-header td[field=\""+_500+"\"] div.datagrid-cell"); -_501.css("width",""); -var col=$(_4fc).datagrid("getColumnOption",_500); -col.width=undefined; -col.boxWidth=undefined; -col.auto=true; -$(_4fc).datagrid("fixColumnSize",_500); -var _502=Math.max(_501._outerWidth(),_503("allbody"),_503("allfooter")); -_501._outerWidth(_502); -col.width=_502; -col.boxWidth=parseInt(_501[0].style.width); -$(_4fc).datagrid("fixColumnSize",_500); -opts.onResizeColumn.call(_4fc,_500,col.width); -function _503(type){ -var _504=0; -opts.finder.getTr(_4fc,0,type).find("td[field=\""+_500+"\"] div.datagrid-cell").each(function(){ -var w=$(this)._outerWidth(); -if(_504b?1:-1); -}; -data.rows.sort(function(r1,r2){ -return _51e(r1[opts.sortName],r2[opts.sortName])*(opts.sortOrder=="asc"?1:-1); -}); -} -} -if(opts.view.onBeforeRender){ -opts.view.onBeforeRender.call(opts.view,_51c,data.rows); -} -opts.view.render.call(opts.view,_51c,dc.body2,false); -opts.view.render.call(opts.view,_51c,dc.body1,true); -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,_51c,dc.footer2,false); -opts.view.renderFooter.call(opts.view,_51c,dc.footer1,true); -} -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,_51c); -} -_51d.ss.clean(); -opts.onLoadSuccess.call(_51c,data); -var _51f=$(_51c).datagrid("getPager"); -if(_51f.length){ -if(_51f.pagination("options").total!=data.total){ -_51f.pagination("refresh",{total:data.total}); -} -} -_4a9(_51c); -dc.body2.triggerHandler("scroll"); -_520(); -$(_51c).datagrid("autoSizeColumn"); -function _520(){ -if(opts.idField){ -for(var i=0;i_531.height()-18){ -_531.scrollTop(_531.scrollTop()+top+tr._outerHeight()-_531.height()+18); -} -} -} -}; -function _533(_534,_535){ -var _536=$.data(_534,"datagrid"); -var opts=_536.options; -opts.finder.getTr(_534,_536.highlightIndex).removeClass("datagrid-row-over"); -opts.finder.getTr(_534,_535).addClass("datagrid-row-over"); -_536.highlightIndex=_535; -}; -function _537(_538,_539,_53a){ -var _53b=$.data(_538,"datagrid"); -var dc=_53b.dc; -var opts=_53b.options; -var _53c=_53b.selectedRows; -if(opts.singleSelect){ -_53d(_538); -_53c.splice(0,_53c.length); -} -if(!_53a&&opts.checkOnSelect){ -_53e(_538,_539,true); -} -var row=opts.finder.getRow(_538,_539); -if(opts.idField){ -_48a(_53c,opts.idField,row); -} -opts.finder.getTr(_538,_539).addClass("datagrid-row-selected"); -opts.onSelect.call(_538,_539,row); -_52c(_538,_539); -}; -function _53f(_540,_541,_542){ -var _543=$.data(_540,"datagrid"); -var dc=_543.dc; -var opts=_543.options; -var _544=$.data(_540,"datagrid").selectedRows; -if(!_542&&opts.checkOnSelect){ -_545(_540,_541,true); -} -opts.finder.getTr(_540,_541).removeClass("datagrid-row-selected"); -var row=opts.finder.getRow(_540,_541); -if(opts.idField){ -_488(_544,opts.idField,row[opts.idField]); -} -opts.onUnselect.call(_540,_541,row); -}; -function _546(_547,_548){ -var _549=$.data(_547,"datagrid"); -var opts=_549.options; -var rows=_549.data.rows; -var _54a=$.data(_547,"datagrid").selectedRows; -if(!_548&&opts.checkOnSelect){ -_54b(_547,true); -} -opts.finder.getTr(_547,"","allbody").addClass("datagrid-row-selected"); -if(opts.idField){ -for(var _54c=0;_54c"); -cell.children("table").bind("click dblclick contextmenu",function(e){ -e.stopPropagation(); -}); -$.data(cell[0],"datagrid.editor",{actions:_581,target:_581.init(cell.find("td"),_580),field:_57e,type:_57f,oldHtml:_582}); -} -} -}); -_4a9(_57c,_57d,true); -}; -function _573(_584,_585){ -var opts=$.data(_584,"datagrid").options; -var tr=opts.finder.getTr(_584,_585); -tr.children("td").each(function(){ -var cell=$(this).find("div.datagrid-editable"); -if(cell.length){ -var ed=$.data(cell[0],"datagrid.editor"); -if(ed.actions.destroy){ -ed.actions.destroy(ed.target); -} -cell.html(ed.oldHtml); -$.removeData(cell[0],"datagrid.editor"); -cell.removeClass("datagrid-editable"); -cell.css("width",""); -} -}); -}; -function _568(_586,_587){ -var tr=$.data(_586,"datagrid").options.finder.getTr(_586,_587); -if(!tr.hasClass("datagrid-row-editing")){ -return true; -} -var vbox=tr.find(".validatebox-text"); -vbox.validatebox("validate"); -vbox.trigger("mouseleave"); -var _588=tr.find(".validatebox-invalid"); -return _588.length==0; -}; -function _589(_58a,_58b){ -var _58c=$.data(_58a,"datagrid").insertedRows; -var _58d=$.data(_58a,"datagrid").deletedRows; -var _58e=$.data(_58a,"datagrid").updatedRows; -if(!_58b){ -var rows=[]; -rows=rows.concat(_58c); -rows=rows.concat(_58d); -rows=rows.concat(_58e); -return rows; -}else{ -if(_58b=="inserted"){ -return _58c; -}else{ -if(_58b=="deleted"){ -return _58d; -}else{ -if(_58b=="updated"){ -return _58e; -} -} -} -} -return []; -}; -function _58f(_590,_591){ -var _592=$.data(_590,"datagrid"); -var opts=_592.options; -var data=_592.data; -var _593=_592.insertedRows; -var _594=_592.deletedRows; -$(_590).datagrid("cancelEdit",_591); -var row=data.rows[_591]; -if(_487(_593,row)>=0){ -_488(_593,row); -}else{ -_594.push(row); -} -_488(_592.selectedRows,opts.idField,data.rows[_591][opts.idField]); -_488(_592.checkedRows,opts.idField,data.rows[_591][opts.idField]); -opts.view.deleteRow.call(opts.view,_590,_591); -if(opts.height=="auto"){ -_4a9(_590); -} -$(_590).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _595(_596,_597){ -var data=$.data(_596,"datagrid").data; -var view=$.data(_596,"datagrid").options.view; -var _598=$.data(_596,"datagrid").insertedRows; -view.insertRow.call(view,_596,_597.index,_597.row); -_598.push(_597.row); -$(_596).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _599(_59a,row){ -var data=$.data(_59a,"datagrid").data; -var view=$.data(_59a,"datagrid").options.view; -var _59b=$.data(_59a,"datagrid").insertedRows; -view.insertRow.call(view,_59a,null,row); -_59b.push(row); -$(_59a).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _59c(_59d){ -var _59e=$.data(_59d,"datagrid"); -var data=_59e.data; -var rows=data.rows; -var _59f=[]; -for(var i=0;i=0){ -(_5ac=="s"?_537:_53e)(_5a3,_5ad,true); -} -} -}; -for(var i=0;i0){ -_51b(this,data); -_59c(this); -} -} -_498(this); -_5b0(this); -_4db(this); -}); -}; -var _5be={text:{init:function(_5bf,_5c0){ -var _5c1=$("").appendTo(_5bf); -return _5c1; -},getValue:function(_5c2){ -return $(_5c2).val(); -},setValue:function(_5c3,_5c4){ -$(_5c3).val(_5c4); -},resize:function(_5c5,_5c6){ -$(_5c5)._outerWidth(_5c6); -}},textarea:{init:function(_5c7,_5c8){ -var _5c9=$("").appendTo(_5c7); -return _5c9; -},getValue:function(_5ca){ -return $(_5ca).val(); -},setValue:function(_5cb,_5cc){ -$(_5cb).val(_5cc); -},resize:function(_5cd,_5ce){ -$(_5cd)._outerWidth(_5ce); -}},checkbox:{init:function(_5cf,_5d0){ -var _5d1=$("").appendTo(_5cf); -_5d1.val(_5d0.on); -_5d1.attr("offval",_5d0.off); -return _5d1; -},getValue:function(_5d2){ -if($(_5d2).is(":checked")){ -return $(_5d2).val(); -}else{ -return $(_5d2).attr("offval"); -} -},setValue:function(_5d3,_5d4){ -var _5d5=false; -if($(_5d3).val()==_5d4){ -_5d5=true; -} -$(_5d3)._propAttr("checked",_5d5); -}},numberbox:{init:function(_5d6,_5d7){ -var _5d8=$("").appendTo(_5d6); -_5d8.numberbox(_5d7); -return _5d8; -},destroy:function(_5d9){ -$(_5d9).numberbox("destroy"); -},getValue:function(_5da){ -$(_5da).blur(); -return $(_5da).numberbox("getValue"); -},setValue:function(_5db,_5dc){ -$(_5db).numberbox("setValue",_5dc); -},resize:function(_5dd,_5de){ -$(_5dd)._outerWidth(_5de); -}},validatebox:{init:function(_5df,_5e0){ -var _5e1=$("").appendTo(_5df); -_5e1.validatebox(_5e0); -return _5e1; -},destroy:function(_5e2){ -$(_5e2).validatebox("destroy"); -},getValue:function(_5e3){ -return $(_5e3).val(); -},setValue:function(_5e4,_5e5){ -$(_5e4).val(_5e5); -},resize:function(_5e6,_5e7){ -$(_5e6)._outerWidth(_5e7); -}},datebox:{init:function(_5e8,_5e9){ -var _5ea=$("").appendTo(_5e8); -_5ea.datebox(_5e9); -return _5ea; -},destroy:function(_5eb){ -$(_5eb).datebox("destroy"); -},getValue:function(_5ec){ -return $(_5ec).datebox("getValue"); -},setValue:function(_5ed,_5ee){ -$(_5ed).datebox("setValue",_5ee); -},resize:function(_5ef,_5f0){ -$(_5ef).datebox("resize",_5f0); -}},combobox:{init:function(_5f1,_5f2){ -var _5f3=$("").appendTo(_5f1); -_5f3.combobox(_5f2||{}); -return _5f3; -},destroy:function(_5f4){ -$(_5f4).combobox("destroy"); -},getValue:function(_5f5){ -return $(_5f5).combobox("getValue"); -},setValue:function(_5f6,_5f7){ -$(_5f6).combobox("setValue",_5f7); -},resize:function(_5f8,_5f9){ -$(_5f8).combobox("resize",_5f9); -}},combotree:{init:function(_5fa,_5fb){ -var _5fc=$("").appendTo(_5fa); -_5fc.combotree(_5fb); -return _5fc; -},destroy:function(_5fd){ -$(_5fd).combotree("destroy"); -},getValue:function(_5fe){ -return $(_5fe).combotree("getValue"); -},setValue:function(_5ff,_600){ -$(_5ff).combotree("setValue",_600); -},resize:function(_601,_602){ -$(_601).combotree("resize",_602); -}}}; -$.fn.datagrid.methods={options:function(jq){ -var _603=$.data(jq[0],"datagrid").options; -var _604=$.data(jq[0],"datagrid").panel.panel("options"); -var opts=$.extend(_603,{width:_604.width,height:_604.height,closed:_604.closed,collapsed:_604.collapsed,minimized:_604.minimized,maximized:_604.maximized}); -return opts; -},getPanel:function(jq){ -return $.data(jq[0],"datagrid").panel; -},getPager:function(jq){ -return $.data(jq[0],"datagrid").panel.children("div.datagrid-pager"); -},getColumnFields:function(jq,_605){ -return _4d9(jq[0],_605); -},getColumnOption:function(jq,_606){ -return _4da(jq[0],_606); -},resize:function(jq,_607){ -return jq.each(function(){ -_498(this,_607); -}); -},load:function(jq,_608){ -return jq.each(function(){ -var opts=$(this).datagrid("options"); -opts.pageNumber=1; -var _609=$(this).datagrid("getPager"); -_609.pagination({pageNumber:1}); -_5b0(this,_608); -}); -},reload:function(jq,_60a){ -return jq.each(function(){ -_5b0(this,_60a); -}); -},reloadFooter:function(jq,_60b){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -var dc=$.data(this,"datagrid").dc; -if(_60b){ -$.data(this,"datagrid").footer=_60b; -} -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,this,dc.footer2,false); -opts.view.renderFooter.call(opts.view,this,dc.footer1,true); -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,this); -} -$(this).datagrid("fixRowHeight"); -} -}); -},loading:function(jq){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -$(this).datagrid("getPager").pagination("loading"); -if(opts.loadMsg){ -var _60c=$(this).datagrid("getPanel"); -$("
    ").appendTo(_60c); -var msg=$("
    ").html(opts.loadMsg).appendTo(_60c); -msg.css("marginLeft",-msg.outerWidth()/2); -} -}); -},loaded:function(jq){ -return jq.each(function(){ -$(this).datagrid("getPager").pagination("loaded"); -var _60d=$(this).datagrid("getPanel"); -_60d.children("div.datagrid-mask-msg").remove(); -_60d.children("div.datagrid-mask").remove(); -}); -},fitColumns:function(jq){ -return jq.each(function(){ -_4ef(this); -}); -},fixColumnSize:function(jq,_60e){ -return jq.each(function(){ -_4c5(this,_60e); -}); -},fixRowHeight:function(jq,_60f){ -return jq.each(function(){ -_4a9(this,_60f); -}); -},freezeRow:function(jq,_610){ -return jq.each(function(){ -_4b6(this,_610); -}); -},autoSizeColumn:function(jq,_611){ -return jq.each(function(){ -_4fb(this,_611); -}); -},loadData:function(jq,data){ -return jq.each(function(){ -_51b(this,data); -_59c(this); -}); -},getData:function(jq){ -return $.data(jq[0],"datagrid").data; -},getRows:function(jq){ -return $.data(jq[0],"datagrid").data.rows; -},getFooterRows:function(jq){ -return $.data(jq[0],"datagrid").footer; -},getRowIndex:function(jq,id){ -return _522(jq[0],id); -},getChecked:function(jq){ -return _529(jq[0]); -},getSelected:function(jq){ -var rows=_525(jq[0]); -return rows.length>0?rows[0]:null; -},getSelections:function(jq){ -return _525(jq[0]); -},clearSelections:function(jq){ -return jq.each(function(){ -var _612=$.data(this,"datagrid").selectedRows; -_612.splice(0,_612.length); -_53d(this); -}); -},clearChecked:function(jq){ -return jq.each(function(){ -var _613=$.data(this,"datagrid").checkedRows; -_613.splice(0,_613.length); -_551(this); -}); -},scrollTo:function(jq,_614){ -return jq.each(function(){ -_52c(this,_614); -}); -},highlightRow:function(jq,_615){ -return jq.each(function(){ -_533(this,_615); -_52c(this,_615); -}); -},selectAll:function(jq){ -return jq.each(function(){ -_546(this); -}); -},unselectAll:function(jq){ -return jq.each(function(){ -_53d(this); -}); -},selectRow:function(jq,_616){ -return jq.each(function(){ -_537(this,_616); -}); -},selectRecord:function(jq,id){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -if(opts.idField){ -var _617=_522(this,id); -if(_617>=0){ -$(this).datagrid("selectRow",_617); -} -} -}); -},unselectRow:function(jq,_618){ -return jq.each(function(){ -_53f(this,_618); -}); -},checkRow:function(jq,_619){ -return jq.each(function(){ -_53e(this,_619); -}); -},uncheckRow:function(jq,_61a){ -return jq.each(function(){ -_545(this,_61a); -}); -},checkAll:function(jq){ -return jq.each(function(){ -_54b(this); -}); -},uncheckAll:function(jq){ -return jq.each(function(){ -_551(this); -}); -},beginEdit:function(jq,_61b){ -return jq.each(function(){ -_563(this,_61b); -}); -},endEdit:function(jq,_61c){ -return jq.each(function(){ -_569(this,_61c,false); -}); -},cancelEdit:function(jq,_61d){ -return jq.each(function(){ -_569(this,_61d,true); -}); -},getEditors:function(jq,_61e){ -return _574(jq[0],_61e); -},getEditor:function(jq,_61f){ -return _578(jq[0],_61f); -},refreshRow:function(jq,_620){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -opts.view.refreshRow.call(opts.view,this,_620); -}); -},validateRow:function(jq,_621){ -return _568(jq[0],_621); -},updateRow:function(jq,_622){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -opts.view.updateRow.call(opts.view,this,_622.index,_622.row); -}); -},appendRow:function(jq,row){ -return jq.each(function(){ -_599(this,row); -}); -},insertRow:function(jq,_623){ -return jq.each(function(){ -_595(this,_623); -}); -},deleteRow:function(jq,_624){ -return jq.each(function(){ -_58f(this,_624); -}); -},getChanges:function(jq,_625){ -return _589(jq[0],_625); -},acceptChanges:function(jq){ -return jq.each(function(){ -_5a0(this); -}); -},rejectChanges:function(jq){ -return jq.each(function(){ -_5a2(this); -}); -},mergeCells:function(jq,_626){ -return jq.each(function(){ -_5b6(this,_626); -}); -},showColumn:function(jq,_627){ -return jq.each(function(){ -var _628=$(this).datagrid("getPanel"); -_628.find("td[field=\""+_627+"\"]").show(); -$(this).datagrid("getColumnOption",_627).hidden=false; -$(this).datagrid("fitColumns"); -}); -},hideColumn:function(jq,_629){ -return jq.each(function(){ -var _62a=$(this).datagrid("getPanel"); -_62a.find("td[field=\""+_629+"\"]").hide(); -$(this).datagrid("getColumnOption",_629).hidden=true; -$(this).datagrid("fitColumns"); -}); -}}; -$.fn.datagrid.parseOptions=function(_62b){ -var t=$(_62b); -return $.extend({},$.fn.panel.parseOptions(_62b),$.parser.parseOptions(_62b,["url","toolbar","idField","sortName","sortOrder","pagePosition","resizeHandle",{fitColumns:"boolean",autoRowHeight:"boolean",striped:"boolean",nowrap:"boolean"},{rownumbers:"boolean",singleSelect:"boolean",checkOnSelect:"boolean",selectOnCheck:"boolean"},{pagination:"boolean",pageSize:"number",pageNumber:"number"},{remoteSort:"boolean",showHeader:"boolean",showFooter:"boolean"},{scrollbarSize:"number"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined),loadMsg:(t.attr("loadMsg")!=undefined?t.attr("loadMsg"):undefined),rowStyler:(t.attr("rowStyler")?eval(t.attr("rowStyler")):undefined)}); -}; -$.fn.datagrid.parseData=function(_62c){ -var t=$(_62c); -var data={total:0,rows:[]}; -var _62d=t.datagrid("getColumnFields",true).concat(t.datagrid("getColumnFields",false)); -t.find("tbody tr").each(function(){ -data.total++; -var row={}; -$.extend(row,$.parser.parseOptions(this,["iconCls","state"])); -for(var i=0;i<_62d.length;i++){ -row[_62d[i]]=$(this).find("td:eq("+i+")").html(); -} -data.rows.push(row); -}); -return data; -}; -var _62e={render:function(_62f,_630,_631){ -var _632=$.data(_62f,"datagrid"); -var opts=_632.options; -var rows=_632.data.rows; -var _633=$(_62f).datagrid("getColumnFields",_631); -if(_631){ -if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){ -return; -} -} -var _634=[""]; -for(var i=0;i"); -_634.push(this.renderRow.call(this,_62f,_633,_631,i,rows[i])); -_634.push(""); -} -_634.push("
    "); -$(_630).html(_634.join("")); -},renderFooter:function(_638,_639,_63a){ -var opts=$.data(_638,"datagrid").options; -var rows=$.data(_638,"datagrid").footer||[]; -var _63b=$(_638).datagrid("getColumnFields",_63a); -var _63c=[""]; -for(var i=0;i"); -_63c.push(this.renderRow.call(this,_638,_63b,_63a,i,rows[i])); -_63c.push(""); -} -_63c.push("
    "); -$(_639).html(_63c.join("")); -},renderRow:function(_63d,_63e,_63f,_640,_641){ -var opts=$.data(_63d,"datagrid").options; -var cc=[]; -if(_63f&&opts.rownumbers){ -var _642=_640+1; -if(opts.pagination){ -_642+=(opts.pageNumber-1)*opts.pageSize; -} -cc.push("
    "+_642+"
    "); -} -for(var i=0;i<_63e.length;i++){ -var _643=_63e[i]; -var col=$(_63d).datagrid("getColumnOption",_643); -if(col){ -var _644=_641[_643]; -var _645=col.styler?(col.styler(_644,_641,_640)||""):""; -var _646=col.hidden?"style=\"display:none;"+_645+"\"":(_645?"style=\""+_645+"\"":""); -cc.push(""); -if(col.checkbox){ -var _646=""; -}else{ -var _646=_645; -if(col.align){ -_646+=";text-align:"+col.align+";"; -} -if(!opts.nowrap){ -_646+=";white-space:normal;height:auto;"; -}else{ -if(opts.autoRowHeight){ -_646+=";height:auto;"; -} -} -} -cc.push("
    "); -if(col.checkbox){ -cc.push(""); -}else{ -if(col.formatter){ -cc.push(col.formatter(_644,_641,_640)); -}else{ -cc.push(_644); -} -} -cc.push("
    "); -cc.push(""); -} -} -return cc.join(""); -},refreshRow:function(_647,_648){ -this.updateRow.call(this,_647,_648,{}); -},updateRow:function(_649,_64a,row){ -var opts=$.data(_649,"datagrid").options; -var rows=$(_649).datagrid("getRows"); -$.extend(rows[_64a],row); -var _64b=opts.rowStyler?opts.rowStyler.call(_649,_64a,rows[_64a]):""; -function _64c(_64d){ -var _64e=$(_649).datagrid("getColumnFields",_64d); -var tr=opts.finder.getTr(_649,_64a,"body",(_64d?1:2)); -var _64f=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); -tr.html(this.renderRow.call(this,_649,_64e,_64d,_64a,rows[_64a])); -tr.attr("style",_64b||""); -if(_64f){ -tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); -} -}; -_64c.call(this,true); -_64c.call(this,false); -$(_649).datagrid("fixRowHeight",_64a); -},insertRow:function(_650,_651,row){ -var _652=$.data(_650,"datagrid"); -var opts=_652.options; -var dc=_652.dc; -var data=_652.data; -if(_651==undefined||_651==null){ -_651=data.rows.length; -} -if(_651>data.rows.length){ -_651=data.rows.length; -} -function _653(_654){ -var _655=_654?1:2; -for(var i=data.rows.length-1;i>=_651;i--){ -var tr=opts.finder.getTr(_650,i,"body",_655); -tr.attr("datagrid-row-index",i+1); -tr.attr("id",_652.rowIdPrefix+"-"+_655+"-"+(i+1)); -if(_654&&opts.rownumbers){ -var _656=i+2; -if(opts.pagination){ -_656+=(opts.pageNumber-1)*opts.pageSize; -} -tr.find("div.datagrid-cell-rownumber").html(_656); -} -} -}; -function _657(_658){ -var _659=_658?1:2; -var _65a=$(_650).datagrid("getColumnFields",_658); -var _65b=_652.rowIdPrefix+"-"+_659+"-"+_651; -var tr=""; -if(_651>=data.rows.length){ -if(data.rows.length){ -opts.finder.getTr(_650,"","last",_659).after(tr); -}else{ -var cc=_658?dc.body1:dc.body2; -cc.html(""+tr+"
    "); -} -}else{ -opts.finder.getTr(_650,_651+1,"body",_659).before(tr); -} -}; -_653.call(this,true); -_653.call(this,false); -_657.call(this,true); -_657.call(this,false); -data.total+=1; -data.rows.splice(_651,0,row); -this.refreshRow.call(this,_650,_651); -},deleteRow:function(_65c,_65d){ -var _65e=$.data(_65c,"datagrid"); -var opts=_65e.options; -var data=_65e.data; -function _65f(_660){ -var _661=_660?1:2; -for(var i=_65d+1;itable>tbody>tr[datagrid-row-index="+_66c+"]"); -} -return tr; -}else{ -if(type=="footer"){ -return (_66d==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index="+_66c+"]"); -}else{ -if(type=="selected"){ -return (_66d==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-selected"); -}else{ -if(type=="highlight"){ -return (_66d==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-over"); -}else{ -if(type=="checked"){ -return (_66d==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row:has(div.datagrid-cell-check input:checked)"); -}else{ -if(type=="last"){ -return (_66d==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]:last"); -}else{ -if(type=="allbody"){ -return (_66d==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]"); -}else{ -if(type=="allfooter"){ -return (_66d==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index]"); -} -} -} -} -} -} -} -} -} -},getRow:function(_66f,p){ -var _670=(typeof p=="object")?p.attr("datagrid-row-index"):p; -return $.data(_66f,"datagrid").data.rows[parseInt(_670)]; -}},view:_62e,onBeforeLoad:function(_671){ -},onLoadSuccess:function(){ -},onLoadError:function(){ -},onClickRow:function(_672,_673){ -},onDblClickRow:function(_674,_675){ -},onClickCell:function(_676,_677,_678){ -},onDblClickCell:function(_679,_67a,_67b){ -},onSortColumn:function(sort,_67c){ -},onResizeColumn:function(_67d,_67e){ -},onSelect:function(_67f,_680){ -},onUnselect:function(_681,_682){ -},onSelectAll:function(rows){ -},onUnselectAll:function(rows){ -},onCheck:function(_683,_684){ -},onUncheck:function(_685,_686){ -},onCheckAll:function(rows){ -},onUncheckAll:function(rows){ -},onBeforeEdit:function(_687,_688){ -},onAfterEdit:function(_689,_68a,_68b){ -},onCancelEdit:function(_68c,_68d){ -},onHeaderContextMenu:function(e,_68e){ -},onRowContextMenu:function(e,_68f,_690){ -}}); -})(jQuery); -(function($){ -var _691; -function _692(_693){ -var _694=$.data(_693,"propertygrid"); -var opts=$.data(_693,"propertygrid").options; -$(_693).datagrid($.extend({},opts,{cls:"propertygrid",view:(opts.showGroup?_695:undefined),onClickRow:function(_696,row){ -if(_691!=this){ -_697(_691); -_691=this; -} -if(opts.editIndex!=_696&&row.editor){ -var col=$(this).datagrid("getColumnOption","value"); -col.editor=row.editor; -_697(_691); -$(this).datagrid("beginEdit",_696); -$(this).datagrid("getEditors",_696)[0].target.focus(); -opts.editIndex=_696; -} -opts.onClickRow.call(_693,_696,row); -},loadFilter:function(data){ -_697(this); -return opts.loadFilter.call(this,data); -},onLoadSuccess:function(data){ -$(_693).datagrid("getPanel").find("div.datagrid-group").attr("style",""); -opts.onLoadSuccess.call(_693,data); -}})); -$(document).unbind(".propertygrid").bind("mousedown.propertygrid",function(e){ -var p=$(e.target).closest("div.datagrid-view,div.combo-panel"); -if(p.length){ -return; -} -_697(_691); -_691=undefined; -}); -}; -function _697(_698){ -var t=$(_698); -if(!t.length){ -return; -} -var opts=$.data(_698,"propertygrid").options; -var _699=opts.editIndex; -if(_699==undefined){ -return; -} -var ed=t.datagrid("getEditors",_699)[0]; -if(ed){ -ed.target.blur(); -if(t.datagrid("validateRow",_699)){ -t.datagrid("endEdit",_699); -}else{ -t.datagrid("cancelEdit",_699); -} -} -opts.editIndex=undefined; -}; -$.fn.propertygrid=function(_69a,_69b){ -if(typeof _69a=="string"){ -var _69c=$.fn.propertygrid.methods[_69a]; -if(_69c){ -return _69c(this,_69b); -}else{ -return this.datagrid(_69a,_69b); -} -} -_69a=_69a||{}; -return this.each(function(){ -var _69d=$.data(this,"propertygrid"); -if(_69d){ -$.extend(_69d.options,_69a); -}else{ -var opts=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_69a); -opts.frozenColumns=$.extend(true,[],opts.frozenColumns); -opts.columns=$.extend(true,[],opts.columns); -$.data(this,"propertygrid",{options:opts}); -} -_692(this); -}); -}; -$.fn.propertygrid.methods={options:function(jq){ -return $.data(jq[0],"propertygrid").options; -}}; -$.fn.propertygrid.parseOptions=function(_69e){ -var t=$(_69e); -return $.extend({},$.fn.datagrid.parseOptions(_69e),$.parser.parseOptions(_69e,[{showGroup:"boolean"}])); -}; -var _695=$.extend({},$.fn.datagrid.defaults.view,{render:function(_69f,_6a0,_6a1){ -var _6a2=$.data(_69f,"datagrid"); -var opts=_6a2.options; -var rows=_6a2.data.rows; -var _6a3=$(_69f).datagrid("getColumnFields",_6a1); -var _6a4=[]; -var _6a5=0; -var _6a6=this.groups; -for(var i=0;i<_6a6.length;i++){ -var _6a7=_6a6[i]; -_6a4.push("
    "); -_6a4.push(""); -_6a4.push(""); -_6a4.push(""); -_6a4.push(""); -_6a4.push("
    "); -if(!_6a1){ -_6a4.push(""); -_6a4.push(opts.groupFormatter.call(_69f,_6a7.fvalue,_6a7.rows)); -_6a4.push(""); -} -_6a4.push("
    "); -_6a4.push("
    "); -_6a4.push(""); -for(var j=0;j<_6a7.rows.length;j++){ -var cls=(_6a5%2&&opts.striped)?"class=\"datagrid-row datagrid-row-alt\"":"class=\"datagrid-row\""; -var _6a8=opts.rowStyler?opts.rowStyler.call(_69f,_6a5,_6a7.rows[j]):""; -var _6a9=_6a8?"style=\""+_6a8+"\"":""; -var _6aa=_6a2.rowIdPrefix+"-"+(_6a1?1:2)+"-"+_6a5; -_6a4.push(""); -_6a4.push(this.renderRow.call(this,_69f,_6a3,_6a1,_6a5,_6a7.rows[j])); -_6a4.push(""); -_6a5++; -} -_6a4.push("
    "); -} -$(_6a0).html(_6a4.join("")); -},onAfterRender:function(_6ab){ -var opts=$.data(_6ab,"datagrid").options; -var dc=$.data(_6ab,"datagrid").dc; -var view=dc.view; -var _6ac=dc.view1; -var _6ad=dc.view2; -$.fn.datagrid.defaults.view.onAfterRender.call(this,_6ab); -if(opts.rownumbers||opts.frozenColumns.length){ -var _6ae=_6ac.find("div.datagrid-group"); -}else{ -var _6ae=_6ad.find("div.datagrid-group"); -} -$(" ").insertBefore(_6ae.find("td")); -view.find("div.datagrid-group").each(function(){ -var _6af=$(this).attr("group-index"); -$(this).find("span.datagrid-row-expander").bind("click",{groupIndex:_6af},function(e){ -if($(this).hasClass("datagrid-row-collapse")){ -$(_6ab).datagrid("collapseGroup",e.data.groupIndex); -}else{ -$(_6ab).datagrid("expandGroup",e.data.groupIndex); -} -}); -}); -},onBeforeRender:function(_6b0,rows){ -var opts=$.data(_6b0,"datagrid").options; -var _6b1=[]; -for(var i=0;i"+""+"
    "+""+"").insertAfter(tr); -}; -}; -function _6ed(_6ee,_6ef,data,_6f0){ -var _6f1=$.data(_6ee,"treegrid"); -var opts=_6f1.options; -var dc=_6f1.dc; -data=opts.loadFilter.call(_6ee,data,_6ef); -var node=find(_6ee,_6ef); -if(node){ -var _6f2=opts.finder.getTr(_6ee,_6ef,"body",1); -var _6f3=opts.finder.getTr(_6ee,_6ef,"body",2); -var cc1=_6f2.next("tr.treegrid-tr-tree").children("td").children("div"); -var cc2=_6f3.next("tr.treegrid-tr-tree").children("td").children("div"); -if(!_6f0){ -node.children=[]; -} -}else{ -var cc1=dc.body1; -var cc2=dc.body2; -if(!_6f0){ -_6f1.data=[]; -} -} -if(!_6f0){ -cc1.empty(); -cc2.empty(); -} -if(opts.view.onBeforeRender){ -opts.view.onBeforeRender.call(opts.view,_6ee,_6ef,data); -} -opts.view.render.call(opts.view,_6ee,cc1,true); -opts.view.render.call(opts.view,_6ee,cc2,false); -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,_6ee,dc.footer1,true); -opts.view.renderFooter.call(opts.view,_6ee,dc.footer2,false); -} -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,_6ee); -} -opts.onLoadSuccess.call(_6ee,node,data); -if(!_6ef&&opts.pagination){ -var _6f4=$.data(_6ee,"treegrid").total; -var _6f5=$(_6ee).datagrid("getPager"); -if(_6f5.pagination("options").total!=_6f4){ -_6f5.pagination({total:_6f4}); -} -} -_6d8(_6ee); -_6e0(_6ee); -$(_6ee).treegrid("autoSizeColumn"); -}; -function _6d7(_6f6,_6f7,_6f8,_6f9,_6fa){ -var opts=$.data(_6f6,"treegrid").options; -var body=$(_6f6).datagrid("getPanel").find("div.datagrid-body"); -if(_6f8){ -opts.queryParams=_6f8; -} -var _6fb=$.extend({},opts.queryParams); -if(opts.pagination){ -$.extend(_6fb,{page:opts.pageNumber,rows:opts.pageSize}); -} -if(opts.sortName){ -$.extend(_6fb,{sort:opts.sortName,order:opts.sortOrder}); -} -var row=find(_6f6,_6f7); -if(opts.onBeforeLoad.call(_6f6,row,_6fb)==false){ -return; -} -var _6fc=body.find("tr[node-id="+_6f7+"] span.tree-folder"); -_6fc.addClass("tree-loading"); -$(_6f6).treegrid("loading"); -var _6fd=opts.loader.call(_6f6,_6fb,function(data){ -_6fc.removeClass("tree-loading"); -$(_6f6).treegrid("loaded"); -_6ed(_6f6,_6f7,data,_6f9); -if(_6fa){ -_6fa(); -} -},function(){ -_6fc.removeClass("tree-loading"); -$(_6f6).treegrid("loaded"); -opts.onLoadError.apply(_6f6,arguments); -if(_6fa){ -_6fa(); -} -}); -if(_6fd==false){ -_6fc.removeClass("tree-loading"); -$(_6f6).treegrid("loaded"); -} -}; -function _6fe(_6ff){ -var rows=_700(_6ff); -if(rows.length){ -return rows[0]; -}else{ -return null; -} -}; -function _700(_701){ -return $.data(_701,"treegrid").data; -}; -function _702(_703,_704){ -var row=find(_703,_704); -if(row._parentId){ -return find(_703,row._parentId); -}else{ -return null; -} -}; -function _6dc(_705,_706){ -var opts=$.data(_705,"treegrid").options; -var body=$(_705).datagrid("getPanel").find("div.datagrid-view2 div.datagrid-body"); -var _707=[]; -if(_706){ -_708(_706); -}else{ -var _709=_700(_705); -for(var i=0;i<_709.length;i++){ -_707.push(_709[i]); -_708(_709[i][opts.idField]); -} -} -function _708(_70a){ -var _70b=find(_705,_70a); -if(_70b&&_70b.children){ -for(var i=0,len=_70b.children.length;i").insertBefore(_72f); -if(hit.prev().length){ -hit.prev().remove(); -} -} -} -_6ed(_72d,_72e.parent,_72e.data,true); -}; -function _730(_731,_732){ -var ref=_732.before||_732.after; -var opts=$.data(_731,"treegrid").options; -var _733=_702(_731,ref); -_72c(_731,{parent:(_733?_733[opts.idField]:null),data:[_732.data]}); -_734(true); -_734(false); -_6e0(_731); -function _734(_735){ -var _736=_735?1:2; -var tr=opts.finder.getTr(_731,_732.data[opts.idField],"body",_736); -var _737=tr.closest("table.datagrid-btable"); -tr=tr.parent().children(); -var dest=opts.finder.getTr(_731,ref,"body",_736); -if(_732.before){ -tr.insertBefore(dest); -}else{ -var sub=dest.next("tr.treegrid-tr-tree"); -tr.insertAfter(sub.length?sub:dest); -} -_737.remove(); -}; -}; -function _738(_739,_73a){ -var opts=$.data(_739,"treegrid").options; -var tr=opts.finder.getTr(_739,_73a); -tr.next("tr.treegrid-tr-tree").remove(); -tr.remove(); -var _73b=del(_73a); -if(_73b){ -if(_73b.children.length==0){ -tr=opts.finder.getTr(_739,_73b[opts.idField]); -tr.next("tr.treegrid-tr-tree").remove(); -var cell=tr.children("td[field="+opts.treeField+"]").children("div.datagrid-cell"); -cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); -cell.find(".tree-hit").remove(); -$("").prependTo(cell); -} -} -_6e0(_739); -function del(id){ -var cc; -var _73c=_702(_739,_73a); -if(_73c){ -cc=_73c.children; -}else{ -cc=$(_739).treegrid("getData"); -} -for(var i=0;i"]; -for(var i=0;i<_753.length;i++){ -var row=_753[i]; -if(row.state!="open"&&row.state!="closed"){ -row.state="open"; -} -var cls=(_74e++%2&&opts.striped)?"class=\"datagrid-row datagrid-row-alt\"":"class=\"datagrid-row\""; -var _755=opts.rowStyler?opts.rowStyler.call(_749,row):""; -var _756=_755?"style=\""+_755+"\"":""; -var _757=_74d+"-"+(_751?1:2)+"-"+row[opts.idField]; -_754.push(""); -_754=_754.concat(view.renderRow.call(view,_749,_74c,_751,_752,row)); -_754.push(""); -if(row.children&&row.children.length){ -var tt=_750(_751,_752+1,row.children); -var v=row.state=="closed"?"none":"block"; -_754.push("
    "); -_754=_754.concat(tt); -_754.push("
    "); -} -} -_754.push(""); -return _754; -}; -},renderFooter:function(_758,_759,_75a){ -var opts=$.data(_758,"treegrid").options; -var rows=$.data(_758,"treegrid").footer||[]; -var _75b=$(_758).datagrid("getColumnFields",_75a); -var _75c=[""]; -for(var i=0;i"); -_75c.push(this.renderRow.call(this,_758,_75b,_75a,0,row)); -_75c.push(""); -} -_75c.push("
    "); -$(_759).html(_75c.join("")); -},renderRow:function(_75d,_75e,_75f,_760,row){ -var opts=$.data(_75d,"treegrid").options; -var cc=[]; -if(_75f&&opts.rownumbers){ -cc.push("
    0
    "); -} -for(var i=0;i<_75e.length;i++){ -var _761=_75e[i]; -var col=$(_75d).datagrid("getColumnOption",_761); -if(col){ -var _762=col.styler?(col.styler(row[_761],row)||""):""; -var _763=col.hidden?"style=\"display:none;"+_762+"\"":(_762?"style=\""+_762+"\"":""); -cc.push(""); -if(col.checkbox){ -var _763=""; -}else{ -var _763=_762; -if(col.align){ -_763+=";text-align:"+col.align+";"; -} -if(!opts.nowrap){ -_763+=";white-space:normal;height:auto;"; -}else{ -if(opts.autoRowHeight){ -_763+=";height:auto;"; -} -} -} -cc.push("
    "); -if(col.checkbox){ -if(row.checked){ -cc.push(""); -}else{ -var val=null; -if(col.formatter){ -val=col.formatter(row[_761],row); -}else{ -val=row[_761]; -} -if(_761==opts.treeField){ -for(var j=0;j<_760;j++){ -cc.push(""); -} -if(row.state=="closed"){ -cc.push(""); -cc.push(""); -}else{ -if(row.children&&row.children.length){ -cc.push(""); -cc.push(""); -}else{ -cc.push(""); -cc.push(""); -} -} -cc.push(""+val+""); -}else{ -cc.push(val); -} -} -cc.push("
    "); -cc.push(""); -} -} -return cc.join(""); -},refreshRow:function(_764,id){ -this.updateRow.call(this,_764,id,{}); -},updateRow:function(_765,id,row){ -var opts=$.data(_765,"treegrid").options; -var _766=$(_765).treegrid("find",id); -$.extend(_766,row); -var _767=$(_765).treegrid("getLevel",id)-1; -var _768=opts.rowStyler?opts.rowStyler.call(_765,_766):""; -function _769(_76a){ -var _76b=$(_765).treegrid("getColumnFields",_76a); -var tr=opts.finder.getTr(_765,id,"body",(_76a?1:2)); -var _76c=tr.find("div.datagrid-cell-rownumber").html(); -var _76d=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); -tr.html(this.renderRow(_765,_76b,_76a,_767,_766)); -tr.attr("style",_768||""); -tr.find("div.datagrid-cell-rownumber").html(_76c); -if(_76d){ -tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); -} -}; -_769.call(this,true); -_769.call(this,false); -$(_765).treegrid("fixRowHeight",id); -},onBeforeRender:function(_76e,_76f,data){ -if($.isArray(_76f)){ -data={total:_76f.length,rows:_76f}; -_76f=null; -} -if(!data){ -return false; -} -var _770=$.data(_76e,"treegrid"); -var opts=_770.options; -if(data.length==undefined){ -if(data.footer){ -_770.footer=data.footer; -} -if(data.total){ -_770.total=data.total; -} -data=this.transfer(_76e,_76f,data.rows); -}else{ -function _771(_772,_773){ -for(var i=0;i<_772.length;i++){ -var row=_772[i]; -row._parentId=_773; -if(row.children&&row.children.length){ -_771(row.children,row[opts.idField]); -} -} -}; -_771(data,_76f); -} -var node=find(_76e,_76f); -if(node){ -if(node.children){ -node.children=node.children.concat(data); -}else{ -node.children=data; -} -}else{ -_770.data=_770.data.concat(data); -} -if(!opts.remoteSort){ -this.sort(_76e,data); -} -this.treeNodes=data; -this.treeLevel=$(_76e).treegrid("getLevel",_76f); -},sort:function(_774,data){ -var opts=$.data(_774,"treegrid").options; -var opt=$(_774).treegrid("getColumnOption",opts.sortName); -if(opt){ -var _775=opt.sorter||function(a,b){ -return (a>b?1:-1); -}; -_776(data); -} -function _776(rows){ -rows.sort(function(r1,r2){ -return _775(r1[opts.sortName],r2[opts.sortName])*(opts.sortOrder=="asc"?1:-1); -}); -for(var i=0;i").insertAfter(_78e); -var _78f=$("").appendTo(span); -$("").appendTo(span); -$("").appendTo(span); -var _790=$("
    ").appendTo("body"); -_790.panel({doSize:false,closed:true,cls:"combo-p",style:{position:"absolute",zIndex:10},onOpen:function(){ -$(this).panel("resize"); -},onClose:function(){ -var _791=$.data(_78e,"combo"); -if(_791){ -_791.options.onHidePanel.call(_78e); -} -}}); -var name=$(_78e).attr("name"); -if(name){ -span.find("input.combo-value").attr("name",name); -$(_78e).removeAttr("name").attr("comboName",name); -} -_78f.attr("autocomplete","off"); -return {combo:span,panel:_790}; -}; -function _792(_793){ -var _794=$.data(_793,"combo"); -var opts=_794.options; -var _795=_794.combo; -if(opts.hasDownArrow){ -_795.find(".combo-arrow").show(); -}else{ -_795.find(".combo-arrow").hide(); -} -_796(_793,opts.disabled); -_797(_793,opts.readonly); -}; -function _798(_799){ -var _79a=$.data(_799,"combo"); -var _79b=_79a.combo.find("input.combo-text"); -_79b.validatebox("destroy"); -_79a.panel.panel("destroy"); -_79a.combo.remove(); -$(_799).remove(); -}; -function _79c(_79d){ -var _79e=$.data(_79d,"combo"); -var opts=_79e.options; -var _79f=_79e.panel; -var _7a0=_79e.combo; -var _7a1=_7a0.find(".combo-text"); -var _7a2=_7a0.find(".combo-arrow"); -$(document).unbind(".combo").bind("mousedown.combo",function(e){ -var p=$(e.target).closest("span.combo,div.combo-panel"); -if(p.length){ -return; -} -$("body>div.combo-p>div.combo-panel:visible").panel("close"); -}); -_7a1.unbind(".combo"); -_7a2.unbind(".combo"); -if(!opts.disabled&&!opts.readonly){ -_7a1.bind("mousedown.combo",function(e){ -$("div.combo-panel").not(_79f).panel("close"); -e.stopPropagation(); -}).bind("keydown.combo",function(e){ -switch(e.keyCode){ -case 38: -opts.keyHandler.up.call(_79d); -break; -case 40: -opts.keyHandler.down.call(_79d); -break; -case 13: -e.preventDefault(); -opts.keyHandler.enter.call(_79d); -return false; -case 9: -case 27: -_7a9(_79d); -break; -default: -if(opts.editable){ -if(_79e.timer){ -clearTimeout(_79e.timer); -} -_79e.timer=setTimeout(function(){ -var q=_7a1.val(); -if(_79e.previousValue!=q){ -_79e.previousValue=q; -$(_79d).combo("showPanel"); -opts.keyHandler.query.call(_79d,_7a1.val()); -_7ac(_79d,true); -} -},opts.delay); -} -} -}); -_7a2.bind("click.combo",function(){ -if(_79f.is(":visible")){ -_7a9(_79d); -}else{ -$("div.combo-panel:visible").panel("close"); -$(_79d).combo("showPanel"); -} -_7a1.focus(); -}).bind("mouseenter.combo",function(){ -$(this).addClass("combo-arrow-hover"); -}).bind("mouseleave.combo",function(){ -$(this).removeClass("combo-arrow-hover"); -}); -} -}; -function _7a3(_7a4){ -var opts=$.data(_7a4,"combo").options; -var _7a5=$.data(_7a4,"combo").combo; -var _7a6=$.data(_7a4,"combo").panel; -if($.fn.window){ -_7a6.panel("panel").css("z-index",$.fn.window.defaults.zIndex++); -} -_7a6.panel("move",{left:_7a5.offset().left,top:_7a7()}); -if(_7a6.panel("options").closed){ -_7a6.panel("open"); -opts.onShowPanel.call(_7a4); -} -(function(){ -if(_7a6.is(":visible")){ -_7a6.panel("move",{left:_7a8(),top:_7a7()}); -setTimeout(arguments.callee,200); -} -})(); -function _7a8(){ -var left=_7a5.offset().left; -if(left+_7a6._outerWidth()>$(window)._outerWidth()+$(document).scrollLeft()){ -left=$(window)._outerWidth()+$(document).scrollLeft()-_7a6._outerWidth(); -} -if(left<0){ -left=0; -} -return left; -}; -function _7a7(){ -var top=_7a5.offset().top+_7a5._outerHeight(); -if(top+_7a6._outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ -top=_7a5.offset().top-_7a6._outerHeight(); -} -if(top<$(document).scrollTop()){ -top=_7a5.offset().top+_7a5._outerHeight(); -} -return top; -}; -}; -function _7a9(_7aa){ -var _7ab=$.data(_7aa,"combo").panel; -_7ab.panel("close"); -}; -function _7ac(_7ad,doit){ -var opts=$.data(_7ad,"combo").options; -var _7ae=$.data(_7ad,"combo").combo.find("input.combo-text"); -_7ae.validatebox($.extend({},opts,{deltaX:(opts.hasDownArrow?opts.deltaX:(opts.deltaX>0?1:-1))})); -if(doit){ -_7ae.validatebox("validate"); -} -}; -function _796(_7af,_7b0){ -var _7b1=$.data(_7af,"combo"); -var opts=_7b1.options; -var _7b2=_7b1.combo; -if(_7b0){ -opts.disabled=true; -$(_7af).attr("disabled",true); -_7b2.find(".combo-value").attr("disabled",true); -_7b2.find(".combo-text").attr("disabled",true); -}else{ -opts.disabled=false; -$(_7af).removeAttr("disabled"); -_7b2.find(".combo-value").removeAttr("disabled"); -_7b2.find(".combo-text").removeAttr("disabled"); -} -}; -function _797(_7b3,mode){ -var _7b4=$.data(_7b3,"combo"); -var opts=_7b4.options; -opts.readonly=mode==undefined?true:mode; -_7b4.combo.find(".combo-text").attr("readonly",opts.readonly?true:(!opts.editable)); -}; -function _7b5(_7b6){ -var _7b7=$.data(_7b6,"combo"); -var opts=_7b7.options; -var _7b8=_7b7.combo; -if(opts.multiple){ -_7b8.find("input.combo-value").remove(); -}else{ -_7b8.find("input.combo-value").val(""); -} -_7b8.find("input.combo-text").val(""); -}; -function _7b9(_7ba){ -var _7bb=$.data(_7ba,"combo").combo; -return _7bb.find("input.combo-text").val(); -}; -function _7bc(_7bd,text){ -var _7be=$.data(_7bd,"combo").combo; -_7be.find("input.combo-text").val(text); -_7ac(_7bd,true); -$.data(_7bd,"combo").previousValue=text; -}; -function _7bf(_7c0){ -var _7c1=[]; -var _7c2=$.data(_7c0,"combo").combo; -_7c2.find("input.combo-value").each(function(){ -_7c1.push($(this).val()); -}); -return _7c1; -}; -function _7c3(_7c4,_7c5){ -var opts=$.data(_7c4,"combo").options; -var _7c6=_7bf(_7c4); -var _7c7=$.data(_7c4,"combo").combo; -_7c7.find("input.combo-value").remove(); -var name=$(_7c4).attr("comboName"); -for(var i=0;i<_7c5.length;i++){ -var _7c8=$("").appendTo(_7c7); -if(name){ -_7c8.attr("name",name); -} -_7c8.val(_7c5[i]); -} -var tmp=[]; -for(var i=0;i<_7c6.length;i++){ -tmp[i]=_7c6[i]; -} -var aa=[]; -for(var i=0;i<_7c5.length;i++){ -for(var j=0;j_7e0.height()){ -var h=_7e0.scrollTop()+item.position().top+item.outerHeight()-_7e0.height(); -_7e0.scrollTop(h); -} -} -} -}; -function nav(_7e1,dir){ -var opts=$(_7e1).combobox("options"); -var _7e2=$(_7e1).combobox("panel"); -var item=_7e2.children("div.combobox-item-hover"); -if(!item.length){ -item=_7e2.children("div.combobox-item-selected"); -} -item.removeClass("combobox-item-hover"); -if(!item.length){ -item=_7e2.children("div.combobox-item:visible:"+(dir=="next"?"first":"last")); -}else{ -if(dir=="next"){ -item=item.nextAll(":visible:first"); -if(!item.length){ -item=_7e2.children("div.combobox-item:visible:first"); -} -}else{ -item=item.prevAll(":visible:first"); -if(!item.length){ -item=_7e2.children("div.combobox-item:visible:last"); -} -} -} -if(item.length){ -item.addClass("combobox-item-hover"); -_7dd(_7e1,item.attr("value")); -if(opts.selectOnNavigation){ -_7e3(_7e1,item.attr("value")); -} -} -}; -function _7e3(_7e4,_7e5){ -var opts=$.data(_7e4,"combobox").options; -var data=$.data(_7e4,"combobox").data; -if(opts.multiple){ -var _7e6=$(_7e4).combo("getValues"); -for(var i=0;i<_7e6.length;i++){ -if(_7e6[i]==_7e5){ -return; -} -} -_7e6.push(_7e5); -_7e7(_7e4,_7e6); -}else{ -_7e7(_7e4,[_7e5]); -} -var item=_7db(data,opts.valueField,_7e5); -if(item){ -opts.onSelect.call(_7e4,item); -} -}; -function _7e8(_7e9,_7ea){ -var _7eb=$.data(_7e9,"combobox"); -var opts=_7eb.options; -var _7ec=$(_7e9).combo("getValues"); -var _7ed=_7ec.indexOf(_7ea+""); -if(_7ed>=0){ -_7ec.splice(_7ed,1); -_7e7(_7e9,_7ec); -} -var item=_7db(_7eb.data,opts.valueField,_7ea); -if(item){ -opts.onUnselect.call(_7e9,item); -} -}; -function _7e7(_7ee,_7ef,_7f0){ -var opts=$.data(_7ee,"combobox").options; -var data=$.data(_7ee,"combobox").data; -var _7f1=$(_7ee).combo("panel"); -_7f1.find("div.combobox-item-selected").removeClass("combobox-item-selected"); -var vv=[],ss=[]; -for(var i=0;i<_7ef.length;i++){ -var v=_7ef[i]; -var s=v; -var item=_7db(data,opts.valueField,v); -if(item){ -s=item[opts.textField]; -} -vv.push(v); -ss.push(s); -_7f1.find("div.combobox-item[value=\""+v+"\"]").addClass("combobox-item-selected"); -} -$(_7ee).combo("setValues",vv); -if(!_7f0){ -$(_7ee).combo("setText",ss.join(opts.separator)); -} -}; -function _7f2(_7f3,data,_7f4){ -var opts=$.data(_7f3,"combobox").options; -var _7f5=$(_7f3).combo("panel"); -data=opts.loadFilter.call(_7f3,data); -$.data(_7f3,"combobox").data=data; -var _7f6=$(_7f3).combobox("getValues"); -_7f5.empty(); -for(var i=0;i").appendTo(_7f5); -item.attr("value",v); -if(opts.formatter){ -item.html(opts.formatter.call(_7f3,data[i])); -}else{ -item.html(s); -} -if(data[i]["selected"]){ -(function(){ -for(var i=0;i<_7f6.length;i++){ -if(v==_7f6[i]){ -return; -} -} -_7f6.push(v); -})(); -} -} -if(opts.multiple){ -_7e7(_7f3,_7f6,_7f4); -}else{ -if(_7f6.length){ -_7e7(_7f3,[_7f6[_7f6.length-1]],_7f4); -}else{ -_7e7(_7f3,[],_7f4); -} -} -opts.onLoadSuccess.call(_7f3,data); -}; -function _7f7(_7f8,url,_7f9,_7fa){ -var opts=$.data(_7f8,"combobox").options; -if(url){ -opts.url=url; -} -_7f9=_7f9||{}; -if(opts.onBeforeLoad.call(_7f8,_7f9)==false){ -return; -} -opts.loader.call(_7f8,_7f9,function(data){ -_7f2(_7f8,data,_7fa); -},function(){ -opts.onLoadError.apply(this,arguments); -}); -}; -function _7fb(_7fc,q){ -var opts=$.data(_7fc,"combobox").options; -if(opts.multiple&&!q){ -_7e7(_7fc,[],true); -}else{ -_7e7(_7fc,[q],true); -} -if(opts.mode=="remote"){ -_7f7(_7fc,null,{q:q},true); -}else{ -var _7fd=$(_7fc).combo("panel"); -_7fd.find("div.combobox-item").hide(); -var data=$.data(_7fc,"combobox").data; -for(var i=0;i").appendTo(_819); -$.data(_818,"combotree").tree=tree; -} -tree.tree($.extend({},opts,{checkbox:opts.multiple,onLoadSuccess:function(node,data){ -var _81a=$(_818).combotree("getValues"); -if(opts.multiple){ -var _81b=tree.tree("getChecked"); -for(var i=0;i<_81b.length;i++){ -var id=_81b[i].id; -(function(){ -for(var i=0;i<_81a.length;i++){ -if(id==_81a[i]){ -return; -} -} -_81a.push(id); -})(); -} -} -$(_818).combotree("setValues",_81a); -opts.onLoadSuccess.call(this,node,data); -},onClick:function(node){ -_81d(_818); -$(_818).combo("hidePanel"); -opts.onClick.call(this,node); -},onCheck:function(node,_81c){ -_81d(_818); -opts.onCheck.call(this,node,_81c); -}})); -}; -function _81d(_81e){ -var opts=$.data(_81e,"combotree").options; -var tree=$.data(_81e,"combotree").tree; -var vv=[],ss=[]; -if(opts.multiple){ -var _81f=tree.tree("getChecked"); -for(var i=0;i<_81f.length;i++){ -vv.push(_81f[i].id); -ss.push(_81f[i].text); -} -}else{ -var node=tree.tree("getSelected"); -if(node){ -vv.push(node.id); -ss.push(node.text); -} -} -$(_81e).combo("setValues",vv).combo("setText",ss.join(opts.separator)); -}; -function _820(_821,_822){ -var opts=$.data(_821,"combotree").options; -var tree=$.data(_821,"combotree").tree; -tree.find("span.tree-checkbox").addClass("tree-checkbox0").removeClass("tree-checkbox1 tree-checkbox2"); -var vv=[],ss=[]; -for(var i=0;i<_822.length;i++){ -var v=_822[i]; -var s=v; -var node=tree.tree("find",v); -if(node){ -s=node.text; -tree.tree("check",node.target); -tree.tree("select",node.target); -} -vv.push(v); -ss.push(s); -} -$(_821).combo("setValues",vv).combo("setText",ss.join(opts.separator)); -}; -$.fn.combotree=function(_823,_824){ -if(typeof _823=="string"){ -var _825=$.fn.combotree.methods[_823]; -if(_825){ -return _825(this,_824); -}else{ -return this.combo(_823,_824); -} -} -_823=_823||{}; -return this.each(function(){ -var _826=$.data(this,"combotree"); -if(_826){ -$.extend(_826.options,_823); -}else{ -$.data(this,"combotree",{options:$.extend({},$.fn.combotree.defaults,$.fn.combotree.parseOptions(this),_823)}); -} -_817(this); -}); -}; -$.fn.combotree.methods={options:function(jq){ -var _827=jq.combo("options"); -return $.extend($.data(jq[0],"combotree").options,{originalValue:_827.originalValue,disabled:_827.disabled,readonly:_827.readonly}); -},tree:function(jq){ -return $.data(jq[0],"combotree").tree; -},loadData:function(jq,data){ -return jq.each(function(){ -var opts=$.data(this,"combotree").options; -opts.data=data; -var tree=$.data(this,"combotree").tree; -tree.tree("loadData",data); -}); -},reload:function(jq,url){ -return jq.each(function(){ -var opts=$.data(this,"combotree").options; -var tree=$.data(this,"combotree").tree; -if(url){ -opts.url=url; -} -tree.tree({url:opts.url}); -}); -},setValues:function(jq,_828){ -return jq.each(function(){ -_820(this,_828); -}); -},setValue:function(jq,_829){ -return jq.each(function(){ -_820(this,[_829]); -}); -},clear:function(jq){ -return jq.each(function(){ -var tree=$.data(this,"combotree").tree; -tree.find("div.tree-node-selected").removeClass("tree-node-selected"); -var cc=tree.tree("getChecked"); -for(var i=0;i").appendTo(_82e); -_82d.grid=grid; -} -grid.datagrid($.extend({},opts,{border:false,fit:true,singleSelect:(!opts.multiple),onLoadSuccess:function(data){ -var _82f=$(_82c).combo("getValues"); -var _830=opts.onSelect; -opts.onSelect=function(){ -}; -_83a(_82c,_82f,_82d.remainText); -opts.onSelect=_830; -opts.onLoadSuccess.apply(_82c,arguments); -},onClickRow:_831,onSelect:function(_832,row){ -_833(); -opts.onSelect.call(this,_832,row); -},onUnselect:function(_834,row){ -_833(); -opts.onUnselect.call(this,_834,row); -},onSelectAll:function(rows){ -_833(); -opts.onSelectAll.call(this,rows); -},onUnselectAll:function(rows){ -if(opts.multiple){ -_833(); -} -opts.onUnselectAll.call(this,rows); -}})); -function _831(_835,row){ -_82d.remainText=false; -_833(); -if(!opts.multiple){ -$(_82c).combo("hidePanel"); -} -opts.onClickRow.call(this,_835,row); -}; -function _833(){ -var rows=grid.datagrid("getSelections"); -var vv=[],ss=[]; -for(var i=0;i=_838){ -_839=0; -} -} -grid.datagrid("highlightRow",_839); -if(opts.selectOnNavigation){ -_837.remainText=false; -grid.datagrid("selectRow",_839); -} -}; -function _83a(_83b,_83c,_83d){ -var _83e=$.data(_83b,"combogrid"); -var opts=_83e.options; -var grid=_83e.grid; -var rows=grid.datagrid("getRows"); -var ss=[]; -var _83f=$(_83b).combo("getValues"); -var _840=$(_83b).combo("options"); -var _841=_840.onChange; -_840.onChange=function(){ -}; -grid.datagrid("clearSelections"); -for(var i=0;i<_83c.length;i++){ -var _842=grid.datagrid("getRowIndex",_83c[i]); -if(_842>=0){ -grid.datagrid("selectRow",_842); -ss.push(rows[_842][opts.textField]); -}else{ -ss.push(_83c[i]); -} -} -$(_83b).combo("setValues",_83f); -_840.onChange=_841; -$(_83b).combo("setValues",_83c); -if(!_83d){ -var s=ss.join(opts.separator); -if($(_83b).combo("getText")!=s){ -$(_83b).combo("setText",s); -} -} -}; -function _843(_844,q){ -var _845=$.data(_844,"combogrid"); -var opts=_845.options; -var grid=_845.grid; -_845.remainText=true; -if(opts.multiple&&!q){ -_83a(_844,[],true); -}else{ -_83a(_844,[q],true); -} -if(opts.mode=="remote"){ -grid.datagrid("clearSelections"); -grid.datagrid("load",$.extend({},opts.queryParams,{q:q})); -}else{ -if(!q){ -return; -} -var rows=grid.datagrid("getRows"); -for(var i=0;i").appendTo(_856).wrap("
    "); -_854.calendar.calendar({fit:true,border:false,onSelect:function(date){ -var _857=opts.formatter(date); -_85b(_853,_857); -$(_853).combo("hidePanel"); -opts.onSelect.call(_853,date); -}}); -_85b(_853,opts.value); -var _858=$("
    ").appendTo(_856); -$("").html(opts.currentText).appendTo(_858); -$("").html(opts.closeText).appendTo(_858); -_858.find(".datebox-current,.datebox-close").hover(function(){ -$(this).addClass("datebox-button-hover"); -},function(){ -$(this).removeClass("datebox-button-hover"); -}); -_858.find(".datebox-current").click(function(){ -_854.calendar.calendar({year:new Date().getFullYear(),month:new Date().getMonth()+1,current:new Date()}); -}); -_858.find(".datebox-close").click(function(){ -$(_853).combo("hidePanel"); -}); -}; -}; -function _859(_85a,q){ -_85b(_85a,q); -}; -function _85c(_85d){ -var opts=$.data(_85d,"datebox").options; -var c=$.data(_85d,"datebox").calendar; -var _85e=opts.formatter(c.calendar("options").current); -_85b(_85d,_85e); -$(_85d).combo("hidePanel"); -}; -function _85b(_85f,_860){ -var _861=$.data(_85f,"datebox"); -var opts=_861.options; -$(_85f).combo("setValue",_860).combo("setText",_860); -_861.calendar.calendar("moveTo",opts.parser(_860)); -}; -$.fn.datebox=function(_862,_863){ -if(typeof _862=="string"){ -var _864=$.fn.datebox.methods[_862]; -if(_864){ -return _864(this,_863); -}else{ -return this.combo(_862,_863); -} -} -_862=_862||{}; -return this.each(function(){ -var _865=$.data(this,"datebox"); -if(_865){ -$.extend(_865.options,_862); -}else{ -$.data(this,"datebox",{options:$.extend({},$.fn.datebox.defaults,$.fn.datebox.parseOptions(this),_862)}); -} -_852(this); -}); -}; -$.fn.datebox.methods={options:function(jq){ -var _866=jq.combo("options"); -return $.extend($.data(jq[0],"datebox").options,{originalValue:_866.originalValue,disabled:_866.disabled,readonly:_866.readonly}); -},calendar:function(jq){ -return $.data(jq[0],"datebox").calendar; -},setValue:function(jq,_867){ -return jq.each(function(){ -_85b(this,_867); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).datebox("options"); -$(this).datebox("setValue",opts.originalValue); -}); -}}; -$.fn.datebox.parseOptions=function(_868){ -var t=$(_868); -return $.extend({},$.fn.combo.parseOptions(_868),{}); -}; -$.fn.datebox.defaults=$.extend({},$.fn.combo.defaults,{panelWidth:180,panelHeight:"auto",keyHandler:{up:function(){ -},down:function(){ -},enter:function(){ -_85c(this); -},query:function(q){ -_859(this,q); -}},currentText:"Today",closeText:"Close",okText:"Ok",formatter:function(date){ -var y=date.getFullYear(); -var m=date.getMonth()+1; -var d=date.getDate(); -return m+"/"+d+"/"+y; -},parser:function(s){ -var t=Date.parse(s); -if(!isNaN(t)){ -return new Date(t); -}else{ -return new Date(); -} -},onSelect:function(date){ -}}); -})(jQuery); -(function($){ -function _869(_86a){ -var _86b=$.data(_86a,"datetimebox"); -var opts=_86b.options; -$(_86a).datebox($.extend({},opts,{onShowPanel:function(){ -var _86c=$(_86a).datetimebox("getValue"); -_86f(_86a,_86c,true); -opts.onShowPanel.call(_86a); -},formatter:$.fn.datebox.defaults.formatter,parser:$.fn.datebox.defaults.parser})); -$(_86a).removeClass("datebox-f").addClass("datetimebox-f"); -$(_86a).datebox("calendar").calendar({onSelect:function(date){ -opts.onSelect.call(_86a,date); -}}); -var _86d=$(_86a).datebox("panel"); -if(!_86b.spinner){ -var p=$("
    ").insertAfter(_86d.children("div.datebox-calendar-inner")); -_86b.spinner=p.children("input"); -var _86e=_86d.children("div.datebox-button"); -var ok=$("").html(opts.okText).appendTo(_86e); -ok.hover(function(){ -$(this).addClass("datebox-button-hover"); -},function(){ -$(this).removeClass("datebox-button-hover"); -}).click(function(){ -_874(_86a); -}); -} -_86b.spinner.timespinner({showSeconds:opts.showSeconds,separator:opts.timeSeparator}).unbind(".datetimebox").bind("mousedown.datetimebox",function(e){ -e.stopPropagation(); -}); -_86f(_86a,opts.value); -}; -function _870(_871){ -var c=$(_871).datetimebox("calendar"); -var t=$(_871).datetimebox("spinner"); -var date=c.calendar("options").current; -return new Date(date.getFullYear(),date.getMonth(),date.getDate(),t.timespinner("getHours"),t.timespinner("getMinutes"),t.timespinner("getSeconds")); -}; -function _872(_873,q){ -_86f(_873,q,true); -}; -function _874(_875){ -var opts=$.data(_875,"datetimebox").options; -var date=_870(_875); -_86f(_875,opts.formatter.call(_875,date)); -$(_875).combo("hidePanel"); -}; -function _86f(_876,_877,_878){ -var opts=$.data(_876,"datetimebox").options; -$(_876).combo("setValue",_877); -if(!_878){ -if(_877){ -var date=opts.parser.call(_876,_877); -$(_876).combo("setValue",opts.formatter.call(_876,date)); -$(_876).combo("setText",opts.formatter.call(_876,date)); -}else{ -$(_876).combo("setText",_877); -} -} -var date=opts.parser.call(_876,_877); -$(_876).datetimebox("calendar").calendar("moveTo",date); -$(_876).datetimebox("spinner").timespinner("setValue",_879(date)); -function _879(date){ -function _87a(_87b){ -return (_87b<10?"0":"")+_87b; -}; -var tt=[_87a(date.getHours()),_87a(date.getMinutes())]; -if(opts.showSeconds){ -tt.push(_87a(date.getSeconds())); -} -return tt.join($(_876).datetimebox("spinner").timespinner("options").separator); -}; -}; -$.fn.datetimebox=function(_87c,_87d){ -if(typeof _87c=="string"){ -var _87e=$.fn.datetimebox.methods[_87c]; -if(_87e){ -return _87e(this,_87d); -}else{ -return this.datebox(_87c,_87d); -} -} -_87c=_87c||{}; -return this.each(function(){ -var _87f=$.data(this,"datetimebox"); -if(_87f){ -$.extend(_87f.options,_87c); -}else{ -$.data(this,"datetimebox",{options:$.extend({},$.fn.datetimebox.defaults,$.fn.datetimebox.parseOptions(this),_87c)}); -} -_869(this); -}); -}; -$.fn.datetimebox.methods={options:function(jq){ -var _880=jq.datebox("options"); -return $.extend($.data(jq[0],"datetimebox").options,{originalValue:_880.originalValue,disabled:_880.disabled,readonly:_880.readonly}); -},spinner:function(jq){ -return $.data(jq[0],"datetimebox").spinner; -},setValue:function(jq,_881){ -return jq.each(function(){ -_86f(this,_881); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).datetimebox("options"); -$(this).datetimebox("setValue",opts.originalValue); -}); -}}; -$.fn.datetimebox.parseOptions=function(_882){ -var t=$(_882); -return $.extend({},$.fn.datebox.parseOptions(_882),$.parser.parseOptions(_882,["timeSeparator",{showSeconds:"boolean"}])); -}; -$.fn.datetimebox.defaults=$.extend({},$.fn.datebox.defaults,{showSeconds:true,timeSeparator:":",keyHandler:{up:function(){ -},down:function(){ -},enter:function(){ -_874(this); -},query:function(q){ -_872(this,q); -}},formatter:function(date){ -var h=date.getHours(); -var M=date.getMinutes(); -var s=date.getSeconds(); -function _883(_884){ -return (_884<10?"0":"")+_884; -}; -var _885=$(this).datetimebox("spinner").timespinner("options").separator; -var r=$.fn.datebox.defaults.formatter(date)+" "+_883(h)+_885+_883(M); -if($(this).datetimebox("options").showSeconds){ -r+=_885+_883(s); -} -return r; -},parser:function(s){ -if($.trim(s)==""){ -return new Date(); -} -var dt=s.split(" "); -var d=$.fn.datebox.defaults.parser(dt[0]); -if(dt.length<2){ -return d; -} -var _886=$(this).datetimebox("spinner").timespinner("options").separator; -var tt=dt[1].split(_886); -var hour=parseInt(tt[0],10)||0; -var _887=parseInt(tt[1],10)||0; -var _888=parseInt(tt[2],10)||0; -return new Date(d.getFullYear(),d.getMonth(),d.getDate(),hour,_887,_888); -}}); -})(jQuery); -(function($){ -function init(_889){ -var _88a=$("
    "+"
    "+""+""+"
    "+"
    "+"
    "+"
    "+""+"
    ").insertAfter(_889); -var name=$(_889).hide().attr("name"); -if(name){ -_88a.find("input.slider-value").attr("name",name); -$(_889).removeAttr("name").attr("sliderName",name); -} -return _88a; -}; -function _88b(_88c,_88d){ -var _88e=$.data(_88c,"slider"); -var opts=_88e.options; -var _88f=_88e.slider; -if(_88d){ -if(_88d.width){ -opts.width=_88d.width; -} -if(_88d.height){ -opts.height=_88d.height; -} -} -if(opts.mode=="h"){ -_88f.css("height",""); -_88f.children("div").css("height",""); -if(!isNaN(opts.width)){ -_88f.width(opts.width); -} -}else{ -_88f.css("width",""); -_88f.children("div").css("width",""); -if(!isNaN(opts.height)){ -_88f.height(opts.height); -_88f.find("div.slider-rule").height(opts.height); -_88f.find("div.slider-rulelabel").height(opts.height); -_88f.find("div.slider-inner")._outerHeight(opts.height); -} -} -_890(_88c); -}; -function _891(_892){ -var _893=$.data(_892,"slider"); -var opts=_893.options; -var _894=_893.slider; -var aa=opts.mode=="h"?opts.rule:opts.rule.slice(0).reverse(); -if(opts.reversed){ -aa=aa.slice(0).reverse(); -} -_895(aa); -function _895(aa){ -var rule=_894.find("div.slider-rule"); -var _896=_894.find("div.slider-rulelabel"); -rule.empty(); -_896.empty(); -for(var i=0;i").appendTo(rule); -span.css((opts.mode=="h"?"left":"top"),_897); -if(aa[i]!="|"){ -span=$("").appendTo(_896); -span.html(aa[i]); -if(opts.mode=="h"){ -span.css({left:_897,marginLeft:-Math.round(span.outerWidth()/2)}); -}else{ -span.css({top:_897,marginTop:-Math.round(span.outerHeight()/2)}); -} -} -} -}; -}; -function _898(_899){ -var _89a=$.data(_899,"slider"); -var opts=_89a.options; -var _89b=_89a.slider; -_89b.removeClass("slider-h slider-v slider-disabled"); -_89b.addClass(opts.mode=="h"?"slider-h":"slider-v"); -_89b.addClass(opts.disabled?"slider-disabled":""); -_89b.find("a.slider-handle").draggable({axis:opts.mode,cursor:"pointer",disabled:opts.disabled,onDrag:function(e){ -var left=e.data.left; -var _89c=_89b.width(); -if(opts.mode!="h"){ -left=e.data.top; -_89c=_89b.height(); -} -if(left<0||left>_89c){ -return false; -}else{ -var _89d=_8ae(_899,left); -_89e(_89d); -return false; -} -},onStartDrag:function(){ -opts.onSlideStart.call(_899,opts.value); -},onStopDrag:function(e){ -var _89f=_8ae(_899,(opts.mode=="h"?e.data.left:e.data.top)); -_89e(_89f); -opts.onSlideEnd.call(_899,opts.value); -}}); -function _89e(_8a0){ -var s=Math.abs(_8a0%opts.step); -if(sopts.max){ -_8a3=opts.max; -} -opts.value=_8a3; -$(_8a2).val(_8a3); -_8a5.find("input.slider-value").val(_8a3); -var pos=_8a7(_8a2,_8a3); -var tip=_8a5.find(".slider-tip"); -if(opts.showTip){ -tip.show(); -tip.html(opts.tipFormatter.call(_8a2,opts.value)); -}else{ -tip.hide(); -} -if(opts.mode=="h"){ -var _8a8="left:"+pos+"px;"; -_8a5.find(".slider-handle").attr("style",_8a8); -tip.attr("style",_8a8+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px"); -}else{ -var _8a8="top:"+pos+"px;"; -_8a5.find(".slider-handle").attr("style",_8a8); -tip.attr("style",_8a8+"margin-left:"+(-Math.round(tip.outerWidth()))+"px"); -} -if(_8a6!=_8a3){ -opts.onChange.call(_8a2,_8a3,_8a6); -} -}; -function _890(_8a9){ -var opts=$.data(_8a9,"slider").options; -var fn=opts.onChange; -opts.onChange=function(){ -}; -_8a1(_8a9,opts.value); -opts.onChange=fn; -}; -function _8a7(_8aa,_8ab){ -var _8ac=$.data(_8aa,"slider"); -var opts=_8ac.options; -var _8ad=_8ac.slider; -if(opts.mode=="h"){ -var pos=(_8ab-opts.min)/(opts.max-opts.min)*_8ad.width(); -if(opts.reversed){ -pos=_8ad.width()-pos; -} -}else{ -var pos=_8ad.height()-(_8ab-opts.min)/(opts.max-opts.min)*_8ad.height(); -if(opts.reversed){ -pos=_8ad.height()-pos; -} -} -return pos.toFixed(0); -}; -function _8ae(_8af,pos){ -var _8b0=$.data(_8af,"slider"); -var opts=_8b0.options; -var _8b1=_8b0.slider; -if(opts.mode=="h"){ -var _8b2=opts.min+(opts.max-opts.min)*(pos/_8b1.width()); -}else{ -var _8b2=opts.min+(opts.max-opts.min)*((_8b1.height()-pos)/_8b1.height()); -} -return opts.reversed?opts.max-_8b2.toFixed(0):_8b2.toFixed(0); -}; -$.fn.slider=function(_8b3,_8b4){ -if(typeof _8b3=="string"){ -return $.fn.slider.methods[_8b3](this,_8b4); -} -_8b3=_8b3||{}; -return this.each(function(){ -var _8b5=$.data(this,"slider"); -if(_8b5){ -$.extend(_8b5.options,_8b3); -}else{ -_8b5=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_8b3),slider:init(this)}); -$(this).removeAttr("disabled"); -} -var opts=_8b5.options; -opts.min=parseFloat(opts.min); -opts.max=parseFloat(opts.max); -opts.value=parseFloat(opts.value); -opts.step=parseFloat(opts.step); -_898(this); -_891(this); -_88b(this); -}); -}; -$.fn.slider.methods={options:function(jq){ -return $.data(jq[0],"slider").options; -},destroy:function(jq){ -return jq.each(function(){ -$.data(this,"slider").slider.remove(); -$(this).remove(); -}); -},resize:function(jq,_8b6){ -return jq.each(function(){ -_88b(this,_8b6); -}); -},getValue:function(jq){ -return jq.slider("options").value; -},setValue:function(jq,_8b7){ -return jq.each(function(){ -_8a1(this,_8b7); -}); -},enable:function(jq){ -return jq.each(function(){ -$.data(this,"slider").options.disabled=false; -_898(this); -}); -},disable:function(jq){ -return jq.each(function(){ -$.data(this,"slider").options.disabled=true; -_898(this); -}); -}}; -$.fn.slider.parseOptions=function(_8b8){ -var t=$(_8b8); -return $.extend({},$.parser.parseOptions(_8b8,["width","height","mode",{reversed:"boolean",showTip:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)}); -}; -$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,value:0,min:0,max:100,step:1,rule:[],tipFormatter:function(_8b9){ -return _8b9; -},onChange:function(_8ba,_8bb){ -},onSlideStart:function(_8bc){ -},onSlideEnd:function(_8bd){ -}}; -})(jQuery); - diff --git a/spider/resources/static/js/editor.js b/spider/resources/static/js/editor.js deleted file mode 100644 index 85abfda..0000000 --- a/spider/resources/static/js/editor.js +++ /dev/null @@ -1,955 +0,0 @@ -var $ = layui.$; -var editor; -var flows; -var cms = []; -function renderCodeMirror(){ - cms = []; - $('[codemirror]').each(function(){ - var $dom = $(this); - if($dom.attr("rendered") == 'true'){ - return; - } - $dom.attr("rendered",true) - var cm = CodeMirror(this,{ - mode : 'spiderflow', //语法 - theme : 'idea', //设置样式 - placeholder : $dom.attr("placeholder"), - value : $dom.attr('data-value') || '', - scrollbarStyle : 'null', //隐藏滚动条 - }); - initHint(cm); - cm.on('change',function(){ - //cm.closeHint(); - //cm.showHint(); - $dom.attr('data-value',cm.getValue()); - serializeForm(); - }); - cms.push(cm); - }); -} -function serializeForm(){ - var cell = editor.getSelectedCell(); - var shape = cell.data.get('shape'); - cell.data.reset({}); - $.each($(".properties-container form").serializeArray(),function(index,item){ - var name = item.name; - var value = item.value; - if($(".properties-container form *[name="+name+"].array").length > 0){ - var array = cell.data.get(name) || []; - array.push(value); - cell.data.set(name,array); - }else{ - cell.data.set(name,value); - } - }); - $(".properties-container form [codemirror]").each(function(){ - var $dom = $(this); - var name = $dom.attr('codemirror'); - var value = $dom.attr('data-value'); - if($dom.hasClass("array")){ - var array = cell.data.get(name) || []; - array.push(value); - cell.data.set(name,array); - }else{ - cell.data.set(name,value); - } - }); - $(".properties-container form input[type=checkbox]").each(function(){ - cell.data.set(this.value,$(this).is(":checked") ? '1': '0'); - }); - cell.data.set('shape',shape); -} -$(function(){ - $.ajax({ - url : 'spider/other', - type : 'post', - data : { - id : getQueryString('id') - }, - dataType : 'json', - success : function(others){ - flows = others; - } - }) - $.ctrl = function(key, callback, args) { - var isCtrl = false; - $(document).keydown(function(e) { - if(!args) args=[]; - if(e.keyCode == 17) isCtrl = true; - if(e.keyCode == key.charCodeAt(0) && isCtrl) { - callback.apply(this, args); - isCtrl = false; - return false; - } - }).keyup(function(e) { - if(e.keyCode == 17) isCtrl = false; - }); - }; - $.ctrl('S', function() { - $('input,textarea').blur(); - Save(); - }); - $.ctrl('Q', function() { - $('input,textarea').blur(); - $(".btn-test").click(); - }); - var resize = $('.resize-container')[0] - resize.onmousedown = function(e){ - var startX = e.clientX; - resize.left = resize.offsetLeft; - var box = $("body")[0]; - document.onmousemove = function(e){ - var endX = e.clientX; - var moveLen = resize.left + (endX - startX); - var maxT = box.clientWidth - resize.offsetWidth; - if(moveLen<150) moveLen = 150; - if(moveLen>maxT-150) moveLen = maxT-150; - if(box.clientWidth - moveLen < 400 || box.clientWidth - moveLen > 800){ - return; - } - resize.style.left = moveLen + 'px'; - $(".editor-container").css('right',($('body').width() - moveLen) + 'px') - $(".properties-container").width(box.clientWidth - moveLen - 5); - $(".xml-container").width($(".main-container").width() - $(".properties-container").width() - $(".sidebar-container").width() + 8); - } - document.onmouseup = function(evt){ - document.onmousemove = null; - document.onmouseup = null; - resize.releaseCapture && resize.releaseCapture(); - } - resize.setCapture && resize.setCapture(); - return false; - } - var templateCache = {}; - function loadTemplate(cell,model,callback){ - var cells = model.cells; - var template = cell.data.get('shape') || 'root'; - if(cell.isEdge()){ - template = 'edge'; - } - var render = function(){ - layui.laytpl(templateCache[template]).render({ - data : cell.data, - value : cell.value, - flows : flows || [], - model : model - },function(html){ - $(".properties-container").html(html); - layui.form.render(); - renderCodeMirror(); - callback&&callback(); - }) - } - if(templateCache[template]){ - render(); - return; - } - $.get('resources/templates/' + template +".html",function(content){ - templateCache[template] = content; - render(); - }); - } - if (!mxClient.isBrowserSupported()){ - layui.layer.msg('浏览器不支持!!'); - }else{ - editor = new SpiderEditor({ - element : $('.editor-container')[0], - selectedCellListener : function(cell){ //选中节点后打开属性面板 - loadTemplate(cell,editor.getModel(),serializeForm); - } - }); - //绑定工具条点击事件 - bindToolbarClickAction(editor); - //加载图形 - loadShapes(editor,$('.sidebar-container')[0]); - if($('.sidebar-container')[0].scrollWidth>$('.sidebar-container')[0].clientWidth){ - $('.sidebar-container').width($('.sidebar-container').width() + 3); - } - layui.form.on('checkbox',function(e){ - serializeForm(); - }); - //节点名称输入框事件 - $("body").on("mousewheel",".layui-tab .layui-tab-title",function(e,delta){ - var $dom = $(this); - var wheel = e.originalEvent.wheelDelta || -e.originalEvent.detail; - var delta = Math.max(-1, Math.min(1, wheel) ); - e.preventDefault = function(){} - if(delta > 0){ - $dom.scrollLeft($dom.scrollLeft()-60); - }else{ - $dom.scrollLeft($dom.scrollLeft()+60); - } - return false; - }).on("dblclick",".layui-input-block[codemirror]",function(){ - if($(this).parent().hasClass("layui-layer-content")){ - return; - } - layui.layer.open({ - type : 1, - title : '请输入'+$(this).prev().html()+'表达式', - content : $(this), - skin : 'codemirror', - area : '800px' - }) - }).on("blur","input,textarea",function(){ - var $input = $(this); - if($input.attr('name') == 'value'){ - var cell = editor.getSelectedCell(); - var model = editor.getModel(); - model.beginUpdate(); - try{ - model.execute(new mxCellAttributeChange(cell,'value',$input.val())); - cell.setValue($input.val()); - }finally{ - model.endUpdate(); - } - }else{ - serializeForm(); - } - }).on("click",".editor-form-node .variable-add",function(){ - var index = $(".draggable").length; - $(this).parent().parent().before('

    '); - renderCodeMirror(); - }).on("click",".editor-form-node .header-remove,.editor-form-node .cookie-remove,.editor-form-node .parameter-remove,.editor-form-node .variable-remove,.editor-form-node .output-remove",function(){ //移除多行 - var $dom = $(this).parents(".draggable"); - $dom.remove(); - serializeForm(); - }).on("click",".editor-form-node .function-remove,.editor-form-node .cmd-remove",function () { - var $dom = $(this).parents(".draggable"); - $dom.remove(); - serializeForm(); - }).on("click",".editor-form-node .header-add",function(){ - var index = $(".draggable").length; - $(this).parent().parent().before('

    '); - renderCodeMirror(); - }).on("click",".editor-form-node .parameter-add",function(){ - var index = $(".draggable").length; - $(this).parent().parent().before('

    '); - renderCodeMirror(); - }).on("click",".editor-form-node .cookie-add",function(){ - var index = $(".draggable").length; - $(this).parent().parent().before('

    '); - renderCodeMirror(); - }).on("click",".editor-form-node .cookie-batch",function(){ - layui.layer.open({ - type : 1, - title : '请输入Cookie', - content : ``, - area : '800px', - btn : ['关闭','设置'], - btn2 : function(){ - var cookieStr = $("#cookies").val(); - var cookieArr = cookieStr.split(";"); - var appendFlag = true; - var appendDiv = ""; - var length = $(".draggable").length; - for (var i = 0; i < cookieArr.length; i++) { - var cookieItem = cookieArr[i]; - var index = cookieItem.indexOf("="); - if (index < 0) { - layer.alert('cookie数据格式错误'); - appendFlag = false; - return; - } else { - var name = cookieItem.substring(0, index); - var value = cookieItem.substring(index + 1); - appendDiv += `

    `; - } - } - if (appendFlag) { - $("#addCookieBtn").before(appendDiv); - renderCodeMirror(); - serializeForm(); - } - } - }) - }).on("click",".editor-form-node .header-batch",function(){ - layui.layer.open({ - type : 1, - title : '请输入Header', - content : ``, - area : '800px', - btn : ['关闭','设置'], - btn2 : function(){ - var headerStr = $("#headers").val(); - var headerArr = headerStr.split("\n"); - var appendFlag = true; - var appendDiv = ""; - var length = $(".draggable").length; - for (var i = 0; i < headerArr.length; i++) { - var headerItem = headerArr[i]; - var index = headerItem.indexOf(":"); - if (index < 0) { - layer.alert('header数据格式错误'); - appendFlag = false; - return; - } else { - var name = headerItem.substring(0, index); - var value = headerItem.substring(index + 1); - appendDiv += `

    `; - } - } - if (appendFlag) { - $("#addHeaderBtn").before(appendDiv); - renderCodeMirror(); - serializeForm(); - } - } - }) - }).on("click",".editor-form-node .parameter-batch",function () { - layui.layer.open({ - type : 1, - title : '请输入参数', - content : ``, - area : '800px', - btn : ['关闭','设置'], - btn2 : function(){ - var paramterStr = $("#paramters").val(); - var paramterArr = paramterStr.split("\n"); - var appendFlag = true; - var appendDiv = ""; - var length = $(".draggable").length; - for (var i = 0; i < paramterArr.length; i++) { - var paramterItem = paramterArr[i]; - var index = -1; - var indexArr = []; - indexArr.push(paramterItem.indexOf(":")); - indexArr.push(paramterItem.indexOf("=")); - indexArr.push(paramterItem.indexOf(" ")); - indexArr.push(paramterItem.indexOf("\t")); - for (var j = 0; j < indexArr.length; j++) { - if (indexArr[j] >= 0) { - if (index < 0) { - index = indexArr[j]; - } - index = Math.min(index, indexArr[j]); - } - } - if (index < 0) { - layer.alert('参数数据格式错误'); - appendFlag = false; - return; - } else { - var name = paramterItem.substring(0, index); - var value = paramterItem.substring(index + 1); - appendDiv += `

    `; - } - } - if (appendFlag) { - $("#addParamterBtn").before(appendDiv); - renderCodeMirror(); - serializeForm(); - } - } - }) - }).on("click",".editor-form-node .output-add",function(){ - var index = $(".draggable").length; - $(this).parent().parent().before('
    '); - renderCodeMirror(); - }).on("click",".editor-form-node .function-add",function(){ - var index = $(".draggable").length; - $(this).parent().parent().before('
    '); - renderCodeMirror(); - }).on("click",".editor-form-node .cmd-add",function(){ - var index = $(".draggable").length; - $(this).parent().parent().before('
    '); - renderCodeMirror(); - }).on("click",".parameter-form-add",function(){ - var html = ''; - html+='
    '; - html+= ''; - html+= ''; - html+= '
    '; - html+= ''; - html+= '
    '; - html+='
    '; - html+='
    '; - html+= ''; - html+= '
    '; - html+= ''; - html+= '
    '; - html+='
    '; - html+=''; - html+='
    '; - html+= ''; - html+= '
    '; - html+= '
    '; - html+='
    '; - html+='
    '; - $(this).parent().parent().before(html); - renderCodeMirror(); - layui.form.render(); - }).on("click",".parameter-form-remove",function(){ - var $dom = $(this).parent(); - $dom.next().remove(); - $dom.next().remove(); - $dom.next().remove(); - $dom.next().remove(); - $dom.remove(); - serializeForm(); - }); - layui.form.on('select(bodyType)',function(e){ - var bodyType = $(e.elem).val(); - $(".form-body-raw,.form-body-form-data").hide(); - if(bodyType == 'raw'){ - $(".form-body-raw").show(); - } - if(bodyType == 'form-data'){ - $(".form-body-form-data").show(); - } - renderCodeMirror(); - serializeForm(); - }); - layui.form.on('select(formType)',function(e){ - var $select = $(e.elem); - if($select.val() == 'file'){ - $select.parents(".layui-form-item").next().show(); - }else{ - $select.parents(".layui-form-item").next().hide(); - } - renderCodeMirror(); - serializeForm(); - }) - layui.element.on('tab',function(){ - for(var i=0;i支持方法参考命令提示。' - },{ - name : 'variable', - image : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAgCAYAAACYTcH3AAACe0lEQVRYR+2WMW5TQRCGv0mEoMMUKK80J0joKJBITgCUVAkniLehjQ+A9GwugLlBboA5QZITYLpnaEwXkZhBs+xu1s8vkhMDMpItudh9szP//PPP7Aor9JMVwsLqgmmV2roD7W9OTpsYe1jqzgWMJk4m9e/FO30W986nnDXZ1P2bPzsT480ws9XTE4EdlNeVk0EesCj1AOE9MKw6smffzPk9oQQOGsAPz5WXOajcP4KB9+cUTrng6SyYUici3M8DxiDRkSpnYyc+o+TcHCpnAhOFlgjb4VwCbuuipxr2R0A7T0DhSR1MT4RDb6Q8qpzYIYpS2wif/bbixk56Ram7CB+D7QyTRanDkDlVR1KMDIz5/wAMfhp4aJvPGTBNQT0DpSaQ58oDo95KdBeslKOxk06eZW6Pslc5GdaYIfrJz811U8zK6jjuyOPgxFhpWzaVkxl9eN1sso2ya3+FHYFWCtIERvlUOdmt66wJTBSqL5UHcVWOlKUH2dcjVToxuCrfTW9+/Vug5mOemUXBhLJ4IavSD473Ub5UTpLosu7y9Z9CL7ZoUWoX4ehPgYkaGfnugFYUbuquUo9FeG7rXKQhmfRtaWZyIadBFoQb10WpA4T9vJu8fjY4ROlmmkmdlrrpJmUK7Zzas0m4Nj03hZO6CEP797MRkUSfgZlrBDt37d1kwTZgYIPMJmWcOXnwYNP1UxtsJtm/a7amKYWOQverk+OQoDF2MIUXTVfO6l6UTZT/y701M9exvWZmzcxNO3F1NbPV18OZt8hNU1vCXn/w9upJmD0tl/B566MqvKo/O+3umHuB3TrC4gdHesmb1dXM4on8Hcs1M//FBP4FX81QGwO29kEAAAAASUVORK5CYII=', - title : '定义变量', - desc : '定义流程变量。
    定义变量有先后顺序,先定义变量后续可以使用,拖动可以交换变量顺序。' - },{ - name : 'loop', - image : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADO0lEQVRYR9WWS2hTURCGvwnVlVjpzgdWxQeo0IWP7rQuRBQVFayLSlUQH5V2UWhzo4takOTGCF1UlOJCKyJiFxUFSwWxioguRBEV31qhVXeKSI3ajJybGxPTJDdpCtUDIeFmZv7vzpmZc4RxXjLO+vzHAH4tZZhySihzsih8JCTPCs1o/hlo0UlE2QlsA2YD0zOI3QV68dFBUD7kA+MN0KIT+U4zwg5gbkrQn8ArYELac2MyCJzClsNeELkB/DoT4SJQ6QZ6AZzFRw8TeEyr/HCeH9YyhqhEWAzUAbNc+26GaSIir7OBZAcIaCXKbaAEGAIaidJJm5jf2ZelRrwFnO0y6wlCNSF5mskpM0CdTmIyX12HAWLs4Khc90rnX/9bagBO/4FQ1hGW9+kxMgNYesEpNuUtw2zimDwqSDxhbOlupxbMUjoIyz5vAEuN0UnXqYawnB+VeBKiCTjqxjNZ6EmNNzIDlt4AqhDaCUlDUeJJiHNATaaYIwECuhClOp8WyhsuoOtRrjhta8u83BnIO2qBhpaq67EUW+4nvP/OgKWm55cBzdjSVaBEZnOzpcoUBDMlTX3tdVs0ii2rkgBx8a0pUcw2FA9h6QAwzZkHsCjlexBbpscBRoonOIqHCOhGlLNAacrLfUGoJSSXBUurAFP55kTrRylH+YwwBegzaSp6K/y6AnGG0hzgDcouwnIrLmmWXyP4uIk6J912FNP7gwjfxqwbDupiYrTjo56gPM5WhHuADicDMZYTkZdFv71HgPQuMMdtXFRpICztYwJgqSnuOpRDhOWO1yS8CqwFerBlXdEAAZ2PYg6yGUBr+paOnIR+rUXodIXbsKWxKIhkhw3gYwlB+eQ9Cf16HOGAa1iPLcdHBWHpEeCQ67sGW66lx8l+IUmdDUITITlWEERAT6Dsd326sWVLJv/cV7Lk/Da+ffiwCUpvTpD4wWO6aYNr14Ut1dl8vC+lliaKMh5DuYQP08cP8HEP5RcxKlAWIKxOETbWFraEcwF7Azhh1LyR+Szx3AYzQ+AMMTqJyEMv+/wAElEs3QxUACvdA2YqEAWeu/Oj3xG35Z2XcOZJmK/XGNoVloExFP5nMvAbItf8IXnK1DcAAAAASUVORK5CYII=', - title : '循环', - desc : '' - },{ - name : 'loopJoin', - image : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADtUlEQVRYR8WXTWgdVRTHf2cCJgi2RdGFWFGXpaZ+2xYEu7FYF9222oVRsaAgJjbJJF34umhyk2grgoLBahetydaFLbppQTCpGmOiuIylSheKYhWkETpHzsyd92bem3mZxgQPPHjMPR//e8+55/yv8D+LXFf8Ab2DgMeA+4Fbgdu8/S/Ar8A8EZ8zLj9X9VsNwLDuI+IVYEdFxzMEvM2ITK+k3x5Av95HwCDCvgJHc4D9TB70v7yaMk3EGBPybRmQcgBD2kPEMYRN3ngJeDcOGjHHuPyVczqgNxHUgbwE3BOvK38Q0MeofFgEohhAqDXg9YzBJF30UpO/VzrSeL2mN3KV48CLGf0jODG/OWkFEOrjwDmvNU8HezkqP1UK3Kx0WDdzjY990drqLpycz6rlAQzrViI+BW4HzuJkz6oCNxuFegZ4ErhMwG5G5PtUJQ9gUKfqBbfMLRyX39cEQK/eTCe/+ZqYZkz2twJIrtqUX+jDieVw7STUXuBY7DBgf3pFGycQ6izwKLBAJ49wRP5Zu+hW0noDy3wJbAMu4GS7+U8AhHoX8GP8X+hnVN4oDT6s3USYsdVJViy/s4zIYqntkB5CmfDrd+PkYgrgWSC9p7tx8lmhkyHdgfJF25MRdjIqM4U6oT4BcZGb9ODkZApgHOiPP3exkZr8WeKgkcdyFOX1U9MNXOWKN53AyUAKwHZvp7CIE8tRsbQ2qCK9woZTVwx1AegGTuKkJwXwCbAH5QRj8sK6AhjU9xGeB87g5Kk8AJjEycF1BRDqe75F5wCkKZjDyUPrDOBrPzlzKWgUYcSGlkmXIgrVhovtoJ0cxMlkoUIyMdMCzxWhtcaPvFHLwKg7S3qAFVG5BGwr7QX5Qfc0TqaSGkioVjrxDuHkzdIISS+wRrSxSecKwmxpDzDlUF8DkiYXsdmoW7YVW4MxyrVEF/dWnv0r5KO+nHCE7zxRmcHJTltrAMgPo/a3oWrQrF6j+kuGkSlnx3EHd66aiDQDTIjJpfiz8cTCcWyLCQk953ngPE4eWM1mW2xC/SZmRcYPI3ZlSWorJTMyqnzgnZxlmQOrJiYJETnl2ZAl/LlmclqVlPbRyTuVOUIy+1+uE5BkNxVJaXp+yZ09nZn7CwinUBbpYrZlYiaTbjtCN8oBTzzM22XgmWYymoZp/zAxknqNwyUPk0WUr2JHwsN+wuXTbwXXwdEsCW2uj+t5mr3qKVuVurxAwFv//WnWHCqhbpaaLSWP0x+A80a1qqDMN6KqFmus9y+zTEcwb5XSdQAAAABJRU5ErkJggg==', - title : '循环结束', - desc : '' - },{ - name : 'output', - image : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAByUlEQVRYR+WXwVHDMBBF/4YD3AgHwEd3QKiA0IE7IOnAqoCkAqWDmAqACggVJJTAzRku4UYOmWVWloMZgi17bGcGdNGMrZWeVtrdL4JtXc3dI8I9gH76rWIfxSENXW0pHehpHoAwdTXMHccYx4pGLnNlAUYg3BojxtjFODPGB+Hmmw1jGCuKiubZCRCHtP1eNIH89zT3QXgy7IwXIlzYjRRC1A7wwTg5BGauELUDiPfkQrtCNAIg7neFaAzAFaJRAIE41dzrJHfieNfFrB2gMGoYz7GibbL7GwAmjQO9vN0zMDGh2YQHCt2eJKsZCFf/F+A3L9VyCV2OQMLxgKA3DPWmaJHatAbgaTbVloHFmnG9UrQSiDYBfFlcEpL0y5AuWwWQxc40B51EdUkzyqmUB6xs0wB8l3PfNYaBHgFdqx1UKYCs8KgKkLVjYFUKwJbYKN1BFQjjga/CNC4FUGXBrI0NxbmtinexokFrAJ5mnwlz8Z7oxjXQl1BsEyDJA4z3NeC3ngeM+4HJBgj3kgn3XgvONRs9IOe/VBTuoxa46wEQnN51pcKSMTAZNEcR1fc4zSFjxuNSUfDjCKyuezCyqanGeN0AQTYKPgFOSUMAph/CYQAAAABJRU5ErkJggg==', - title : '输出', - desc : '输出流程中的变量结果(仅测试下有用)' - },{ - name : 'executeSql', - image : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAD1ElEQVRYR7WXUXIaRxCGv4YqR2+WH2zxZukEUU5gdAKjExhfILAnMD7BohMYn8D4BEYnsHQCobfd5CHkDVIFnerZmc0sLAJjMlVUSbszPX93//13r7DnOk319JcGb0TpAOfRzyxMw0+F8WLF7SyR2T6mZdemVqrnCB+A7sZe5dE9E17X2BmhfMwSMXBb11YAzmPhg0DfnVYeFcYKkz8SGddZfJVqR6At0ClBCYP5ipttEakF4C//JnCpyt/AIE9kuCta8fuzVA34QITnCncL5aoOxAaAl6leNgS7/FSVrwvo7pvPdYDOERiJ8FZhtlKu/kzkLt5XAeA9f/CX3+SJFOH/yXWW6lCEnoFYKBexQyWAtbAf7fKAPQJRSUcJoNygfM0TsVI7+jpLdWzp8NUxKAoI8KX2YIRbwPmhOd+F2HNiasREubASDQBGCO9USdbZ3kq1TRPNfpfb9Qsc8CavWfIY17sRudnk+XzJ/bozrVQHTleUz1kiXTFUJ8JfVudZIqZwbjkjwhevePZoulSuA4tLQ36/wjDvS+IjOkF4g3KVJTKpAT41nZgrL8TEoyF8UaVCvFaqbpOVooEQ4Ver57wvv7moCN8sZVKIU8eH9X2WyKiV6i4ALuIr5VpaqZb/BIWLOHGfJ3LpvXKAsr7YGRdGM2Bn1p3YBSDstzSYMYfWDIdQBQ9RbrNE2h6A9YLzLJFBlEcX4vX9uwA4e0NVs28ASs/iXLkN1uWKPFYayrEAWErFI6kQ0IAEXbC/rQmJchMIdRQA3nEHIJCrhq0mFt2ysxXt9TgpKAFsSUElHakaiE+m5XlfXhwlAua4cl9LwjpFi8l6LACBhBtl6EUo9Wo1isUlLkMj6BJmTaHnUuWrZlcVVMqwTog8gO+BG14tv7syjHTApNuGFhMVF7X/OLK/EJVSDNOsLxdR+7wz9aukw+u3CZUrIWsq0QqTzwmMnRRXX8aaUpb+1mbkgMHQZNa3zfEc+qG5mPiY/juJLuR6YvPjEjoN6LrIrIGzAWejGfn82uT7UDex1BHy0GfxxFVpxx6E03cTnbwv14de8tS5iJxOT3xkiyN+WJj4kP5/I5lyv4B2SOXmUApuYon7+89GIxr3Niau+rHcCFWAGC+U94eOaD7nn+xDxWaHFbSfHMuDp5V0wAxhkPfk5kciYWxXoedH/ErYYztPfpqd2GdZ8V1oa2oRQZjkPbGy21he1N4CNkMU453ycQ7DH/o0iy276QisQgq1q64wJ5SzZPla+WznDv44Xb/J0vIM2o1CmEwJT4NSuq5mqYLpCsb/wGRf3vwLgODoY+vqQ1gAAAAASUVORK5CYII=', - title : '执行SQL', - desc : '执行sql,需配置数据源,sql执行结果存于变量rs中。
    语句类型为:select,返回:List<Map<String,Object>>
    语句类型为:selectOne,返回:Map<String,Object>
    语句类型为:selectInt,返回:Integer
    语句类型为:insert、update、delete,返回:int,批量操作返回int数组
    sql中变量必须用 # # 包裹,如:#${title}#' - },{ - name : 'function', - image : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAAgCAYAAACPb1E+AAAC9UlEQVRYR+2YP0zUUBjAf9+RKJPgQK6THptxERPiZOTUxEUj/tlMjCS62xoT3YARl5bJTXByBGcHISQmxhjQ6A6TPRg8JrnE62de6Z0Htne9XhMw4W1N3/u+X7//rwJgzeokygRQMs+HYSksBsr0liNrYrk6gTB3GMBiGNZ9W4al6OqiCOOqfFGYKkD1oIEVRkRwQw5l2FhyCWEMZdp3ZOqgARv6LU/1CDIPbxxZMg8rhmUxj5gcdHWw6khiJSh6+lVgAGXMd2S90/79H9czpOXpd+CsKk7FEe8fBab2whwCdeF6n/ISOFUPuLT1RFbSWLsnSMvTOVUmREJVM74tz1uVGov1C6tR9/rs2zJqefoL6FfYDpSy6SKdQDNDGkAI2yeqvKk4ci/GilMIk40aZ1w95OpIQVgWOKFQDZTLnUAzQbYCorz2HQlhW5flakmFVYFBVWYrjtiN9yEoLIkwkAa0a0jL0x8m4SLrxAKGGenqPMIDVbZrUNqfWE1Qk1AFqAc83HLkVZzrs0AGgKhQDwJG41xluVpGeB99SGKLtTx9i3LTJFUAC5u23MkFcsjTZwWYFjie5CrLUwNYRtnwHYkd+fbENHyr/eZG9als5AJphLSLqdZxL1BubzqyGFP3mkmXFNN74jtrMW8FRdgB7u4EfGiWHGXZd6QcA7iCcBEz1yQkXa7F3ID2wUeEY0HATJ9wRoVxo6SunI+N18gqCu8qtlzrVCNzaYtFVx8BVwJ4UYB5Ec4pfKrYciEOoOiqjXC1ptxv10pzcXccQBQC5VqdhaQkSGO5XN2dRWGWM13XySxKej1zBNmrBRvnYy25fyDIS1kWOdG49zNqseG92xPhcSRsqWuhgoXSn3jOFH3F71Kuaatha91RTpp7d0lhzYxQXQra3W66yO4AHL86vW+nNOpOofgI9JaZAzOAmt80p9tAmgFivlu5Aaw1ZoB2Nkglt/kHJNmSsf08lfBoU2pIy9W/14JuNCTs9e3olpRC1n8B+Qd0Dhp9ddQMugAAAABJRU5ErkJggg==', - title : '执行函数', - desc : '单独执行函数方法,结果不保存为变量' - },{ - name : 'process', - image : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACMklEQVRYR+2WwXHTQBSGv+fMkNwIB7BvMRVgV0DoIFRAUoGlCpJUsKICnApCB4QKcCrAvslwwEebGfyYp2g1QgmytBmPOaCjtLv/t+/9+neFHT+yY31aAxw6PdwXzgVOgH5lA1OEcTqSy6Ybaw3QdZqIMKoTUOX9PJaoCUQIwEKEp7+U4fdYJmWR504He8IXYJpG8tK+9RJVP0ZhIkKSjuTKv9sOgDJLY8naUwYog6yUN4tYFq0Bek4vEM5ry6tcprFclMeYd57AcQcShCOrxjySYWsAWzTzgZlQOPoDRJkB46p4FeQAJtlc5SwIoIm56sa8cHrSEa4zTzx2sZD51o4D4YfN3QlAz2kf4evOAIoWKLetKxCShD2np2ksY9txXn7Lin6QCdsmoYkjfFgqz/Y7vBYlMXFVbuexDB6sQNdphPBOYOBNlkaSje06bZyEXrxqVBNfwfG9IMrL+6ksHASQJ2EVwIQFEt+OeybsOrWsfoUyW0P0E26MsryDtknoIXwFq9UoWmBlF8GZ+BIGVeHyxLZJWDZhHUC2+7Xy9lssH0MCJmROUQF/aplb63YfIlI3598B8AbcWQsKE8J0qQx9G3pO7Xg99WUMScJGLchD5u43hKkK0WrN5/zUGqeRnBV3gW3dCbPdwU0OUQXPINokYRPDPhjF9t8qWC5YNe4e5cpa0QigdCfcBLHxNMx+z1zcFmubhI8HqJiw8EHgnfCvSbiJdFvfN7ZgW8J+3f8AvwFIqFFyobd5IgAAAABJRU5ErkJggg==', - title : '子流程', - desc : '执行其他spiderFlow流程,父子流程变量共享' - }]; - var addShape = function(shape){ - var image = new Image(); - image.src = shape.image; - image.title = shape.title; - image.id = shape.name; - image.onclick = function (ev) { - if(shape.desc){ - layer.tips("(" + shape.name + ")" + shape.title + "
    " + shape.desc, '#' + shape.name,{ - tips: [1, '#3595CC'], - area: ['auto', 'auto'], - time: 4000 - }); - } - } - if(!shape.hidden){ - container.appendChild(image); - } - - if(!shape.disabled){ - editor.addShape(shape.name,shape.title || 'Label',image,shape.defaultAdd); - } - } - for(var i =0,len = shapes.length;i
      ', - area : ["980px","500px"], - shade : 0, - maxmin : true, - maxWidth : 700, - maxHeight : 400, - title : '测试窗口', - btn : ['关闭','显示/隐藏输出','显示/隐藏日志','停止'], - btn2 : function(){ - var $output = $(".test-window-container .output-container"); - var $log = $(".test-window-container .log-container"); - if($output.is(":hidden")){ - $output.show(); - $output.find("canvas").each(function(){ - if($log.is(":hidden")){ - this.height = 320; - }else{ - this.height = 200; - } - }) - $log.attr('height',100) - LogViewer.resize(); - for(var tableId in tableMap){ - tableMap[tableId].instance.resize(); - } - }else{ - $output.hide(); - $log.attr('height',400); - LogViewer.resize(); - for(var tableId in tableMap){ - tableMap[tableId].instance.resize(); - } - } - return false; - }, - btn3 : function(){ - var $output = $(".test-window-container .output-container"); - var $log = $(".test-window-container .log-container"); - if($log.is(":hidden")){ - $log.show(); - $log.attr('height',$output.is(":hidden") ? 400 : 100) - $output.find("canvas").each(function(){ - this.height = 200; - }); - LogViewer.resize(); - for(var tableId in tableMap){ - tableMap[tableId].instance.resize(); - } - }else{ - $log.hide(); - $output.find("canvas").each(function(){ - this.height = 320; - }); - LogViewer.resize(); - for(var tableId in tableMap){ - tableMap[tableId].instance.resize(); - } - } - return false; - }, - btn4 : function(){ - var $btn = $("#layui-layer" + testWindowIndex).find('.layui-layer-btn3'); - if($btn.html() == '停止'){ - socket.send(JSON.stringify({ - eventType : 'stop' - })); - }else{ - socket.send(JSON.stringify({ - eventType : 'test', - message : editor.getXML() - })); - $btn.html('停止'); - } - return false; - }, - end : function(){ - if(socket){ - socket.close(); - } - if(LogViewer){ - LogViewer.destory(); - } - for(var tableId in tableMap){ - tableMap[tableId].instance.destory(); - } - }, - success : function(layero,index){ - var logElement = $(".test-window-container .log-container")[0]; - var colors = { - 'array' : '#2a00ff', - 'object' : '#2a00ff', - 'boolean' : '#600100', - 'number' : '#000E59' - } - LogViewer = new CanvasViewer({ - element : logElement, - onClick : function(e){ - onCanvasViewerClick(e,'日志'); - } - }); - $(layero).find(".layui-layer-btn") - .append('
      ') - .on("keyup","input",function(){ - LogViewer.filter(this.value); - }); - socket = createWebSocket({ - onopen : function(){ - socket.send(JSON.stringify({ - eventType : 'test', - message : editor.getXML() - })); - }, - onmessage : function(e){ - var event = JSON.parse(e.data); - var eventType = event.eventType; - var message = event.message; - if(eventType == 'finish'){ - $("#layui-layer" + testWindowIndex).find('.layui-layer-btn3').html('重新开始'); - }else if(eventType == 'output'){ - var tableId = 'output-' + message.nodeId; - var $table = $('#' + tableId); - if($table.length == 0){ - tableMap[tableId] = { - index : 0 - }; - var $tab = $(".test-window-container .output-container .layui-tab") - var outputTitle = '输出-'+tableId; - var cell = editor.getModel().cells[message.nodeId]; - if(cell){ - outputTitle = cell.value; - } - if(first){ - $tab.find(".layui-tab-title").append('
    • ' + outputTitle + '
    • '); - $tab.find(".layui-tab-content").append('
      '); - first = false; - }else{ - $tab.find(".layui-tab-title").append('
    • ' + outputTitle + '
    • '); - $tab.find(".layui-tab-content").append('
      '); - } - $table = $('').appendTo($(".test-window-container .output-container .layui-tab-item[data-output="+tableId+"]")); - $table.attr('id',tableId); - tableMap[tableId].instance = new CanvasViewer({ - element : document.getElementById(tableId), - grid : true, - header : true, - style : { - font : 'bold 13px Consolas' - }, - onClick : function(e){ - onCanvasViewerClick(e,'表格'); - } - }) - var cols = []; - var texts = [new CanvasText({ - text : '序号', - maxWidth : 100 - })]; - for(var i =0,len = message.outputNames.length;i'+(json ? '' : msg.replace(/\n/g,'
      ')).replace(/ /g,' ').replace(/\t/g,'    ')+'', - shade : 0, - area : json ? ['700px','500px'] : 'auto', - maxmin : true, - maxWidth : (json ? undefined : 700), - maxHeight : (json ? undefined : 400), - success : function(dom,index){ - var $dom = $(dom).find(".message-content"); - if(json){ - jsonTree.create(json,$dom[0]); - } - } - }); -} -function createWebSocket(options){ - options = options || {}; - var socket; - if(location.host === 'demo.spiderflow.org'){ - socket = new WebSocket(options.url || 'ws://49.233.182.130:8088/ws'); - }else{ - socket = new WebSocket(options.url || (location.origin.replace("http",'ws') + '/ws')); - } - socket.onopen = options.onopen; - socket.onmessage = options.onmessage; - socket.onerror = options.onerror || function(){ - layer.layer.msg('WebSocket错误'); - } - return socket; -} - -var flowId; -function Save(){ - $.ajax({ - url : 'spider/save', - type : 'post', - data : { - id : getQueryString('id') || flowId, - xml : editor.getXML(), - name : editor.graph.getModel().getRoot().data.get('spiderName') || '未定义名称', - }, - success : function(id) { - flowId = id; - layui.layer.msg('保存成功', { - time : 800 - }, function() { - // location.href = "spiderList.html"; - }) - } - }) -} - -function allowDrop(ev){ - ev.preventDefault(); -} - -function drag(ev){ - ev.dataTransfer.setData("moverTarget", ev.target.id); -} - -function drop(ev){ - var moverTargetId = ev.dataTransfer.getData("moverTarget"); - $(ev.target).parents(".draggable").before($("#" + moverTargetId)); - ev.preventDefault(); - serializeForm(); -} \ No newline at end of file diff --git a/spider/resources/static/js/index.js b/spider/resources/static/js/index.js deleted file mode 100644 index 34dfb5e..0000000 --- a/spider/resources/static/js/index.js +++ /dev/null @@ -1,43 +0,0 @@ -var $ = layui.$; -function openTab(title,id,href){ - if($(".layui-tab[lay-filter=admin-tab]").find("[lay-id="+id+"]").length > 0){ //判断是否已打开 - var $dom = $(".layui-tab[lay-filter=admin-tab]"); - var index = $dom.find("[lay-id="+id+"]").index(); - $dom.find(".layui-tab-content .layui-tab-item").eq(index).find("iframe").attr("src",href); - }else{ - var html = ''; - layui.element.tabAdd('admin-tab',{ - title:title, - content:html, - id:id, - }); - } - layui.element.tabChange("admin-tab",id); -} -$(function(){ - $.ajax({ - url:'spider/pluginConfigs', - success:function(data){ - for(var i =0;i'+data[i].name+''); - } - layui.element.init(); - initMenu(); - } - }) -}); - -function initMenu() { - $("body").on('click','.menu-list li a',function(){ - $(this).parents("ul").siblings().find("li.layui-this,dd.layui-this").removeClass('layui-this') - }).on('click','.menu-list > ul',function(){ - $(this).siblings().find('.layui-nav-itemed').removeClass('layui-nav-itemed') - }).on('click','.menu-list a',function(){ - var href = $(this).data('link'); - if(href){ - var title = $(this).html(); - openTab(title, title, href); - return false; - } - }); -} \ No newline at end of file diff --git a/spider/resources/static/js/jquery.easyui.min.js b/spider/resources/static/js/jquery.easyui.min.js deleted file mode 100644 index 94da279..0000000 --- a/spider/resources/static/js/jquery.easyui.min.js +++ /dev/null @@ -1,11838 +0,0 @@ -/** - * jQuery EasyUI 1.3.3 - * - * Copyright (c) 2009-2013 www.jeasyui.com. All rights reserved. - * - * Licensed under the GPL or commercial licenses - * To use it on other terms please contact us: info@jeasyui.com - * http://www.gnu.org/licenses/gpl.txt - * http://www.jeasyui.com/license_commercial.php - * - */ -(function($){ -$.parser={auto:true,onComplete:function(_1){ -},plugins:["draggable","droppable","resizable","pagination","tooltip","linkbutton","menu","menubutton","splitbutton","progressbar","tree","combobox","combotree","combogrid","numberbox","validatebox","searchbox","numberspinner","timespinner","calendar","datebox","datetimebox","slider","layout","panel","datagrid","propertygrid","treegrid","tabs","accordion","window","dialog"],parse:function(_2){ -var aa=[]; -for(var i=0;i<$.parser.plugins.length;i++){ -var _3=$.parser.plugins[i]; -var r=$(".easyui-"+_3,_2); -if(r.length){ -if(r[_3]){ -r[_3](); -}else{ -aa.push({name:_3,jq:r}); -} -} -} -if(aa.length&&window.easyloader){ -var _4=[]; -for(var i=0;i").appendTo("body"); -$._boxModel=parseInt(d.width())==100; -d.remove(); -if(!window.easyloader&&$.parser.auto){ -$.parser.parse(); -} -}); -$.fn._outerWidth=function(_e){ -if(_e==undefined){ -if(this[0]==window){ -return this.width()||document.body.clientWidth; -} -return this.outerWidth()||0; -} -return this.each(function(){ -if($._boxModel){ -$(this).width(_e-($(this).outerWidth()-$(this).width())); -}else{ -$(this).width(_e); -} -}); -}; -$.fn._outerHeight=function(_f){ -if(_f==undefined){ -if(this[0]==window){ -return this.height()||document.body.clientHeight; -} -return this.outerHeight()||0; -} -return this.each(function(){ -if($._boxModel){ -$(this).height(_f-($(this).outerHeight()-$(this).height())); -}else{ -$(this).height(_f); -} -}); -}; -$.fn._scrollLeft=function(_10){ -if(_10==undefined){ -return this.scrollLeft(); -}else{ -return this.each(function(){ -$(this).scrollLeft(_10); -}); -} -}; -$.fn._propAttr=$.fn.prop||$.fn.attr; -$.fn._fit=function(fit){ -fit=fit==undefined?true:fit; -var t=this[0]; -var p=(t.tagName=="BODY"?t:this.parent()[0]); -var _11=p.fcount||0; -if(fit){ -if(!t.fitted){ -t.fitted=true; -p.fcount=_11+1; -$(p).addClass("panel-noscroll"); -if(p.tagName=="BODY"){ -$("html").addClass("panel-fit"); -} -} -}else{ -if(t.fitted){ -t.fitted=false; -p.fcount=_11-1; -if(p.fcount==0){ -$(p).removeClass("panel-noscroll"); -if(p.tagName=="BODY"){ -$("html").removeClass("panel-fit"); -} -} -} -} -return {width:$(p).width(),height:$(p).height()}; -}; -})(jQuery); -(function($){ -var _12=false; -function _13(e){ -var _14=$.data(e.data.target,"draggable"); -var _15=_14.options; -var _16=_14.proxy; -var _17=e.data; -var _18=_17.startLeft+e.pageX-_17.startX; -var top=_17.startTop+e.pageY-_17.startY; -if(_16){ -if(_16.parent()[0]==document.body){ -if(_15.deltaX!=null&&_15.deltaX!=undefined){ -_18=e.pageX+_15.deltaX; -}else{ -_18=e.pageX-e.data.offsetWidth; -} -if(_15.deltaY!=null&&_15.deltaY!=undefined){ -top=e.pageY+_15.deltaY; -}else{ -top=e.pageY-e.data.offsetHeight; -} -}else{ -if(_15.deltaX!=null&&_15.deltaX!=undefined){ -_18+=e.data.offsetWidth+_15.deltaX; -} -if(_15.deltaY!=null&&_15.deltaY!=undefined){ -top+=e.data.offsetHeight+_15.deltaY; -} -} -} -if(e.data.parent!=document.body){ -_18+=$(e.data.parent).scrollLeft(); -top+=$(e.data.parent).scrollTop(); -} -if(_15.axis=="h"){ -_17.left=_18; -}else{ -if(_15.axis=="v"){ -_17.top=top; -}else{ -_17.left=_18; -_17.top=top; -} -} -}; -function _19(e){ -var _1a=$.data(e.data.target,"draggable"); -var _1b=_1a.options; -var _1c=_1a.proxy; -if(!_1c){ -_1c=$(e.data.target); -} -_1c.css({left:e.data.left,top:e.data.top}); -$("body").css("cursor",_1b.cursor); -}; -function _1d(e){ -_12=true; -var _1e=$.data(e.data.target,"draggable"); -var _1f=_1e.options; -var _20=$(".droppable").filter(function(){ -return e.data.target!=this; -}).filter(function(){ -var _21=$.data(this,"droppable").options.accept; -if(_21){ -return $(_21).filter(function(){ -return this==e.data.target; -}).length>0; -}else{ -return true; -} -}); -_1e.droppables=_20; -var _22=_1e.proxy; -if(!_22){ -if(_1f.proxy){ -if(_1f.proxy=="clone"){ -_22=$(e.data.target).clone().insertAfter(e.data.target); -}else{ -_22=_1f.proxy.call(e.data.target,e.data.target); -} -_1e.proxy=_22; -}else{ -_22=$(e.data.target); -} -} -_22.css("position","absolute"); -_13(e); -_19(e); -_1f.onStartDrag.call(e.data.target,e); -return false; -}; -function _23(e){ -var _24=$.data(e.data.target,"draggable"); -_13(e); -if(_24.options.onDrag.call(e.data.target,e)!=false){ -_19(e); -} -var _25=e.data.target; -_24.droppables.each(function(){ -var _26=$(this); -if(_26.droppable("options").disabled){ -return; -} -var p2=_26.offset(); -if(e.pageX>p2.left&&e.pageXp2.top&&e.pageYp2.left&&e.pageXp2.top&&e.pageY_3b.options.edge; -}; -}); -}; -$.fn.draggable.methods={options:function(jq){ -return $.data(jq[0],"draggable").options; -},proxy:function(jq){ -return $.data(jq[0],"draggable").proxy; -},enable:function(jq){ -return jq.each(function(){ -$(this).draggable({disabled:false}); -}); -},disable:function(jq){ -return jq.each(function(){ -$(this).draggable({disabled:true}); -}); -}}; -$.fn.draggable.parseOptions=function(_40){ -var t=$(_40); -return $.extend({},$.parser.parseOptions(_40,["cursor","handle","axis",{"revert":"boolean","deltaX":"number","deltaY":"number","edge":"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.draggable.defaults={proxy:null,revert:false,cursor:"move",deltaX:null,deltaY:null,handle:null,disabled:false,edge:0,axis:null,onBeforeDrag:function(e){ -},onStartDrag:function(e){ -},onDrag:function(e){ -},onStopDrag:function(e){ -}}; -$(function(){ -function _41(e){ -var _42=e.changedTouches,_43=_42[0],_44=""; -switch(e.type){ -case "touchstart": -_44="mousedown"; -break; -case "touchmove": -_44="mousemove"; -break; -case "touchend": -_44="mouseup"; -break; -default: -return; -} -var _45=document.createEvent("MouseEvent"); -_45.initMouseEvent(_44,true,true,window,1,_43.screenX,_43.screenY,_43.clientX,_43.clientY,false,false,false,false,0,null); -_43.target.dispatchEvent(_45); -if(_12){ -e.preventDefault(); -} -}; -if(document.addEventListener){ -document.addEventListener("touchstart",_41,true); -document.addEventListener("touchmove",_41,true); -document.addEventListener("touchend",_41,true); -document.addEventListener("touchcancel",_41,true); -} -}); -})(jQuery); -(function($){ -function _46(_47){ -$(_47).addClass("droppable"); -$(_47).bind("_dragenter",function(e,_48){ -$.data(_47,"droppable").options.onDragEnter.apply(_47,[e,_48]); -}); -$(_47).bind("_dragleave",function(e,_49){ -$.data(_47,"droppable").options.onDragLeave.apply(_47,[e,_49]); -}); -$(_47).bind("_dragover",function(e,_4a){ -$.data(_47,"droppable").options.onDragOver.apply(_47,[e,_4a]); -}); -$(_47).bind("_drop",function(e,_4b){ -$.data(_47,"droppable").options.onDrop.apply(_47,[e,_4b]); -}); -}; -$.fn.droppable=function(_4c,_4d){ -if(typeof _4c=="string"){ -return $.fn.droppable.methods[_4c](this,_4d); -} -_4c=_4c||{}; -return this.each(function(){ -var _4e=$.data(this,"droppable"); -if(_4e){ -$.extend(_4e.options,_4c); -}else{ -_46(this); -$.data(this,"droppable",{options:$.extend({},$.fn.droppable.defaults,$.fn.droppable.parseOptions(this),_4c)}); -} -}); -}; -$.fn.droppable.methods={options:function(jq){ -return $.data(jq[0],"droppable").options; -},enable:function(jq){ -return jq.each(function(){ -$(this).droppable({disabled:false}); -}); -},disable:function(jq){ -return jq.each(function(){ -$(this).droppable({disabled:true}); -}); -}}; -$.fn.droppable.parseOptions=function(_4f){ -var t=$(_4f); -return $.extend({},$.parser.parseOptions(_4f,["accept"]),{disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.droppable.defaults={accept:null,disabled:false,onDragEnter:function(e,_50){ -},onDragOver:function(e,_51){ -},onDragLeave:function(e,_52){ -},onDrop:function(e,_53){ -}}; -})(jQuery); -(function($){ -var _54=false; -$.fn.resizable=function(_55,_56){ -if(typeof _55=="string"){ -return $.fn.resizable.methods[_55](this,_56); -} -function _57(e){ -var _58=e.data; -var _59=$.data(_58.target,"resizable").options; -if(_58.dir.indexOf("e")!=-1){ -var _5a=_58.startWidth+e.pageX-_58.startX; -_5a=Math.min(Math.max(_5a,_59.minWidth),_59.maxWidth); -_58.width=_5a; -} -if(_58.dir.indexOf("s")!=-1){ -var _5b=_58.startHeight+e.pageY-_58.startY; -_5b=Math.min(Math.max(_5b,_59.minHeight),_59.maxHeight); -_58.height=_5b; -} -if(_58.dir.indexOf("w")!=-1){ -var _5a=_58.startWidth-e.pageX+_58.startX; -_5a=Math.min(Math.max(_5a,_59.minWidth),_59.maxWidth); -_58.width=_5a; -_58.left=_58.startLeft+_58.startWidth-_58.width; -} -if(_58.dir.indexOf("n")!=-1){ -var _5b=_58.startHeight-e.pageY+_58.startY; -_5b=Math.min(Math.max(_5b,_59.minHeight),_59.maxHeight); -_58.height=_5b; -_58.top=_58.startTop+_58.startHeight-_58.height; -} -}; -function _5c(e){ -var _5d=e.data; -var t=$(_5d.target); -t.css({left:_5d.left,top:_5d.top}); -if(t.outerWidth()!=_5d.width){ -t._outerWidth(_5d.width); -} -if(t.outerHeight()!=_5d.height){ -t._outerHeight(_5d.height); -} -}; -function _5e(e){ -_54=true; -$.data(e.data.target,"resizable").options.onStartResize.call(e.data.target,e); -return false; -}; -function _5f(e){ -_57(e); -if($.data(e.data.target,"resizable").options.onResize.call(e.data.target,e)!=false){ -_5c(e); -} -return false; -}; -function _60(e){ -_54=false; -_57(e,true); -_5c(e); -$.data(e.data.target,"resizable").options.onStopResize.call(e.data.target,e); -$(document).unbind(".resizable"); -$("body").css("cursor",""); -return false; -}; -return this.each(function(){ -var _61=null; -var _62=$.data(this,"resizable"); -if(_62){ -$(this).unbind(".resizable"); -_61=$.extend(_62.options,_55||{}); -}else{ -_61=$.extend({},$.fn.resizable.defaults,$.fn.resizable.parseOptions(this),_55||{}); -$.data(this,"resizable",{options:_61}); -} -if(_61.disabled==true){ -return; -} -$(this).bind("mousemove.resizable",{target:this},function(e){ -if(_54){ -return; -} -var dir=_63(e); -if(dir==""){ -$(e.data.target).css("cursor",""); -}else{ -$(e.data.target).css("cursor",dir+"-resize"); -} -}).bind("mouseleave.resizable",{target:this},function(e){ -$(e.data.target).css("cursor",""); -}).bind("mousedown.resizable",{target:this},function(e){ -var dir=_63(e); -if(dir==""){ -return; -} -function _64(css){ -var val=parseInt($(e.data.target).css(css)); -if(isNaN(val)){ -return 0; -}else{ -return val; -} -}; -var _65={target:e.data.target,dir:dir,startLeft:_64("left"),startTop:_64("top"),left:_64("left"),top:_64("top"),startX:e.pageX,startY:e.pageY,startWidth:$(e.data.target).outerWidth(),startHeight:$(e.data.target).outerHeight(),width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),deltaWidth:$(e.data.target).outerWidth()-$(e.data.target).width(),deltaHeight:$(e.data.target).outerHeight()-$(e.data.target).height()}; -$(document).bind("mousedown.resizable",_65,_5e); -$(document).bind("mousemove.resizable",_65,_5f); -$(document).bind("mouseup.resizable",_65,_60); -$("body").css("cursor",dir+"-resize"); -}); -function _63(e){ -var tt=$(e.data.target); -var dir=""; -var _66=tt.offset(); -var _67=tt.outerWidth(); -var _68=tt.outerHeight(); -var _69=_61.edge; -if(e.pageY>_66.top&&e.pageY<_66.top+_69){ -dir+="n"; -}else{ -if(e.pageY<_66.top+_68&&e.pageY>_66.top+_68-_69){ -dir+="s"; -} -} -if(e.pageX>_66.left&&e.pageX<_66.left+_69){ -dir+="w"; -}else{ -if(e.pageX<_66.left+_67&&e.pageX>_66.left+_67-_69){ -dir+="e"; -} -} -var _6a=_61.handles.split(","); -for(var i=0;i<_6a.length;i++){ -var _6b=_6a[i].replace(/(^\s*)|(\s*$)/g,""); -if(_6b=="all"||_6b==dir){ -return dir; -} -} -return ""; -}; -}); -}; -$.fn.resizable.methods={options:function(jq){ -return $.data(jq[0],"resizable").options; -},enable:function(jq){ -return jq.each(function(){ -$(this).resizable({disabled:false}); -}); -},disable:function(jq){ -return jq.each(function(){ -$(this).resizable({disabled:true}); -}); -}}; -$.fn.resizable.parseOptions=function(_6c){ -var t=$(_6c); -return $.extend({},$.parser.parseOptions(_6c,["handles",{minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number",edge:"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.resizable.defaults={disabled:false,handles:"n, e, s, w, ne, se, sw, nw, all",minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000,edge:5,onStartResize:function(e){ -},onResize:function(e){ -},onStopResize:function(e){ -}}; -})(jQuery); -(function($){ -function _6d(_6e){ -var _6f=$.data(_6e,"linkbutton").options; -var t=$(_6e); -t.addClass("l-btn").removeClass("l-btn-plain l-btn-selected l-btn-plain-selected"); -if(_6f.plain){ -t.addClass("l-btn-plain"); -} -if(_6f.selected){ -t.addClass(_6f.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); -} -t.attr("group",_6f.group||""); -t.attr("id",_6f.id||""); -t.html(""+""+""); -if(_6f.text){ -t.find(".l-btn-text").html(_6f.text); -if(_6f.iconCls){ -t.find(".l-btn-text").addClass(_6f.iconCls).addClass(_6f.iconAlign=="left"?"l-btn-icon-left":"l-btn-icon-right"); -} -}else{ -t.find(".l-btn-text").html(" "); -if(_6f.iconCls){ -t.find(".l-btn-empty").addClass(_6f.iconCls); -} -} -t.unbind(".linkbutton").bind("focus.linkbutton",function(){ -if(!_6f.disabled){ -$(this).find(".l-btn-text").addClass("l-btn-focus"); -} -}).bind("blur.linkbutton",function(){ -$(this).find(".l-btn-text").removeClass("l-btn-focus"); -}); -if(_6f.toggle&&!_6f.disabled){ -t.bind("click.linkbutton",function(){ -if(_6f.selected){ -$(this).linkbutton("unselect"); -}else{ -$(this).linkbutton("select"); -} -}); -} -_70(_6e,_6f.selected); -_71(_6e,_6f.disabled); -}; -function _70(_72,_73){ -var _74=$.data(_72,"linkbutton").options; -if(_73){ -if(_74.group){ -$("a.l-btn[group=\""+_74.group+"\"]").each(function(){ -var o=$(this).linkbutton("options"); -if(o.toggle){ -$(this).removeClass("l-btn-selected l-btn-plain-selected"); -o.selected=false; -} -}); -} -$(_72).addClass(_74.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); -_74.selected=true; -}else{ -if(!_74.group){ -$(_72).removeClass("l-btn-selected l-btn-plain-selected"); -_74.selected=false; -} -} -}; -function _71(_75,_76){ -var _77=$.data(_75,"linkbutton"); -var _78=_77.options; -$(_75).removeClass("l-btn-disabled l-btn-plain-disabled"); -if(_76){ -_78.disabled=true; -var _79=$(_75).attr("href"); -if(_79){ -_77.href=_79; -$(_75).attr("href","javascript:void(0)"); -} -if(_75.onclick){ -_77.onclick=_75.onclick; -_75.onclick=null; -} -_78.plain?$(_75).addClass("l-btn-disabled l-btn-plain-disabled"):$(_75).addClass("l-btn-disabled"); -}else{ -_78.disabled=false; -if(_77.href){ -$(_75).attr("href",_77.href); -} -if(_77.onclick){ -_75.onclick=_77.onclick; -} -} -}; -$.fn.linkbutton=function(_7a,_7b){ -if(typeof _7a=="string"){ -return $.fn.linkbutton.methods[_7a](this,_7b); -} -_7a=_7a||{}; -return this.each(function(){ -var _7c=$.data(this,"linkbutton"); -if(_7c){ -$.extend(_7c.options,_7a); -}else{ -$.data(this,"linkbutton",{options:$.extend({},$.fn.linkbutton.defaults,$.fn.linkbutton.parseOptions(this),_7a)}); -$(this).removeAttr("disabled"); -} -_6d(this); -}); -}; -$.fn.linkbutton.methods={options:function(jq){ -return $.data(jq[0],"linkbutton").options; -},enable:function(jq){ -return jq.each(function(){ -_71(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_71(this,true); -}); -},select:function(jq){ -return jq.each(function(){ -_70(this,true); -}); -},unselect:function(jq){ -return jq.each(function(){ -_70(this,false); -}); -}}; -$.fn.linkbutton.parseOptions=function(_7d){ -var t=$(_7d); -return $.extend({},$.parser.parseOptions(_7d,["id","iconCls","iconAlign","group",{plain:"boolean",toggle:"boolean",selected:"boolean"}]),{disabled:(t.attr("disabled")?true:undefined),text:$.trim(t.html()),iconCls:(t.attr("icon")||t.attr("iconCls"))}); -}; -$.fn.linkbutton.defaults={id:null,disabled:false,toggle:false,selected:false,group:null,plain:false,text:"",iconCls:null,iconAlign:"left"}; -})(jQuery); -(function($){ -function _7e(_7f){ -var _80=$.data(_7f,"pagination"); -var _81=_80.options; -var bb=_80.bb={}; -var _82=$(_7f).addClass("pagination").html("
      "); -var tr=_82.find("tr"); -function _83(_84){ -var btn=_81.nav[_84]; -var a=$("").appendTo(tr); -a.wrap(""); -a.linkbutton({iconCls:btn.iconCls,plain:true}).unbind(".pagination").bind("click.pagination",function(){ -btn.handler.call(_7f); -}); -return a; -}; -if(_81.showPageList){ -var ps=$(""); -ps.bind("change",function(){ -_81.pageSize=parseInt($(this).val()); -_81.onChangePageSize.call(_7f,_81.pageSize); -_86(_7f,_81.pageNumber); -}); -for(var i=0;i<_81.pageList.length;i++){ -$("").text(_81.pageList[i]).appendTo(ps); -} -$("").append(ps).appendTo(tr); -$("
      ").appendTo(tr); -} -bb.first=_83("first"); -bb.prev=_83("prev"); -$("
      ").appendTo(tr); -$("").html(_81.beforePageText).appendTo(tr).wrap(""); -bb.num=$("").appendTo(tr).wrap(""); -bb.num.unbind(".pagination").bind("keydown.pagination",function(e){ -if(e.keyCode==13){ -var _85=parseInt($(this).val())||1; -_86(_7f,_85); -return false; -} -}); -bb.after=$("").appendTo(tr).wrap(""); -$("
      ").appendTo(tr); -bb.next=_83("next"); -bb.last=_83("last"); -if(_81.showRefresh){ -$("
      ").appendTo(tr); -bb.refresh=_83("refresh"); -} -if(_81.buttons){ -$("
      ").appendTo(tr); -for(var i=0;i<_81.buttons.length;i++){ -var btn=_81.buttons[i]; -if(btn=="-"){ -$("
      ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var a=$("").appendTo(td); -a[0].onclick=eval(btn.handler||function(){ -}); -a.linkbutton($.extend({},btn,{plain:true})); -} -} -} -$("
      ").appendTo(_82); -$("
      ").appendTo(_82); -}; -function _86(_87,_88){ -var _89=$.data(_87,"pagination").options; -var _8a=Math.ceil(_89.total/_89.pageSize)||1; -_89.pageNumber=_88; -if(_89.pageNumber<1){ -_89.pageNumber=1; -} -if(_89.pageNumber>_8a){ -_89.pageNumber=_8a; -} -_8b(_87,{pageNumber:_89.pageNumber}); -_89.onSelectPage.call(_87,_89.pageNumber,_89.pageSize); -}; -function _8b(_8c,_8d){ -var _8e=$.data(_8c,"pagination").options; -var bb=$.data(_8c,"pagination").bb; -$.extend(_8e,_8d||{}); -var ps=$(_8c).find("select.pagination-page-list"); -if(ps.length){ -ps.val(_8e.pageSize+""); -_8e.pageSize=parseInt(ps.val()); -} -var _8f=Math.ceil(_8e.total/_8e.pageSize)||1; -bb.num.val(_8e.pageNumber); -bb.after.html(_8e.afterPageText.replace(/{pages}/,_8f)); -var _90=_8e.displayMsg; -_90=_90.replace(/{from}/,_8e.total==0?0:_8e.pageSize*(_8e.pageNumber-1)+1); -_90=_90.replace(/{to}/,Math.min(_8e.pageSize*(_8e.pageNumber),_8e.total)); -_90=_90.replace(/{total}/,_8e.total); -$(_8c).find("div.pagination-info").html(_90); -bb.first.add(bb.prev).linkbutton({disabled:(_8e.pageNumber==1)}); -bb.next.add(bb.last).linkbutton({disabled:(_8e.pageNumber==_8f)}); -_91(_8c,_8e.loading); -}; -function _91(_92,_93){ -var _94=$.data(_92,"pagination").options; -var bb=$.data(_92,"pagination").bb; -_94.loading=_93; -if(_94.showRefresh){ -if(_94.loading){ -bb.refresh.linkbutton({iconCls:"pagination-loading"}); -}else{ -bb.refresh.linkbutton({iconCls:"pagination-load"}); -} -} -}; -$.fn.pagination=function(_95,_96){ -if(typeof _95=="string"){ -return $.fn.pagination.methods[_95](this,_96); -} -_95=_95||{}; -return this.each(function(){ -var _97; -var _98=$.data(this,"pagination"); -if(_98){ -_97=$.extend(_98.options,_95); -}else{ -_97=$.extend({},$.fn.pagination.defaults,$.fn.pagination.parseOptions(this),_95); -$.data(this,"pagination",{options:_97}); -} -_7e(this); -_8b(this); -}); -}; -$.fn.pagination.methods={options:function(jq){ -return $.data(jq[0],"pagination").options; -},loading:function(jq){ -return jq.each(function(){ -_91(this,true); -}); -},loaded:function(jq){ -return jq.each(function(){ -_91(this,false); -}); -},refresh:function(jq,_99){ -return jq.each(function(){ -_8b(this,_99); -}); -},select:function(jq,_9a){ -return jq.each(function(){ -_86(this,_9a); -}); -}}; -$.fn.pagination.parseOptions=function(_9b){ -var t=$(_9b); -return $.extend({},$.parser.parseOptions(_9b,[{total:"number",pageSize:"number",pageNumber:"number"},{loading:"boolean",showPageList:"boolean",showRefresh:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined)}); -}; -$.fn.pagination.defaults={total:1,pageSize:10,pageNumber:1,pageList:[10,20,30,50],loading:false,buttons:null,showPageList:true,showRefresh:true,onSelectPage:function(_9c,_9d){ -},onBeforeRefresh:function(_9e,_9f){ -},onRefresh:function(_a0,_a1){ -},onChangePageSize:function(_a2){ -},beforePageText:"Page",afterPageText:"of {pages}",displayMsg:"Displaying {from} to {to} of {total} items",nav:{first:{iconCls:"pagination-first",handler:function(){ -var _a3=$(this).pagination("options"); -if(_a3.pageNumber>1){ -$(this).pagination("select",1); -} -}},prev:{iconCls:"pagination-prev",handler:function(){ -var _a4=$(this).pagination("options"); -if(_a4.pageNumber>1){ -$(this).pagination("select",_a4.pageNumber-1); -} -}},next:{iconCls:"pagination-next",handler:function(){ -var _a5=$(this).pagination("options"); -var _a6=Math.ceil(_a5.total/_a5.pageSize); -if(_a5.pageNumber<_a6){ -$(this).pagination("select",_a5.pageNumber+1); -} -}},last:{iconCls:"pagination-last",handler:function(){ -var _a7=$(this).pagination("options"); -var _a8=Math.ceil(_a7.total/_a7.pageSize); -if(_a7.pageNumber<_a8){ -$(this).pagination("select",_a8); -} -}},refresh:{iconCls:"pagination-refresh",handler:function(){ -var _a9=$(this).pagination("options"); -if(_a9.onBeforeRefresh.call(this,_a9.pageNumber,_a9.pageSize)!=false){ -$(this).pagination("select",_a9.pageNumber); -_a9.onRefresh.call(this,_a9.pageNumber,_a9.pageSize); -} -}}}}; -})(jQuery); -(function($){ -function _aa(_ab){ -var _ac=$(_ab); -_ac.addClass("tree"); -return _ac; -}; -function _ad(_ae){ -var _af=[]; -_b0(_af,$(_ae)); -function _b0(aa,_b1){ -_b1.children("li").each(function(){ -var _b2=$(this); -var _b3=$.extend({},$.parser.parseOptions(this,["id","iconCls","state"]),{checked:(_b2.attr("checked")?true:undefined)}); -_b3.text=_b2.children("span").html(); -if(!_b3.text){ -_b3.text=_b2.html(); -} -var _b4=_b2.children("ul"); -if(_b4.length){ -_b3.children=[]; -_b0(_b3.children,_b4); -} -aa.push(_b3); -}); -}; -return _af; -}; -function _b5(_b6){ -var _b7=$.data(_b6,"tree").options; -$(_b6).unbind().bind("mouseover",function(e){ -var tt=$(e.target); -var _b8=tt.closest("div.tree-node"); -if(!_b8.length){ -return; -} -_b8.addClass("tree-node-hover"); -if(tt.hasClass("tree-hit")){ -if(tt.hasClass("tree-expanded")){ -tt.addClass("tree-expanded-hover"); -}else{ -tt.addClass("tree-collapsed-hover"); -} -} -e.stopPropagation(); -}).bind("mouseout",function(e){ -var tt=$(e.target); -var _b9=tt.closest("div.tree-node"); -if(!_b9.length){ -return; -} -_b9.removeClass("tree-node-hover"); -if(tt.hasClass("tree-hit")){ -if(tt.hasClass("tree-expanded")){ -tt.removeClass("tree-expanded-hover"); -}else{ -tt.removeClass("tree-collapsed-hover"); -} -} -e.stopPropagation(); -}).bind("click",function(e){ -var tt=$(e.target); -var _ba=tt.closest("div.tree-node"); -if(!_ba.length){ -return; -} -if(tt.hasClass("tree-hit")){ -_11f(_b6,_ba[0]); -return false; -}else{ -if(tt.hasClass("tree-checkbox")){ -_e2(_b6,_ba[0],!tt.hasClass("tree-checkbox1")); -return false; -}else{ -_15d(_b6,_ba[0]); -_b7.onClick.call(_b6,_bd(_b6,_ba[0])); -} -} -e.stopPropagation(); -}).bind("dblclick",function(e){ -var _bb=$(e.target).closest("div.tree-node"); -if(!_bb.length){ -return; -} -_15d(_b6,_bb[0]); -_b7.onDblClick.call(_b6,_bd(_b6,_bb[0])); -e.stopPropagation(); -}).bind("contextmenu",function(e){ -var _bc=$(e.target).closest("div.tree-node"); -if(!_bc.length){ -return; -} -_b7.onContextMenu.call(_b6,e,_bd(_b6,_bc[0])); -e.stopPropagation(); -}); -}; -function _be(_bf){ -var _c0=$(_bf).find("div.tree-node"); -_c0.draggable("disable"); -_c0.css("cursor","pointer"); -}; -function _c1(_c2){ -var _c3=$.data(_c2,"tree"); -var _c4=_c3.options; -var _c5=_c3.tree; -_c3.disabledNodes=[]; -_c5.find("div.tree-node").draggable({disabled:false,revert:true,cursor:"pointer",proxy:function(_c6){ -var p=$("
      ").appendTo("body"); -p.html(" "+$(_c6).find(".tree-title").html()); -p.hide(); -return p; -},deltaX:15,deltaY:15,onBeforeDrag:function(e){ -if(_c4.onBeforeDrag.call(_c2,_bd(_c2,this))==false){ -return false; -} -if($(e.target).hasClass("tree-hit")||$(e.target).hasClass("tree-checkbox")){ -return false; -} -if(e.which!=1){ -return false; -} -$(this).next("ul").find("div.tree-node").droppable({accept:"no-accept"}); -var _c7=$(this).find("span.tree-indent"); -if(_c7.length){ -e.data.offsetWidth-=_c7.length*_c7.width(); -} -},onStartDrag:function(){ -$(this).draggable("proxy").css({left:-10000,top:-10000}); -_c4.onStartDrag.call(_c2,_bd(_c2,this)); -var _c8=_bd(_c2,this); -if(_c8.id==undefined){ -_c8.id="easyui_tree_node_id_temp"; -_155(_c2,_c8); -} -_c3.draggingNodeId=_c8.id; -},onDrag:function(e){ -var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY; -var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); -if(d>3){ -$(this).draggable("proxy").show(); -} -this.pageY=e.pageY; -},onStopDrag:function(){ -$(this).next("ul").find("div.tree-node").droppable({accept:"div.tree-node"}); -for(var i=0;i<_c3.disabledNodes.length;i++){ -$(_c3.disabledNodes[i]).droppable("enable"); -} -_c3.disabledNodes=[]; -var _c9=_15b(_c2,_c3.draggingNodeId); -if(_c9&&_c9.id=="easyui_tree_node_id_temp"){ -_c9.id=""; -_155(_c2,_c9); -} -_c4.onStopDrag.call(_c2,_c9); -}}).droppable({accept:"div.tree-node",onDragEnter:function(e,_ca){ -if(_c4.onDragEnter.call(_c2,this,_bd(_c2,_ca))==false){ -_cb(_ca,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -$(this).droppable("disable"); -_c3.disabledNodes.push(this); -} -},onDragOver:function(e,_cc){ -if($(this).droppable("options").disabled){ -return; -} -var _cd=_cc.pageY; -var top=$(this).offset().top; -var _ce=top+$(this).outerHeight(); -_cb(_cc,true); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -if(_cd>top+(_ce-top)/2){ -if(_ce-_cd<5){ -$(this).addClass("tree-node-bottom"); -}else{ -$(this).addClass("tree-node-append"); -} -}else{ -if(_cd-top<5){ -$(this).addClass("tree-node-top"); -}else{ -$(this).addClass("tree-node-append"); -} -} -if(_c4.onDragOver.call(_c2,this,_bd(_c2,_cc))==false){ -_cb(_cc,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -$(this).droppable("disable"); -_c3.disabledNodes.push(this); -} -},onDragLeave:function(e,_cf){ -_cb(_cf,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -_c4.onDragLeave.call(_c2,this,_bd(_c2,_cf)); -},onDrop:function(e,_d0){ -var _d1=this; -var _d2,_d3; -if($(this).hasClass("tree-node-append")){ -_d2=_d4; -}else{ -_d2=_d5; -_d3=$(this).hasClass("tree-node-top")?"top":"bottom"; -} -if(_c4.onBeforeDrop.call(_c2,_d1,_14f(_c2,_d0),_d3)==false){ -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -return; -} -_d2(_d0,_d1,_d3); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -}}); -function _cb(_d6,_d7){ -var _d8=$(_d6).draggable("proxy").find("span.tree-dnd-icon"); -_d8.removeClass("tree-dnd-yes tree-dnd-no").addClass(_d7?"tree-dnd-yes":"tree-dnd-no"); -}; -function _d4(_d9,_da){ -if(_bd(_c2,_da).state=="closed"){ -_117(_c2,_da,function(){ -_db(); -}); -}else{ -_db(); -} -function _db(){ -var _dc=$(_c2).tree("pop",_d9); -$(_c2).tree("append",{parent:_da,data:[_dc]}); -_c4.onDrop.call(_c2,_da,_dc,"append"); -}; -}; -function _d5(_dd,_de,_df){ -var _e0={}; -if(_df=="top"){ -_e0.before=_de; -}else{ -_e0.after=_de; -} -var _e1=$(_c2).tree("pop",_dd); -_e0.data=_e1; -$(_c2).tree("insert",_e0); -_c4.onDrop.call(_c2,_de,_e1,_df); -}; -}; -function _e2(_e3,_e4,_e5){ -var _e6=$.data(_e3,"tree").options; -if(!_e6.checkbox){ -return; -} -var _e7=_bd(_e3,_e4); -if(_e6.onBeforeCheck.call(_e3,_e7,_e5)==false){ -return; -} -var _e8=$(_e4); -var ck=_e8.find(".tree-checkbox"); -ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); -if(_e5){ -ck.addClass("tree-checkbox1"); -}else{ -ck.addClass("tree-checkbox0"); -} -if(_e6.cascadeCheck){ -_e9(_e8); -_ea(_e8); -} -_e6.onCheck.call(_e3,_e7,_e5); -function _ea(_eb){ -var _ec=_eb.next().find(".tree-checkbox"); -_ec.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); -if(_eb.find(".tree-checkbox").hasClass("tree-checkbox1")){ -_ec.addClass("tree-checkbox1"); -}else{ -_ec.addClass("tree-checkbox0"); -} -}; -function _e9(_ed){ -var _ee=_12a(_e3,_ed[0]); -if(_ee){ -var ck=$(_ee.target).find(".tree-checkbox"); -ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); -if(_ef(_ed)){ -ck.addClass("tree-checkbox1"); -}else{ -if(_f0(_ed)){ -ck.addClass("tree-checkbox0"); -}else{ -ck.addClass("tree-checkbox2"); -} -} -_e9($(_ee.target)); -} -function _ef(n){ -var ck=n.find(".tree-checkbox"); -if(ck.hasClass("tree-checkbox0")||ck.hasClass("tree-checkbox2")){ -return false; -} -var b=true; -n.parent().siblings().each(function(){ -if(!$(this).children("div.tree-node").children(".tree-checkbox").hasClass("tree-checkbox1")){ -b=false; -} -}); -return b; -}; -function _f0(n){ -var ck=n.find(".tree-checkbox"); -if(ck.hasClass("tree-checkbox1")||ck.hasClass("tree-checkbox2")){ -return false; -} -var b=true; -n.parent().siblings().each(function(){ -if(!$(this).children("div.tree-node").children(".tree-checkbox").hasClass("tree-checkbox0")){ -b=false; -} -}); -return b; -}; -}; -}; -function _f1(_f2,_f3){ -var _f4=$.data(_f2,"tree").options; -var _f5=$(_f3); -if(_f6(_f2,_f3)){ -var ck=_f5.find(".tree-checkbox"); -if(ck.length){ -if(ck.hasClass("tree-checkbox1")){ -_e2(_f2,_f3,true); -}else{ -_e2(_f2,_f3,false); -} -}else{ -if(_f4.onlyLeafCheck){ -$("").insertBefore(_f5.find(".tree-title")); -} -} -}else{ -var ck=_f5.find(".tree-checkbox"); -if(_f4.onlyLeafCheck){ -ck.remove(); -}else{ -if(ck.hasClass("tree-checkbox1")){ -_e2(_f2,_f3,true); -}else{ -if(ck.hasClass("tree-checkbox2")){ -var _f7=true; -var _f8=true; -var _f9=_fa(_f2,_f3); -for(var i=0;i<_f9.length;i++){ -if(_f9[i].checked){ -_f8=false; -}else{ -_f7=false; -} -} -if(_f7){ -_e2(_f2,_f3,true); -} -if(_f8){ -_e2(_f2,_f3,false); -} -} -} -} -} -}; -function _fb(_fc,ul,_fd,_fe){ -var _ff=$.data(_fc,"tree").options; -_fd=_ff.loadFilter.call(_fc,_fd,$(ul).prev("div.tree-node")[0]); -if(!_fe){ -$(ul).empty(); -} -var _100=[]; -var _101=$(ul).prev("div.tree-node").find("span.tree-indent, span.tree-hit").length; -_102(ul,_fd,_101); -if(_ff.dnd){ -_c1(_fc); -}else{ -_be(_fc); -} -for(var i=0;i<_100.length;i++){ -_e2(_fc,_100[i],true); -} -setTimeout(function(){ -_107(_fc,_fc); -},0); -var _103=null; -if(_fc!=ul){ -var node=$(ul).prev(); -_103=_bd(_fc,node[0]); -} -_ff.onLoadSuccess.call(_fc,_103,_fd); -function _102(ul,_104,_105){ -for(var i=0;i<_104.length;i++){ -var li=$("
    • ").appendTo(ul); -var item=_104[i]; -if(item.state!="open"&&item.state!="closed"){ -item.state="open"; -} -var node=$("
      ").appendTo(li); -node.attr("node-id",item.id); -$.data(node[0],"tree-node",{id:item.id,text:item.text,iconCls:item.iconCls,attributes:item.attributes}); -$("").html(_ff.formatter.call(_fc,item)).appendTo(node); -if(_ff.checkbox){ -if(_ff.onlyLeafCheck){ -if(item.state=="open"&&(!item.children||!item.children.length)){ -if(item.checked){ -$("").prependTo(node); -}else{ -$("").prependTo(node); -} -} -}else{ -if(item.checked){ -$("").prependTo(node); -_100.push(node[0]); -}else{ -$("").prependTo(node); -} -} -} -if(item.children&&item.children.length){ -var _106=$("
        ").appendTo(li); -if(item.state=="open"){ -$("").addClass(item.iconCls).prependTo(node); -$("").prependTo(node); -}else{ -$("").addClass(item.iconCls).prependTo(node); -$("").prependTo(node); -_106.css("display","none"); -} -_102(_106,item.children,_105+1); -}else{ -if(item.state=="closed"){ -$("").addClass(item.iconCls).prependTo(node); -$("").prependTo(node); -}else{ -$("").addClass(item.iconCls).prependTo(node); -$("").prependTo(node); -} -} -for(var j=0;j<_105;j++){ -$("").prependTo(node); -} -} -}; -}; -function _107(_108,ul,_109){ -var opts=$.data(_108,"tree").options; -if(!opts.lines){ -return; -} -if(!_109){ -_109=true; -$(_108).find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); -$(_108).find("div.tree-node").removeClass("tree-node-last tree-root-first tree-root-one"); -var _10a=$(_108).tree("getRoots"); -if(_10a.length>1){ -$(_10a[0].target).addClass("tree-root-first"); -}else{ -if(_10a.length==1){ -$(_10a[0].target).addClass("tree-root-one"); -} -} -} -$(ul).children("li").each(function(){ -var node=$(this).children("div.tree-node"); -var ul=node.next("ul"); -if(ul.length){ -if($(this).next().length){ -_10b(node); -} -_107(_108,ul,_109); -}else{ -_10c(node); -} -}); -var _10d=$(ul).children("li:last").children("div.tree-node").addClass("tree-node-last"); -_10d.children("span.tree-join").removeClass("tree-join").addClass("tree-joinbottom"); -function _10c(node,_10e){ -var icon=node.find("span.tree-icon"); -icon.prev("span.tree-indent").addClass("tree-join"); -}; -function _10b(node){ -var _10f=node.find("span.tree-indent, span.tree-hit").length; -node.next().find("div.tree-node").each(function(){ -$(this).children("span:eq("+(_10f-1)+")").addClass("tree-line"); -}); -}; -}; -function _110(_111,ul,_112,_113){ -var opts=$.data(_111,"tree").options; -_112=_112||{}; -var _114=null; -if(_111!=ul){ -var node=$(ul).prev(); -_114=_bd(_111,node[0]); -} -if(opts.onBeforeLoad.call(_111,_114,_112)==false){ -return; -} -var _115=$(ul).prev().children("span.tree-folder"); -_115.addClass("tree-loading"); -var _116=opts.loader.call(_111,_112,function(data){ -_115.removeClass("tree-loading"); -_fb(_111,ul,data); -if(_113){ -_113(); -} -},function(){ -_115.removeClass("tree-loading"); -opts.onLoadError.apply(_111,arguments); -if(_113){ -_113(); -} -}); -if(_116==false){ -_115.removeClass("tree-loading"); -} -}; -function _117(_118,_119,_11a){ -var opts=$.data(_118,"tree").options; -var hit=$(_119).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -return; -} -var node=_bd(_118,_119); -if(opts.onBeforeExpand.call(_118,node)==false){ -return; -} -hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); -hit.next().addClass("tree-folder-open"); -var ul=$(_119).next(); -if(ul.length){ -if(opts.animate){ -ul.slideDown("normal",function(){ -opts.onExpand.call(_118,node); -if(_11a){ -_11a(); -} -}); -}else{ -ul.css("display","block"); -opts.onExpand.call(_118,node); -if(_11a){ -_11a(); -} -} -}else{ -var _11b=$("
          ").insertAfter(_119); -_110(_118,_11b[0],{id:node.id},function(){ -if(_11b.is(":empty")){ -_11b.remove(); -} -if(opts.animate){ -_11b.slideDown("normal",function(){ -opts.onExpand.call(_118,node); -if(_11a){ -_11a(); -} -}); -}else{ -_11b.css("display","block"); -opts.onExpand.call(_118,node); -if(_11a){ -_11a(); -} -} -}); -} -}; -function _11c(_11d,_11e){ -var opts=$.data(_11d,"tree").options; -var hit=$(_11e).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-collapsed")){ -return; -} -var node=_bd(_11d,_11e); -if(opts.onBeforeCollapse.call(_11d,node)==false){ -return; -} -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -hit.next().removeClass("tree-folder-open"); -var ul=$(_11e).next(); -if(opts.animate){ -ul.slideUp("normal",function(){ -opts.onCollapse.call(_11d,node); -}); -}else{ -ul.css("display","none"); -opts.onCollapse.call(_11d,node); -} -}; -function _11f(_120,_121){ -var hit=$(_121).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -_11c(_120,_121); -}else{ -_117(_120,_121); -} -}; -function _122(_123,_124){ -var _125=_fa(_123,_124); -if(_124){ -_125.unshift(_bd(_123,_124)); -} -for(var i=0;i<_125.length;i++){ -_117(_123,_125[i].target); -} -}; -function _126(_127,_128){ -var _129=[]; -var p=_12a(_127,_128); -while(p){ -_129.unshift(p); -p=_12a(_127,p.target); -} -for(var i=0;i<_129.length;i++){ -_117(_127,_129[i].target); -} -}; -function _12b(_12c,_12d){ -var _12e=_fa(_12c,_12d); -if(_12d){ -_12e.unshift(_bd(_12c,_12d)); -} -for(var i=0;i<_12e.length;i++){ -_11c(_12c,_12e[i].target); -} -}; -function _12f(_130){ -var _131=_132(_130); -if(_131.length){ -return _131[0]; -}else{ -return null; -} -}; -function _132(_133){ -var _134=[]; -$(_133).children("li").each(function(){ -var node=$(this).children("div.tree-node"); -_134.push(_bd(_133,node[0])); -}); -return _134; -}; -function _fa(_135,_136){ -var _137=[]; -if(_136){ -_138($(_136)); -}else{ -var _139=_132(_135); -for(var i=0;i<_139.length;i++){ -_137.push(_139[i]); -_138($(_139[i].target)); -} -} -function _138(node){ -node.next().find("div.tree-node").each(function(){ -_137.push(_bd(_135,this)); -}); -}; -return _137; -}; -function _12a(_13a,_13b){ -var ul=$(_13b).parent().parent(); -if(ul[0]==_13a){ -return null; -}else{ -return _bd(_13a,ul.prev()[0]); -} -}; -function _13c(_13d,_13e){ -_13e=_13e||"checked"; -var _13f=""; -if(_13e=="checked"){ -_13f="span.tree-checkbox1"; -}else{ -if(_13e=="unchecked"){ -_13f="span.tree-checkbox0"; -}else{ -if(_13e=="indeterminate"){ -_13f="span.tree-checkbox2"; -} -} -} -var _140=[]; -$(_13d).find(_13f).each(function(){ -var node=$(this).parent(); -_140.push(_bd(_13d,node[0])); -}); -return _140; -}; -function _141(_142){ -var node=$(_142).find("div.tree-node-selected"); -if(node.length){ -return _bd(_142,node[0]); -}else{ -return null; -} -}; -function _143(_144,_145){ -var node=$(_145.parent); -var ul; -if(node.length==0){ -ul=$(_144); -}else{ -ul=node.next(); -if(ul.length==0){ -ul=$("
            ").insertAfter(node); -} -} -if(_145.data&&_145.data.length){ -var _146=node.find("span.tree-icon"); -if(_146.hasClass("tree-file")){ -_146.removeClass("tree-file").addClass("tree-folder tree-folder-open"); -var hit=$("").insertBefore(_146); -if(hit.prev().length){ -hit.prev().remove(); -} -} -} -_fb(_144,ul[0],_145.data,true); -_f1(_144,ul.prev()); -}; -function _147(_148,_149){ -var ref=_149.before||_149.after; -var _14a=_12a(_148,ref); -var li; -if(_14a){ -_143(_148,{parent:_14a.target,data:[_149.data]}); -li=$(_14a.target).next().children("li:last"); -}else{ -_143(_148,{parent:null,data:[_149.data]}); -li=$(_148).children("li:last"); -} -if(_149.before){ -li.insertBefore($(ref).parent()); -}else{ -li.insertAfter($(ref).parent()); -} -}; -function _14b(_14c,_14d){ -var _14e=_12a(_14c,_14d); -var node=$(_14d); -var li=node.parent(); -var ul=li.parent(); -li.remove(); -if(ul.children("li").length==0){ -var node=ul.prev(); -node.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); -node.find(".tree-hit").remove(); -$("").prependTo(node); -if(ul[0]!=_14c){ -ul.remove(); -} -} -if(_14e){ -_f1(_14c,_14e.target); -} -_107(_14c,_14c); -}; -function _14f(_150,_151){ -function _152(aa,ul){ -ul.children("li").each(function(){ -var node=$(this).children("div.tree-node"); -var _153=_bd(_150,node[0]); -var sub=$(this).children("ul"); -if(sub.length){ -_153.children=[]; -_152(_153.children,sub); -} -aa.push(_153); -}); -}; -if(_151){ -var _154=_bd(_150,_151); -_154.children=[]; -_152(_154.children,$(_151).next()); -return _154; -}else{ -return null; -} -}; -function _155(_156,_157){ -var opts=$.data(_156,"tree").options; -var node=$(_157.target); -var _158=_bd(_156,_157.target); -if(_158.iconCls){ -node.find(".tree-icon").removeClass(_158.iconCls); -} -var data=$.extend({},_158,_157); -$.data(_157.target,"tree-node",data); -node.attr("node-id",data.id); -node.find(".tree-title").html(opts.formatter.call(_156,data)); -if(data.iconCls){ -node.find(".tree-icon").addClass(data.iconCls); -} -if(_158.checked!=data.checked){ -_e2(_156,_157.target,data.checked); -} -}; -function _bd(_159,_15a){ -var node=$.extend({},$.data(_15a,"tree-node"),{target:_15a,checked:$(_15a).find(".tree-checkbox").hasClass("tree-checkbox1")}); -if(!_f6(_159,_15a)){ -node.state=$(_15a).find(".tree-hit").hasClass("tree-expanded")?"open":"closed"; -} -return node; -}; -function _15b(_15c,id){ -var node=$(_15c).find("div.tree-node[node-id="+id+"]"); -if(node.length){ -return _bd(_15c,node[0]); -}else{ -return null; -} -}; -function _15d(_15e,_15f){ -var opts=$.data(_15e,"tree").options; -var node=_bd(_15e,_15f); -if(opts.onBeforeSelect.call(_15e,node)==false){ -return; -} -$("div.tree-node-selected",_15e).removeClass("tree-node-selected"); -$(_15f).addClass("tree-node-selected"); -opts.onSelect.call(_15e,node); -}; -function _f6(_160,_161){ -var node=$(_161); -var hit=node.children("span.tree-hit"); -return hit.length==0; -}; -function _162(_163,_164){ -var opts=$.data(_163,"tree").options; -var node=_bd(_163,_164); -if(opts.onBeforeEdit.call(_163,node)==false){ -return; -} -$(_164).css("position","relative"); -var nt=$(_164).find(".tree-title"); -var _165=nt.outerWidth(); -nt.empty(); -var _166=$("").appendTo(nt); -_166.val(node.text).focus(); -_166.width(_165+20); -_166.height(document.compatMode=="CSS1Compat"?(18-(_166.outerHeight()-_166.height())):18); -_166.bind("click",function(e){ -return false; -}).bind("mousedown",function(e){ -e.stopPropagation(); -}).bind("mousemove",function(e){ -e.stopPropagation(); -}).bind("keydown",function(e){ -if(e.keyCode==13){ -_167(_163,_164); -return false; -}else{ -if(e.keyCode==27){ -_16b(_163,_164); -return false; -} -} -}).bind("blur",function(e){ -e.stopPropagation(); -_167(_163,_164); -}); -}; -function _167(_168,_169){ -var opts=$.data(_168,"tree").options; -$(_169).css("position",""); -var _16a=$(_169).find("input.tree-editor"); -var val=_16a.val(); -_16a.remove(); -var node=_bd(_168,_169); -node.text=val; -_155(_168,node); -opts.onAfterEdit.call(_168,node); -}; -function _16b(_16c,_16d){ -var opts=$.data(_16c,"tree").options; -$(_16d).css("position",""); -$(_16d).find("input.tree-editor").remove(); -var node=_bd(_16c,_16d); -_155(_16c,node); -opts.onCancelEdit.call(_16c,node); -}; -$.fn.tree=function(_16e,_16f){ -if(typeof _16e=="string"){ -return $.fn.tree.methods[_16e](this,_16f); -} -var _16e=_16e||{}; -return this.each(function(){ -var _170=$.data(this,"tree"); -var opts; -if(_170){ -opts=$.extend(_170.options,_16e); -_170.options=opts; -}else{ -opts=$.extend({},$.fn.tree.defaults,$.fn.tree.parseOptions(this),_16e); -$.data(this,"tree",{options:opts,tree:_aa(this)}); -var data=_ad(this); -if(data.length&&!opts.data){ -opts.data=data; -} -} -_b5(this); -if(opts.lines){ -$(this).addClass("tree-lines"); -} -if(opts.data){ -_fb(this,this,opts.data); -}else{ -if(opts.dnd){ -_c1(this); -}else{ -_be(this); -} -} -_110(this,this); -}); -}; -$.fn.tree.methods={options:function(jq){ -return $.data(jq[0],"tree").options; -},loadData:function(jq,data){ -return jq.each(function(){ -_fb(this,this,data); -}); -},getNode:function(jq,_171){ -return _bd(jq[0],_171); -},getData:function(jq,_172){ -return _14f(jq[0],_172); -},reload:function(jq,_173){ -return jq.each(function(){ -if(_173){ -var node=$(_173); -var hit=node.children("span.tree-hit"); -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -node.next().remove(); -_117(this,_173); -}else{ -$(this).empty(); -_110(this,this); -} -}); -},getRoot:function(jq){ -return _12f(jq[0]); -},getRoots:function(jq){ -return _132(jq[0]); -},getParent:function(jq,_174){ -return _12a(jq[0],_174); -},getChildren:function(jq,_175){ -return _fa(jq[0],_175); -},getChecked:function(jq,_176){ -return _13c(jq[0],_176); -},getSelected:function(jq){ -return _141(jq[0]); -},isLeaf:function(jq,_177){ -return _f6(jq[0],_177); -},find:function(jq,id){ -return _15b(jq[0],id); -},select:function(jq,_178){ -return jq.each(function(){ -_15d(this,_178); -}); -},check:function(jq,_179){ -return jq.each(function(){ -_e2(this,_179,true); -}); -},uncheck:function(jq,_17a){ -return jq.each(function(){ -_e2(this,_17a,false); -}); -},collapse:function(jq,_17b){ -return jq.each(function(){ -_11c(this,_17b); -}); -},expand:function(jq,_17c){ -return jq.each(function(){ -_117(this,_17c); -}); -},collapseAll:function(jq,_17d){ -return jq.each(function(){ -_12b(this,_17d); -}); -},expandAll:function(jq,_17e){ -return jq.each(function(){ -_122(this,_17e); -}); -},expandTo:function(jq,_17f){ -return jq.each(function(){ -_126(this,_17f); -}); -},toggle:function(jq,_180){ -return jq.each(function(){ -_11f(this,_180); -}); -},append:function(jq,_181){ -return jq.each(function(){ -_143(this,_181); -}); -},insert:function(jq,_182){ -return jq.each(function(){ -_147(this,_182); -}); -},remove:function(jq,_183){ -return jq.each(function(){ -_14b(this,_183); -}); -},pop:function(jq,_184){ -var node=jq.tree("getData",_184); -jq.tree("remove",_184); -return node; -},update:function(jq,_185){ -return jq.each(function(){ -_155(this,_185); -}); -},enableDnd:function(jq){ -return jq.each(function(){ -_c1(this); -}); -},disableDnd:function(jq){ -return jq.each(function(){ -_be(this); -}); -},beginEdit:function(jq,_186){ -return jq.each(function(){ -_162(this,_186); -}); -},endEdit:function(jq,_187){ -return jq.each(function(){ -_167(this,_187); -}); -},cancelEdit:function(jq,_188){ -return jq.each(function(){ -_16b(this,_188); -}); -}}; -$.fn.tree.parseOptions=function(_189){ -var t=$(_189); -return $.extend({},$.parser.parseOptions(_189,["url","method",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean",lines:"boolean",dnd:"boolean"}])); -}; -$.fn.tree.defaults={url:null,method:"post",animate:false,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,dnd:false,data:null,formatter:function(node){ -return node.text; -},loader:function(_18a,_18b,_18c){ -var opts=$(this).tree("options"); -if(!opts.url){ -return false; -} -$.ajax({type:opts.method,url:opts.url,data:_18a,dataType:"json",success:function(data){ -_18b(data); -},error:function(){ -_18c.apply(this,arguments); -}}); -},loadFilter:function(data,_18d){ -return data; -},onBeforeLoad:function(node,_18e){ -},onLoadSuccess:function(node,data){ -},onLoadError:function(){ -},onClick:function(node){ -},onDblClick:function(node){ -},onBeforeExpand:function(node){ -},onExpand:function(node){ -},onBeforeCollapse:function(node){ -},onCollapse:function(node){ -},onBeforeCheck:function(node,_18f){ -},onCheck:function(node,_190){ -},onBeforeSelect:function(node){ -},onSelect:function(node){ -},onContextMenu:function(e,node){ -},onBeforeDrag:function(node){ -},onStartDrag:function(node){ -},onStopDrag:function(node){ -},onDragEnter:function(_191,_192){ -},onDragOver:function(_193,_194){ -},onDragLeave:function(_195,_196){ -},onBeforeDrop:function(_197,_198,_199){ -},onDrop:function(_19a,_19b,_19c){ -},onBeforeEdit:function(node){ -},onAfterEdit:function(node){ -},onCancelEdit:function(node){ -}}; -})(jQuery); -(function($){ -function init(_19d){ -$(_19d).addClass("progressbar"); -$(_19d).html("
            "); -return $(_19d); -}; -function _19e(_19f,_1a0){ -var opts=$.data(_19f,"progressbar").options; -var bar=$.data(_19f,"progressbar").bar; -if(_1a0){ -opts.width=_1a0; -} -bar._outerWidth(opts.width)._outerHeight(opts.height); -bar.find("div.progressbar-text").width(bar.width()); -bar.find("div.progressbar-text,div.progressbar-value").css({height:bar.height()+"px",lineHeight:bar.height()+"px"}); -}; -$.fn.progressbar=function(_1a1,_1a2){ -if(typeof _1a1=="string"){ -var _1a3=$.fn.progressbar.methods[_1a1]; -if(_1a3){ -return _1a3(this,_1a2); -} -} -_1a1=_1a1||{}; -return this.each(function(){ -var _1a4=$.data(this,"progressbar"); -if(_1a4){ -$.extend(_1a4.options,_1a1); -}else{ -_1a4=$.data(this,"progressbar",{options:$.extend({},$.fn.progressbar.defaults,$.fn.progressbar.parseOptions(this),_1a1),bar:init(this)}); -} -$(this).progressbar("setValue",_1a4.options.value); -_19e(this); -}); -}; -$.fn.progressbar.methods={options:function(jq){ -return $.data(jq[0],"progressbar").options; -},resize:function(jq,_1a5){ -return jq.each(function(){ -_19e(this,_1a5); -}); -},getValue:function(jq){ -return $.data(jq[0],"progressbar").options.value; -},setValue:function(jq,_1a6){ -if(_1a6<0){ -_1a6=0; -} -if(_1a6>100){ -_1a6=100; -} -return jq.each(function(){ -var opts=$.data(this,"progressbar").options; -var text=opts.text.replace(/{value}/,_1a6); -var _1a7=opts.value; -opts.value=_1a6; -$(this).find("div.progressbar-value").width(_1a6+"%"); -$(this).find("div.progressbar-text").html(text); -if(_1a7!=_1a6){ -opts.onChange.call(this,_1a6,_1a7); -} -}); -}}; -$.fn.progressbar.parseOptions=function(_1a8){ -return $.extend({},$.parser.parseOptions(_1a8,["width","height","text",{value:"number"}])); -}; -$.fn.progressbar.defaults={width:"auto",height:22,value:0,text:"{value}%",onChange:function(_1a9,_1aa){ -}}; -})(jQuery); -(function($){ -function init(_1ab){ -$(_1ab).addClass("tooltip-f"); -}; -function _1ac(_1ad){ -var opts=$.data(_1ad,"tooltip").options; -$(_1ad).unbind(".tooltip").bind(opts.showEvent+".tooltip",function(e){ -_1b4(_1ad,e); -}).bind(opts.hideEvent+".tooltip",function(e){ -_1ba(_1ad,e); -}).bind("mousemove.tooltip",function(e){ -if(opts.trackMouse){ -opts.trackMouseX=e.pageX; -opts.trackMouseY=e.pageY; -_1ae(_1ad); -} -}); -}; -function _1af(_1b0){ -var _1b1=$.data(_1b0,"tooltip"); -if(_1b1.showTimer){ -clearTimeout(_1b1.showTimer); -_1b1.showTimer=null; -} -if(_1b1.hideTimer){ -clearTimeout(_1b1.hideTimer); -_1b1.hideTimer=null; -} -}; -function _1ae(_1b2){ -var _1b3=$.data(_1b2,"tooltip"); -if(!_1b3||!_1b3.tip){ -return; -} -var opts=_1b3.options; -var tip=_1b3.tip; -if(opts.trackMouse){ -t=$(); -var left=opts.trackMouseX+opts.deltaX; -var top=opts.trackMouseY+opts.deltaY; -}else{ -var t=$(_1b2); -var left=t.offset().left+opts.deltaX; -var top=t.offset().top+opts.deltaY; -} -switch(opts.position){ -case "right": -left+=t._outerWidth()+12+(opts.trackMouse?12:0); -top-=(tip._outerHeight()-t._outerHeight())/2; -break; -case "left": -left-=tip._outerWidth()+12+(opts.trackMouse?12:0); -top-=(tip._outerHeight()-t._outerHeight())/2; -break; -case "top": -left-=(tip._outerWidth()-t._outerWidth())/2; -top-=tip._outerHeight()+12+(opts.trackMouse?12:0); -break; -case "bottom": -left-=(tip._outerWidth()-t._outerWidth())/2; -top+=t._outerHeight()+12+(opts.trackMouse?12:0); -break; -} -tip.css({left:left,top:top,zIndex:(opts.zIndex!=undefined?opts.zIndex:($.fn.window?$.fn.window.defaults.zIndex++:""))}); -opts.onPosition.call(_1b2,left,top); -}; -function _1b4(_1b5,e){ -var _1b6=$.data(_1b5,"tooltip"); -var opts=_1b6.options; -var tip=_1b6.tip; -if(!tip){ -tip=$("
            "+"
            "+"
            "+"
            "+"
            ").appendTo("body"); -_1b6.tip=tip; -_1b7(_1b5); -} -tip.removeClass("tooltip-top tooltip-bottom tooltip-left tooltip-right").addClass("tooltip-"+opts.position); -_1af(_1b5); -_1b6.showTimer=setTimeout(function(){ -_1ae(_1b5); -tip.show(); -opts.onShow.call(_1b5,e); -var _1b8=tip.children(".tooltip-arrow-outer"); -var _1b9=tip.children(".tooltip-arrow"); -var bc="border-"+opts.position+"-color"; -_1b8.add(_1b9).css({borderTopColor:"",borderBottomColor:"",borderLeftColor:"",borderRightColor:""}); -_1b8.css(bc,tip.css(bc)); -_1b9.css(bc,tip.css("backgroundColor")); -},opts.showDelay); -}; -function _1ba(_1bb,e){ -var _1bc=$.data(_1bb,"tooltip"); -if(_1bc&&_1bc.tip){ -_1af(_1bb); -_1bc.hideTimer=setTimeout(function(){ -_1bc.tip.hide(); -_1bc.options.onHide.call(_1bb,e); -},_1bc.options.hideDelay); -} -}; -function _1b7(_1bd,_1be){ -var _1bf=$.data(_1bd,"tooltip"); -var opts=_1bf.options; -if(_1be){ -opts.content=_1be; -} -if(!_1bf.tip){ -return; -} -var cc=typeof opts.content=="function"?opts.content.call(_1bd):opts.content; -_1bf.tip.children(".tooltip-content").html(cc); -opts.onUpdate.call(_1bd,cc); -}; -function _1c0(_1c1){ -var _1c2=$.data(_1c1,"tooltip"); -if(_1c2){ -_1af(_1c1); -var opts=_1c2.options; -if(_1c2.tip){ -_1c2.tip.remove(); -} -if(opts._title){ -$(_1c1).attr("title",opts._title); -} -$.removeData(_1c1,"tooltip"); -$(_1c1).unbind(".tooltip").removeClass("tooltip-f"); -opts.onDestroy.call(_1c1); -} -}; -$.fn.tooltip=function(_1c3,_1c4){ -if(typeof _1c3=="string"){ -return $.fn.tooltip.methods[_1c3](this,_1c4); -} -_1c3=_1c3||{}; -return this.each(function(){ -var _1c5=$.data(this,"tooltip"); -if(_1c5){ -$.extend(_1c5.options,_1c3); -}else{ -$.data(this,"tooltip",{options:$.extend({},$.fn.tooltip.defaults,$.fn.tooltip.parseOptions(this),_1c3)}); -init(this); -} -_1ac(this); -_1b7(this); -}); -}; -$.fn.tooltip.methods={options:function(jq){ -return $.data(jq[0],"tooltip").options; -},tip:function(jq){ -return $.data(jq[0],"tooltip").tip; -},arrow:function(jq){ -return jq.tooltip("tip").children(".tooltip-arrow-outer,.tooltip-arrow"); -},show:function(jq,e){ -return jq.each(function(){ -_1b4(this,e); -}); -},hide:function(jq,e){ -return jq.each(function(){ -_1ba(this,e); -}); -},update:function(jq,_1c6){ -return jq.each(function(){ -_1b7(this,_1c6); -}); -},reposition:function(jq){ -return jq.each(function(){ -_1ae(this); -}); -},destroy:function(jq){ -return jq.each(function(){ -_1c0(this); -}); -}}; -$.fn.tooltip.parseOptions=function(_1c7){ -var t=$(_1c7); -var opts=$.extend({},$.parser.parseOptions(_1c7,["position","showEvent","hideEvent","content",{deltaX:"number",deltaY:"number",showDelay:"number",hideDelay:"number"}]),{_title:t.attr("title")}); -t.attr("title",""); -if(!opts.content){ -opts.content=opts._title; -} -return opts; -}; -$.fn.tooltip.defaults={position:"bottom",content:null,trackMouse:false,deltaX:0,deltaY:0,showEvent:"mouseenter",hideEvent:"mouseleave",showDelay:200,hideDelay:100,onShow:function(e){ -},onHide:function(e){ -},onUpdate:function(_1c8){ -},onPosition:function(left,top){ -},onDestroy:function(){ -}}; -})(jQuery); -(function($){ -$.fn._remove=function(){ -return this.each(function(){ -$(this).remove(); -try{ -this.outerHTML=""; -} -catch(err){ -} -}); -}; -function _1c9(node){ -node._remove(); -}; -function _1ca(_1cb,_1cc){ -var opts=$.data(_1cb,"panel").options; -var _1cd=$.data(_1cb,"panel").panel; -var _1ce=_1cd.children("div.panel-header"); -var _1cf=_1cd.children("div.panel-body"); -if(_1cc){ -if(_1cc.width){ -opts.width=_1cc.width; -} -if(_1cc.height){ -opts.height=_1cc.height; -} -if(_1cc.left!=null){ -opts.left=_1cc.left; -} -if(_1cc.top!=null){ -opts.top=_1cc.top; -} -} -opts.fit?$.extend(opts,_1cd._fit()):_1cd._fit(false); -_1cd.css({left:opts.left,top:opts.top}); -if(!isNaN(opts.width)){ -_1cd._outerWidth(opts.width); -}else{ -_1cd.width("auto"); -} -_1ce.add(_1cf)._outerWidth(_1cd.width()); -if(!isNaN(opts.height)){ -_1cd._outerHeight(opts.height); -_1cf._outerHeight(_1cd.height()-_1ce._outerHeight()); -}else{ -_1cf.height("auto"); -} -_1cd.css("height",""); -opts.onResize.apply(_1cb,[opts.width,opts.height]); -_1cd.find(">div.panel-body>div").triggerHandler("_resize"); -}; -function _1d0(_1d1,_1d2){ -var opts=$.data(_1d1,"panel").options; -var _1d3=$.data(_1d1,"panel").panel; -if(_1d2){ -if(_1d2.left!=null){ -opts.left=_1d2.left; -} -if(_1d2.top!=null){ -opts.top=_1d2.top; -} -} -_1d3.css({left:opts.left,top:opts.top}); -opts.onMove.apply(_1d1,[opts.left,opts.top]); -}; -function _1d4(_1d5){ -$(_1d5).addClass("panel-body"); -var _1d6=$("
            ").insertBefore(_1d5); -_1d6[0].appendChild(_1d5); -_1d6.bind("_resize",function(){ -var opts=$.data(_1d5,"panel").options; -if(opts.fit==true){ -_1ca(_1d5); -} -return false; -}); -return _1d6; -}; -function _1d7(_1d8){ -var opts=$.data(_1d8,"panel").options; -var _1d9=$.data(_1d8,"panel").panel; -if(opts.tools&&typeof opts.tools=="string"){ -_1d9.find(">div.panel-header>div.panel-tool .panel-tool-a").appendTo(opts.tools); -} -_1c9(_1d9.children("div.panel-header")); -if(opts.title&&!opts.noheader){ -var _1da=$("
            "+opts.title+"
            ").prependTo(_1d9); -if(opts.iconCls){ -_1da.find(".panel-title").addClass("panel-with-icon"); -$("
            ").addClass(opts.iconCls).appendTo(_1da); -} -var tool=$("
            ").appendTo(_1da); -tool.bind("click",function(e){ -e.stopPropagation(); -}); -if(opts.tools){ -if(typeof opts.tools=="string"){ -$(opts.tools).children().each(function(){ -$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(tool); -}); -}else{ -for(var i=0;i").addClass(opts.tools[i].iconCls).appendTo(tool); -if(opts.tools[i].handler){ -t.bind("click",eval(opts.tools[i].handler)); -} -} -} -} -if(opts.collapsible){ -$("").appendTo(tool).bind("click",function(){ -if(opts.collapsed==true){ -_1f5(_1d8,true); -}else{ -_1ea(_1d8,true); -} -return false; -}); -} -if(opts.minimizable){ -$("").appendTo(tool).bind("click",function(){ -_1fb(_1d8); -return false; -}); -} -if(opts.maximizable){ -$("").appendTo(tool).bind("click",function(){ -if(opts.maximized==true){ -_1fe(_1d8); -}else{ -_1e9(_1d8); -} -return false; -}); -} -if(opts.closable){ -$("").appendTo(tool).bind("click",function(){ -_1db(_1d8); -return false; -}); -} -_1d9.children("div.panel-body").removeClass("panel-body-noheader"); -}else{ -_1d9.children("div.panel-body").addClass("panel-body-noheader"); -} -}; -function _1dc(_1dd){ -var _1de=$.data(_1dd,"panel"); -var opts=_1de.options; -if(opts.href){ -if(!_1de.isLoaded||!opts.cache){ -_1de.isLoaded=false; -_1df(_1dd); -if(opts.loadingMessage){ -$(_1dd).html($("
            ").html(opts.loadingMessage)); -} -$.ajax({url:opts.href,cache:false,dataType:"html",success:function(data){ -_1e0(opts.extractor.call(_1dd,data)); -opts.onLoad.apply(_1dd,arguments); -_1de.isLoaded=true; -}}); -} -}else{ -if(opts.content){ -if(!_1de.isLoaded){ -_1df(_1dd); -_1e0(opts.content); -_1de.isLoaded=true; -} -} -} -function _1e0(_1e1){ -$(_1dd).html(_1e1); -if($.parser){ -$.parser.parse($(_1dd)); -} -}; -}; -function _1df(_1e2){ -var t=$(_1e2); -t.find(".combo-f").each(function(){ -$(this).combo("destroy"); -}); -t.find(".m-btn").each(function(){ -$(this).menubutton("destroy"); -}); -t.find(".s-btn").each(function(){ -$(this).splitbutton("destroy"); -}); -t.find(".tooltip-f").tooltip("destroy"); -}; -function _1e3(_1e4){ -$(_1e4).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible").each(function(){ -$(this).triggerHandler("_resize",[true]); -}); -}; -function _1e5(_1e6,_1e7){ -var opts=$.data(_1e6,"panel").options; -var _1e8=$.data(_1e6,"panel").panel; -if(_1e7!=true){ -if(opts.onBeforeOpen.call(_1e6)==false){ -return; -} -} -_1e8.show(); -opts.closed=false; -opts.minimized=false; -var tool=_1e8.children("div.panel-header").find("a.panel-tool-restore"); -if(tool.length){ -opts.maximized=true; -} -opts.onOpen.call(_1e6); -if(opts.maximized==true){ -opts.maximized=false; -_1e9(_1e6); -} -if(opts.collapsed==true){ -opts.collapsed=false; -_1ea(_1e6); -} -if(!opts.collapsed){ -_1dc(_1e6); -_1e3(_1e6); -} -}; -function _1db(_1eb,_1ec){ -var opts=$.data(_1eb,"panel").options; -var _1ed=$.data(_1eb,"panel").panel; -if(_1ec!=true){ -if(opts.onBeforeClose.call(_1eb)==false){ -return; -} -} -_1ed._fit(false); -_1ed.hide(); -opts.closed=true; -opts.onClose.call(_1eb); -}; -function _1ee(_1ef,_1f0){ -var opts=$.data(_1ef,"panel").options; -var _1f1=$.data(_1ef,"panel").panel; -if(_1f0!=true){ -if(opts.onBeforeDestroy.call(_1ef)==false){ -return; -} -} -_1df(_1ef); -_1c9(_1f1); -opts.onDestroy.call(_1ef); -}; -function _1ea(_1f2,_1f3){ -var opts=$.data(_1f2,"panel").options; -var _1f4=$.data(_1f2,"panel").panel; -var body=_1f4.children("div.panel-body"); -var tool=_1f4.children("div.panel-header").find("a.panel-tool-collapse"); -if(opts.collapsed==true){ -return; -} -body.stop(true,true); -if(opts.onBeforeCollapse.call(_1f2)==false){ -return; -} -tool.addClass("panel-tool-expand"); -if(_1f3==true){ -body.slideUp("normal",function(){ -opts.collapsed=true; -opts.onCollapse.call(_1f2); -}); -}else{ -body.hide(); -opts.collapsed=true; -opts.onCollapse.call(_1f2); -} -}; -function _1f5(_1f6,_1f7){ -var opts=$.data(_1f6,"panel").options; -var _1f8=$.data(_1f6,"panel").panel; -var body=_1f8.children("div.panel-body"); -var tool=_1f8.children("div.panel-header").find("a.panel-tool-collapse"); -if(opts.collapsed==false){ -return; -} -body.stop(true,true); -if(opts.onBeforeExpand.call(_1f6)==false){ -return; -} -tool.removeClass("panel-tool-expand"); -if(_1f7==true){ -body.slideDown("normal",function(){ -opts.collapsed=false; -opts.onExpand.call(_1f6); -_1dc(_1f6); -_1e3(_1f6); -}); -}else{ -body.show(); -opts.collapsed=false; -opts.onExpand.call(_1f6); -_1dc(_1f6); -_1e3(_1f6); -} -}; -function _1e9(_1f9){ -var opts=$.data(_1f9,"panel").options; -var _1fa=$.data(_1f9,"panel").panel; -var tool=_1fa.children("div.panel-header").find("a.panel-tool-max"); -if(opts.maximized==true){ -return; -} -tool.addClass("panel-tool-restore"); -if(!$.data(_1f9,"panel").original){ -$.data(_1f9,"panel").original={width:opts.width,height:opts.height,left:opts.left,top:opts.top,fit:opts.fit}; -} -opts.left=0; -opts.top=0; -opts.fit=true; -_1ca(_1f9); -opts.minimized=false; -opts.maximized=true; -opts.onMaximize.call(_1f9); -}; -function _1fb(_1fc){ -var opts=$.data(_1fc,"panel").options; -var _1fd=$.data(_1fc,"panel").panel; -_1fd._fit(false); -_1fd.hide(); -opts.minimized=true; -opts.maximized=false; -opts.onMinimize.call(_1fc); -}; -function _1fe(_1ff){ -var opts=$.data(_1ff,"panel").options; -var _200=$.data(_1ff,"panel").panel; -var tool=_200.children("div.panel-header").find("a.panel-tool-max"); -if(opts.maximized==false){ -return; -} -_200.show(); -tool.removeClass("panel-tool-restore"); -$.extend(opts,$.data(_1ff,"panel").original); -_1ca(_1ff); -opts.minimized=false; -opts.maximized=false; -$.data(_1ff,"panel").original=null; -opts.onRestore.call(_1ff); -}; -function _201(_202){ -var opts=$.data(_202,"panel").options; -var _203=$.data(_202,"panel").panel; -var _204=$(_202).panel("header"); -var body=$(_202).panel("body"); -_203.css(opts.style); -_203.addClass(opts.cls); -if(opts.border){ -_204.removeClass("panel-header-noborder"); -body.removeClass("panel-body-noborder"); -}else{ -_204.addClass("panel-header-noborder"); -body.addClass("panel-body-noborder"); -} -_204.addClass(opts.headerCls); -body.addClass(opts.bodyCls); -if(opts.id){ -$(_202).attr("id",opts.id); -}else{ -$(_202).attr("id",""); -} -}; -function _205(_206,_207){ -$.data(_206,"panel").options.title=_207; -$(_206).panel("header").find("div.panel-title").html(_207); -}; -var TO=false; -var _208=true; -$(window).unbind(".panel").bind("resize.panel",function(){ -if(!_208){ -return; -} -if(TO!==false){ -clearTimeout(TO); -} -TO=setTimeout(function(){ -_208=false; -var _209=$("body.layout"); -if(_209.length){ -_209.layout("resize"); -}else{ -$("body").children("div.panel,div.accordion,div.tabs-container,div.layout").triggerHandler("_resize"); -} -_208=true; -TO=false; -},200); -}); -$.fn.panel=function(_20a,_20b){ -if(typeof _20a=="string"){ -return $.fn.panel.methods[_20a](this,_20b); -} -_20a=_20a||{}; -return this.each(function(){ -var _20c=$.data(this,"panel"); -var opts; -if(_20c){ -opts=$.extend(_20c.options,_20a); -_20c.isLoaded=false; -}else{ -opts=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_20a); -$(this).attr("title",""); -_20c=$.data(this,"panel",{options:opts,panel:_1d4(this),isLoaded:false}); -} -_1d7(this); -_201(this); -if(opts.doSize==true){ -_20c.panel.css("display","block"); -_1ca(this); -} -if(opts.closed==true||opts.minimized==true){ -_20c.panel.hide(); -}else{ -_1e5(this); -} -}); -}; -$.fn.panel.methods={options:function(jq){ -return $.data(jq[0],"panel").options; -},panel:function(jq){ -return $.data(jq[0],"panel").panel; -},header:function(jq){ -return $.data(jq[0],"panel").panel.find(">div.panel-header"); -},body:function(jq){ -return $.data(jq[0],"panel").panel.find(">div.panel-body"); -},setTitle:function(jq,_20d){ -return jq.each(function(){ -_205(this,_20d); -}); -},open:function(jq,_20e){ -return jq.each(function(){ -_1e5(this,_20e); -}); -},close:function(jq,_20f){ -return jq.each(function(){ -_1db(this,_20f); -}); -},destroy:function(jq,_210){ -return jq.each(function(){ -_1ee(this,_210); -}); -},refresh:function(jq,href){ -return jq.each(function(){ -$.data(this,"panel").isLoaded=false; -if(href){ -$.data(this,"panel").options.href=href; -} -_1dc(this); -}); -},resize:function(jq,_211){ -return jq.each(function(){ -_1ca(this,_211); -}); -},move:function(jq,_212){ -return jq.each(function(){ -_1d0(this,_212); -}); -},maximize:function(jq){ -return jq.each(function(){ -_1e9(this); -}); -},minimize:function(jq){ -return jq.each(function(){ -_1fb(this); -}); -},restore:function(jq){ -return jq.each(function(){ -_1fe(this); -}); -},collapse:function(jq,_213){ -return jq.each(function(){ -_1ea(this,_213); -}); -},expand:function(jq,_214){ -return jq.each(function(){ -_1f5(this,_214); -}); -}}; -$.fn.panel.parseOptions=function(_215){ -var t=$(_215); -return $.extend({},$.parser.parseOptions(_215,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"}]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined)}); -}; -$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,tools:null,href:null,loadingMessage:"Loading...",extractor:function(data){ -var _216=/]*>((.|[\n\r])*)<\/body>/im; -var _217=_216.exec(data); -if(_217){ -return _217[1]; -}else{ -return data; -} -},onLoad:function(){ -},onBeforeOpen:function(){ -},onOpen:function(){ -},onBeforeClose:function(){ -},onClose:function(){ -},onBeforeDestroy:function(){ -},onDestroy:function(){ -},onResize:function(_218,_219){ -},onMove:function(left,top){ -},onMaximize:function(){ -},onRestore:function(){ -},onMinimize:function(){ -},onBeforeCollapse:function(){ -},onBeforeExpand:function(){ -},onCollapse:function(){ -},onExpand:function(){ -}}; -})(jQuery); -(function($){ -function _21a(_21b,_21c){ -var opts=$.data(_21b,"window").options; -if(_21c){ -if(_21c.width){ -opts.width=_21c.width; -} -if(_21c.height){ -opts.height=_21c.height; -} -if(_21c.left!=null){ -opts.left=_21c.left; -} -if(_21c.top!=null){ -opts.top=_21c.top; -} -} -$(_21b).panel("resize",opts); -}; -function _21d(_21e,_21f){ -var _220=$.data(_21e,"window"); -if(_21f){ -if(_21f.left!=null){ -_220.options.left=_21f.left; -} -if(_21f.top!=null){ -_220.options.top=_21f.top; -} -} -$(_21e).panel("move",_220.options); -if(_220.shadow){ -_220.shadow.css({left:_220.options.left,top:_220.options.top}); -} -}; -function _221(_222,_223){ -var _224=$.data(_222,"window"); -var opts=_224.options; -var _225=opts.width; -if(isNaN(_225)){ -_225=_224.window._outerWidth(); -} -if(opts.inline){ -var _226=_224.window.parent(); -opts.left=(_226.width()-_225)/2+_226.scrollLeft(); -}else{ -opts.left=($(window)._outerWidth()-_225)/2+$(document).scrollLeft(); -} -if(_223){ -_21d(_222); -} -}; -function _227(_228,_229){ -var _22a=$.data(_228,"window"); -var opts=_22a.options; -var _22b=opts.height; -if(isNaN(_22b)){ -_22b=_22a.window._outerHeight(); -} -if(opts.inline){ -var _22c=_22a.window.parent(); -opts.top=(_22c.height()-_22b)/2+_22c.scrollTop(); -}else{ -opts.top=($(window)._outerHeight()-_22b)/2+$(document).scrollTop(); -} -if(_229){ -_21d(_228); -} -}; -function _22d(_22e){ -var _22f=$.data(_22e,"window"); -var win=$(_22e).panel($.extend({},_22f.options,{border:false,doSize:true,closed:true,cls:"window",headerCls:"window-header",bodyCls:"window-body "+(_22f.options.noheader?"window-body-noheader":""),onBeforeDestroy:function(){ -if(_22f.options.onBeforeDestroy.call(_22e)==false){ -return false; -} -if(_22f.shadow){ -_22f.shadow.remove(); -} -if(_22f.mask){ -_22f.mask.remove(); -} -},onClose:function(){ -if(_22f.shadow){ -_22f.shadow.hide(); -} -if(_22f.mask){ -_22f.mask.hide(); -} -_22f.options.onClose.call(_22e); -},onOpen:function(){ -if(_22f.mask){ -_22f.mask.css({display:"block",zIndex:$.fn.window.defaults.zIndex++}); -} -if(_22f.shadow){ -_22f.shadow.css({display:"block",zIndex:$.fn.window.defaults.zIndex++,left:_22f.options.left,top:_22f.options.top,width:_22f.window._outerWidth(),height:_22f.window._outerHeight()}); -} -_22f.window.css("z-index",$.fn.window.defaults.zIndex++); -_22f.options.onOpen.call(_22e); -},onResize:function(_230,_231){ -var opts=$(this).panel("options"); -$.extend(_22f.options,{width:opts.width,height:opts.height,left:opts.left,top:opts.top}); -if(_22f.shadow){ -_22f.shadow.css({left:_22f.options.left,top:_22f.options.top,width:_22f.window._outerWidth(),height:_22f.window._outerHeight()}); -} -_22f.options.onResize.call(_22e,_230,_231); -},onMinimize:function(){ -if(_22f.shadow){ -_22f.shadow.hide(); -} -if(_22f.mask){ -_22f.mask.hide(); -} -_22f.options.onMinimize.call(_22e); -},onBeforeCollapse:function(){ -if(_22f.options.onBeforeCollapse.call(_22e)==false){ -return false; -} -if(_22f.shadow){ -_22f.shadow.hide(); -} -},onExpand:function(){ -if(_22f.shadow){ -_22f.shadow.show(); -} -_22f.options.onExpand.call(_22e); -}})); -_22f.window=win.panel("panel"); -if(_22f.mask){ -_22f.mask.remove(); -} -if(_22f.options.modal==true){ -_22f.mask=$("
            ").insertAfter(_22f.window); -_22f.mask.css({width:(_22f.options.inline?_22f.mask.parent().width():_232().width),height:(_22f.options.inline?_22f.mask.parent().height():_232().height),display:"none"}); -} -if(_22f.shadow){ -_22f.shadow.remove(); -} -if(_22f.options.shadow==true){ -_22f.shadow=$("
            ").insertAfter(_22f.window); -_22f.shadow.css({display:"none"}); -} -if(_22f.options.left==null){ -_221(_22e); -} -if(_22f.options.top==null){ -_227(_22e); -} -_21d(_22e); -if(_22f.options.closed==false){ -win.window("open"); -} -}; -function _233(_234){ -var _235=$.data(_234,"window"); -_235.window.draggable({handle:">div.panel-header>div.panel-title",disabled:_235.options.draggable==false,onStartDrag:function(e){ -if(_235.mask){ -_235.mask.css("z-index",$.fn.window.defaults.zIndex++); -} -if(_235.shadow){ -_235.shadow.css("z-index",$.fn.window.defaults.zIndex++); -} -_235.window.css("z-index",$.fn.window.defaults.zIndex++); -if(!_235.proxy){ -_235.proxy=$("
            ").insertAfter(_235.window); -} -_235.proxy.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top}); -_235.proxy._outerWidth(_235.window._outerWidth()); -_235.proxy._outerHeight(_235.window._outerHeight()); -setTimeout(function(){ -if(_235.proxy){ -_235.proxy.show(); -} -},500); -},onDrag:function(e){ -_235.proxy.css({display:"block",left:e.data.left,top:e.data.top}); -return false; -},onStopDrag:function(e){ -_235.options.left=e.data.left; -_235.options.top=e.data.top; -$(_234).window("move"); -_235.proxy.remove(); -_235.proxy=null; -}}); -_235.window.resizable({disabled:_235.options.resizable==false,onStartResize:function(e){ -_235.pmask=$("
            ").insertAfter(_235.window); -_235.pmask.css({zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top,width:_235.window._outerWidth(),height:_235.window._outerHeight()}); -if(!_235.proxy){ -_235.proxy=$("
            ").insertAfter(_235.window); -} -_235.proxy.css({zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top}); -_235.proxy._outerWidth(e.data.width); -_235.proxy._outerHeight(e.data.height); -},onResize:function(e){ -_235.proxy.css({left:e.data.left,top:e.data.top}); -_235.proxy._outerWidth(e.data.width); -_235.proxy._outerHeight(e.data.height); -return false; -},onStopResize:function(e){ -$.extend(_235.options,{left:e.data.left,top:e.data.top,width:e.data.width,height:e.data.height}); -_21a(_234); -_235.pmask.remove(); -_235.pmask=null; -_235.proxy.remove(); -_235.proxy=null; -}}); -}; -function _232(){ -if(document.compatMode=="BackCompat"){ -return {width:Math.max(document.body.scrollWidth,document.body.clientWidth),height:Math.max(document.body.scrollHeight,document.body.clientHeight)}; -}else{ -return {width:Math.max(document.documentElement.scrollWidth,document.documentElement.clientWidth),height:Math.max(document.documentElement.scrollHeight,document.documentElement.clientHeight)}; -} -}; -$(window).resize(function(){ -$("body>div.window-mask").css({width:$(window)._outerWidth(),height:$(window)._outerHeight()}); -setTimeout(function(){ -$("body>div.window-mask").css({width:_232().width,height:_232().height}); -},50); -}); -$.fn.window=function(_236,_237){ -if(typeof _236=="string"){ -var _238=$.fn.window.methods[_236]; -if(_238){ -return _238(this,_237); -}else{ -return this.panel(_236,_237); -} -} -_236=_236||{}; -return this.each(function(){ -var _239=$.data(this,"window"); -if(_239){ -$.extend(_239.options,_236); -}else{ -_239=$.data(this,"window",{options:$.extend({},$.fn.window.defaults,$.fn.window.parseOptions(this),_236)}); -if(!_239.options.inline){ -document.body.appendChild(this); -} -} -_22d(this); -_233(this); -}); -}; -$.fn.window.methods={options:function(jq){ -var _23a=jq.panel("options"); -var _23b=$.data(jq[0],"window").options; -return $.extend(_23b,{closed:_23a.closed,collapsed:_23a.collapsed,minimized:_23a.minimized,maximized:_23a.maximized}); -},window:function(jq){ -return $.data(jq[0],"window").window; -},resize:function(jq,_23c){ -return jq.each(function(){ -_21a(this,_23c); -}); -},move:function(jq,_23d){ -return jq.each(function(){ -_21d(this,_23d); -}); -},hcenter:function(jq){ -return jq.each(function(){ -_221(this,true); -}); -},vcenter:function(jq){ -return jq.each(function(){ -_227(this,true); -}); -},center:function(jq){ -return jq.each(function(){ -_221(this); -_227(this); -_21d(this); -}); -}}; -$.fn.window.parseOptions=function(_23e){ -return $.extend({},$.fn.panel.parseOptions(_23e),$.parser.parseOptions(_23e,[{draggable:"boolean",resizable:"boolean",shadow:"boolean",modal:"boolean",inline:"boolean"}])); -}; -$.fn.window.defaults=$.extend({},$.fn.panel.defaults,{zIndex:9000,draggable:true,resizable:true,shadow:true,modal:false,inline:false,title:"New Window",collapsible:true,minimizable:true,maximizable:true,closable:true,closed:false}); -})(jQuery); -(function($){ -function _23f(_240){ -var cp=document.createElement("div"); -while(_240.firstChild){ -cp.appendChild(_240.firstChild); -} -_240.appendChild(cp); -var _241=$(cp); -_241.attr("style",$(_240).attr("style")); -$(_240).removeAttr("style").css("overflow","hidden"); -_241.panel({border:false,doSize:false,bodyCls:"dialog-content"}); -return _241; -}; -function _242(_243){ -var opts=$.data(_243,"dialog").options; -var _244=$.data(_243,"dialog").contentPanel; -if(opts.toolbar){ -if(typeof opts.toolbar=="string"){ -$(opts.toolbar).addClass("dialog-toolbar").prependTo(_243); -$(opts.toolbar).show(); -}else{ -$(_243).find("div.dialog-toolbar").remove(); -var _245=$("
            ").prependTo(_243); -var tr=_245.find("tr"); -for(var i=0;i
            ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var tool=$("").appendTo(td); -tool[0].onclick=eval(btn.handler||function(){ -}); -tool.linkbutton($.extend({},btn,{plain:true})); -} -} -} -}else{ -$(_243).find("div.dialog-toolbar").remove(); -} -if(opts.buttons){ -if(typeof opts.buttons=="string"){ -$(opts.buttons).addClass("dialog-button").appendTo(_243); -$(opts.buttons).show(); -}else{ -$(_243).find("div.dialog-button").remove(); -var _246=$("
            ").appendTo(_243); -for(var i=0;i").appendTo(_246); -if(p.handler){ -_247[0].onclick=p.handler; -} -_247.linkbutton(p); -} -} -}else{ -$(_243).find("div.dialog-button").remove(); -} -var _248=opts.href; -var _249=opts.content; -opts.href=null; -opts.content=null; -_244.panel({closed:opts.closed,cache:opts.cache,href:_248,content:_249,onLoad:function(){ -if(opts.height=="auto"){ -$(_243).window("resize"); -} -opts.onLoad.apply(_243,arguments); -}}); -$(_243).window($.extend({},opts,{onOpen:function(){ -if(_244.panel("options").closed){ -_244.panel("open"); -} -if(opts.onOpen){ -opts.onOpen.call(_243); -} -},onResize:function(_24a,_24b){ -var _24c=$(_243); -_244.panel("panel").show(); -_244.panel("resize",{width:_24c.width(),height:(_24b=="auto")?"auto":_24c.height()-_24c.children("div.dialog-toolbar")._outerHeight()-_24c.children("div.dialog-button")._outerHeight()}); -if(opts.onResize){ -opts.onResize.call(_243,_24a,_24b); -} -}})); -opts.href=_248; -opts.content=_249; -}; -function _24d(_24e,href){ -var _24f=$.data(_24e,"dialog").contentPanel; -_24f.panel("refresh",href); -}; -$.fn.dialog=function(_250,_251){ -if(typeof _250=="string"){ -var _252=$.fn.dialog.methods[_250]; -if(_252){ -return _252(this,_251); -}else{ -return this.window(_250,_251); -} -} -_250=_250||{}; -return this.each(function(){ -var _253=$.data(this,"dialog"); -if(_253){ -$.extend(_253.options,_250); -}else{ -$.data(this,"dialog",{options:$.extend({},$.fn.dialog.defaults,$.fn.dialog.parseOptions(this),_250),contentPanel:_23f(this)}); -} -_242(this); -}); -}; -$.fn.dialog.methods={options:function(jq){ -var _254=$.data(jq[0],"dialog").options; -var _255=jq.panel("options"); -$.extend(_254,{closed:_255.closed,collapsed:_255.collapsed,minimized:_255.minimized,maximized:_255.maximized}); -var _256=$.data(jq[0],"dialog").contentPanel; -return _254; -},dialog:function(jq){ -return jq.window("window"); -},refresh:function(jq,href){ -return jq.each(function(){ -_24d(this,href); -}); -}}; -$.fn.dialog.parseOptions=function(_257){ -return $.extend({},$.fn.window.parseOptions(_257),$.parser.parseOptions(_257,["toolbar","buttons"])); -}; -$.fn.dialog.defaults=$.extend({},$.fn.window.defaults,{title:"New Dialog",collapsible:false,minimizable:false,maximizable:false,resizable:false,toolbar:null,buttons:null}); -})(jQuery); -(function($){ -function show(el,type,_258,_259){ -var win=$(el).window("window"); -if(!win){ -return; -} -switch(type){ -case null: -win.show(); -break; -case "slide": -win.slideDown(_258); -break; -case "fade": -win.fadeIn(_258); -break; -case "show": -win.show(_258); -break; -} -var _25a=null; -if(_259>0){ -_25a=setTimeout(function(){ -hide(el,type,_258); -},_259); -} -win.hover(function(){ -if(_25a){ -clearTimeout(_25a); -} -},function(){ -if(_259>0){ -_25a=setTimeout(function(){ -hide(el,type,_258); -},_259); -} -}); -}; -function hide(el,type,_25b){ -if(el.locked==true){ -return; -} -el.locked=true; -var win=$(el).window("window"); -if(!win){ -return; -} -switch(type){ -case null: -win.hide(); -break; -case "slide": -win.slideUp(_25b); -break; -case "fade": -win.fadeOut(_25b); -break; -case "show": -win.hide(_25b); -break; -} -setTimeout(function(){ -$(el).window("destroy"); -},_25b); -}; -function _25c(_25d){ -var opts=$.extend({},$.fn.window.defaults,{collapsible:false,minimizable:false,maximizable:false,shadow:false,draggable:false,resizable:false,closed:true,style:{left:"",top:"",right:0,zIndex:$.fn.window.defaults.zIndex++,bottom:-document.body.scrollTop-document.documentElement.scrollTop},onBeforeOpen:function(){ -show(this,opts.showType,opts.showSpeed,opts.timeout); -return false; -},onBeforeClose:function(){ -hide(this,opts.showType,opts.showSpeed); -return false; -}},{title:"",width:250,height:100,showType:"slide",showSpeed:600,msg:"",timeout:4000},_25d); -opts.style.zIndex=$.fn.window.defaults.zIndex++; -var win=$("
            ").html(opts.msg).appendTo("body"); -win.window(opts); -win.window("window").css(opts.style); -win.window("open"); -return win; -}; -function _25e(_25f,_260,_261){ -var win=$("
            ").appendTo("body"); -win.append(_260); -if(_261){ -var tb=$("
            ").appendTo(win); -for(var _262 in _261){ -$("").attr("href","javascript:void(0)").text(_262).css("margin-left",10).bind("click",eval(_261[_262])).appendTo(tb).linkbutton(); -} -} -win.window({title:_25f,noheader:(_25f?false:true),width:300,height:"auto",modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,onClose:function(){ -setTimeout(function(){ -win.window("destroy"); -},100); -}}); -win.window("window").addClass("messager-window"); -win.children("div.messager-button").children("a:first").focus(); -return win; -}; -$.messager={show:function(_263){ -return _25c(_263); -},alert:function(_264,msg,icon,fn){ -var _265="
            "+msg+"
            "; -switch(icon){ -case "error": -_265="
            "+_265; -break; -case "info": -_265="
            "+_265; -break; -case "question": -_265="
            "+_265; -break; -case "warning": -_265="
            "+_265; -break; -} -_265+="

            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 z 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

            "; -var _266={}; -_266[$.messager.defaults.ok]=function(){ -win.window("close"); -if(fn){ -fn(); -return false; -} -}; -var win=_25e(_264,_265,_266); -return win; -},confirm:function(_267,msg,fn){ -var _268="
            "+"
            "+msg+"
            "+"
            "; -var _269={}; -_269[$.messager.defaults.ok]=function(){ -win.window("close"); -if(fn){ -fn(true); -return false; -} -}; -_269[$.messager.defaults.cancel]=function(){ -win.window("close"); -if(fn){ -fn(false); -return false; -} -}; -var win=_25e(_267,_268,_269); -return win; -},prompt:function(_26a,msg,fn){ -var _26b="
            "+"
            "+msg+"
            "+"
            "+"
            "+"
            "; -var _26c={}; -_26c[$.messager.defaults.ok]=function(){ -win.window("close"); -if(fn){ -fn($(".messager-input",win).val()); -return false; -} -}; -_26c[$.messager.defaults.cancel]=function(){ -win.window("close"); -if(fn){ -fn(); -return false; -} -}; -var win=_25e(_26a,_26b,_26c); -win.children("input.messager-input").focus(); -return win; -},progress:function(_26d){ -var _26e={bar:function(){ -return $("body>div.messager-window").find("div.messager-p-bar"); -},close:function(){ -var win=$("body>div.messager-window>div.messager-body:has(div.messager-progress)"); -if(win.length){ -win.window("close"); -} -}}; -if(typeof _26d=="string"){ -var _26f=_26e[_26d]; -return _26f(); -} -var opts=$.extend({title:"",msg:"",text:undefined,interval:300},_26d||{}); -var _270="
            "; -var win=_25e(opts.title,_270,null); -win.find("div.messager-p-msg").html(opts.msg); -var bar=win.find("div.messager-p-bar"); -bar.progressbar({text:opts.text}); -win.window({closable:false,onClose:function(){ -if(this.timer){ -clearInterval(this.timer); -} -$(this).window("destroy"); -}}); -if(opts.interval){ -win[0].timer=setInterval(function(){ -var v=bar.progressbar("getValue"); -v+=10; -if(v>100){ -v=0; -} -bar.progressbar("setValue",v); -},opts.interval); -} -return win; -}}; -$.messager.defaults={ok:"Ok",cancel:"Cancel"}; -})(jQuery); -(function($){ -function _271(_272){ -var opts=$.data(_272,"accordion").options; -var _273=$.data(_272,"accordion").panels; -var cc=$(_272); -opts.fit?$.extend(opts,cc._fit()):cc._fit(false); -if(opts.width>0){ -cc._outerWidth(opts.width); -} -var _274="auto"; -if(opts.height>0){ -cc._outerHeight(opts.height); -var _275=_273.length?_273[0].panel("header").css("height","")._outerHeight():"auto"; -var _274=cc.height()-(_273.length-1)*_275; -} -for(var i=0;i<_273.length;i++){ -var _276=_273[i]; -var _277=_276.panel("header"); -_277._outerHeight(_275); -_276.panel("resize",{width:cc.width(),height:_274}); -} -}; -function _278(_279){ -var _27a=$.data(_279,"accordion").panels; -for(var i=0;i<_27a.length;i++){ -var _27b=_27a[i]; -if(_27b.panel("options").collapsed==false){ -return _27b; -} -} -return null; -}; -function _27c(_27d,_27e){ -var _27f=$.data(_27d,"accordion").panels; -for(var i=0;i<_27f.length;i++){ -if(_27f[i][0]==$(_27e)[0]){ -return i; -} -} -return -1; -}; -function _280(_281,_282,_283){ -var _284=$.data(_281,"accordion").panels; -if(typeof _282=="number"){ -if(_282<0||_282>=_284.length){ -return null; -}else{ -var _285=_284[_282]; -if(_283){ -_284.splice(_282,1); -} -return _285; -} -} -for(var i=0;i<_284.length;i++){ -var _285=_284[i]; -if(_285.panel("options").title==_282){ -if(_283){ -_284.splice(i,1); -} -return _285; -} -} -return null; -}; -function _286(_287){ -var opts=$.data(_287,"accordion").options; -var cc=$(_287); -if(opts.border){ -cc.removeClass("accordion-noborder"); -}else{ -cc.addClass("accordion-noborder"); -} -}; -function _288(_289){ -var cc=$(_289); -cc.addClass("accordion"); -var _28a=[]; -cc.children("div").each(function(){ -var opts=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); -var pp=$(this); -_28a.push(pp); -_28c(_289,pp,opts); -}); -cc.bind("_resize",function(e,_28b){ -var opts=$.data(_289,"accordion").options; -if(opts.fit==true||_28b){ -_271(_289); -} -return false; -}); -return {accordion:cc,panels:_28a}; -}; -function _28c(_28d,pp,_28e){ -pp.panel($.extend({},_28e,{collapsible:false,minimizable:false,maximizable:false,closable:false,doSize:false,collapsed:true,headerCls:"accordion-header",bodyCls:"accordion-body",onBeforeExpand:function(){ -var curr=_278(_28d); -if(curr){ -var _28f=$(curr).panel("header"); -_28f.removeClass("accordion-header-selected"); -_28f.find(".accordion-collapse").triggerHandler("click"); -} -var _28f=pp.panel("header"); -_28f.addClass("accordion-header-selected"); -_28f.find(".accordion-collapse").removeClass("accordion-expand"); -},onExpand:function(){ -var opts=$.data(_28d,"accordion").options; -opts.onSelect.call(_28d,pp.panel("options").title,_27c(_28d,this)); -},onBeforeCollapse:function(){ -var _290=pp.panel("header"); -_290.removeClass("accordion-header-selected"); -_290.find(".accordion-collapse").addClass("accordion-expand"); -}})); -var _291=pp.panel("header"); -var t=$("").appendTo(_291.children("div.panel-tool")); -t.bind("click",function(e){ -var _292=$.data(_28d,"accordion").options.animate; -_29d(_28d); -if(pp.panel("options").collapsed){ -pp.panel("expand",_292); -}else{ -pp.panel("collapse",_292); -} -return false; -}); -_291.click(function(){ -$(this).find(".accordion-collapse").triggerHandler("click"); -return false; -}); -}; -function _293(_294,_295){ -var _296=_280(_294,_295); -if(!_296){ -return; -} -var curr=_278(_294); -if(curr&&curr[0]==_296[0]){ -return; -} -_296.panel("header").triggerHandler("click"); -}; -function _297(_298){ -var _299=$.data(_298,"accordion").panels; -for(var i=0;i<_299.length;i++){ -if(_299[i].panel("options").selected){ -_29a(i); -return; -} -} -if(_299.length){ -_29a(0); -} -function _29a(_29b){ -var opts=$.data(_298,"accordion").options; -var _29c=opts.animate; -opts.animate=false; -_293(_298,_29b); -opts.animate=_29c; -}; -}; -function _29d(_29e){ -var _29f=$.data(_29e,"accordion").panels; -for(var i=0;i<_29f.length;i++){ -_29f[i].stop(true,true); -} -}; -function add(_2a0,_2a1){ -var opts=$.data(_2a0,"accordion").options; -var _2a2=$.data(_2a0,"accordion").panels; -if(_2a1.selected==undefined){ -_2a1.selected=true; -} -_29d(_2a0); -var pp=$("
            ").appendTo(_2a0); -_2a2.push(pp); -_28c(_2a0,pp,_2a1); -_271(_2a0); -opts.onAdd.call(_2a0,_2a1.title,_2a2.length-1); -if(_2a1.selected){ -_293(_2a0,_2a2.length-1); -} -}; -function _2a3(_2a4,_2a5){ -var opts=$.data(_2a4,"accordion").options; -var _2a6=$.data(_2a4,"accordion").panels; -_29d(_2a4); -var _2a7=_280(_2a4,_2a5); -var _2a8=_2a7.panel("options").title; -var _2a9=_27c(_2a4,_2a7); -if(opts.onBeforeRemove.call(_2a4,_2a8,_2a9)==false){ -return; -} -var _2a7=_280(_2a4,_2a5,true); -if(_2a7){ -_2a7.panel("destroy"); -if(_2a6.length){ -_271(_2a4); -var curr=_278(_2a4); -if(!curr){ -_293(_2a4,0); -} -} -} -opts.onRemove.call(_2a4,_2a8,_2a9); -}; -$.fn.accordion=function(_2aa,_2ab){ -if(typeof _2aa=="string"){ -return $.fn.accordion.methods[_2aa](this,_2ab); -} -_2aa=_2aa||{}; -return this.each(function(){ -var _2ac=$.data(this,"accordion"); -var opts; -if(_2ac){ -opts=$.extend(_2ac.options,_2aa); -_2ac.opts=opts; -}else{ -opts=$.extend({},$.fn.accordion.defaults,$.fn.accordion.parseOptions(this),_2aa); -var r=_288(this); -$.data(this,"accordion",{options:opts,accordion:r.accordion,panels:r.panels}); -} -_286(this); -_271(this); -_297(this); -}); -}; -$.fn.accordion.methods={options:function(jq){ -return $.data(jq[0],"accordion").options; -},panels:function(jq){ -return $.data(jq[0],"accordion").panels; -},resize:function(jq){ -return jq.each(function(){ -_271(this); -}); -},getSelected:function(jq){ -return _278(jq[0]); -},getPanel:function(jq,_2ad){ -return _280(jq[0],_2ad); -},getPanelIndex:function(jq,_2ae){ -return _27c(jq[0],_2ae); -},select:function(jq,_2af){ -return jq.each(function(){ -_293(this,_2af); -}); -},add:function(jq,_2b0){ -return jq.each(function(){ -add(this,_2b0); -}); -},remove:function(jq,_2b1){ -return jq.each(function(){ -_2a3(this,_2b1); -}); -}}; -$.fn.accordion.parseOptions=function(_2b2){ -var t=$(_2b2); -return $.extend({},$.parser.parseOptions(_2b2,["width","height",{fit:"boolean",border:"boolean",animate:"boolean"}])); -}; -$.fn.accordion.defaults={width:"auto",height:"auto",fit:false,border:true,animate:true,onSelect:function(_2b3,_2b4){ -},onAdd:function(_2b5,_2b6){ -},onBeforeRemove:function(_2b7,_2b8){ -},onRemove:function(_2b9,_2ba){ -}}; -})(jQuery); -(function($){ -function _2bb(_2bc){ -var opts=$.data(_2bc,"tabs").options; -if(opts.tabPosition=="left"||opts.tabPosition=="right"){ -return; -} -var _2bd=$(_2bc).children("div.tabs-header"); -var tool=_2bd.children("div.tabs-tool"); -var _2be=_2bd.children("div.tabs-scroller-left"); -var _2bf=_2bd.children("div.tabs-scroller-right"); -var wrap=_2bd.children("div.tabs-wrap"); -tool._outerHeight(_2bd.outerHeight()-(opts.plain?2:0)); -var _2c0=0; -$("ul.tabs li",_2bd).each(function(){ -_2c0+=$(this).outerWidth(true); -}); -var _2c1=_2bd.width()-tool._outerWidth(); -if(_2c0>_2c1){ -_2be.show(); -_2bf.show(); -if(opts.toolPosition=="left"){ -tool.css({left:_2be.outerWidth(),right:""}); -wrap.css({marginLeft:_2be.outerWidth()+tool._outerWidth(),marginRight:_2bf._outerWidth(),width:_2c1-_2be.outerWidth()-_2bf.outerWidth()}); -}else{ -tool.css({left:"",right:_2bf.outerWidth()}); -wrap.css({marginLeft:_2be.outerWidth(),marginRight:_2bf.outerWidth()+tool._outerWidth(),width:_2c1-_2be.outerWidth()-_2bf.outerWidth()}); -} -}else{ -_2be.hide(); -_2bf.hide(); -if(opts.toolPosition=="left"){ -tool.css({left:0,right:""}); -wrap.css({marginLeft:tool._outerWidth(),marginRight:0,width:_2c1}); -}else{ -tool.css({left:"",right:0}); -wrap.css({marginLeft:0,marginRight:tool._outerWidth(),width:_2c1}); -} -} -}; -function _2c2(_2c3){ -var opts=$.data(_2c3,"tabs").options; -var _2c4=$(_2c3).children("div.tabs-header"); -if(opts.tools){ -if(typeof opts.tools=="string"){ -$(opts.tools).addClass("tabs-tool").appendTo(_2c4); -$(opts.tools).show(); -}else{ -_2c4.children("div.tabs-tool").remove(); -var _2c5=$("
            ").appendTo(_2c4); -for(var i=0;i").appendTo(_2c5); -tool[0].onclick=eval(opts.tools[i].handler||function(){ -}); -tool.linkbutton($.extend({},opts.tools[i],{plain:true})); -} -} -}else{ -_2c4.children("div.tabs-tool").remove(); -} -}; -function _2c6(_2c7){ -var opts=$.data(_2c7,"tabs").options; -var cc=$(_2c7); -opts.fit?$.extend(opts,cc._fit()):cc._fit(false); -cc.width(opts.width).height(opts.height); -var _2c8=$(_2c7).children("div.tabs-header"); -var _2c9=$(_2c7).children("div.tabs-panels"); -if(opts.tabPosition=="left"||opts.tabPosition=="right"){ -_2c8._outerWidth(opts.headerWidth); -_2c9._outerWidth(cc.width()-opts.headerWidth); -_2c8.add(_2c9)._outerHeight(opts.height); -var wrap=_2c8.find("div.tabs-wrap"); -wrap._outerWidth(_2c8.width()); -_2c8.find(".tabs")._outerWidth(wrap.width()); -}else{ -_2c8.css("height",""); -_2c8.find("div.tabs-wrap").css("width",""); -_2c8.find(".tabs").css("width",""); -_2c8._outerWidth(opts.width); -_2bb(_2c7); -var _2ca=opts.height; -if(!isNaN(_2ca)){ -_2c9._outerHeight(_2ca-_2c8.outerHeight()); -}else{ -_2c9.height("auto"); -} -var _2cb=opts.width; -if(!isNaN(_2cb)){ -_2c9._outerWidth(_2cb); -}else{ -_2c9.width("auto"); -} -} -}; -function _2cc(_2cd){ -var opts=$.data(_2cd,"tabs").options; -var tab=_2ce(_2cd); -if(tab){ -var _2cf=$(_2cd).children("div.tabs-panels"); -var _2d0=opts.width=="auto"?"auto":_2cf.width(); -var _2d1=opts.height=="auto"?"auto":_2cf.height(); -tab.panel("resize",{width:_2d0,height:_2d1}); -} -}; -function _2d2(_2d3){ -var tabs=$.data(_2d3,"tabs").tabs; -var cc=$(_2d3); -cc.addClass("tabs-container"); -cc.wrapInner("
            "); -$("
            "+"
            "+"
            "+"
            "+"
              "+"
              "+"
              ").prependTo(_2d3); -cc.children("div.tabs-panels").children("div").each(function(i){ -var opts=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); -var pp=$(this); -tabs.push(pp); -_2d9(_2d3,pp,opts); -}); -cc.children("div.tabs-header").find(".tabs-scroller-left, .tabs-scroller-right").hover(function(){ -$(this).addClass("tabs-scroller-over"); -},function(){ -$(this).removeClass("tabs-scroller-over"); -}); -cc.bind("_resize",function(e,_2d4){ -var opts=$.data(_2d3,"tabs").options; -if(opts.fit==true||_2d4){ -_2c6(_2d3); -_2cc(_2d3); -} -return false; -}); -}; -function _2d5(_2d6){ -var opts=$.data(_2d6,"tabs").options; -var _2d7=$(_2d6).children("div.tabs-header"); -var _2d8=$(_2d6).children("div.tabs-panels"); -_2d7.removeClass("tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right"); -_2d8.removeClass("tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right"); -if(opts.tabPosition=="top"){ -_2d7.insertBefore(_2d8); -}else{ -if(opts.tabPosition=="bottom"){ -_2d7.insertAfter(_2d8); -_2d7.addClass("tabs-header-bottom"); -_2d8.addClass("tabs-panels-top"); -}else{ -if(opts.tabPosition=="left"){ -_2d7.addClass("tabs-header-left"); -_2d8.addClass("tabs-panels-right"); -}else{ -if(opts.tabPosition=="right"){ -_2d7.addClass("tabs-header-right"); -_2d8.addClass("tabs-panels-left"); -} -} -} -} -if(opts.plain==true){ -_2d7.addClass("tabs-header-plain"); -}else{ -_2d7.removeClass("tabs-header-plain"); -} -if(opts.border==true){ -_2d7.removeClass("tabs-header-noborder"); -_2d8.removeClass("tabs-panels-noborder"); -}else{ -_2d7.addClass("tabs-header-noborder"); -_2d8.addClass("tabs-panels-noborder"); -} -$(".tabs-scroller-left",_2d7).unbind(".tabs").bind("click.tabs",function(){ -$(_2d6).tabs("scrollBy",-opts.scrollIncrement); -}); -$(".tabs-scroller-right",_2d7).unbind(".tabs").bind("click.tabs",function(){ -$(_2d6).tabs("scrollBy",opts.scrollIncrement); -}); -}; -function _2d9(_2da,pp,_2db){ -var _2dc=$.data(_2da,"tabs"); -_2db=_2db||{}; -pp.panel($.extend({},_2db,{border:false,noheader:true,closed:true,doSize:false,iconCls:(_2db.icon?_2db.icon:undefined),onLoad:function(){ -if(_2db.onLoad){ -_2db.onLoad.call(this,arguments); -} -_2dc.options.onLoad.call(_2da,$(this)); -}})); -var opts=pp.panel("options"); -var tabs=$(_2da).children("div.tabs-header").find("ul.tabs"); -opts.tab=$("
            • ").appendTo(tabs); -opts.tab.append(""+""+""+""); -opts.tab.unbind(".tabs").bind("click.tabs",{p:pp},function(e){ -if($(this).hasClass("tabs-disabled")){ -return; -} -_2e1(_2da,_2dd(_2da,e.data.p)); -}).bind("contextmenu.tabs",{p:pp},function(e){ -if($(this).hasClass("tabs-disabled")){ -return; -} -_2dc.options.onContextMenu.call(_2da,e,$(this).find("span.tabs-title").html(),_2dd(_2da,e.data.p)); -}); -$(_2da).tabs("update",{tab:pp,options:opts}); -}; -function _2de(_2df,_2e0){ -var opts=$.data(_2df,"tabs").options; -var tabs=$.data(_2df,"tabs").tabs; -if(_2e0.selected==undefined){ -_2e0.selected=true; -} -var pp=$("
              ").appendTo($(_2df).children("div.tabs-panels")); -tabs.push(pp); -_2d9(_2df,pp,_2e0); -opts.onAdd.call(_2df,_2e0.title,tabs.length-1); -_2bb(_2df); -if(_2e0.selected){ -_2e1(_2df,tabs.length-1); -} -}; -function _2e2(_2e3,_2e4){ -var _2e5=$.data(_2e3,"tabs").selectHis; -var pp=_2e4.tab; -var _2e6=pp.panel("options").title; -pp.panel($.extend({},_2e4.options,{iconCls:(_2e4.options.icon?_2e4.options.icon:undefined)})); -var opts=pp.panel("options"); -var tab=opts.tab; -var _2e7=tab.find("span.tabs-title"); -var _2e8=tab.find("span.tabs-icon"); -_2e7.html(opts.title); -_2e8.attr("class","tabs-icon"); -tab.find("a.tabs-close").remove(); -if(opts.closable){ -_2e7.addClass("tabs-closable"); -var _2e9=$("").appendTo(tab); -_2e9.bind("click.tabs",{p:pp},function(e){ -if($(this).parent().hasClass("tabs-disabled")){ -return; -} -_2eb(_2e3,_2dd(_2e3,e.data.p)); -return false; -}); -}else{ -_2e7.removeClass("tabs-closable"); -} -if(opts.iconCls){ -_2e7.addClass("tabs-with-icon"); -_2e8.addClass(opts.iconCls); -}else{ -_2e7.removeClass("tabs-with-icon"); -} -if(_2e6!=opts.title){ -for(var i=0;i<_2e5.length;i++){ -if(_2e5[i]==_2e6){ -_2e5[i]=opts.title; -} -} -} -tab.find("span.tabs-p-tool").remove(); -if(opts.tools){ -var _2ea=$("").insertAfter(tab.find("a.tabs-inner")); -if(typeof opts.tools=="string"){ -$(opts.tools).children().appendTo(_2ea); -}else{ -for(var i=0;i").appendTo(_2ea); -t.addClass(opts.tools[i].iconCls); -if(opts.tools[i].handler){ -t.bind("click",{handler:opts.tools[i].handler},function(e){ -if($(this).parents("li").hasClass("tabs-disabled")){ -return; -} -e.data.handler.call(this); -}); -} -} -} -var pr=_2ea.children().length*12; -if(opts.closable){ -pr+=8; -}else{ -pr-=3; -_2ea.css("right","5px"); -} -_2e7.css("padding-right",pr+"px"); -} -_2bb(_2e3); -$.data(_2e3,"tabs").options.onUpdate.call(_2e3,opts.title,_2dd(_2e3,pp)); -}; -function _2eb(_2ec,_2ed){ -var opts=$.data(_2ec,"tabs").options; -var tabs=$.data(_2ec,"tabs").tabs; -var _2ee=$.data(_2ec,"tabs").selectHis; -if(!_2ef(_2ec,_2ed)){ -return; -} -var tab=_2f0(_2ec,_2ed); -var _2f1=tab.panel("options").title; -var _2f2=_2dd(_2ec,tab); -if(opts.onBeforeClose.call(_2ec,_2f1,_2f2)==false){ -return; -} -var tab=_2f0(_2ec,_2ed,true); -tab.panel("options").tab.remove(); -tab.panel("destroy"); -opts.onClose.call(_2ec,_2f1,_2f2); -_2bb(_2ec); -for(var i=0;i<_2ee.length;i++){ -if(_2ee[i]==_2f1){ -_2ee.splice(i,1); -i--; -} -} -var _2f3=_2ee.pop(); -if(_2f3){ -_2e1(_2ec,_2f3); -}else{ -if(tabs.length){ -_2e1(_2ec,0); -} -} -}; -function _2f0(_2f4,_2f5,_2f6){ -var tabs=$.data(_2f4,"tabs").tabs; -if(typeof _2f5=="number"){ -if(_2f5<0||_2f5>=tabs.length){ -return null; -}else{ -var tab=tabs[_2f5]; -if(_2f6){ -tabs.splice(_2f5,1); -} -return tab; -} -} -for(var i=0;idiv.tabs-header>div.tabs-wrap"); -var left=tab.position().left; -var _301=left+tab.outerWidth(); -if(left<0||_301>wrap.width()){ -var _302=left-(wrap.width()-tab.width())/2; -$(_2fb).tabs("scrollBy",_302); -}else{ -$(_2fb).tabs("scrollBy",0); -} -_2cc(_2fb); -opts.onSelect.call(_2fb,_300,_2dd(_2fb,_2fe)); -}; -function _2ef(_303,_304){ -return _2f0(_303,_304)!=null; -}; -$.fn.tabs=function(_305,_306){ -if(typeof _305=="string"){ -return $.fn.tabs.methods[_305](this,_306); -} -_305=_305||{}; -return this.each(function(){ -var _307=$.data(this,"tabs"); -var opts; -if(_307){ -opts=$.extend(_307.options,_305); -_307.options=opts; -}else{ -$.data(this,"tabs",{options:$.extend({},$.fn.tabs.defaults,$.fn.tabs.parseOptions(this),_305),tabs:[],selectHis:[]}); -_2d2(this); -} -_2c2(this); -_2d5(this); -_2c6(this); -_2f9(this); -}); -}; -$.fn.tabs.methods={options:function(jq){ -return $.data(jq[0],"tabs").options; -},tabs:function(jq){ -return $.data(jq[0],"tabs").tabs; -},resize:function(jq){ -return jq.each(function(){ -_2c6(this); -_2cc(this); -}); -},add:function(jq,_308){ -return jq.each(function(){ -_2de(this,_308); -}); -},close:function(jq,_309){ -return jq.each(function(){ -_2eb(this,_309); -}); -},getTab:function(jq,_30a){ -return _2f0(jq[0],_30a); -},getTabIndex:function(jq,tab){ -return _2dd(jq[0],tab); -},getSelected:function(jq){ -return _2ce(jq[0]); -},select:function(jq,_30b){ -return jq.each(function(){ -_2e1(this,_30b); -}); -},exists:function(jq,_30c){ -return _2ef(jq[0],_30c); -},update:function(jq,_30d){ -return jq.each(function(){ -_2e2(this,_30d); -}); -},enableTab:function(jq,_30e){ -return jq.each(function(){ -$(this).tabs("getTab",_30e).panel("options").tab.removeClass("tabs-disabled"); -}); -},disableTab:function(jq,_30f){ -return jq.each(function(){ -$(this).tabs("getTab",_30f).panel("options").tab.addClass("tabs-disabled"); -}); -},scrollBy:function(jq,_310){ -return jq.each(function(){ -var opts=$(this).tabs("options"); -var wrap=$(this).find(">div.tabs-header>div.tabs-wrap"); -var pos=Math.min(wrap._scrollLeft()+_310,_311()); -wrap.animate({scrollLeft:pos},opts.scrollDuration); -function _311(){ -var w=0; -var ul=wrap.children("ul"); -ul.children("li").each(function(){ -w+=$(this).outerWidth(true); -}); -return w-wrap.width()+(ul.outerWidth()-ul.width()); -}; -}); -}}; -$.fn.tabs.parseOptions=function(_312){ -return $.extend({},$.parser.parseOptions(_312,["width","height","tools","toolPosition","tabPosition",{fit:"boolean",border:"boolean",plain:"boolean",headerWidth:"number"}])); -}; -$.fn.tabs.defaults={width:"auto",height:"auto",headerWidth:150,plain:false,fit:false,border:true,tools:null,toolPosition:"right",tabPosition:"top",scrollIncrement:100,scrollDuration:400,onLoad:function(_313){ -},onSelect:function(_314,_315){ -},onBeforeClose:function(_316,_317){ -},onClose:function(_318,_319){ -},onAdd:function(_31a,_31b){ -},onUpdate:function(_31c,_31d){ -},onContextMenu:function(e,_31e,_31f){ -}}; -})(jQuery); -(function($){ -var _320=false; -function _321(_322){ -var _323=$.data(_322,"layout"); -var opts=_323.options; -var _324=_323.panels; -var cc=$(_322); -if(_322.tagName=="BODY"){ -cc._fit(); -}else{ -opts.fit?cc.css(cc._fit()):cc._fit(false); -} -var cpos={top:0,left:0,width:cc.width(),height:cc.height()}; -function _325(pp){ -if(pp.length==0){ -return; -} -var opts=pp.panel("options"); -var _326=Math.min(Math.max(opts.height,opts.minHeight),opts.maxHeight); -pp.panel("resize",{width:cc.width(),height:_326,left:0,top:0}); -cpos.top+=_326; -cpos.height-=_326; -}; -if(_32d(_324.expandNorth)){ -_325(_324.expandNorth); -}else{ -_325(_324.north); -} -function _327(pp){ -if(pp.length==0){ -return; -} -var opts=pp.panel("options"); -var _328=Math.min(Math.max(opts.height,opts.minHeight),opts.maxHeight); -pp.panel("resize",{width:cc.width(),height:_328,left:0,top:cc.height()-_328}); -cpos.height-=_328; -}; -if(_32d(_324.expandSouth)){ -_327(_324.expandSouth); -}else{ -_327(_324.south); -} -function _329(pp){ -if(pp.length==0){ -return; -} -var opts=pp.panel("options"); -var _32a=Math.min(Math.max(opts.width,opts.minWidth),opts.maxWidth); -pp.panel("resize",{width:_32a,height:cpos.height,left:cc.width()-_32a,top:cpos.top}); -cpos.width-=_32a; -}; -if(_32d(_324.expandEast)){ -_329(_324.expandEast); -}else{ -_329(_324.east); -} -function _32b(pp){ -if(pp.length==0){ -return; -} -var opts=pp.panel("options"); -var _32c=Math.min(Math.max(opts.width,opts.minWidth),opts.maxWidth); -pp.panel("resize",{width:_32c,height:cpos.height,left:0,top:cpos.top}); -cpos.left+=_32c; -cpos.width-=_32c; -}; -if(_32d(_324.expandWest)){ -_32b(_324.expandWest); -}else{ -_32b(_324.west); -} -_324.center.panel("resize",cpos); -}; -function init(_32e){ -var cc=$(_32e); -cc.addClass("layout"); -function _32f(cc){ -cc.children("div").each(function(){ -var opts=$.parser.parseOptions(this,["region",{split:"boolean",minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number"}]); -var r=opts.region; -if(r=="north"||r=="south"||r=="east"||r=="west"||r=="center"){ -_331(_32e,opts,this); -} -}); -}; -cc.children("form").length?_32f(cc.children("form")):_32f(cc); -$("
              ").appendTo(cc); -$("
              ").appendTo(cc); -cc.bind("_resize",function(e,_330){ -var opts=$.data(_32e,"layout").options; -if(opts.fit==true||_330){ -_321(_32e); -} -return false; -}); -}; -function _331(_332,_333,el){ -_333.region=_333.region||"center"; -var _334=$.data(_332,"layout").panels; -var cc=$(_332); -var dir=_333.region; -if(_334[dir].length){ -return; -} -var pp=$(el); -if(!pp.length){ -pp=$("
              ").appendTo(cc); -} -pp.panel($.extend({minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000},{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),doSize:false,collapsible:true,cls:("layout-panel layout-panel-"+dir),bodyCls:"layout-body",onOpen:function(){ -var tool=$(this).panel("header").children("div.panel-tool"); -tool.children("a.panel-tool-collapse").hide(); -var _335={north:"up",south:"down",east:"right",west:"left"}; -if(!_335[dir]){ -return; -} -var _336="layout-button-"+_335[dir]; -var t=tool.children("a."+_336); -if(!t.length){ -t=$("").addClass(_336).appendTo(tool); -t.bind("click",{dir:dir},function(e){ -_342(_332,e.data.dir); -return false; -}); -} -$(this).panel("options").collapsible?t.show():t.hide(); -}},_333)); -_334[dir]=pp; -if(pp.panel("options").split){ -var _337=pp.panel("panel"); -_337.addClass("layout-split-"+dir); -var _338=""; -if(dir=="north"){ -_338="s"; -} -if(dir=="south"){ -_338="n"; -} -if(dir=="east"){ -_338="w"; -} -if(dir=="west"){ -_338="e"; -} -_337.resizable($.extend({},{handles:_338,onStartResize:function(e){ -_320=true; -if(dir=="north"||dir=="south"){ -var _339=$(">div.layout-split-proxy-v",_332); -}else{ -var _339=$(">div.layout-split-proxy-h",_332); -} -var top=0,left=0,_33a=0,_33b=0; -var pos={display:"block"}; -if(dir=="north"){ -pos.top=parseInt(_337.css("top"))+_337.outerHeight()-_339.height(); -pos.left=parseInt(_337.css("left")); -pos.width=_337.outerWidth(); -pos.height=_339.height(); -}else{ -if(dir=="south"){ -pos.top=parseInt(_337.css("top")); -pos.left=parseInt(_337.css("left")); -pos.width=_337.outerWidth(); -pos.height=_339.height(); -}else{ -if(dir=="east"){ -pos.top=parseInt(_337.css("top"))||0; -pos.left=parseInt(_337.css("left"))||0; -pos.width=_339.width(); -pos.height=_337.outerHeight(); -}else{ -if(dir=="west"){ -pos.top=parseInt(_337.css("top"))||0; -pos.left=_337.outerWidth()-_339.width(); -pos.width=_339.width(); -pos.height=_337.outerHeight(); -} -} -} -} -_339.css(pos); -$("
              ").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc); -},onResize:function(e){ -if(dir=="north"||dir=="south"){ -var _33c=$(">div.layout-split-proxy-v",_332); -_33c.css("top",e.pageY-$(_332).offset().top-_33c.height()/2); -}else{ -var _33c=$(">div.layout-split-proxy-h",_332); -_33c.css("left",e.pageX-$(_332).offset().left-_33c.width()/2); -} -return false; -},onStopResize:function(){ -$(">div.layout-split-proxy-v",_332).css("display","none"); -$(">div.layout-split-proxy-h",_332).css("display","none"); -var opts=pp.panel("options"); -opts.width=_337.outerWidth(); -opts.height=_337.outerHeight(); -opts.left=_337.css("left"); -opts.top=_337.css("top"); -pp.panel("resize"); -_321(_332); -_320=false; -cc.find(">div.layout-mask").remove(); -}},_333)); -} -}; -function _33d(_33e,_33f){ -var _340=$.data(_33e,"layout").panels; -if(_340[_33f].length){ -_340[_33f].panel("destroy"); -_340[_33f]=$(); -var _341="expand"+_33f.substring(0,1).toUpperCase()+_33f.substring(1); -if(_340[_341]){ -_340[_341].panel("destroy"); -_340[_341]=undefined; -} -} -}; -function _342(_343,_344,_345){ -if(_345==undefined){ -_345="normal"; -} -var _346=$.data(_343,"layout").panels; -var p=_346[_344]; -if(p.panel("options").onBeforeCollapse.call(p)==false){ -return; -} -var _347="expand"+_344.substring(0,1).toUpperCase()+_344.substring(1); -if(!_346[_347]){ -_346[_347]=_348(_344); -_346[_347].panel("panel").click(function(){ -var _349=_34a(); -p.panel("expand",false).panel("open").panel("resize",_349.collapse); -p.panel("panel").animate(_349.expand,_345,function(){ -$(this).unbind(".layout").bind("mouseleave.layout",{region:_344},function(e){ -if(_320==true){ -return; -} -_342(_343,e.data.region); -}); -}); -return false; -}); -} -var _34b=_34a(); -if(!_32d(_346[_347])){ -_346.center.panel("resize",_34b.resizeC); -} -p.panel("panel").animate(_34b.collapse,_345,function(){ -p.panel("collapse",false).panel("close"); -_346[_347].panel("open").panel("resize",_34b.expandP); -$(this).unbind(".layout"); -}); -function _348(dir){ -var icon; -if(dir=="east"){ -icon="layout-button-left"; -}else{ -if(dir=="west"){ -icon="layout-button-right"; -}else{ -if(dir=="north"){ -icon="layout-button-down"; -}else{ -if(dir=="south"){ -icon="layout-button-up"; -} -} -} -} -var p=$("
              ").appendTo(_343).panel({cls:"layout-expand",title:" ",closed:true,doSize:false,tools:[{iconCls:icon,handler:function(){ -_34c(_343,_344); -return false; -}}]}); -p.panel("panel").hover(function(){ -$(this).addClass("layout-expand-over"); -},function(){ -$(this).removeClass("layout-expand-over"); -}); -return p; -}; -function _34a(){ -var cc=$(_343); -if(_344=="east"){ -return {resizeC:{width:_346.center.panel("options").width+_346["east"].panel("options").width-28},expand:{left:cc.width()-_346["east"].panel("options").width},expandP:{top:_346["east"].panel("options").top,left:cc.width()-28,width:28,height:_346["center"].panel("options").height},collapse:{left:cc.width()}}; -}else{ -if(_344=="west"){ -return {resizeC:{width:_346.center.panel("options").width+_346["west"].panel("options").width-28,left:28},expand:{left:0},expandP:{left:0,top:_346["west"].panel("options").top,width:28,height:_346["center"].panel("options").height},collapse:{left:-_346["west"].panel("options").width}}; -}else{ -if(_344=="north"){ -var hh=cc.height()-28; -if(_32d(_346.expandSouth)){ -hh-=_346.expandSouth.panel("options").height; -}else{ -if(_32d(_346.south)){ -hh-=_346.south.panel("options").height; -} -} -_346.east.panel("resize",{top:28,height:hh}); -_346.west.panel("resize",{top:28,height:hh}); -if(_32d(_346.expandEast)){ -_346.expandEast.panel("resize",{top:28,height:hh}); -} -if(_32d(_346.expandWest)){ -_346.expandWest.panel("resize",{top:28,height:hh}); -} -return {resizeC:{top:28,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:28},collapse:{top:-_346["north"].panel("options").height}}; -}else{ -if(_344=="south"){ -var hh=cc.height()-28; -if(_32d(_346.expandNorth)){ -hh-=_346.expandNorth.panel("options").height; -}else{ -if(_32d(_346.north)){ -hh-=_346.north.panel("options").height; -} -} -_346.east.panel("resize",{height:hh}); -_346.west.panel("resize",{height:hh}); -if(_32d(_346.expandEast)){ -_346.expandEast.panel("resize",{height:hh}); -} -if(_32d(_346.expandWest)){ -_346.expandWest.panel("resize",{height:hh}); -} -return {resizeC:{height:hh},expand:{top:cc.height()-_346["south"].panel("options").height},expandP:{top:cc.height()-28,left:0,width:cc.width(),height:28},collapse:{top:cc.height()}}; -} -} -} -} -}; -}; -function _34c(_34d,_34e){ -var _34f=$.data(_34d,"layout").panels; -var _350=_351(); -var p=_34f[_34e]; -if(p.panel("options").onBeforeExpand.call(p)==false){ -return; -} -var _352="expand"+_34e.substring(0,1).toUpperCase()+_34e.substring(1); -_34f[_352].panel("close"); -p.panel("panel").stop(true,true); -p.panel("expand",false).panel("open").panel("resize",_350.collapse); -p.panel("panel").animate(_350.expand,function(){ -_321(_34d); -}); -function _351(){ -var cc=$(_34d); -if(_34e=="east"&&_34f.expandEast){ -return {collapse:{left:cc.width()},expand:{left:cc.width()-_34f["east"].panel("options").width}}; -}else{ -if(_34e=="west"&&_34f.expandWest){ -return {collapse:{left:-_34f["west"].panel("options").width},expand:{left:0}}; -}else{ -if(_34e=="north"&&_34f.expandNorth){ -return {collapse:{top:-_34f["north"].panel("options").height},expand:{top:0}}; -}else{ -if(_34e=="south"&&_34f.expandSouth){ -return {collapse:{top:cc.height()},expand:{top:cc.height()-_34f["south"].panel("options").height}}; -} -} -} -} -}; -}; -function _32d(pp){ -if(!pp){ -return false; -} -if(pp.length){ -return pp.panel("panel").is(":visible"); -}else{ -return false; -} -}; -function _353(_354){ -var _355=$.data(_354,"layout").panels; -if(_355.east.length&&_355.east.panel("options").collapsed){ -_342(_354,"east",0); -} -if(_355.west.length&&_355.west.panel("options").collapsed){ -_342(_354,"west",0); -} -if(_355.north.length&&_355.north.panel("options").collapsed){ -_342(_354,"north",0); -} -if(_355.south.length&&_355.south.panel("options").collapsed){ -_342(_354,"south",0); -} -}; -$.fn.layout=function(_356,_357){ -if(typeof _356=="string"){ -return $.fn.layout.methods[_356](this,_357); -} -_356=_356||{}; -return this.each(function(){ -var _358=$.data(this,"layout"); -if(_358){ -$.extend(_358.options,_356); -}else{ -var opts=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_356); -$.data(this,"layout",{options:opts,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}}); -init(this); -} -_321(this); -_353(this); -}); -}; -$.fn.layout.methods={resize:function(jq){ -return jq.each(function(){ -_321(this); -}); -},panel:function(jq,_359){ -return $.data(jq[0],"layout").panels[_359]; -},collapse:function(jq,_35a){ -return jq.each(function(){ -_342(this,_35a); -}); -},expand:function(jq,_35b){ -return jq.each(function(){ -_34c(this,_35b); -}); -},add:function(jq,_35c){ -return jq.each(function(){ -_331(this,_35c); -_321(this); -if($(this).layout("panel",_35c.region).panel("options").collapsed){ -_342(this,_35c.region,0); -} -}); -},remove:function(jq,_35d){ -return jq.each(function(){ -_33d(this,_35d); -_321(this); -}); -}}; -$.fn.layout.parseOptions=function(_35e){ -return $.extend({},$.parser.parseOptions(_35e,[{fit:"boolean"}])); -}; -$.fn.layout.defaults={fit:false}; -})(jQuery); -(function($){ -function init(_35f){ -$(_35f).appendTo("body"); -$(_35f).addClass("menu-top"); -$(document).unbind(".menu").bind("mousedown.menu",function(e){ -var _360=$("body>div.menu:visible"); -var m=$(e.target).closest("div.menu",_360); -if(m.length){ -return; -} -$("body>div.menu-top:visible").menu("hide"); -}); -var _361=_362($(_35f)); -for(var i=0;i<_361.length;i++){ -_363(_361[i]); -} -function _362(menu){ -var _364=[]; -menu.addClass("menu"); -_364.push(menu); -if(!menu.hasClass("menu-content")){ -menu.children("div").each(function(){ -var _365=$(this).children("div"); -if(_365.length){ -_365.insertAfter(_35f); -this.submenu=_365; -var mm=_362(_365); -_364=_364.concat(mm); -} -}); -} -return _364; -}; -function _363(menu){ -var _366=$.parser.parseOptions(menu[0],["width"]).width; -if(menu.hasClass("menu-content")){ -menu[0].originalWidth=_366||menu._outerWidth(); -}else{ -menu[0].originalWidth=_366||0; -menu.children("div").each(function(){ -var item=$(this); -if(item.hasClass("menu-sep")){ -}else{ -var _367=$.extend({},$.parser.parseOptions(this,["name","iconCls","href"]),{disabled:(item.attr("disabled")?true:undefined)}); -item.attr("name",_367.name||"").attr("href",_367.href||""); -var text=item.addClass("menu-item").html(); -item.empty().append($("
              ").html(text)); -if(_367.iconCls){ -$("
              ").addClass(_367.iconCls).appendTo(item); -} -if(_367.disabled){ -_368(_35f,item[0],true); -} -if(item[0].submenu){ -$("
              ").appendTo(item); -} -_369(_35f,item); -} -}); -$("
              ").prependTo(menu); -} -_36a(_35f,menu); -menu.hide(); -_36b(_35f,menu); -}; -}; -function _36a(_36c,menu){ -var opts=$.data(_36c,"menu").options; -var d=menu.css("display"); -menu.css({display:"block",left:-10000}); -menu.find("div.menu-item")._outerHeight(22); -var _36d=0; -menu.find("div.menu-text").each(function(){ -if(_36d<$(this)._outerWidth()){ -_36d=$(this)._outerWidth(); -} -}); -_36d+=65; -menu._outerWidth(Math.max((menu[0].originalWidth||0),_36d,opts.minWidth)); -menu.css("display",d); -}; -function _36b(_36e,menu){ -var _36f=$.data(_36e,"menu"); -menu.unbind(".menu").bind("mouseenter.menu",function(){ -if(_36f.timer){ -clearTimeout(_36f.timer); -_36f.timer=null; -} -}).bind("mouseleave.menu",function(){ -_36f.timer=setTimeout(function(){ -_370(_36e); -},100); -}); -}; -function _369(_371,item){ -item.unbind(".menu"); -item.bind("click.menu",function(){ -if($(this).hasClass("menu-item-disabled")){ -return; -} -if(!this.submenu){ -_370(_371); -var href=$(this).attr("href"); -if(href){ -location.href=href; -} -} -var item=$(_371).menu("getItem",this); -$.data(_371,"menu").options.onClick.call(_371,item); -}).bind("mouseenter.menu",function(e){ -item.siblings().each(function(){ -if(this.submenu){ -_374(this.submenu); -} -$(this).removeClass("menu-active"); -}); -item.addClass("menu-active"); -if($(this).hasClass("menu-item-disabled")){ -item.addClass("menu-active-disabled"); -return; -} -var _372=item[0].submenu; -if(_372){ -$(_371).menu("show",{menu:_372,parent:item}); -} -}).bind("mouseleave.menu",function(e){ -item.removeClass("menu-active menu-active-disabled"); -var _373=item[0].submenu; -if(_373){ -if(e.pageX>=parseInt(_373.css("left"))){ -item.addClass("menu-active"); -}else{ -_374(_373); -} -}else{ -item.removeClass("menu-active"); -} -}); -}; -function _370(_375){ -var _376=$.data(_375,"menu"); -if(_376){ -if($(_375).is(":visible")){ -_374($(_375)); -_376.options.onHide.call(_375); -} -} -return false; -}; -function _377(_378,_379){ -var left,top; -var menu=$(_379.menu||_378); -if(menu.hasClass("menu-top")){ -var opts=$.data(_378,"menu").options; -left=opts.left; -top=opts.top; -if(_379.alignTo){ -var at=$(_379.alignTo); -left=at.offset().left; -top=at.offset().top+at._outerHeight(); -} -if(_379.left!=undefined){ -left=_379.left; -} -if(_379.top!=undefined){ -top=_379.top; -} -if(left+menu.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ -left=$(window)._outerWidth()+$(document).scrollLeft()-menu.outerWidth()-5; -} -if(top+menu.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ -top-=menu.outerHeight(); -} -}else{ -var _37a=_379.parent; -left=_37a.offset().left+_37a.outerWidth()-2; -if(left+menu.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){ -left=_37a.offset().left-menu.outerWidth()+2; -} -var top=_37a.offset().top-3; -if(top+menu.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ -top=$(window)._outerHeight()+$(document).scrollTop()-menu.outerHeight()-5; -} -} -menu.css({left:left,top:top}); -menu.show(0,function(){ -if(!menu[0].shadow){ -menu[0].shadow=$("
              ").insertAfter(menu); -} -menu[0].shadow.css({display:"block",zIndex:$.fn.menu.defaults.zIndex++,left:menu.css("left"),top:menu.css("top"),width:menu.outerWidth(),height:menu.outerHeight()}); -menu.css("z-index",$.fn.menu.defaults.zIndex++); -if(menu.hasClass("menu-top")){ -$.data(menu[0],"menu").options.onShow.call(menu[0]); -} -}); -}; -function _374(menu){ -if(!menu){ -return; -} -_37b(menu); -menu.find("div.menu-item").each(function(){ -if(this.submenu){ -_374(this.submenu); -} -$(this).removeClass("menu-active"); -}); -function _37b(m){ -m.stop(true,true); -if(m[0].shadow){ -m[0].shadow.hide(); -} -m.hide(); -}; -}; -function _37c(_37d,text){ -var _37e=null; -var tmp=$("
              "); -function find(menu){ -menu.children("div.menu-item").each(function(){ -var item=$(_37d).menu("getItem",this); -var s=tmp.empty().html(item.text).text(); -if(text==$.trim(s)){ -_37e=item; -}else{ -if(this.submenu&&!_37e){ -find(this.submenu); -} -} -}); -}; -find($(_37d)); -tmp.remove(); -return _37e; -}; -function _368(_37f,_380,_381){ -var t=$(_380); -if(_381){ -t.addClass("menu-item-disabled"); -if(_380.onclick){ -_380.onclick1=_380.onclick; -_380.onclick=null; -} -}else{ -t.removeClass("menu-item-disabled"); -if(_380.onclick1){ -_380.onclick=_380.onclick1; -_380.onclick1=null; -} -} -}; -function _382(_383,_384){ -var menu=$(_383); -if(_384.parent){ -if(!_384.parent.submenu){ -var _385=$("
              ").appendTo("body"); -_385.hide(); -_384.parent.submenu=_385; -$("
              ").appendTo(_384.parent); -} -menu=_384.parent.submenu; -} -var item=$("
              ").appendTo(menu); -$("
              ").html(_384.text).appendTo(item); -if(_384.iconCls){ -$("
              ").addClass(_384.iconCls).appendTo(item); -} -if(_384.id){ -item.attr("id",_384.id); -} -if(_384.href){ -item.attr("href",_384.href); -} -if(_384.name){ -item.attr("name",_384.name); -} -if(_384.onclick){ -if(typeof _384.onclick=="string"){ -item.attr("onclick",_384.onclick); -}else{ -item[0].onclick=eval(_384.onclick); -} -} -if(_384.handler){ -item[0].onclick=eval(_384.handler); -} -_369(_383,item); -if(_384.disabled){ -_368(_383,item[0],true); -} -_36b(_383,menu); -_36a(_383,menu); -}; -function _386(_387,_388){ -function _389(el){ -if(el.submenu){ -el.submenu.children("div.menu-item").each(function(){ -_389(this); -}); -var _38a=el.submenu[0].shadow; -if(_38a){ -_38a.remove(); -} -el.submenu.remove(); -} -$(el).remove(); -}; -_389(_388); -}; -function _38b(_38c){ -$(_38c).children("div.menu-item").each(function(){ -_386(_38c,this); -}); -if(_38c.shadow){ -_38c.shadow.remove(); -} -$(_38c).remove(); -}; -$.fn.menu=function(_38d,_38e){ -if(typeof _38d=="string"){ -return $.fn.menu.methods[_38d](this,_38e); -} -_38d=_38d||{}; -return this.each(function(){ -var _38f=$.data(this,"menu"); -if(_38f){ -$.extend(_38f.options,_38d); -}else{ -_38f=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_38d)}); -init(this); -} -$(this).css({left:_38f.options.left,top:_38f.options.top}); -}); -}; -$.fn.menu.methods={options:function(jq){ -return $.data(jq[0],"menu").options; -},show:function(jq,pos){ -return jq.each(function(){ -_377(this,pos); -}); -},hide:function(jq){ -return jq.each(function(){ -_370(this); -}); -},destroy:function(jq){ -return jq.each(function(){ -_38b(this); -}); -},setText:function(jq,_390){ -return jq.each(function(){ -$(_390.target).children("div.menu-text").html(_390.text); -}); -},setIcon:function(jq,_391){ -return jq.each(function(){ -var item=$(this).menu("getItem",_391.target); -if(item.iconCls){ -$(item.target).children("div.menu-icon").removeClass(item.iconCls).addClass(_391.iconCls); -}else{ -$("
              ").addClass(_391.iconCls).appendTo(_391.target); -} -}); -},getItem:function(jq,_392){ -var t=$(_392); -var item={target:_392,id:t.attr("id"),text:$.trim(t.children("div.menu-text").html()),disabled:t.hasClass("menu-item-disabled"),href:t.attr("href"),name:t.attr("name"),onclick:_392.onclick}; -var icon=t.children("div.menu-icon"); -if(icon.length){ -var cc=[]; -var aa=icon.attr("class").split(" "); -for(var i=0;i "})); -if(opts.menu){ -$(opts.menu).menu({onShow:function(){ -btn.addClass((opts.plain==true)?"m-btn-plain-active":"m-btn-active"); -},onHide:function(){ -btn.removeClass((opts.plain==true)?"m-btn-plain-active":"m-btn-active"); -}}); -} -_399(_398,opts.disabled); -}; -function _399(_39a,_39b){ -var opts=$.data(_39a,"menubutton").options; -opts.disabled=_39b; -var btn=$(_39a); -if(_39b){ -btn.linkbutton("disable"); -btn.unbind(".menubutton"); -}else{ -btn.linkbutton("enable"); -btn.unbind(".menubutton"); -btn.bind("click.menubutton",function(){ -_39c(); -return false; -}); -var _39d=null; -btn.bind("mouseenter.menubutton",function(){ -_39d=setTimeout(function(){ -_39c(); -},opts.duration); -return false; -}).bind("mouseleave.menubutton",function(){ -if(_39d){ -clearTimeout(_39d); -} -}); -} -function _39c(){ -if(!opts.menu){ -return; -} -$("body>div.menu-top").menu("hide"); -$(opts.menu).menu("show",{alignTo:btn}); -btn.blur(); -}; -}; -$.fn.menubutton=function(_39e,_39f){ -if(typeof _39e=="string"){ -return $.fn.menubutton.methods[_39e](this,_39f); -} -_39e=_39e||{}; -return this.each(function(){ -var _3a0=$.data(this,"menubutton"); -if(_3a0){ -$.extend(_3a0.options,_39e); -}else{ -$.data(this,"menubutton",{options:$.extend({},$.fn.menubutton.defaults,$.fn.menubutton.parseOptions(this),_39e)}); -$(this).removeAttr("disabled"); -} -init(this); -}); -}; -$.fn.menubutton.methods={options:function(jq){ -return $.data(jq[0],"menubutton").options; -},enable:function(jq){ -return jq.each(function(){ -_399(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_399(this,true); -}); -},destroy:function(jq){ -return jq.each(function(){ -var opts=$(this).menubutton("options"); -if(opts.menu){ -$(opts.menu).menu("destroy"); -} -$(this).remove(); -}); -}}; -$.fn.menubutton.parseOptions=function(_3a1){ -var t=$(_3a1); -return $.extend({},$.fn.linkbutton.parseOptions(_3a1),$.parser.parseOptions(_3a1,["menu",{plain:"boolean",duration:"number"}])); -}; -$.fn.menubutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100}); -})(jQuery); -(function($){ -function init(_3a2){ -var opts=$.data(_3a2,"splitbutton").options; -var btn=$(_3a2); -btn.removeClass("s-btn-active s-btn-plain-active").addClass("s-btn"); -btn.linkbutton($.extend({},opts,{text:opts.text+" "})); -if(opts.menu){ -$(opts.menu).menu({onShow:function(){ -btn.addClass((opts.plain==true)?"s-btn-plain-active":"s-btn-active"); -},onHide:function(){ -btn.removeClass((opts.plain==true)?"s-btn-plain-active":"s-btn-active"); -}}); -} -_3a3(_3a2,opts.disabled); -}; -function _3a3(_3a4,_3a5){ -var opts=$.data(_3a4,"splitbutton").options; -opts.disabled=_3a5; -var btn=$(_3a4); -var _3a6=btn.find(".s-btn-downarrow"); -if(_3a5){ -btn.linkbutton("disable"); -_3a6.unbind(".splitbutton"); -}else{ -btn.linkbutton("enable"); -_3a6.unbind(".splitbutton"); -_3a6.bind("click.splitbutton",function(){ -_3a7(); -return false; -}); -var _3a8=null; -_3a6.bind("mouseenter.splitbutton",function(){ -_3a8=setTimeout(function(){ -_3a7(); -},opts.duration); -return false; -}).bind("mouseleave.splitbutton",function(){ -if(_3a8){ -clearTimeout(_3a8); -} -}); -} -function _3a7(){ -if(!opts.menu){ -return; -} -$("body>div.menu-top").menu("hide"); -$(opts.menu).menu("show",{alignTo:btn}); -btn.blur(); -}; -}; -$.fn.splitbutton=function(_3a9,_3aa){ -if(typeof _3a9=="string"){ -return $.fn.splitbutton.methods[_3a9](this,_3aa); -} -_3a9=_3a9||{}; -return this.each(function(){ -var _3ab=$.data(this,"splitbutton"); -if(_3ab){ -$.extend(_3ab.options,_3a9); -}else{ -$.data(this,"splitbutton",{options:$.extend({},$.fn.splitbutton.defaults,$.fn.splitbutton.parseOptions(this),_3a9)}); -$(this).removeAttr("disabled"); -} -init(this); -}); -}; -$.fn.splitbutton.methods={options:function(jq){ -return $.data(jq[0],"splitbutton").options; -},enable:function(jq){ -return jq.each(function(){ -_3a3(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_3a3(this,true); -}); -},destroy:function(jq){ -return jq.each(function(){ -var opts=$(this).splitbutton("options"); -if(opts.menu){ -$(opts.menu).menu("destroy"); -} -$(this).remove(); -}); -}}; -$.fn.splitbutton.parseOptions=function(_3ac){ -var t=$(_3ac); -return $.extend({},$.fn.linkbutton.parseOptions(_3ac),$.parser.parseOptions(_3ac,["menu",{plain:"boolean",duration:"number"}])); -}; -$.fn.splitbutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100}); -})(jQuery); -(function($){ -function init(_3ad){ -$(_3ad).hide(); -var span=$("").insertAfter(_3ad); -var _3ae=$("").appendTo(span); -$("").appendTo(span); -var name=$(_3ad).attr("name"); -if(name){ -_3ae.attr("name",name); -$(_3ad).removeAttr("name").attr("searchboxName",name); -} -return span; -}; -function _3af(_3b0,_3b1){ -var opts=$.data(_3b0,"searchbox").options; -var sb=$.data(_3b0,"searchbox").searchbox; -if(_3b1){ -opts.width=_3b1; -} -sb.appendTo("body"); -if(isNaN(opts.width)){ -opts.width=sb._outerWidth(); -} -var _3b2=sb.find("span.searchbox-button"); -var menu=sb.find("a.searchbox-menu"); -var _3b3=sb.find("input.searchbox-text"); -sb._outerWidth(opts.width)._outerHeight(opts.height); -_3b3._outerWidth(sb.width()-menu._outerWidth()-_3b2._outerWidth()); -_3b3.css({height:sb.height()+"px",lineHeight:sb.height()+"px"}); -menu._outerHeight(sb.height()); -_3b2._outerHeight(sb.height()); -var _3b4=menu.find("span.l-btn-left"); -_3b4._outerHeight(sb.height()); -_3b4.find("span.l-btn-text,span.m-btn-downarrow").css({height:_3b4.height()+"px",lineHeight:_3b4.height()+"px"}); -sb.insertAfter(_3b0); -}; -function _3b5(_3b6){ -var _3b7=$.data(_3b6,"searchbox"); -var opts=_3b7.options; -if(opts.menu){ -_3b7.menu=$(opts.menu).menu({onClick:function(item){ -_3b8(item); -}}); -var item=_3b7.menu.children("div.menu-item:first"); -_3b7.menu.children("div.menu-item").each(function(){ -var _3b9=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); -if(_3b9.selected){ -item=$(this); -return false; -} -}); -item.triggerHandler("click"); -}else{ -_3b7.searchbox.find("a.searchbox-menu").remove(); -_3b7.menu=null; -} -function _3b8(item){ -_3b7.searchbox.find("a.searchbox-menu").remove(); -var mb=$("").html(item.text); -mb.prependTo(_3b7.searchbox).menubutton({menu:_3b7.menu,iconCls:item.iconCls}); -_3b7.searchbox.find("input.searchbox-text").attr("name",$(item.target).attr("name")||item.text); -_3af(_3b6); -}; -}; -function _3ba(_3bb){ -var _3bc=$.data(_3bb,"searchbox"); -var opts=_3bc.options; -var _3bd=_3bc.searchbox.find("input.searchbox-text"); -var _3be=_3bc.searchbox.find(".searchbox-button"); -_3bd.unbind(".searchbox").bind("blur.searchbox",function(e){ -opts.value=$(this).val(); -if(opts.value==""){ -$(this).val(opts.prompt); -$(this).addClass("searchbox-prompt"); -}else{ -$(this).removeClass("searchbox-prompt"); -} -}).bind("focus.searchbox",function(e){ -if($(this).val()!=opts.value){ -$(this).val(opts.value); -} -$(this).removeClass("searchbox-prompt"); -}).bind("keydown.searchbox",function(e){ -if(e.keyCode==13){ -e.preventDefault(); -var name=$.fn.prop?_3bd.prop("name"):_3bd.attr("name"); -opts.value=$(this).val(); -opts.searcher.call(_3bb,opts.value,name); -return false; -} -}); -_3be.unbind(".searchbox").bind("click.searchbox",function(){ -var name=$.fn.prop?_3bd.prop("name"):_3bd.attr("name"); -opts.searcher.call(_3bb,opts.value,name); -}).bind("mouseenter.searchbox",function(){ -$(this).addClass("searchbox-button-hover"); -}).bind("mouseleave.searchbox",function(){ -$(this).removeClass("searchbox-button-hover"); -}); -}; -function _3bf(_3c0){ -var _3c1=$.data(_3c0,"searchbox"); -var opts=_3c1.options; -var _3c2=_3c1.searchbox.find("input.searchbox-text"); -if(opts.value==""){ -_3c2.val(opts.prompt); -_3c2.addClass("searchbox-prompt"); -}else{ -_3c2.val(opts.value); -_3c2.removeClass("searchbox-prompt"); -} -}; -$.fn.searchbox=function(_3c3,_3c4){ -if(typeof _3c3=="string"){ -return $.fn.searchbox.methods[_3c3](this,_3c4); -} -_3c3=_3c3||{}; -return this.each(function(){ -var _3c5=$.data(this,"searchbox"); -if(_3c5){ -$.extend(_3c5.options,_3c3); -}else{ -_3c5=$.data(this,"searchbox",{options:$.extend({},$.fn.searchbox.defaults,$.fn.searchbox.parseOptions(this),_3c3),searchbox:init(this)}); -} -_3b5(this); -_3bf(this); -_3ba(this); -_3af(this); -}); -}; -$.fn.searchbox.methods={options:function(jq){ -return $.data(jq[0],"searchbox").options; -},menu:function(jq){ -return $.data(jq[0],"searchbox").menu; -},textbox:function(jq){ -return $.data(jq[0],"searchbox").searchbox.find("input.searchbox-text"); -},getValue:function(jq){ -return $.data(jq[0],"searchbox").options.value; -},setValue:function(jq,_3c6){ -return jq.each(function(){ -$(this).searchbox("options").value=_3c6; -$(this).searchbox("textbox").val(_3c6); -$(this).searchbox("textbox").blur(); -}); -},getName:function(jq){ -return $.data(jq[0],"searchbox").searchbox.find("input.searchbox-text").attr("name"); -},selectName:function(jq,name){ -return jq.each(function(){ -var menu=$.data(this,"searchbox").menu; -if(menu){ -menu.children("div.menu-item[name=\""+name+"\"]").triggerHandler("click"); -} -}); -},destroy:function(jq){ -return jq.each(function(){ -var menu=$(this).searchbox("menu"); -if(menu){ -menu.menu("destroy"); -} -$.data(this,"searchbox").searchbox.remove(); -$(this).remove(); -}); -},resize:function(jq,_3c7){ -return jq.each(function(){ -_3af(this,_3c7); -}); -}}; -$.fn.searchbox.parseOptions=function(_3c8){ -var t=$(_3c8); -return $.extend({},$.parser.parseOptions(_3c8,["width","height","prompt","menu"]),{value:t.val(),searcher:(t.attr("searcher")?eval(t.attr("searcher")):undefined)}); -}; -$.fn.searchbox.defaults={width:"auto",height:22,prompt:"",value:"",menu:null,searcher:function(_3c9,name){ -}}; -})(jQuery); -(function($){ -function init(_3ca){ -$(_3ca).addClass("validatebox-text"); -}; -function _3cb(_3cc){ -var _3cd=$.data(_3cc,"validatebox"); -_3cd.validating=false; -$(_3cc).tooltip("destroy"); -$(_3cc).unbind(); -$(_3cc).remove(); -}; -function _3ce(_3cf){ -var box=$(_3cf); -var _3d0=$.data(_3cf,"validatebox"); -box.unbind(".validatebox").bind("focus.validatebox",function(){ -_3d0.validating=true; -_3d0.value=undefined; -(function(){ -if(_3d0.validating){ -if(_3d0.value!=box.val()){ -_3d0.value=box.val(); -if(_3d0.timer){ -clearTimeout(_3d0.timer); -} -_3d0.timer=setTimeout(function(){ -$(_3cf).validatebox("validate"); -},_3d0.options.delay); -}else{ -_3d5(_3cf); -} -setTimeout(arguments.callee,200); -} -})(); -}).bind("blur.validatebox",function(){ -if(_3d0.timer){ -clearTimeout(_3d0.timer); -_3d0.timer=undefined; -} -_3d0.validating=false; -_3d1(_3cf); -}).bind("mouseenter.validatebox",function(){ -if(box.hasClass("validatebox-invalid")){ -_3d2(_3cf); -} -}).bind("mouseleave.validatebox",function(){ -if(!_3d0.validating){ -_3d1(_3cf); -} -}); -}; -function _3d2(_3d3){ -var _3d4=$.data(_3d3,"validatebox"); -var opts=_3d4.options; -$(_3d3).tooltip($.extend({},opts.tipOptions,{content:_3d4.message,position:opts.tipPosition,deltaX:opts.deltaX})).tooltip("show"); -_3d4.tip=true; -}; -function _3d5(_3d6){ -var _3d7=$.data(_3d6,"validatebox"); -if(_3d7&&_3d7.tip){ -$(_3d6).tooltip("reposition"); -} -}; -function _3d1(_3d8){ -var _3d9=$.data(_3d8,"validatebox"); -_3d9.tip=false; -$(_3d8).tooltip("hide"); -}; -function _3da(_3db){ -var _3dc=$.data(_3db,"validatebox"); -var opts=_3dc.options; -var box=$(_3db); -var _3dd=box.val(); -function _3de(msg){ -_3dc.message=msg; -}; -function _3df(_3e0){ -var _3e1=/([a-zA-Z_]+)(.*)/.exec(_3e0); -var rule=opts.rules[_3e1[1]]; -if(rule&&_3dd){ -var _3e2=eval(_3e1[2]); -if(!rule["validator"](_3dd,_3e2)){ -box.addClass("validatebox-invalid"); -var _3e3=rule["message"]; -if(_3e2){ -for(var i=0;i<_3e2.length;i++){ -_3e3=_3e3.replace(new RegExp("\\{"+i+"\\}","g"),_3e2[i]); -} -} -_3de(opts.invalidMessage||_3e3); -if(_3dc.validating){ -_3d2(_3db); -} -return false; -} -} -return true; -}; -if(opts.required){ -if(_3dd==""){ -box.addClass("validatebox-invalid"); -_3de(opts.missingMessage); -if(_3dc.validating){ -_3d2(_3db); -} -return false; -} -} -if(opts.validType){ -if(typeof opts.validType=="string"){ -if(!_3df(opts.validType)){ -return false; -} -}else{ -for(var i=0;i=_3eb[0]&&len<=_3eb[1]; -},message:"Please enter a value between {0} and {1}."},remote:{validator:function(_3ec,_3ed){ -var data={}; -data[_3ed[1]]=_3ec; -var _3ee=$.ajax({url:_3ed[0],dataType:"json",data:data,async:false,cache:false,type:"post"}).responseText; -return _3ee=="true"; -},message:"Please fix this field."}}}; -})(jQuery); -(function($){ -function _3ef(_3f0,_3f1){ -_3f1=_3f1||{}; -var _3f2={}; -if(_3f1.onSubmit){ -if(_3f1.onSubmit.call(_3f0,_3f2)==false){ -return; -} -} -var form=$(_3f0); -if(_3f1.url){ -form.attr("action",_3f1.url); -} -var _3f3="easyui_frame_"+(new Date().getTime()); -var _3f4=$("").attr("src",window.ActiveXObject?"javascript:false":"about:blank").css({position:"absolute",top:-1000,left:-1000}); -var t=form.attr("target"),a=form.attr("action"); -form.attr("target",_3f3); -var _3f5=$(); -try{ -_3f4.appendTo("body"); -_3f4.bind("load",cb); -for(var n in _3f2){ -var f=$("").val(_3f2[n]).appendTo(form); -_3f5=_3f5.add(f); -} -form[0].submit(); -} -finally{ -form.attr("action",a); -t?form.attr("target",t):form.removeAttr("target"); -_3f5.remove(); -} -var _3f6=10; -function cb(){ -_3f4.unbind(); -var body=$("#"+_3f3).contents().find("body"); -var data=body.html(); -if(data==""){ -if(--_3f6){ -setTimeout(cb,100); -return; -} -return; -} -var ta=body.find(">textarea"); -if(ta.length){ -data=ta.val(); -}else{ -var pre=body.find(">pre"); -if(pre.length){ -data=pre.html(); -} -} -if(_3f1.success){ -_3f1.success(data); -} -setTimeout(function(){ -_3f4.unbind(); -_3f4.remove(); -},100); -}; -}; -function load(_3f7,data){ -if(!$.data(_3f7,"form")){ -$.data(_3f7,"form",{options:$.extend({},$.fn.form.defaults)}); -} -var opts=$.data(_3f7,"form").options; -if(typeof data=="string"){ -var _3f8={}; -if(opts.onBeforeLoad.call(_3f7,_3f8)==false){ -return; -} -$.ajax({url:data,data:_3f8,dataType:"json",success:function(data){ -_3f9(data); -},error:function(){ -opts.onLoadError.apply(_3f7,arguments); -}}); -}else{ -_3f9(data); -} -function _3f9(data){ -var form=$(_3f7); -for(var name in data){ -var val=data[name]; -var rr=_3fa(name,val); -if(!rr.length){ -var f=form.find("input[numberboxName=\""+name+"\"]"); -if(f.length){ -f.numberbox("setValue",val); -}else{ -$("input[name=\""+name+"\"]",form).val(val); -$("textarea[name=\""+name+"\"]",form).val(val); -$("select[name=\""+name+"\"]",form).val(val); -} -} -_3fb(name,val); -} -opts.onLoadSuccess.call(_3f7,data); -_3fe(_3f7); -}; -function _3fa(name,val){ -var rr=$(_3f7).find("input[name=\""+name+"\"][type=radio], input[name=\""+name+"\"][type=checkbox]"); -rr._propAttr("checked",false); -rr.each(function(){ -var f=$(this); -if(f.val()==String(val)||$.inArray(f.val(),val)>=0){ -f._propAttr("checked",true); -} -}); -return rr; -}; -function _3fb(name,val){ -var form=$(_3f7); -var cc=["combobox","combotree","combogrid","datetimebox","datebox","combo"]; -var c=form.find("[comboName=\""+name+"\"]"); -if(c.length){ -for(var i=0;i").insertAfter(_40b); -var name=$(_40b).attr("name"); -if(name){ -v.attr("name",name); -$(_40b).removeAttr("name").attr("numberboxName",name); -} -return v; -}; -function _40c(_40d){ -var opts=$.data(_40d,"numberbox").options; -var fn=opts.onChange; -opts.onChange=function(){ -}; -_40e(_40d,opts.parser.call(_40d,opts.value)); -opts.onChange=fn; -opts.originalValue=_40f(_40d); -}; -function _40f(_410){ -return $.data(_410,"numberbox").field.val(); -}; -function _40e(_411,_412){ -var _413=$.data(_411,"numberbox"); -var opts=_413.options; -var _414=_40f(_411); -_412=opts.parser.call(_411,_412); -opts.value=_412; -_413.field.val(_412); -$(_411).val(opts.formatter.call(_411,_412)); -if(_414!=_412){ -opts.onChange.call(_411,_412,_414); -} -}; -function _415(_416){ -var opts=$.data(_416,"numberbox").options; -$(_416).unbind(".numberbox").bind("keypress.numberbox",function(e){ -return opts.filter.call(_416,e); -}).bind("blur.numberbox",function(){ -_40e(_416,$(this).val()); -$(this).val(opts.formatter.call(_416,_40f(_416))); -}).bind("focus.numberbox",function(){ -var vv=_40f(_416); -if(vv!=opts.parser.call(_416,$(this).val())){ -$(this).val(opts.formatter.call(_416,vv)); -} -}); -}; -function _417(_418){ -if($.fn.validatebox){ -var opts=$.data(_418,"numberbox").options; -$(_418).validatebox(opts); -} -}; -function _419(_41a,_41b){ -var opts=$.data(_41a,"numberbox").options; -if(_41b){ -opts.disabled=true; -$(_41a).attr("disabled",true); -}else{ -opts.disabled=false; -$(_41a).removeAttr("disabled"); -} -}; -$.fn.numberbox=function(_41c,_41d){ -if(typeof _41c=="string"){ -var _41e=$.fn.numberbox.methods[_41c]; -if(_41e){ -return _41e(this,_41d); -}else{ -return this.validatebox(_41c,_41d); -} -} -_41c=_41c||{}; -return this.each(function(){ -var _41f=$.data(this,"numberbox"); -if(_41f){ -$.extend(_41f.options,_41c); -}else{ -_41f=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_41c),field:init(this)}); -$(this).removeAttr("disabled"); -$(this).css({imeMode:"disabled"}); -} -_419(this,_41f.options.disabled); -_415(this); -_417(this); -_40c(this); -}); -}; -$.fn.numberbox.methods={options:function(jq){ -return $.data(jq[0],"numberbox").options; -},destroy:function(jq){ -return jq.each(function(){ -$.data(this,"numberbox").field.remove(); -$(this).validatebox("destroy"); -$(this).remove(); -}); -},disable:function(jq){ -return jq.each(function(){ -_419(this,true); -}); -},enable:function(jq){ -return jq.each(function(){ -_419(this,false); -}); -},fix:function(jq){ -return jq.each(function(){ -_40e(this,$(this).val()); -}); -},setValue:function(jq,_420){ -return jq.each(function(){ -_40e(this,_420); -}); -},getValue:function(jq){ -return _40f(jq[0]); -},clear:function(jq){ -return jq.each(function(){ -var _421=$.data(this,"numberbox"); -_421.field.val(""); -$(this).val(""); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).numberbox("options"); -$(this).numberbox("setValue",opts.originalValue); -}); -}}; -$.fn.numberbox.parseOptions=function(_422){ -var t=$(_422); -return $.extend({},$.fn.validatebox.parseOptions(_422),$.parser.parseOptions(_422,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined),disabled:(t.attr("disabled")?true:undefined),value:(t.val()||undefined)}); -}; -$.fn.numberbox.defaults=$.extend({},$.fn.validatebox.defaults,{disabled:false,value:"",min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",filter:function(e){ -var opts=$(this).numberbox("options"); -if(e.which==45){ -return ($(this).val().indexOf("-")==-1?true:false); -} -var c=String.fromCharCode(e.which); -if(c==opts.decimalSeparator){ -return ($(this).val().indexOf(c)==-1?true:false); -}else{ -if(c==opts.groupSeparator){ -return true; -}else{ -if((e.which>=48&&e.which<=57&&e.ctrlKey==false&&e.shiftKey==false)||e.which==0||e.which==8){ -return true; -}else{ -if(e.ctrlKey==true&&(e.which==99||e.which==118)){ -return true; -}else{ -return false; -} -} -} -} -},formatter:function(_423){ -if(!_423){ -return _423; -} -_423=_423+""; -var opts=$(this).numberbox("options"); -var s1=_423,s2=""; -var dpos=_423.indexOf("."); -if(dpos>=0){ -s1=_423.substring(0,dpos); -s2=_423.substring(dpos+1,_423.length); -} -if(opts.groupSeparator){ -var p=/(\d+)(\d{3})/; -while(p.test(s1)){ -s1=s1.replace(p,"$1"+opts.groupSeparator+"$2"); -} -} -if(s2){ -return opts.prefix+s1+opts.decimalSeparator+s2+opts.suffix; -}else{ -return opts.prefix+s1+opts.suffix; -} -},parser:function(s){ -s=s+""; -var opts=$(this).numberbox("options"); -if(parseFloat(s)!=s){ -if(opts.prefix){ -s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.prefix),"g"),"")); -} -if(opts.suffix){ -s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.suffix),"g"),"")); -} -if(opts.groupSeparator){ -s=$.trim(s.replace(new RegExp("\\"+opts.groupSeparator,"g"),"")); -} -if(opts.decimalSeparator){ -s=$.trim(s.replace(new RegExp("\\"+opts.decimalSeparator,"g"),".")); -} -s=s.replace(/\s/g,""); -} -var val=parseFloat(s).toFixed(opts.precision); -if(isNaN(val)){ -val=""; -}else{ -if(typeof (opts.min)=="number"&&valopts.max){ -val=opts.max.toFixed(opts.precision); -} -} -} -return val; -},onChange:function(_424,_425){ -}}); -})(jQuery); -(function($){ -function _426(_427){ -var opts=$.data(_427,"calendar").options; -var t=$(_427); -if(opts.fit==true){ -var p=t.parent(); -opts.width=p.width(); -opts.height=p.height(); -} -var _428=t.find(".calendar-header"); -t._outerWidth(opts.width); -t._outerHeight(opts.height); -t.find(".calendar-body")._outerHeight(t.height()-_428._outerHeight()); -}; -function init(_429){ -$(_429).addClass("calendar").html("
              "+"
              "+"
              "+"
              "+"
              "+"
              "+"Aprial 2010"+"
              "+"
              "+"
              "+"
              "+"
              "+""+""+""+"
              "+"
              "+"
              "+"
              "+"
              "); -$(_429).find(".calendar-title span").hover(function(){ -$(this).addClass("calendar-menu-hover"); -},function(){ -$(this).removeClass("calendar-menu-hover"); -}).click(function(){ -var menu=$(_429).find(".calendar-menu"); -if(menu.is(":visible")){ -menu.hide(); -}else{ -_430(_429); -} -}); -$(".calendar-prevmonth,.calendar-nextmonth,.calendar-prevyear,.calendar-nextyear",_429).hover(function(){ -$(this).addClass("calendar-nav-hover"); -},function(){ -$(this).removeClass("calendar-nav-hover"); -}); -$(_429).find(".calendar-nextmonth").click(function(){ -_42a(_429,1); -}); -$(_429).find(".calendar-prevmonth").click(function(){ -_42a(_429,-1); -}); -$(_429).find(".calendar-nextyear").click(function(){ -_42d(_429,1); -}); -$(_429).find(".calendar-prevyear").click(function(){ -_42d(_429,-1); -}); -$(_429).bind("_resize",function(){ -var opts=$.data(_429,"calendar").options; -if(opts.fit==true){ -_426(_429); -} -return false; -}); -}; -function _42a(_42b,_42c){ -var opts=$.data(_42b,"calendar").options; -opts.month+=_42c; -if(opts.month>12){ -opts.year++; -opts.month=1; -}else{ -if(opts.month<1){ -opts.year--; -opts.month=12; -} -} -show(_42b); -var menu=$(_42b).find(".calendar-menu-month-inner"); -menu.find("td.calendar-selected").removeClass("calendar-selected"); -menu.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); -}; -function _42d(_42e,_42f){ -var opts=$.data(_42e,"calendar").options; -opts.year+=_42f; -show(_42e); -var menu=$(_42e).find(".calendar-menu-year"); -menu.val(opts.year); -}; -function _430(_431){ -var opts=$.data(_431,"calendar").options; -$(_431).find(".calendar-menu").show(); -if($(_431).find(".calendar-menu-month-inner").is(":empty")){ -$(_431).find(".calendar-menu-month-inner").empty(); -var t=$("
              ").appendTo($(_431).find(".calendar-menu-month-inner")); -var idx=0; -for(var i=0;i<3;i++){ -var tr=$("").appendTo(t); -for(var j=0;j<4;j++){ -$("").html(opts.months[idx++]).attr("abbr",idx).appendTo(tr); -} -} -$(_431).find(".calendar-menu-prev,.calendar-menu-next").hover(function(){ -$(this).addClass("calendar-menu-hover"); -},function(){ -$(this).removeClass("calendar-menu-hover"); -}); -$(_431).find(".calendar-menu-next").click(function(){ -var y=$(_431).find(".calendar-menu-year"); -if(!isNaN(y.val())){ -y.val(parseInt(y.val())+1); -} -}); -$(_431).find(".calendar-menu-prev").click(function(){ -var y=$(_431).find(".calendar-menu-year"); -if(!isNaN(y.val())){ -y.val(parseInt(y.val()-1)); -} -}); -$(_431).find(".calendar-menu-year").keypress(function(e){ -if(e.keyCode==13){ -_432(); -} -}); -$(_431).find(".calendar-menu-month").hover(function(){ -$(this).addClass("calendar-menu-hover"); -},function(){ -$(this).removeClass("calendar-menu-hover"); -}).click(function(){ -var menu=$(_431).find(".calendar-menu"); -menu.find(".calendar-selected").removeClass("calendar-selected"); -$(this).addClass("calendar-selected"); -_432(); -}); -} -function _432(){ -var menu=$(_431).find(".calendar-menu"); -var year=menu.find(".calendar-menu-year").val(); -var _433=menu.find(".calendar-selected").attr("abbr"); -if(!isNaN(year)){ -opts.year=parseInt(year); -opts.month=parseInt(_433); -show(_431); -} -menu.hide(); -}; -var body=$(_431).find(".calendar-body"); -var sele=$(_431).find(".calendar-menu"); -var _434=sele.find(".calendar-menu-year-inner"); -var _435=sele.find(".calendar-menu-month-inner"); -_434.find("input").val(opts.year).focus(); -_435.find("td.calendar-selected").removeClass("calendar-selected"); -_435.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); -sele._outerWidth(body._outerWidth()); -sele._outerHeight(body._outerHeight()); -_435._outerHeight(sele.height()-_434._outerHeight()); -}; -function _436(_437,year,_438){ -var opts=$.data(_437,"calendar").options; -var _439=[]; -var _43a=new Date(year,_438,0).getDate(); -for(var i=1;i<=_43a;i++){ -_439.push([year,_438,i]); -} -var _43b=[],week=[]; -var _43c=-1; -while(_439.length>0){ -var date=_439.shift(); -week.push(date); -var day=new Date(date[0],date[1]-1,date[2]).getDay(); -if(_43c==day){ -day=0; -}else{ -if(day==(opts.firstDay==0?7:opts.firstDay)-1){ -_43b.push(week); -week=[]; -} -} -_43c=day; -} -if(week.length){ -_43b.push(week); -} -var _43d=_43b[0]; -if(_43d.length<7){ -while(_43d.length<7){ -var _43e=_43d[0]; -var date=new Date(_43e[0],_43e[1]-1,_43e[2]-1); -_43d.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -}else{ -var _43e=_43d[0]; -var week=[]; -for(var i=1;i<=7;i++){ -var date=new Date(_43e[0],_43e[1]-1,_43e[2]-i); -week.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -_43b.unshift(week); -} -var _43f=_43b[_43b.length-1]; -while(_43f.length<7){ -var _440=_43f[_43f.length-1]; -var date=new Date(_440[0],_440[1]-1,_440[2]+1); -_43f.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -if(_43b.length<6){ -var _440=_43f[_43f.length-1]; -var week=[]; -for(var i=1;i<=7;i++){ -var date=new Date(_440[0],_440[1]-1,_440[2]+i); -week.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -_43b.push(week); -} -return _43b; -}; -function show(_441){ -var opts=$.data(_441,"calendar").options; -$(_441).find(".calendar-title span").html(opts.months[opts.month-1]+" "+opts.year); -var body=$(_441).find("div.calendar-body"); -body.find(">table").remove(); -var t=$("
              ").prependTo(body); -var tr=$("").appendTo(t.find("thead")); -for(var i=opts.firstDay;i"+opts.weeks[i]+""); -} -for(var i=0;i"+opts.weeks[i]+""); -} -var _442=_436(_441,opts.year,opts.month); -for(var i=0;i<_442.length;i++){ -var week=_442[i]; -var tr=$("").appendTo(t.find("tbody")); -for(var j=0;j").attr("abbr",day[0]+","+day[1]+","+day[2]).html(day[2]).appendTo(tr); -} -} -t.find("td[abbr^=\""+opts.year+","+opts.month+"\"]").removeClass("calendar-other-month"); -var now=new Date(); -var _443=now.getFullYear()+","+(now.getMonth()+1)+","+now.getDate(); -t.find("td[abbr=\""+_443+"\"]").addClass("calendar-today"); -if(opts.current){ -t.find(".calendar-selected").removeClass("calendar-selected"); -var _444=opts.current.getFullYear()+","+(opts.current.getMonth()+1)+","+opts.current.getDate(); -t.find("td[abbr=\""+_444+"\"]").addClass("calendar-selected"); -} -var _445=6-opts.firstDay; -var _446=_445+1; -if(_445>=7){ -_445-=7; -} -if(_446>=7){ -_446-=7; -} -t.find("tr").find("td:eq("+_445+")").addClass("calendar-saturday"); -t.find("tr").find("td:eq("+_446+")").addClass("calendar-sunday"); -t.find("td").hover(function(){ -$(this).addClass("calendar-hover"); -},function(){ -$(this).removeClass("calendar-hover"); -}).click(function(){ -t.find(".calendar-selected").removeClass("calendar-selected"); -$(this).addClass("calendar-selected"); -var _447=$(this).attr("abbr").split(","); -opts.current=new Date(_447[0],parseInt(_447[1])-1,_447[2]); -opts.onSelect.call(_441,opts.current); -}); -}; -$.fn.calendar=function(_448,_449){ -if(typeof _448=="string"){ -return $.fn.calendar.methods[_448](this,_449); -} -_448=_448||{}; -return this.each(function(){ -var _44a=$.data(this,"calendar"); -if(_44a){ -$.extend(_44a.options,_448); -}else{ -_44a=$.data(this,"calendar",{options:$.extend({},$.fn.calendar.defaults,$.fn.calendar.parseOptions(this),_448)}); -init(this); -} -if(_44a.options.border==false){ -$(this).addClass("calendar-noborder"); -} -_426(this); -show(this); -$(this).find("div.calendar-menu").hide(); -}); -}; -$.fn.calendar.methods={options:function(jq){ -return $.data(jq[0],"calendar").options; -},resize:function(jq){ -return jq.each(function(){ -_426(this); -}); -},moveTo:function(jq,date){ -return jq.each(function(){ -$(this).calendar({year:date.getFullYear(),month:date.getMonth()+1,current:date}); -}); -}}; -$.fn.calendar.parseOptions=function(_44b){ -var t=$(_44b); -return $.extend({},$.parser.parseOptions(_44b,["width","height",{firstDay:"number",fit:"boolean",border:"boolean"}])); -}; -$.fn.calendar.defaults={width:180,height:180,fit:false,border:true,firstDay:0,weeks:["S","M","T","W","T","F","S"],months:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],year:new Date().getFullYear(),month:new Date().getMonth()+1,current:new Date(),onSelect:function(date){ -}}; -})(jQuery); -(function($){ -function init(_44c){ -var _44d=$(""+""+""+""+""+"").insertAfter(_44c); -$(_44c).addClass("spinner-text spinner-f").prependTo(_44d); -return _44d; -}; -function _44e(_44f,_450){ -var opts=$.data(_44f,"spinner").options; -var _451=$.data(_44f,"spinner").spinner; -if(_450){ -opts.width=_450; -} -var _452=$("
              ").insertBefore(_451); -_451.appendTo("body"); -if(isNaN(opts.width)){ -opts.width=$(_44f).outerWidth(); -} -var _453=_451.find(".spinner-arrow"); -_451._outerWidth(opts.width)._outerHeight(opts.height); -$(_44f)._outerWidth(_451.width()-_453.outerWidth()); -$(_44f).css({height:_451.height()+"px",lineHeight:_451.height()+"px"}); -_453._outerHeight(_451.height()); -_453.find("span")._outerHeight(_453.height()/2); -_451.insertAfter(_452); -_452.remove(); -}; -function _454(_455){ -var opts=$.data(_455,"spinner").options; -var _456=$.data(_455,"spinner").spinner; -_456.find(".spinner-arrow-up,.spinner-arrow-down").unbind(".spinner"); -if(!opts.disabled){ -_456.find(".spinner-arrow-up").bind("mouseenter.spinner",function(){ -$(this).addClass("spinner-arrow-hover"); -}).bind("mouseleave.spinner",function(){ -$(this).removeClass("spinner-arrow-hover"); -}).bind("click.spinner",function(){ -opts.spin.call(_455,false); -opts.onSpinUp.call(_455); -$(_455).validatebox("validate"); -}); -_456.find(".spinner-arrow-down").bind("mouseenter.spinner",function(){ -$(this).addClass("spinner-arrow-hover"); -}).bind("mouseleave.spinner",function(){ -$(this).removeClass("spinner-arrow-hover"); -}).bind("click.spinner",function(){ -opts.spin.call(_455,true); -opts.onSpinDown.call(_455); -$(_455).validatebox("validate"); -}); -} -}; -function _457(_458,_459){ -var opts=$.data(_458,"spinner").options; -if(_459){ -opts.disabled=true; -$(_458).attr("disabled",true); -}else{ -opts.disabled=false; -$(_458).removeAttr("disabled"); -} -}; -$.fn.spinner=function(_45a,_45b){ -if(typeof _45a=="string"){ -var _45c=$.fn.spinner.methods[_45a]; -if(_45c){ -return _45c(this,_45b); -}else{ -return this.validatebox(_45a,_45b); -} -} -_45a=_45a||{}; -return this.each(function(){ -var _45d=$.data(this,"spinner"); -if(_45d){ -$.extend(_45d.options,_45a); -}else{ -_45d=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_45a),spinner:init(this)}); -$(this).removeAttr("disabled"); -} -_45d.options.originalValue=_45d.options.value; -$(this).val(_45d.options.value); -$(this).attr("readonly",!_45d.options.editable); -_457(this,_45d.options.disabled); -_44e(this); -$(this).validatebox(_45d.options); -_454(this); -}); -}; -$.fn.spinner.methods={options:function(jq){ -var opts=$.data(jq[0],"spinner").options; -return $.extend(opts,{value:jq.val()}); -},destroy:function(jq){ -return jq.each(function(){ -var _45e=$.data(this,"spinner").spinner; -$(this).validatebox("destroy"); -_45e.remove(); -}); -},resize:function(jq,_45f){ -return jq.each(function(){ -_44e(this,_45f); -}); -},enable:function(jq){ -return jq.each(function(){ -_457(this,false); -_454(this); -}); -},disable:function(jq){ -return jq.each(function(){ -_457(this,true); -_454(this); -}); -},getValue:function(jq){ -return jq.val(); -},setValue:function(jq,_460){ -return jq.each(function(){ -var opts=$.data(this,"spinner").options; -opts.value=_460; -$(this).val(_460); -}); -},clear:function(jq){ -return jq.each(function(){ -var opts=$.data(this,"spinner").options; -opts.value=""; -$(this).val(""); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).spinner("options"); -$(this).spinner("setValue",opts.originalValue); -}); -}}; -$.fn.spinner.parseOptions=function(_461){ -var t=$(_461); -return $.extend({},$.fn.validatebox.parseOptions(_461),$.parser.parseOptions(_461,["width","height","min","max",{increment:"number",editable:"boolean"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.spinner.defaults=$.extend({},$.fn.validatebox.defaults,{width:"auto",height:22,deltaX:19,value:"",min:null,max:null,increment:1,editable:true,disabled:false,spin:function(down){ -},onSpinUp:function(){ -},onSpinDown:function(){ -}}); -})(jQuery); -(function($){ -function _462(_463){ -$(_463).addClass("numberspinner-f"); -var opts=$.data(_463,"numberspinner").options; -$(_463).spinner(opts).numberbox(opts); -}; -function _464(_465,down){ -var opts=$.data(_465,"numberspinner").options; -var v=parseFloat($(_465).numberbox("getValue")||opts.value)||0; -if(down==true){ -v-=opts.increment; -}else{ -v+=opts.increment; -} -$(_465).numberbox("setValue",v); -}; -$.fn.numberspinner=function(_466,_467){ -if(typeof _466=="string"){ -var _468=$.fn.numberspinner.methods[_466]; -if(_468){ -return _468(this,_467); -}else{ -return this.spinner(_466,_467); -} -} -_466=_466||{}; -return this.each(function(){ -var _469=$.data(this,"numberspinner"); -if(_469){ -$.extend(_469.options,_466); -}else{ -$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_466)}); -} -_462(this); -}); -}; -$.fn.numberspinner.methods={options:function(jq){ -var opts=$.data(jq[0],"numberspinner").options; -return $.extend(opts,{value:jq.numberbox("getValue"),originalValue:jq.numberbox("options").originalValue}); -},setValue:function(jq,_46a){ -return jq.each(function(){ -$(this).numberbox("setValue",_46a); -}); -},getValue:function(jq){ -return jq.numberbox("getValue"); -},clear:function(jq){ -return jq.each(function(){ -$(this).spinner("clear"); -$(this).numberbox("clear"); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).numberspinner("options"); -$(this).numberspinner("setValue",opts.originalValue); -}); -}}; -$.fn.numberspinner.parseOptions=function(_46b){ -return $.extend({},$.fn.spinner.parseOptions(_46b),$.fn.numberbox.parseOptions(_46b),{}); -}; -$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(down){ -_464(this,down); -}}); -})(jQuery); -(function($){ -function _46c(_46d){ -var opts=$.data(_46d,"timespinner").options; -$(_46d).addClass("timespinner-f"); -$(_46d).spinner(opts); -$(_46d).unbind(".timespinner"); -$(_46d).bind("click.timespinner",function(){ -var _46e=0; -if(this.selectionStart!=null){ -_46e=this.selectionStart; -}else{ -if(this.createTextRange){ -var _46f=_46d.createTextRange(); -var s=document.selection.createRange(); -s.setEndPoint("StartToStart",_46f); -_46e=s.text.length; -} -} -if(_46e>=0&&_46e<=2){ -opts.highlight=0; -}else{ -if(_46e>=3&&_46e<=5){ -opts.highlight=1; -}else{ -if(_46e>=6&&_46e<=8){ -opts.highlight=2; -} -} -} -_471(_46d); -}).bind("blur.timespinner",function(){ -_470(_46d); -}); -}; -function _471(_472){ -var opts=$.data(_472,"timespinner").options; -var _473=0,end=0; -if(opts.highlight==0){ -_473=0; -end=2; -}else{ -if(opts.highlight==1){ -_473=3; -end=5; -}else{ -if(opts.highlight==2){ -_473=6; -end=8; -} -} -} -if(_472.selectionStart!=null){ -_472.setSelectionRange(_473,end); -}else{ -if(_472.createTextRange){ -var _474=_472.createTextRange(); -_474.collapse(); -_474.moveEnd("character",end); -_474.moveStart("character",_473); -_474.select(); -} -} -$(_472).focus(); -}; -function _475(_476,_477){ -var opts=$.data(_476,"timespinner").options; -if(!_477){ -return null; -} -var vv=_477.split(opts.separator); -for(var i=0;itime){ -time=_47a; -} -if(_47b&&_47b"]; -for(var i=0;i<_48e.length;i++){ -_48d.cache[_48e[i][0]]={width:_48e[i][1]}; -} -var _48f=0; -for(var s in _48d.cache){ -var item=_48d.cache[s]; -item.index=_48f++; -ss.push(s+"{width:"+item.width+"}"); -} -ss.push(""); -$(ss.join("\n")).appendTo(cc); -setTimeout(function(){ -cc.children("style:not(:last)").remove(); -},0); -},getRule:function(_490){ -var _491=cc.children("style:last")[0]; -var _492=_491.styleSheet?_491.styleSheet:(_491.sheet||document.styleSheets[document.styleSheets.length-1]); -var _493=_492.cssRules||_492.rules; -return _493[_490]; -},set:function(_494,_495){ -var item=_48d.cache[_494]; -if(item){ -item.width=_495; -var rule=this.getRule(item.index); -if(rule){ -rule.style["width"]=_495; -} -} -},remove:function(_496){ -var tmp=[]; -for(var s in _48d.cache){ -if(s.indexOf(_496)==-1){ -tmp.push([s,_48d.cache[s].width]); -} -} -_48d.cache={}; -this.add(tmp); -},dirty:function(_497){ -if(_497){ -_48d.dirty.push(_497); -} -},clean:function(){ -for(var i=0;i<_48d.dirty.length;i++){ -this.remove(_48d.dirty[i]); -} -_48d.dirty=[]; -}}; -}; -function _498(_499,_49a){ -var opts=$.data(_499,"datagrid").options; -var _49b=$.data(_499,"datagrid").panel; -if(_49a){ -if(_49a.width){ -opts.width=_49a.width; -} -if(_49a.height){ -opts.height=_49a.height; -} -} -if(opts.fit==true){ -var p=_49b.panel("panel").parent(); -opts.width=p.width(); -opts.height=p.height(); -} -_49b.panel("resize",{width:opts.width,height:opts.height}); -}; -function _49c(_49d){ -var opts=$.data(_49d,"datagrid").options; -var dc=$.data(_49d,"datagrid").dc; -var wrap=$.data(_49d,"datagrid").panel; -var _49e=wrap.width(); -var _49f=wrap.height(); -var view=dc.view; -var _4a0=dc.view1; -var _4a1=dc.view2; -var _4a2=_4a0.children("div.datagrid-header"); -var _4a3=_4a1.children("div.datagrid-header"); -var _4a4=_4a2.find("table"); -var _4a5=_4a3.find("table"); -view.width(_49e); -var _4a6=_4a2.children("div.datagrid-header-inner").show(); -_4a0.width(_4a6.find("table").width()); -if(!opts.showHeader){ -_4a6.hide(); -} -_4a1.width(_49e-_4a0._outerWidth()); -_4a0.children("div.datagrid-header,div.datagrid-body,div.datagrid-footer").width(_4a0.width()); -_4a1.children("div.datagrid-header,div.datagrid-body,div.datagrid-footer").width(_4a1.width()); -var hh; -_4a2.css("height",""); -_4a3.css("height",""); -_4a4.css("height",""); -_4a5.css("height",""); -hh=Math.max(_4a4.height(),_4a5.height()); -_4a4.height(hh); -_4a5.height(hh); -_4a2.add(_4a3)._outerHeight(hh); -if(opts.height!="auto"){ -var _4a7=_49f-_4a1.children("div.datagrid-header")._outerHeight()-_4a1.children("div.datagrid-footer")._outerHeight()-wrap.children("div.datagrid-toolbar")._outerHeight(); -wrap.children("div.datagrid-pager").each(function(){ -_4a7-=$(this)._outerHeight(); -}); -dc.body1.add(dc.body2).children("table.datagrid-btable-frozen").css({position:"absolute",top:dc.header2._outerHeight()}); -var _4a8=dc.body2.children("table.datagrid-btable-frozen")._outerHeight(); -_4a0.add(_4a1).children("div.datagrid-body").css({marginTop:_4a8,height:(_4a7-_4a8)}); -} -view.height(_4a1.height()); -}; -function _4a9(_4aa,_4ab,_4ac){ -var rows=$.data(_4aa,"datagrid").data.rows; -var opts=$.data(_4aa,"datagrid").options; -var dc=$.data(_4aa,"datagrid").dc; -if(!dc.body1.is(":empty")&&(!opts.nowrap||opts.autoRowHeight||_4ac)){ -if(_4ab!=undefined){ -var tr1=opts.finder.getTr(_4aa,_4ab,"body",1); -var tr2=opts.finder.getTr(_4aa,_4ab,"body",2); -_4ad(tr1,tr2); -}else{ -var tr1=opts.finder.getTr(_4aa,0,"allbody",1); -var tr2=opts.finder.getTr(_4aa,0,"allbody",2); -_4ad(tr1,tr2); -if(opts.showFooter){ -var tr1=opts.finder.getTr(_4aa,0,"allfooter",1); -var tr2=opts.finder.getTr(_4aa,0,"allfooter",2); -_4ad(tr1,tr2); -} -} -} -_49c(_4aa); -if(opts.height=="auto"){ -var _4ae=dc.body1.parent(); -var _4af=dc.body2; -var _4b0=_4b1(_4af); -var _4b2=_4b0.height; -if(_4b0.width>_4af.width()){ -_4b2+=18; -} -_4ae.height(_4b2); -_4af.height(_4b2); -dc.view.height(dc.view2.height()); -} -dc.body2.triggerHandler("scroll"); -function _4ad(trs1,trs2){ -for(var i=0;i"); -} -_4ba(true); -_4ba(false); -_49c(_4b7); -function _4ba(_4bb){ -var _4bc=_4bb?1:2; -var tr=opts.finder.getTr(_4b7,_4b8,"body",_4bc); -(_4bb?dc.body1:dc.body2).children("table.datagrid-btable-frozen").append(tr); -}; -}; -function _4bd(_4be,_4bf){ -function _4c0(){ -var _4c1=[]; -var _4c2=[]; -$(_4be).children("thead").each(function(){ -var opt=$.parser.parseOptions(this,[{frozen:"boolean"}]); -$(this).find("tr").each(function(){ -var cols=[]; -$(this).find("th").each(function(){ -var th=$(this); -var col=$.extend({},$.parser.parseOptions(this,["field","align","halign","order",{sortable:"boolean",checkbox:"boolean",resizable:"boolean",fixed:"boolean"},{rowspan:"number",colspan:"number",width:"number"}]),{title:(th.html()||undefined),hidden:(th.attr("hidden")?true:undefined),formatter:(th.attr("formatter")?eval(th.attr("formatter")):undefined),styler:(th.attr("styler")?eval(th.attr("styler")):undefined),sorter:(th.attr("sorter")?eval(th.attr("sorter")):undefined)}); -if(th.attr("editor")){ -var s=$.trim(th.attr("editor")); -if(s.substr(0,1)=="{"){ -col.editor=eval("("+s+")"); -}else{ -col.editor=s; -} -} -cols.push(col); -}); -opt.frozen?_4c1.push(cols):_4c2.push(cols); -}); -}); -return [_4c1,_4c2]; -}; -var _4c3=$("
              "+"
              "+"
              "+"
              "+"
              "+"
              "+"
              "+"
              "+"
              "+"
              "+""+"
              "+"
              "+"
              "+"
              "+"
              "+"
              "+"
              "+"
              "+""+"
              "+"
              "+"
              "+"
              ").insertAfter(_4be); -_4c3.panel({doSize:false}); -_4c3.panel("panel").addClass("datagrid").bind("_resize",function(e,_4c4){ -var opts=$.data(_4be,"datagrid").options; -if(opts.fit==true||_4c4){ -_498(_4be); -setTimeout(function(){ -if($.data(_4be,"datagrid")){ -_4c5(_4be); -} -},0); -} -return false; -}); -$(_4be).hide().appendTo(_4c3.children("div.datagrid-view")); -var cc=_4c0(); -var view=_4c3.children("div.datagrid-view"); -var _4c6=view.children("div.datagrid-view1"); -var _4c7=view.children("div.datagrid-view2"); -var _4c8=_4c3.closest("div.datagrid-view"); -if(!_4c8.length){ -_4c8=view; -} -var ss=_48b(_4c8); -return {panel:_4c3,frozenColumns:cc[0],columns:cc[1],dc:{view:view,view1:_4c6,view2:_4c7,header1:_4c6.children("div.datagrid-header").children("div.datagrid-header-inner"),header2:_4c7.children("div.datagrid-header").children("div.datagrid-header-inner"),body1:_4c6.children("div.datagrid-body").children("div.datagrid-body-inner"),body2:_4c7.children("div.datagrid-body"),footer1:_4c6.children("div.datagrid-footer").children("div.datagrid-footer-inner"),footer2:_4c7.children("div.datagrid-footer").children("div.datagrid-footer-inner")},ss:ss}; -}; -function _4c9(_4ca){ -var _4cb=$.data(_4ca,"datagrid"); -var opts=_4cb.options; -var dc=_4cb.dc; -var _4cc=_4cb.panel; -_4cc.panel($.extend({},opts,{id:null,doSize:false,onResize:function(_4cd,_4ce){ -setTimeout(function(){ -if($.data(_4ca,"datagrid")){ -_49c(_4ca); -_4ef(_4ca); -opts.onResize.call(_4cc,_4cd,_4ce); -} -},0); -},onExpand:function(){ -_4a9(_4ca); -opts.onExpand.call(_4cc); -}})); -_4cb.rowIdPrefix="datagrid-row-r"+(++_486); -_4cb.cellClassPrefix="datagrid-cell-c"+_486; -_4cf(dc.header1,opts.frozenColumns,true); -_4cf(dc.header2,opts.columns,false); -_4d0(); -dc.header1.add(dc.header2).css("display",opts.showHeader?"block":"none"); -dc.footer1.add(dc.footer2).css("display",opts.showFooter?"block":"none"); -if(opts.toolbar){ -if(typeof opts.toolbar=="string"){ -$(opts.toolbar).addClass("datagrid-toolbar").prependTo(_4cc); -$(opts.toolbar).show(); -}else{ -$("div.datagrid-toolbar",_4cc).remove(); -var tb=$("
              ").prependTo(_4cc); -var tr=tb.find("tr"); -for(var i=0;i
              ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var tool=$("").appendTo(td); -tool[0].onclick=eval(btn.handler||function(){ -}); -tool.linkbutton($.extend({},btn,{plain:true})); -} -} -} -}else{ -$("div.datagrid-toolbar",_4cc).remove(); -} -$("div.datagrid-pager",_4cc).remove(); -if(opts.pagination){ -var _4d1=$("
              "); -if(opts.pagePosition=="bottom"){ -_4d1.appendTo(_4cc); -}else{ -if(opts.pagePosition=="top"){ -_4d1.addClass("datagrid-pager-top").prependTo(_4cc); -}else{ -var ptop=$("
              ").prependTo(_4cc); -_4d1.appendTo(_4cc); -_4d1=_4d1.add(ptop); -} -} -_4d1.pagination({total:0,pageNumber:opts.pageNumber,pageSize:opts.pageSize,pageList:opts.pageList,onSelectPage:function(_4d2,_4d3){ -opts.pageNumber=_4d2; -opts.pageSize=_4d3; -_4d1.pagination("refresh",{pageNumber:_4d2,pageSize:_4d3}); -_5b0(_4ca); -}}); -opts.pageSize=_4d1.pagination("options").pageSize; -} -function _4cf(_4d4,_4d5,_4d6){ -if(!_4d5){ -return; -} -$(_4d4).show(); -$(_4d4).empty(); -var t=$("
              ").appendTo(_4d4); -for(var i=0;i<_4d5.length;i++){ -var tr=$("").appendTo($("tbody",t)); -var cols=_4d5[i]; -for(var j=0;j").appendTo(tr); -if(col.checkbox){ -td.attr("field",col.field); -$("
              ").html("").appendTo(td); -}else{ -if(col.field){ -td.attr("field",col.field); -td.append("
              "); -$("span",td).html(col.title); -$("span.datagrid-sort-icon",td).html(" "); -var cell=td.find("div.datagrid-cell"); -if(opts.sortName==col.field){ -cell.addClass("datagrid-sort-"+opts.sortOrder); -} -if(col.resizable==false){ -cell.attr("resizable","false"); -} -if(col.width){ -cell._outerWidth(col.width); -col.boxWidth=parseInt(cell[0].style.width); -}else{ -col.auto=true; -} -cell.css("text-align",(col.halign||col.align||"")); -col.cellClass=_4cb.cellClassPrefix+"-"+col.field.replace(/[\.|\s]/g,"-"); -}else{ -$("
              ").html(col.title).appendTo(td); -} -} -if(col.hidden){ -td.hide(); -} -} -} -if(_4d6&&opts.rownumbers){ -var td=$("
              "); -if($("tr",t).length==0){ -td.wrap("").parent().appendTo($("tbody",t)); -}else{ -td.prependTo($("tr:first",t)); -} -} -}; -function _4d0(){ -var _4d7=[]; -var _4d8=_4d9(_4ca,true).concat(_4d9(_4ca)); -for(var i=0;i<_4d8.length;i++){ -var col=_4da(_4ca,_4d8[i]); -if(col&&!col.checkbox){ -_4d7.push(["."+col.cellClass,col.boxWidth?col.boxWidth+"px":"auto"]); -} -} -_4cb.ss.add(_4d7); -_4cb.ss.dirty(_4cb.cellSelectorPrefix); -_4cb.cellSelectorPrefix="."+_4cb.cellClassPrefix; -}; -}; -function _4db(_4dc){ -var _4dd=$.data(_4dc,"datagrid"); -var _4de=_4dd.panel; -var opts=_4dd.options; -var dc=_4dd.dc; -var _4df=dc.header1.add(dc.header2); -_4df.find("input[type=checkbox]").unbind(".datagrid").bind("click.datagrid",function(e){ -if(opts.singleSelect&&opts.selectOnCheck){ -return false; -} -if($(this).is(":checked")){ -_54b(_4dc); -}else{ -_551(_4dc); -} -e.stopPropagation(); -}); -var _4e0=_4df.find("div.datagrid-cell"); -_4e0.closest("td").unbind(".datagrid").bind("mouseenter.datagrid",function(){ -if(_4dd.resizing){ -return; -} -$(this).addClass("datagrid-header-over"); -}).bind("mouseleave.datagrid",function(){ -$(this).removeClass("datagrid-header-over"); -}).bind("contextmenu.datagrid",function(e){ -var _4e1=$(this).attr("field"); -opts.onHeaderContextMenu.call(_4dc,e,_4e1); -}); -_4e0.unbind(".datagrid").bind("click.datagrid",function(e){ -var p1=$(this).offset().left+5; -var p2=$(this).offset().left+$(this)._outerWidth()-5; -if(e.pageXp1){ -var _4e2=$(this).parent().attr("field"); -var col=_4da(_4dc,_4e2); -if(!col.sortable||_4dd.resizing){ -return; -} -opts.sortName=_4e2; -opts.sortOrder=col.order||"asc"; -var cls="datagrid-sort-"+opts.sortOrder; -if($(this).hasClass("datagrid-sort-asc")){ -cls="datagrid-sort-desc"; -opts.sortOrder="desc"; -}else{ -if($(this).hasClass("datagrid-sort-desc")){ -cls="datagrid-sort-asc"; -opts.sortOrder="asc"; -} -} -_4e0.removeClass("datagrid-sort-asc datagrid-sort-desc"); -$(this).addClass(cls); -if(opts.remoteSort){ -_5b0(_4dc); -}else{ -var data=$.data(_4dc,"datagrid").data; -_51b(_4dc,data); -} -opts.onSortColumn.call(_4dc,opts.sortName,opts.sortOrder); -} -}).bind("dblclick.datagrid",function(e){ -var p1=$(this).offset().left+5; -var p2=$(this).offset().left+$(this)._outerWidth()-5; -var cond=opts.resizeHandle=="right"?(e.pageX>p2):(opts.resizeHandle=="left"?(e.pageXp2)); -if(cond){ -var _4e3=$(this).parent().attr("field"); -var col=_4da(_4dc,_4e3); -if(col.resizable==false){ -return; -} -$(_4dc).datagrid("autoSizeColumn",_4e3); -col.auto=false; -} -}); -var _4e4=opts.resizeHandle=="right"?"e":(opts.resizeHandle=="left"?"w":"e,w"); -_4e0.each(function(){ -$(this).resizable({handles:_4e4,disabled:($(this).attr("resizable")?$(this).attr("resizable")=="false":false),minWidth:25,onStartResize:function(e){ -_4dd.resizing=true; -_4df.css("cursor",$("body").css("cursor")); -if(!_4dd.proxy){ -_4dd.proxy=$("
              ").appendTo(dc.view); -} -_4dd.proxy.css({left:e.pageX-$(_4de).offset().left-1,display:"none"}); -setTimeout(function(){ -if(_4dd.proxy){ -_4dd.proxy.show(); -} -},500); -},onResize:function(e){ -_4dd.proxy.css({left:e.pageX-$(_4de).offset().left-1,display:"block"}); -return false; -},onStopResize:function(e){ -_4df.css("cursor",""); -$(this).css("height",""); -var _4e5=$(this).parent().attr("field"); -var col=_4da(_4dc,_4e5); -col.width=$(this)._outerWidth(); -col.boxWidth=parseInt(this.style.width); -col.auto=undefined; -_4c5(_4dc,_4e5); -_4dd.proxy.remove(); -_4dd.proxy=null; -if($(this).parents("div:first.datagrid-header").parent().hasClass("datagrid-view1")){ -_49c(_4dc); -} -_4ef(_4dc); -opts.onResizeColumn.call(_4dc,_4e5,col.width); -setTimeout(function(){ -_4dd.resizing=false; -},0); -}}); -}); -dc.body1.add(dc.body2).unbind().bind("mouseover",function(e){ -if(_4dd.resizing){ -return; -} -var tr=$(e.target).closest("tr.datagrid-row"); -if(!_4e6(tr)){ -return; -} -var _4e7=_4e8(tr); -_533(_4dc,_4e7); -e.stopPropagation(); -}).bind("mouseout",function(e){ -var tr=$(e.target).closest("tr.datagrid-row"); -if(!_4e6(tr)){ -return; -} -var _4e9=_4e8(tr); -opts.finder.getTr(_4dc,_4e9).removeClass("datagrid-row-over"); -e.stopPropagation(); -}).bind("click",function(e){ -var tt=$(e.target); -var tr=tt.closest("tr.datagrid-row"); -if(!_4e6(tr)){ -return; -} -var _4ea=_4e8(tr); -if(tt.parent().hasClass("datagrid-cell-check")){ -if(opts.singleSelect&&opts.selectOnCheck){ -if(!opts.checkOnSelect){ -_551(_4dc,true); -} -_53e(_4dc,_4ea); -}else{ -if(tt.is(":checked")){ -_53e(_4dc,_4ea); -}else{ -_545(_4dc,_4ea); -} -} -}else{ -var row=opts.finder.getRow(_4dc,_4ea); -var td=tt.closest("td[field]",tr); -if(td.length){ -var _4eb=td.attr("field"); -opts.onClickCell.call(_4dc,_4ea,_4eb,row[_4eb]); -} -if(opts.singleSelect==true){ -_537(_4dc,_4ea); -}else{ -if(tr.hasClass("datagrid-row-selected")){ -_53f(_4dc,_4ea); -}else{ -_537(_4dc,_4ea); -} -} -opts.onClickRow.call(_4dc,_4ea,row); -} -e.stopPropagation(); -}).bind("dblclick",function(e){ -var tt=$(e.target); -var tr=tt.closest("tr.datagrid-row"); -if(!_4e6(tr)){ -return; -} -var _4ec=_4e8(tr); -var row=opts.finder.getRow(_4dc,_4ec); -var td=tt.closest("td[field]",tr); -if(td.length){ -var _4ed=td.attr("field"); -opts.onDblClickCell.call(_4dc,_4ec,_4ed,row[_4ed]); -} -opts.onDblClickRow.call(_4dc,_4ec,row); -e.stopPropagation(); -}).bind("contextmenu",function(e){ -var tr=$(e.target).closest("tr.datagrid-row"); -if(!_4e6(tr)){ -return; -} -var _4ee=_4e8(tr); -var row=opts.finder.getRow(_4dc,_4ee); -opts.onRowContextMenu.call(_4dc,e,_4ee,row); -e.stopPropagation(); -}); -dc.body2.bind("scroll",function(){ -var b1=dc.view1.children("div.datagrid-body"); -b1.scrollTop($(this).scrollTop()); -var c1=dc.body1.children(":first"); -var c2=dc.body2.children(":first"); -if(c1.length&&c2.length){ -var top1=c1.offset().top; -var top2=c2.offset().top; -if(top1!=top2){ -b1.scrollTop(b1.scrollTop()+top1-top2); -} -} -dc.view2.children("div.datagrid-header,div.datagrid-footer")._scrollLeft($(this)._scrollLeft()); -dc.body2.children("table.datagrid-btable-frozen").css("left",-$(this)._scrollLeft()); -}); -function _4e8(tr){ -if(tr.attr("datagrid-row-index")){ -return parseInt(tr.attr("datagrid-row-index")); -}else{ -return tr.attr("node-id"); -} -}; -function _4e6(tr){ -return tr.length&&tr.parent().length; -}; -}; -function _4ef(_4f0){ -var opts=$.data(_4f0,"datagrid").options; -var dc=$.data(_4f0,"datagrid").dc; -dc.body2.css("overflow-x",opts.fitColumns?"hidden":""); -if(!opts.fitColumns){ -return; -} -var _4f1=dc.view2.children("div.datagrid-header"); -var _4f2=0; -var _4f3; -var _4f4=_4d9(_4f0,false); -for(var i=0;i<_4f4.length;i++){ -var col=_4da(_4f0,_4f4[i]); -if(_4f5(col)){ -_4f2+=col.width; -_4f3=col; -} -} -var _4f6=_4f1.children("div.datagrid-header-inner").show(); -var _4f7=_4f1.width()-_4f1.find("table").width()-opts.scrollbarSize; -var rate=_4f7/_4f2; -if(!opts.showHeader){ -_4f6.hide(); -} -for(var i=0;i<_4f4.length;i++){ -var col=_4da(_4f0,_4f4[i]); -if(_4f5(col)){ -var _4f8=Math.floor(col.width*rate); -_4f9(col,_4f8); -_4f7-=_4f8; -} -} -if(_4f7&&_4f3){ -_4f9(_4f3,_4f7); -} -_4c5(_4f0); -function _4f9(col,_4fa){ -col.width+=_4fa; -col.boxWidth+=_4fa; -_4f1.find("td[field=\""+col.field+"\"] div.datagrid-cell").width(col.boxWidth); -}; -function _4f5(col){ -if(!col.hidden&&!col.checkbox&&!col.auto&&!col.fixed){ -return true; -} -}; -}; -function _4fb(_4fc,_4fd){ -var opts=$.data(_4fc,"datagrid").options; -var dc=$.data(_4fc,"datagrid").dc; -if(_4fd){ -_498(_4fd); -if(opts.fitColumns){ -_49c(_4fc); -_4ef(_4fc); -} -}else{ -var _4fe=false; -var _4ff=_4d9(_4fc,true).concat(_4d9(_4fc,false)); -for(var i=0;i<_4ff.length;i++){ -var _4fd=_4ff[i]; -var col=_4da(_4fc,_4fd); -if(col.auto){ -_498(_4fd); -_4fe=true; -} -} -if(_4fe&&opts.fitColumns){ -_49c(_4fc); -_4ef(_4fc); -} -} -function _498(_500){ -var _501=dc.view.find("div.datagrid-header td[field=\""+_500+"\"] div.datagrid-cell"); -_501.css("width",""); -var col=$(_4fc).datagrid("getColumnOption",_500); -col.width=undefined; -col.boxWidth=undefined; -col.auto=true; -$(_4fc).datagrid("fixColumnSize",_500); -var _502=Math.max(_501._outerWidth(),_503("allbody"),_503("allfooter")); -_501._outerWidth(_502); -col.width=_502; -col.boxWidth=parseInt(_501[0].style.width); -$(_4fc).datagrid("fixColumnSize",_500); -opts.onResizeColumn.call(_4fc,_500,col.width); -function _503(type){ -var _504=0; -opts.finder.getTr(_4fc,0,type).find("td[field=\""+_500+"\"] div.datagrid-cell").each(function(){ -var w=$(this)._outerWidth(); -if(_504b?1:-1); -}; -data.rows.sort(function(r1,r2){ -return _51e(r1[opts.sortName],r2[opts.sortName])*(opts.sortOrder=="asc"?1:-1); -}); -} -} -if(opts.view.onBeforeRender){ -opts.view.onBeforeRender.call(opts.view,_51c,data.rows); -} -opts.view.render.call(opts.view,_51c,dc.body2,false); -opts.view.render.call(opts.view,_51c,dc.body1,true); -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,_51c,dc.footer2,false); -opts.view.renderFooter.call(opts.view,_51c,dc.footer1,true); -} -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,_51c); -} -_51d.ss.clean(); -opts.onLoadSuccess.call(_51c,data); -var _51f=$(_51c).datagrid("getPager"); -if(_51f.length){ -if(_51f.pagination("options").total!=data.total){ -_51f.pagination("refresh",{total:data.total}); -} -} -_4a9(_51c); -dc.body2.triggerHandler("scroll"); -_520(); -$(_51c).datagrid("autoSizeColumn"); -function _520(){ -if(opts.idField){ -for(var i=0;i_531.height()-18){ -_531.scrollTop(_531.scrollTop()+top+tr._outerHeight()-_531.height()+18); -} -} -} -}; -function _533(_534,_535){ -var _536=$.data(_534,"datagrid"); -var opts=_536.options; -opts.finder.getTr(_534,_536.highlightIndex).removeClass("datagrid-row-over"); -opts.finder.getTr(_534,_535).addClass("datagrid-row-over"); -_536.highlightIndex=_535; -}; -function _537(_538,_539,_53a){ -var _53b=$.data(_538,"datagrid"); -var dc=_53b.dc; -var opts=_53b.options; -var _53c=_53b.selectedRows; -if(opts.singleSelect){ -_53d(_538); -_53c.splice(0,_53c.length); -} -if(!_53a&&opts.checkOnSelect){ -_53e(_538,_539,true); -} -var row=opts.finder.getRow(_538,_539); -if(opts.idField){ -_48a(_53c,opts.idField,row); -} -opts.finder.getTr(_538,_539).addClass("datagrid-row-selected"); -opts.onSelect.call(_538,_539,row); -_52c(_538,_539); -}; -function _53f(_540,_541,_542){ -var _543=$.data(_540,"datagrid"); -var dc=_543.dc; -var opts=_543.options; -var _544=$.data(_540,"datagrid").selectedRows; -if(!_542&&opts.checkOnSelect){ -_545(_540,_541,true); -} -opts.finder.getTr(_540,_541).removeClass("datagrid-row-selected"); -var row=opts.finder.getRow(_540,_541); -if(opts.idField){ -_488(_544,opts.idField,row[opts.idField]); -} -opts.onUnselect.call(_540,_541,row); -}; -function _546(_547,_548){ -var _549=$.data(_547,"datagrid"); -var opts=_549.options; -var rows=_549.data.rows; -var _54a=$.data(_547,"datagrid").selectedRows; -if(!_548&&opts.checkOnSelect){ -_54b(_547,true); -} -opts.finder.getTr(_547,"","allbody").addClass("datagrid-row-selected"); -if(opts.idField){ -for(var _54c=0;_54c"); -cell.children("table").bind("click dblclick contextmenu",function(e){ -e.stopPropagation(); -}); -$.data(cell[0],"datagrid.editor",{actions:_581,target:_581.init(cell.find("td"),_580),field:_57e,type:_57f,oldHtml:_582}); -} -} -}); -_4a9(_57c,_57d,true); -}; -function _573(_584,_585){ -var opts=$.data(_584,"datagrid").options; -var tr=opts.finder.getTr(_584,_585); -tr.children("td").each(function(){ -var cell=$(this).find("div.datagrid-editable"); -if(cell.length){ -var ed=$.data(cell[0],"datagrid.editor"); -if(ed.actions.destroy){ -ed.actions.destroy(ed.target); -} -cell.html(ed.oldHtml); -$.removeData(cell[0],"datagrid.editor"); -cell.removeClass("datagrid-editable"); -cell.css("width",""); -} -}); -}; -function _568(_586,_587){ -var tr=$.data(_586,"datagrid").options.finder.getTr(_586,_587); -if(!tr.hasClass("datagrid-row-editing")){ -return true; -} -var vbox=tr.find(".validatebox-text"); -vbox.validatebox("validate"); -vbox.trigger("mouseleave"); -var _588=tr.find(".validatebox-invalid"); -return _588.length==0; -}; -function _589(_58a,_58b){ -var _58c=$.data(_58a,"datagrid").insertedRows; -var _58d=$.data(_58a,"datagrid").deletedRows; -var _58e=$.data(_58a,"datagrid").updatedRows; -if(!_58b){ -var rows=[]; -rows=rows.concat(_58c); -rows=rows.concat(_58d); -rows=rows.concat(_58e); -return rows; -}else{ -if(_58b=="inserted"){ -return _58c; -}else{ -if(_58b=="deleted"){ -return _58d; -}else{ -if(_58b=="updated"){ -return _58e; -} -} -} -} -return []; -}; -function _58f(_590,_591){ -var _592=$.data(_590,"datagrid"); -var opts=_592.options; -var data=_592.data; -var _593=_592.insertedRows; -var _594=_592.deletedRows; -$(_590).datagrid("cancelEdit",_591); -var row=data.rows[_591]; -if(_487(_593,row)>=0){ -_488(_593,row); -}else{ -_594.push(row); -} -_488(_592.selectedRows,opts.idField,data.rows[_591][opts.idField]); -_488(_592.checkedRows,opts.idField,data.rows[_591][opts.idField]); -opts.view.deleteRow.call(opts.view,_590,_591); -if(opts.height=="auto"){ -_4a9(_590); -} -$(_590).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _595(_596,_597){ -var data=$.data(_596,"datagrid").data; -var view=$.data(_596,"datagrid").options.view; -var _598=$.data(_596,"datagrid").insertedRows; -view.insertRow.call(view,_596,_597.index,_597.row); -_598.push(_597.row); -$(_596).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _599(_59a,row){ -var data=$.data(_59a,"datagrid").data; -var view=$.data(_59a,"datagrid").options.view; -var _59b=$.data(_59a,"datagrid").insertedRows; -view.insertRow.call(view,_59a,null,row); -_59b.push(row); -$(_59a).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _59c(_59d){ -var _59e=$.data(_59d,"datagrid"); -var data=_59e.data; -var rows=data.rows; -var _59f=[]; -for(var i=0;i=0){ -(_5ac=="s"?_537:_53e)(_5a3,_5ad,true); -} -} -}; -for(var i=0;i0){ -_51b(this,data); -_59c(this); -} -} -_498(this); -_5b0(this); -_4db(this); -}); -}; -var _5be={text:{init:function(_5bf,_5c0){ -var _5c1=$("").appendTo(_5bf); -return _5c1; -},getValue:function(_5c2){ -return $(_5c2).val(); -},setValue:function(_5c3,_5c4){ -$(_5c3).val(_5c4); -},resize:function(_5c5,_5c6){ -$(_5c5)._outerWidth(_5c6); -}},textarea:{init:function(_5c7,_5c8){ -var _5c9=$("").appendTo(_5c7); -return _5c9; -},getValue:function(_5ca){ -return $(_5ca).val(); -},setValue:function(_5cb,_5cc){ -$(_5cb).val(_5cc); -},resize:function(_5cd,_5ce){ -$(_5cd)._outerWidth(_5ce); -}},checkbox:{init:function(_5cf,_5d0){ -var _5d1=$("").appendTo(_5cf); -_5d1.val(_5d0.on); -_5d1.attr("offval",_5d0.off); -return _5d1; -},getValue:function(_5d2){ -if($(_5d2).is(":checked")){ -return $(_5d2).val(); -}else{ -return $(_5d2).attr("offval"); -} -},setValue:function(_5d3,_5d4){ -var _5d5=false; -if($(_5d3).val()==_5d4){ -_5d5=true; -} -$(_5d3)._propAttr("checked",_5d5); -}},numberbox:{init:function(_5d6,_5d7){ -var _5d8=$("").appendTo(_5d6); -_5d8.numberbox(_5d7); -return _5d8; -},destroy:function(_5d9){ -$(_5d9).numberbox("destroy"); -},getValue:function(_5da){ -$(_5da).blur(); -return $(_5da).numberbox("getValue"); -},setValue:function(_5db,_5dc){ -$(_5db).numberbox("setValue",_5dc); -},resize:function(_5dd,_5de){ -$(_5dd)._outerWidth(_5de); -}},validatebox:{init:function(_5df,_5e0){ -var _5e1=$("").appendTo(_5df); -_5e1.validatebox(_5e0); -return _5e1; -},destroy:function(_5e2){ -$(_5e2).validatebox("destroy"); -},getValue:function(_5e3){ -return $(_5e3).val(); -},setValue:function(_5e4,_5e5){ -$(_5e4).val(_5e5); -},resize:function(_5e6,_5e7){ -$(_5e6)._outerWidth(_5e7); -}},datebox:{init:function(_5e8,_5e9){ -var _5ea=$("").appendTo(_5e8); -_5ea.datebox(_5e9); -return _5ea; -},destroy:function(_5eb){ -$(_5eb).datebox("destroy"); -},getValue:function(_5ec){ -return $(_5ec).datebox("getValue"); -},setValue:function(_5ed,_5ee){ -$(_5ed).datebox("setValue",_5ee); -},resize:function(_5ef,_5f0){ -$(_5ef).datebox("resize",_5f0); -}},combobox:{init:function(_5f1,_5f2){ -var _5f3=$("").appendTo(_5f1); -_5f3.combobox(_5f2||{}); -return _5f3; -},destroy:function(_5f4){ -$(_5f4).combobox("destroy"); -},getValue:function(_5f5){ -return $(_5f5).combobox("getValue"); -},setValue:function(_5f6,_5f7){ -$(_5f6).combobox("setValue",_5f7); -},resize:function(_5f8,_5f9){ -$(_5f8).combobox("resize",_5f9); -}},combotree:{init:function(_5fa,_5fb){ -var _5fc=$("").appendTo(_5fa); -_5fc.combotree(_5fb); -return _5fc; -},destroy:function(_5fd){ -$(_5fd).combotree("destroy"); -},getValue:function(_5fe){ -return $(_5fe).combotree("getValue"); -},setValue:function(_5ff,_600){ -$(_5ff).combotree("setValue",_600); -},resize:function(_601,_602){ -$(_601).combotree("resize",_602); -}}}; -$.fn.datagrid.methods={options:function(jq){ -var _603=$.data(jq[0],"datagrid").options; -var _604=$.data(jq[0],"datagrid").panel.panel("options"); -var opts=$.extend(_603,{width:_604.width,height:_604.height,closed:_604.closed,collapsed:_604.collapsed,minimized:_604.minimized,maximized:_604.maximized}); -return opts; -},getPanel:function(jq){ -return $.data(jq[0],"datagrid").panel; -},getPager:function(jq){ -return $.data(jq[0],"datagrid").panel.children("div.datagrid-pager"); -},getColumnFields:function(jq,_605){ -return _4d9(jq[0],_605); -},getColumnOption:function(jq,_606){ -return _4da(jq[0],_606); -},resize:function(jq,_607){ -return jq.each(function(){ -_498(this,_607); -}); -},load:function(jq,_608){ -return jq.each(function(){ -var opts=$(this).datagrid("options"); -opts.pageNumber=1; -var _609=$(this).datagrid("getPager"); -_609.pagination({pageNumber:1}); -_5b0(this,_608); -}); -},reload:function(jq,_60a){ -return jq.each(function(){ -_5b0(this,_60a); -}); -},reloadFooter:function(jq,_60b){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -var dc=$.data(this,"datagrid").dc; -if(_60b){ -$.data(this,"datagrid").footer=_60b; -} -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,this,dc.footer2,false); -opts.view.renderFooter.call(opts.view,this,dc.footer1,true); -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,this); -} -$(this).datagrid("fixRowHeight"); -} -}); -},loading:function(jq){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -$(this).datagrid("getPager").pagination("loading"); -if(opts.loadMsg){ -var _60c=$(this).datagrid("getPanel"); -$("
              ").appendTo(_60c); -var msg=$("
              ").html(opts.loadMsg).appendTo(_60c); -msg.css("marginLeft",-msg.outerWidth()/2); -} -}); -},loaded:function(jq){ -return jq.each(function(){ -$(this).datagrid("getPager").pagination("loaded"); -var _60d=$(this).datagrid("getPanel"); -_60d.children("div.datagrid-mask-msg").remove(); -_60d.children("div.datagrid-mask").remove(); -}); -},fitColumns:function(jq){ -return jq.each(function(){ -_4ef(this); -}); -},fixColumnSize:function(jq,_60e){ -return jq.each(function(){ -_4c5(this,_60e); -}); -},fixRowHeight:function(jq,_60f){ -return jq.each(function(){ -_4a9(this,_60f); -}); -},freezeRow:function(jq,_610){ -return jq.each(function(){ -_4b6(this,_610); -}); -},autoSizeColumn:function(jq,_611){ -return jq.each(function(){ -_4fb(this,_611); -}); -},loadData:function(jq,data){ -return jq.each(function(){ -_51b(this,data); -_59c(this); -}); -},getData:function(jq){ -return $.data(jq[0],"datagrid").data; -},getRows:function(jq){ -return $.data(jq[0],"datagrid").data.rows; -},getFooterRows:function(jq){ -return $.data(jq[0],"datagrid").footer; -},getRowIndex:function(jq,id){ -return _522(jq[0],id); -},getChecked:function(jq){ -return _529(jq[0]); -},getSelected:function(jq){ -var rows=_525(jq[0]); -return rows.length>0?rows[0]:null; -},getSelections:function(jq){ -return _525(jq[0]); -},clearSelections:function(jq){ -return jq.each(function(){ -var _612=$.data(this,"datagrid").selectedRows; -_612.splice(0,_612.length); -_53d(this); -}); -},clearChecked:function(jq){ -return jq.each(function(){ -var _613=$.data(this,"datagrid").checkedRows; -_613.splice(0,_613.length); -_551(this); -}); -},scrollTo:function(jq,_614){ -return jq.each(function(){ -_52c(this,_614); -}); -},highlightRow:function(jq,_615){ -return jq.each(function(){ -_533(this,_615); -_52c(this,_615); -}); -},selectAll:function(jq){ -return jq.each(function(){ -_546(this); -}); -},unselectAll:function(jq){ -return jq.each(function(){ -_53d(this); -}); -},selectRow:function(jq,_616){ -return jq.each(function(){ -_537(this,_616); -}); -},selectRecord:function(jq,id){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -if(opts.idField){ -var _617=_522(this,id); -if(_617>=0){ -$(this).datagrid("selectRow",_617); -} -} -}); -},unselectRow:function(jq,_618){ -return jq.each(function(){ -_53f(this,_618); -}); -},checkRow:function(jq,_619){ -return jq.each(function(){ -_53e(this,_619); -}); -},uncheckRow:function(jq,_61a){ -return jq.each(function(){ -_545(this,_61a); -}); -},checkAll:function(jq){ -return jq.each(function(){ -_54b(this); -}); -},uncheckAll:function(jq){ -return jq.each(function(){ -_551(this); -}); -},beginEdit:function(jq,_61b){ -return jq.each(function(){ -_563(this,_61b); -}); -},endEdit:function(jq,_61c){ -return jq.each(function(){ -_569(this,_61c,false); -}); -},cancelEdit:function(jq,_61d){ -return jq.each(function(){ -_569(this,_61d,true); -}); -},getEditors:function(jq,_61e){ -return _574(jq[0],_61e); -},getEditor:function(jq,_61f){ -return _578(jq[0],_61f); -},refreshRow:function(jq,_620){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -opts.view.refreshRow.call(opts.view,this,_620); -}); -},validateRow:function(jq,_621){ -return _568(jq[0],_621); -},updateRow:function(jq,_622){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -opts.view.updateRow.call(opts.view,this,_622.index,_622.row); -}); -},appendRow:function(jq,row){ -return jq.each(function(){ -_599(this,row); -}); -},insertRow:function(jq,_623){ -return jq.each(function(){ -_595(this,_623); -}); -},deleteRow:function(jq,_624){ -return jq.each(function(){ -_58f(this,_624); -}); -},getChanges:function(jq,_625){ -return _589(jq[0],_625); -},acceptChanges:function(jq){ -return jq.each(function(){ -_5a0(this); -}); -},rejectChanges:function(jq){ -return jq.each(function(){ -_5a2(this); -}); -},mergeCells:function(jq,_626){ -return jq.each(function(){ -_5b6(this,_626); -}); -},showColumn:function(jq,_627){ -return jq.each(function(){ -var _628=$(this).datagrid("getPanel"); -_628.find("td[field=\""+_627+"\"]").show(); -$(this).datagrid("getColumnOption",_627).hidden=false; -$(this).datagrid("fitColumns"); -}); -},hideColumn:function(jq,_629){ -return jq.each(function(){ -var _62a=$(this).datagrid("getPanel"); -_62a.find("td[field=\""+_629+"\"]").hide(); -$(this).datagrid("getColumnOption",_629).hidden=true; -$(this).datagrid("fitColumns"); -}); -}}; -$.fn.datagrid.parseOptions=function(_62b){ -var t=$(_62b); -return $.extend({},$.fn.panel.parseOptions(_62b),$.parser.parseOptions(_62b,["url","toolbar","idField","sortName","sortOrder","pagePosition","resizeHandle",{fitColumns:"boolean",autoRowHeight:"boolean",striped:"boolean",nowrap:"boolean"},{rownumbers:"boolean",singleSelect:"boolean",checkOnSelect:"boolean",selectOnCheck:"boolean"},{pagination:"boolean",pageSize:"number",pageNumber:"number"},{remoteSort:"boolean",showHeader:"boolean",showFooter:"boolean"},{scrollbarSize:"number"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined),loadMsg:(t.attr("loadMsg")!=undefined?t.attr("loadMsg"):undefined),rowStyler:(t.attr("rowStyler")?eval(t.attr("rowStyler")):undefined)}); -}; -$.fn.datagrid.parseData=function(_62c){ -var t=$(_62c); -var data={total:0,rows:[]}; -var _62d=t.datagrid("getColumnFields",true).concat(t.datagrid("getColumnFields",false)); -t.find("tbody tr").each(function(){ -data.total++; -var row={}; -$.extend(row,$.parser.parseOptions(this,["iconCls","state"])); -for(var i=0;i<_62d.length;i++){ -row[_62d[i]]=$(this).find("td:eq("+i+")").html(); -} -data.rows.push(row); -}); -return data; -}; -var _62e={render:function(_62f,_630,_631){ -var _632=$.data(_62f,"datagrid"); -var opts=_632.options; -var rows=_632.data.rows; -var _633=$(_62f).datagrid("getColumnFields",_631); -if(_631){ -if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){ -return; -} -} -var _634=[""]; -for(var i=0;i"); -_634.push(this.renderRow.call(this,_62f,_633,_631,i,rows[i])); -_634.push(""); -} -_634.push("
              "); -$(_630).html(_634.join("")); -},renderFooter:function(_638,_639,_63a){ -var opts=$.data(_638,"datagrid").options; -var rows=$.data(_638,"datagrid").footer||[]; -var _63b=$(_638).datagrid("getColumnFields",_63a); -var _63c=[""]; -for(var i=0;i"); -_63c.push(this.renderRow.call(this,_638,_63b,_63a,i,rows[i])); -_63c.push(""); -} -_63c.push("
              "); -$(_639).html(_63c.join("")); -},renderRow:function(_63d,_63e,_63f,_640,_641){ -var opts=$.data(_63d,"datagrid").options; -var cc=[]; -if(_63f&&opts.rownumbers){ -var _642=_640+1; -if(opts.pagination){ -_642+=(opts.pageNumber-1)*opts.pageSize; -} -cc.push("
              "+_642+"
              "); -} -for(var i=0;i<_63e.length;i++){ -var _643=_63e[i]; -var col=$(_63d).datagrid("getColumnOption",_643); -if(col){ -var _644=_641[_643]; -var _645=col.styler?(col.styler(_644,_641,_640)||""):""; -var _646=col.hidden?"style=\"display:none;"+_645+"\"":(_645?"style=\""+_645+"\"":""); -cc.push(""); -if(col.checkbox){ -var _646=""; -}else{ -var _646=_645; -if(col.align){ -_646+=";text-align:"+col.align+";"; -} -if(!opts.nowrap){ -_646+=";white-space:normal;height:auto;"; -}else{ -if(opts.autoRowHeight){ -_646+=";height:auto;"; -} -} -} -cc.push("
              "); -if(col.checkbox){ -cc.push(""); -}else{ -if(col.formatter){ -cc.push(col.formatter(_644,_641,_640)); -}else{ -cc.push(_644); -} -} -cc.push("
              "); -cc.push(""); -} -} -return cc.join(""); -},refreshRow:function(_647,_648){ -this.updateRow.call(this,_647,_648,{}); -},updateRow:function(_649,_64a,row){ -var opts=$.data(_649,"datagrid").options; -var rows=$(_649).datagrid("getRows"); -$.extend(rows[_64a],row); -var _64b=opts.rowStyler?opts.rowStyler.call(_649,_64a,rows[_64a]):""; -function _64c(_64d){ -var _64e=$(_649).datagrid("getColumnFields",_64d); -var tr=opts.finder.getTr(_649,_64a,"body",(_64d?1:2)); -var _64f=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); -tr.html(this.renderRow.call(this,_649,_64e,_64d,_64a,rows[_64a])); -tr.attr("style",_64b||""); -if(_64f){ -tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); -} -}; -_64c.call(this,true); -_64c.call(this,false); -$(_649).datagrid("fixRowHeight",_64a); -},insertRow:function(_650,_651,row){ -var _652=$.data(_650,"datagrid"); -var opts=_652.options; -var dc=_652.dc; -var data=_652.data; -if(_651==undefined||_651==null){ -_651=data.rows.length; -} -if(_651>data.rows.length){ -_651=data.rows.length; -} -function _653(_654){ -var _655=_654?1:2; -for(var i=data.rows.length-1;i>=_651;i--){ -var tr=opts.finder.getTr(_650,i,"body",_655); -tr.attr("datagrid-row-index",i+1); -tr.attr("id",_652.rowIdPrefix+"-"+_655+"-"+(i+1)); -if(_654&&opts.rownumbers){ -var _656=i+2; -if(opts.pagination){ -_656+=(opts.pageNumber-1)*opts.pageSize; -} -tr.find("div.datagrid-cell-rownumber").html(_656); -} -} -}; -function _657(_658){ -var _659=_658?1:2; -var _65a=$(_650).datagrid("getColumnFields",_658); -var _65b=_652.rowIdPrefix+"-"+_659+"-"+_651; -var tr=""; -if(_651>=data.rows.length){ -if(data.rows.length){ -opts.finder.getTr(_650,"","last",_659).after(tr); -}else{ -var cc=_658?dc.body1:dc.body2; -cc.html(""+tr+"
              "); -} -}else{ -opts.finder.getTr(_650,_651+1,"body",_659).before(tr); -} -}; -_653.call(this,true); -_653.call(this,false); -_657.call(this,true); -_657.call(this,false); -data.total+=1; -data.rows.splice(_651,0,row); -this.refreshRow.call(this,_650,_651); -},deleteRow:function(_65c,_65d){ -var _65e=$.data(_65c,"datagrid"); -var opts=_65e.options; -var data=_65e.data; -function _65f(_660){ -var _661=_660?1:2; -for(var i=_65d+1;itable>tbody>tr[datagrid-row-index="+_66c+"]"); -} -return tr; -}else{ -if(type=="footer"){ -return (_66d==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index="+_66c+"]"); -}else{ -if(type=="selected"){ -return (_66d==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-selected"); -}else{ -if(type=="highlight"){ -return (_66d==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-over"); -}else{ -if(type=="checked"){ -return (_66d==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row:has(div.datagrid-cell-check input:checked)"); -}else{ -if(type=="last"){ -return (_66d==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]:last"); -}else{ -if(type=="allbody"){ -return (_66d==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]"); -}else{ -if(type=="allfooter"){ -return (_66d==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index]"); -} -} -} -} -} -} -} -} -} -},getRow:function(_66f,p){ -var _670=(typeof p=="object")?p.attr("datagrid-row-index"):p; -return $.data(_66f,"datagrid").data.rows[parseInt(_670)]; -}},view:_62e,onBeforeLoad:function(_671){ -},onLoadSuccess:function(){ -},onLoadError:function(){ -},onClickRow:function(_672,_673){ -},onDblClickRow:function(_674,_675){ -},onClickCell:function(_676,_677,_678){ -},onDblClickCell:function(_679,_67a,_67b){ -},onSortColumn:function(sort,_67c){ -},onResizeColumn:function(_67d,_67e){ -},onSelect:function(_67f,_680){ -},onUnselect:function(_681,_682){ -},onSelectAll:function(rows){ -},onUnselectAll:function(rows){ -},onCheck:function(_683,_684){ -},onUncheck:function(_685,_686){ -},onCheckAll:function(rows){ -},onUncheckAll:function(rows){ -},onBeforeEdit:function(_687,_688){ -},onAfterEdit:function(_689,_68a,_68b){ -},onCancelEdit:function(_68c,_68d){ -},onHeaderContextMenu:function(e,_68e){ -},onRowContextMenu:function(e,_68f,_690){ -}}); -})(jQuery); -(function($){ -var _691; -function _692(_693){ -var _694=$.data(_693,"propertygrid"); -var opts=$.data(_693,"propertygrid").options; -$(_693).datagrid($.extend({},opts,{cls:"propertygrid",view:(opts.showGroup?_695:undefined),onClickRow:function(_696,row){ -if(_691!=this){ -_697(_691); -_691=this; -} -if(opts.editIndex!=_696&&row.editor){ -var col=$(this).datagrid("getColumnOption","value"); -col.editor=row.editor; -_697(_691); -$(this).datagrid("beginEdit",_696); -$(this).datagrid("getEditors",_696)[0].target.focus(); -opts.editIndex=_696; -} -opts.onClickRow.call(_693,_696,row); -},loadFilter:function(data){ -_697(this); -return opts.loadFilter.call(this,data); -},onLoadSuccess:function(data){ -$(_693).datagrid("getPanel").find("div.datagrid-group").attr("style",""); -opts.onLoadSuccess.call(_693,data); -}})); -$(document).unbind(".propertygrid").bind("mousedown.propertygrid",function(e){ -var p=$(e.target).closest("div.datagrid-view,div.combo-panel"); -if(p.length){ -return; -} -_697(_691); -_691=undefined; -}); -}; -function _697(_698){ -var t=$(_698); -if(!t.length){ -return; -} -var opts=$.data(_698,"propertygrid").options; -var _699=opts.editIndex; -if(_699==undefined){ -return; -} -var ed=t.datagrid("getEditors",_699)[0]; -if(ed){ -ed.target.blur(); -if(t.datagrid("validateRow",_699)){ -t.datagrid("endEdit",_699); -}else{ -t.datagrid("cancelEdit",_699); -} -} -opts.editIndex=undefined; -}; -$.fn.propertygrid=function(_69a,_69b){ -if(typeof _69a=="string"){ -var _69c=$.fn.propertygrid.methods[_69a]; -if(_69c){ -return _69c(this,_69b); -}else{ -return this.datagrid(_69a,_69b); -} -} -_69a=_69a||{}; -return this.each(function(){ -var _69d=$.data(this,"propertygrid"); -if(_69d){ -$.extend(_69d.options,_69a); -}else{ -var opts=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_69a); -opts.frozenColumns=$.extend(true,[],opts.frozenColumns); -opts.columns=$.extend(true,[],opts.columns); -$.data(this,"propertygrid",{options:opts}); -} -_692(this); -}); -}; -$.fn.propertygrid.methods={options:function(jq){ -return $.data(jq[0],"propertygrid").options; -}}; -$.fn.propertygrid.parseOptions=function(_69e){ -var t=$(_69e); -return $.extend({},$.fn.datagrid.parseOptions(_69e),$.parser.parseOptions(_69e,[{showGroup:"boolean"}])); -}; -var _695=$.extend({},$.fn.datagrid.defaults.view,{render:function(_69f,_6a0,_6a1){ -var _6a2=$.data(_69f,"datagrid"); -var opts=_6a2.options; -var rows=_6a2.data.rows; -var _6a3=$(_69f).datagrid("getColumnFields",_6a1); -var _6a4=[]; -var _6a5=0; -var _6a6=this.groups; -for(var i=0;i<_6a6.length;i++){ -var _6a7=_6a6[i]; -_6a4.push("
              "); -_6a4.push(""); -_6a4.push(""); -_6a4.push(""); -_6a4.push(""); -_6a4.push("
              "); -if(!_6a1){ -_6a4.push(""); -_6a4.push(opts.groupFormatter.call(_69f,_6a7.fvalue,_6a7.rows)); -_6a4.push(""); -} -_6a4.push("
              "); -_6a4.push("
              "); -_6a4.push(""); -for(var j=0;j<_6a7.rows.length;j++){ -var cls=(_6a5%2&&opts.striped)?"class=\"datagrid-row datagrid-row-alt\"":"class=\"datagrid-row\""; -var _6a8=opts.rowStyler?opts.rowStyler.call(_69f,_6a5,_6a7.rows[j]):""; -var _6a9=_6a8?"style=\""+_6a8+"\"":""; -var _6aa=_6a2.rowIdPrefix+"-"+(_6a1?1:2)+"-"+_6a5; -_6a4.push(""); -_6a4.push(this.renderRow.call(this,_69f,_6a3,_6a1,_6a5,_6a7.rows[j])); -_6a4.push(""); -_6a5++; -} -_6a4.push("
              "); -} -$(_6a0).html(_6a4.join("")); -},onAfterRender:function(_6ab){ -var opts=$.data(_6ab,"datagrid").options; -var dc=$.data(_6ab,"datagrid").dc; -var view=dc.view; -var _6ac=dc.view1; -var _6ad=dc.view2; -$.fn.datagrid.defaults.view.onAfterRender.call(this,_6ab); -if(opts.rownumbers||opts.frozenColumns.length){ -var _6ae=_6ac.find("div.datagrid-group"); -}else{ -var _6ae=_6ad.find("div.datagrid-group"); -} -$(" ").insertBefore(_6ae.find("td")); -view.find("div.datagrid-group").each(function(){ -var _6af=$(this).attr("group-index"); -$(this).find("span.datagrid-row-expander").bind("click",{groupIndex:_6af},function(e){ -if($(this).hasClass("datagrid-row-collapse")){ -$(_6ab).datagrid("collapseGroup",e.data.groupIndex); -}else{ -$(_6ab).datagrid("expandGroup",e.data.groupIndex); -} -}); -}); -},onBeforeRender:function(_6b0,rows){ -var opts=$.data(_6b0,"datagrid").options; -var _6b1=[]; -for(var i=0;i"+""+"
              "+""+"").insertAfter(tr); -}; -}; -function _6ed(_6ee,_6ef,data,_6f0){ -var _6f1=$.data(_6ee,"treegrid"); -var opts=_6f1.options; -var dc=_6f1.dc; -data=opts.loadFilter.call(_6ee,data,_6ef); -var node=find(_6ee,_6ef); -if(node){ -var _6f2=opts.finder.getTr(_6ee,_6ef,"body",1); -var _6f3=opts.finder.getTr(_6ee,_6ef,"body",2); -var cc1=_6f2.next("tr.treegrid-tr-tree").children("td").children("div"); -var cc2=_6f3.next("tr.treegrid-tr-tree").children("td").children("div"); -if(!_6f0){ -node.children=[]; -} -}else{ -var cc1=dc.body1; -var cc2=dc.body2; -if(!_6f0){ -_6f1.data=[]; -} -} -if(!_6f0){ -cc1.empty(); -cc2.empty(); -} -if(opts.view.onBeforeRender){ -opts.view.onBeforeRender.call(opts.view,_6ee,_6ef,data); -} -opts.view.render.call(opts.view,_6ee,cc1,true); -opts.view.render.call(opts.view,_6ee,cc2,false); -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,_6ee,dc.footer1,true); -opts.view.renderFooter.call(opts.view,_6ee,dc.footer2,false); -} -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,_6ee); -} -opts.onLoadSuccess.call(_6ee,node,data); -if(!_6ef&&opts.pagination){ -var _6f4=$.data(_6ee,"treegrid").total; -var _6f5=$(_6ee).datagrid("getPager"); -if(_6f5.pagination("options").total!=_6f4){ -_6f5.pagination({total:_6f4}); -} -} -_6d8(_6ee); -_6e0(_6ee); -$(_6ee).treegrid("autoSizeColumn"); -}; -function _6d7(_6f6,_6f7,_6f8,_6f9,_6fa){ -var opts=$.data(_6f6,"treegrid").options; -var body=$(_6f6).datagrid("getPanel").find("div.datagrid-body"); -if(_6f8){ -opts.queryParams=_6f8; -} -var _6fb=$.extend({},opts.queryParams); -if(opts.pagination){ -$.extend(_6fb,{page:opts.pageNumber,rows:opts.pageSize}); -} -if(opts.sortName){ -$.extend(_6fb,{sort:opts.sortName,order:opts.sortOrder}); -} -var row=find(_6f6,_6f7); -if(opts.onBeforeLoad.call(_6f6,row,_6fb)==false){ -return; -} -var _6fc=body.find("tr[node-id="+_6f7+"] span.tree-folder"); -_6fc.addClass("tree-loading"); -$(_6f6).treegrid("loading"); -var _6fd=opts.loader.call(_6f6,_6fb,function(data){ -_6fc.removeClass("tree-loading"); -$(_6f6).treegrid("loaded"); -_6ed(_6f6,_6f7,data,_6f9); -if(_6fa){ -_6fa(); -} -},function(){ -_6fc.removeClass("tree-loading"); -$(_6f6).treegrid("loaded"); -opts.onLoadError.apply(_6f6,arguments); -if(_6fa){ -_6fa(); -} -}); -if(_6fd==false){ -_6fc.removeClass("tree-loading"); -$(_6f6).treegrid("loaded"); -} -}; -function _6fe(_6ff){ -var rows=_700(_6ff); -if(rows.length){ -return rows[0]; -}else{ -return null; -} -}; -function _700(_701){ -return $.data(_701,"treegrid").data; -}; -function _702(_703,_704){ -var row=find(_703,_704); -if(row._parentId){ -return find(_703,row._parentId); -}else{ -return null; -} -}; -function _6dc(_705,_706){ -var opts=$.data(_705,"treegrid").options; -var body=$(_705).datagrid("getPanel").find("div.datagrid-view2 div.datagrid-body"); -var _707=[]; -if(_706){ -_708(_706); -}else{ -var _709=_700(_705); -for(var i=0;i<_709.length;i++){ -_707.push(_709[i]); -_708(_709[i][opts.idField]); -} -} -function _708(_70a){ -var _70b=find(_705,_70a); -if(_70b&&_70b.children){ -for(var i=0,len=_70b.children.length;i").insertBefore(_72f); -if(hit.prev().length){ -hit.prev().remove(); -} -} -} -_6ed(_72d,_72e.parent,_72e.data,true); -}; -function _730(_731,_732){ -var ref=_732.before||_732.after; -var opts=$.data(_731,"treegrid").options; -var _733=_702(_731,ref); -_72c(_731,{parent:(_733?_733[opts.idField]:null),data:[_732.data]}); -_734(true); -_734(false); -_6e0(_731); -function _734(_735){ -var _736=_735?1:2; -var tr=opts.finder.getTr(_731,_732.data[opts.idField],"body",_736); -var _737=tr.closest("table.datagrid-btable"); -tr=tr.parent().children(); -var dest=opts.finder.getTr(_731,ref,"body",_736); -if(_732.before){ -tr.insertBefore(dest); -}else{ -var sub=dest.next("tr.treegrid-tr-tree"); -tr.insertAfter(sub.length?sub:dest); -} -_737.remove(); -}; -}; -function _738(_739,_73a){ -var opts=$.data(_739,"treegrid").options; -var tr=opts.finder.getTr(_739,_73a); -tr.next("tr.treegrid-tr-tree").remove(); -tr.remove(); -var _73b=del(_73a); -if(_73b){ -if(_73b.children.length==0){ -tr=opts.finder.getTr(_739,_73b[opts.idField]); -tr.next("tr.treegrid-tr-tree").remove(); -var cell=tr.children("td[field="+opts.treeField+"]").children("div.datagrid-cell"); -cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); -cell.find(".tree-hit").remove(); -$("").prependTo(cell); -} -} -_6e0(_739); -function del(id){ -var cc; -var _73c=_702(_739,_73a); -if(_73c){ -cc=_73c.children; -}else{ -cc=$(_739).treegrid("getData"); -} -for(var i=0;i"]; -for(var i=0;i<_753.length;i++){ -var row=_753[i]; -if(row.state!="open"&&row.state!="closed"){ -row.state="open"; -} -var cls=(_74e++%2&&opts.striped)?"class=\"datagrid-row datagrid-row-alt\"":"class=\"datagrid-row\""; -var _755=opts.rowStyler?opts.rowStyler.call(_749,row):""; -var _756=_755?"style=\""+_755+"\"":""; -var _757=_74d+"-"+(_751?1:2)+"-"+row[opts.idField]; -_754.push(""); -_754=_754.concat(view.renderRow.call(view,_749,_74c,_751,_752,row)); -_754.push(""); -if(row.children&&row.children.length){ -var tt=_750(_751,_752+1,row.children); -var v=row.state=="closed"?"none":"block"; -_754.push("
              "); -_754=_754.concat(tt); -_754.push("
              "); -} -} -_754.push(""); -return _754; -}; -},renderFooter:function(_758,_759,_75a){ -var opts=$.data(_758,"treegrid").options; -var rows=$.data(_758,"treegrid").footer||[]; -var _75b=$(_758).datagrid("getColumnFields",_75a); -var _75c=[""]; -for(var i=0;i"); -_75c.push(this.renderRow.call(this,_758,_75b,_75a,0,row)); -_75c.push(""); -} -_75c.push("
              "); -$(_759).html(_75c.join("")); -},renderRow:function(_75d,_75e,_75f,_760,row){ -var opts=$.data(_75d,"treegrid").options; -var cc=[]; -if(_75f&&opts.rownumbers){ -cc.push("
              0
              "); -} -for(var i=0;i<_75e.length;i++){ -var _761=_75e[i]; -var col=$(_75d).datagrid("getColumnOption",_761); -if(col){ -var _762=col.styler?(col.styler(row[_761],row)||""):""; -var _763=col.hidden?"style=\"display:none;"+_762+"\"":(_762?"style=\""+_762+"\"":""); -cc.push(""); -if(col.checkbox){ -var _763=""; -}else{ -var _763=_762; -if(col.align){ -_763+=";text-align:"+col.align+";"; -} -if(!opts.nowrap){ -_763+=";white-space:normal;height:auto;"; -}else{ -if(opts.autoRowHeight){ -_763+=";height:auto;"; -} -} -} -cc.push("
              "); -if(col.checkbox){ -if(row.checked){ -cc.push(""); -}else{ -var val=null; -if(col.formatter){ -val=col.formatter(row[_761],row); -}else{ -val=row[_761]; -} -if(_761==opts.treeField){ -for(var j=0;j<_760;j++){ -cc.push(""); -} -if(row.state=="closed"){ -cc.push(""); -cc.push(""); -}else{ -if(row.children&&row.children.length){ -cc.push(""); -cc.push(""); -}else{ -cc.push(""); -cc.push(""); -} -} -cc.push(""+val+""); -}else{ -cc.push(val); -} -} -cc.push("
              "); -cc.push(""); -} -} -return cc.join(""); -},refreshRow:function(_764,id){ -this.updateRow.call(this,_764,id,{}); -},updateRow:function(_765,id,row){ -var opts=$.data(_765,"treegrid").options; -var _766=$(_765).treegrid("find",id); -$.extend(_766,row); -var _767=$(_765).treegrid("getLevel",id)-1; -var _768=opts.rowStyler?opts.rowStyler.call(_765,_766):""; -function _769(_76a){ -var _76b=$(_765).treegrid("getColumnFields",_76a); -var tr=opts.finder.getTr(_765,id,"body",(_76a?1:2)); -var _76c=tr.find("div.datagrid-cell-rownumber").html(); -var _76d=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); -tr.html(this.renderRow(_765,_76b,_76a,_767,_766)); -tr.attr("style",_768||""); -tr.find("div.datagrid-cell-rownumber").html(_76c); -if(_76d){ -tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); -} -}; -_769.call(this,true); -_769.call(this,false); -$(_765).treegrid("fixRowHeight",id); -},onBeforeRender:function(_76e,_76f,data){ -if($.isArray(_76f)){ -data={total:_76f.length,rows:_76f}; -_76f=null; -} -if(!data){ -return false; -} -var _770=$.data(_76e,"treegrid"); -var opts=_770.options; -if(data.length==undefined){ -if(data.footer){ -_770.footer=data.footer; -} -if(data.total){ -_770.total=data.total; -} -data=this.transfer(_76e,_76f,data.rows); -}else{ -function _771(_772,_773){ -for(var i=0;i<_772.length;i++){ -var row=_772[i]; -row._parentId=_773; -if(row.children&&row.children.length){ -_771(row.children,row[opts.idField]); -} -} -}; -_771(data,_76f); -} -var node=find(_76e,_76f); -if(node){ -if(node.children){ -node.children=node.children.concat(data); -}else{ -node.children=data; -} -}else{ -_770.data=_770.data.concat(data); -} -if(!opts.remoteSort){ -this.sort(_76e,data); -} -this.treeNodes=data; -this.treeLevel=$(_76e).treegrid("getLevel",_76f); -},sort:function(_774,data){ -var opts=$.data(_774,"treegrid").options; -var opt=$(_774).treegrid("getColumnOption",opts.sortName); -if(opt){ -var _775=opt.sorter||function(a,b){ -return (a>b?1:-1); -}; -_776(data); -} -function _776(rows){ -rows.sort(function(r1,r2){ -return _775(r1[opts.sortName],r2[opts.sortName])*(opts.sortOrder=="asc"?1:-1); -}); -for(var i=0;i").insertAfter(_78e); -var _78f=$("").appendTo(span); -$("").appendTo(span); -$("").appendTo(span); -var _790=$("
              ").appendTo("body"); -_790.panel({doSize:false,closed:true,cls:"combo-p",style:{position:"absolute",zIndex:10},onOpen:function(){ -$(this).panel("resize"); -},onClose:function(){ -var _791=$.data(_78e,"combo"); -if(_791){ -_791.options.onHidePanel.call(_78e); -} -}}); -var name=$(_78e).attr("name"); -if(name){ -span.find("input.combo-value").attr("name",name); -$(_78e).removeAttr("name").attr("comboName",name); -} -_78f.attr("autocomplete","off"); -return {combo:span,panel:_790}; -}; -function _792(_793){ -var _794=$.data(_793,"combo"); -var opts=_794.options; -var _795=_794.combo; -if(opts.hasDownArrow){ -_795.find(".combo-arrow").show(); -}else{ -_795.find(".combo-arrow").hide(); -} -_796(_793,opts.disabled); -_797(_793,opts.readonly); -}; -function _798(_799){ -var _79a=$.data(_799,"combo"); -var _79b=_79a.combo.find("input.combo-text"); -_79b.validatebox("destroy"); -_79a.panel.panel("destroy"); -_79a.combo.remove(); -$(_799).remove(); -}; -function _79c(_79d){ -var _79e=$.data(_79d,"combo"); -var opts=_79e.options; -var _79f=_79e.panel; -var _7a0=_79e.combo; -var _7a1=_7a0.find(".combo-text"); -var _7a2=_7a0.find(".combo-arrow"); -$(document).unbind(".combo").bind("mousedown.combo",function(e){ -var p=$(e.target).closest("span.combo,div.combo-panel"); -if(p.length){ -return; -} -$("body>div.combo-p>div.combo-panel:visible").panel("close"); -}); -_7a1.unbind(".combo"); -_7a2.unbind(".combo"); -if(!opts.disabled&&!opts.readonly){ -_7a1.bind("mousedown.combo",function(e){ -$("div.combo-panel").not(_79f).panel("close"); -e.stopPropagation(); -}).bind("keydown.combo",function(e){ -switch(e.keyCode){ -case 38: -opts.keyHandler.up.call(_79d); -break; -case 40: -opts.keyHandler.down.call(_79d); -break; -case 13: -e.preventDefault(); -opts.keyHandler.enter.call(_79d); -return false; -case 9: -case 27: -_7a9(_79d); -break; -default: -if(opts.editable){ -if(_79e.timer){ -clearTimeout(_79e.timer); -} -_79e.timer=setTimeout(function(){ -var q=_7a1.val(); -if(_79e.previousValue!=q){ -_79e.previousValue=q; -$(_79d).combo("showPanel"); -opts.keyHandler.query.call(_79d,_7a1.val()); -_7ac(_79d,true); -} -},opts.delay); -} -} -}); -_7a2.bind("click.combo",function(){ -if(_79f.is(":visible")){ -_7a9(_79d); -}else{ -$("div.combo-panel:visible").panel("close"); -$(_79d).combo("showPanel"); -} -_7a1.focus(); -}).bind("mouseenter.combo",function(){ -$(this).addClass("combo-arrow-hover"); -}).bind("mouseleave.combo",function(){ -$(this).removeClass("combo-arrow-hover"); -}); -} -}; -function _7a3(_7a4){ -var opts=$.data(_7a4,"combo").options; -var _7a5=$.data(_7a4,"combo").combo; -var _7a6=$.data(_7a4,"combo").panel; -if($.fn.window){ -_7a6.panel("panel").css("z-index",$.fn.window.defaults.zIndex++); -} -_7a6.panel("move",{left:_7a5.offset().left,top:_7a7()}); -if(_7a6.panel("options").closed){ -_7a6.panel("open"); -opts.onShowPanel.call(_7a4); -} -(function(){ -if(_7a6.is(":visible")){ -_7a6.panel("move",{left:_7a8(),top:_7a7()}); -setTimeout(arguments.callee,200); -} -})(); -function _7a8(){ -var left=_7a5.offset().left; -if(left+_7a6._outerWidth()>$(window)._outerWidth()+$(document).scrollLeft()){ -left=$(window)._outerWidth()+$(document).scrollLeft()-_7a6._outerWidth(); -} -if(left<0){ -left=0; -} -return left; -}; -function _7a7(){ -var top=_7a5.offset().top+_7a5._outerHeight(); -if(top+_7a6._outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ -top=_7a5.offset().top-_7a6._outerHeight(); -} -if(top<$(document).scrollTop()){ -top=_7a5.offset().top+_7a5._outerHeight(); -} -return top; -}; -}; -function _7a9(_7aa){ -var _7ab=$.data(_7aa,"combo").panel; -_7ab.panel("close"); -}; -function _7ac(_7ad,doit){ -var opts=$.data(_7ad,"combo").options; -var _7ae=$.data(_7ad,"combo").combo.find("input.combo-text"); -_7ae.validatebox($.extend({},opts,{deltaX:(opts.hasDownArrow?opts.deltaX:(opts.deltaX>0?1:-1))})); -if(doit){ -_7ae.validatebox("validate"); -} -}; -function _796(_7af,_7b0){ -var _7b1=$.data(_7af,"combo"); -var opts=_7b1.options; -var _7b2=_7b1.combo; -if(_7b0){ -opts.disabled=true; -$(_7af).attr("disabled",true); -_7b2.find(".combo-value").attr("disabled",true); -_7b2.find(".combo-text").attr("disabled",true); -}else{ -opts.disabled=false; -$(_7af).removeAttr("disabled"); -_7b2.find(".combo-value").removeAttr("disabled"); -_7b2.find(".combo-text").removeAttr("disabled"); -} -}; -function _797(_7b3,mode){ -var _7b4=$.data(_7b3,"combo"); -var opts=_7b4.options; -opts.readonly=mode==undefined?true:mode; -_7b4.combo.find(".combo-text").attr("readonly",opts.readonly?true:(!opts.editable)); -}; -function _7b5(_7b6){ -var _7b7=$.data(_7b6,"combo"); -var opts=_7b7.options; -var _7b8=_7b7.combo; -if(opts.multiple){ -_7b8.find("input.combo-value").remove(); -}else{ -_7b8.find("input.combo-value").val(""); -} -_7b8.find("input.combo-text").val(""); -}; -function _7b9(_7ba){ -var _7bb=$.data(_7ba,"combo").combo; -return _7bb.find("input.combo-text").val(); -}; -function _7bc(_7bd,text){ -var _7be=$.data(_7bd,"combo").combo; -_7be.find("input.combo-text").val(text); -_7ac(_7bd,true); -$.data(_7bd,"combo").previousValue=text; -}; -function _7bf(_7c0){ -var _7c1=[]; -var _7c2=$.data(_7c0,"combo").combo; -_7c2.find("input.combo-value").each(function(){ -_7c1.push($(this).val()); -}); -return _7c1; -}; -function _7c3(_7c4,_7c5){ -var opts=$.data(_7c4,"combo").options; -var _7c6=_7bf(_7c4); -var _7c7=$.data(_7c4,"combo").combo; -_7c7.find("input.combo-value").remove(); -var name=$(_7c4).attr("comboName"); -for(var i=0;i<_7c5.length;i++){ -var _7c8=$("").appendTo(_7c7); -if(name){ -_7c8.attr("name",name); -} -_7c8.val(_7c5[i]); -} -var tmp=[]; -for(var i=0;i<_7c6.length;i++){ -tmp[i]=_7c6[i]; -} -var aa=[]; -for(var i=0;i<_7c5.length;i++){ -for(var j=0;j_7e0.height()){ -var h=_7e0.scrollTop()+item.position().top+item.outerHeight()-_7e0.height(); -_7e0.scrollTop(h); -} -} -} -}; -function nav(_7e1,dir){ -var opts=$(_7e1).combobox("options"); -var _7e2=$(_7e1).combobox("panel"); -var item=_7e2.children("div.combobox-item-hover"); -if(!item.length){ -item=_7e2.children("div.combobox-item-selected"); -} -item.removeClass("combobox-item-hover"); -if(!item.length){ -item=_7e2.children("div.combobox-item:visible:"+(dir=="next"?"first":"last")); -}else{ -if(dir=="next"){ -item=item.nextAll(":visible:first"); -if(!item.length){ -item=_7e2.children("div.combobox-item:visible:first"); -} -}else{ -item=item.prevAll(":visible:first"); -if(!item.length){ -item=_7e2.children("div.combobox-item:visible:last"); -} -} -} -if(item.length){ -item.addClass("combobox-item-hover"); -_7dd(_7e1,item.attr("value")); -if(opts.selectOnNavigation){ -_7e3(_7e1,item.attr("value")); -} -} -}; -function _7e3(_7e4,_7e5){ -var opts=$.data(_7e4,"combobox").options; -var data=$.data(_7e4,"combobox").data; -if(opts.multiple){ -var _7e6=$(_7e4).combo("getValues"); -for(var i=0;i<_7e6.length;i++){ -if(_7e6[i]==_7e5){ -return; -} -} -_7e6.push(_7e5); -_7e7(_7e4,_7e6); -}else{ -_7e7(_7e4,[_7e5]); -} -var item=_7db(data,opts.valueField,_7e5); -if(item){ -opts.onSelect.call(_7e4,item); -} -}; -function _7e8(_7e9,_7ea){ -var _7eb=$.data(_7e9,"combobox"); -var opts=_7eb.options; -var _7ec=$(_7e9).combo("getValues"); -var _7ed=_7ec.indexOf(_7ea+""); -if(_7ed>=0){ -_7ec.splice(_7ed,1); -_7e7(_7e9,_7ec); -} -var item=_7db(_7eb.data,opts.valueField,_7ea); -if(item){ -opts.onUnselect.call(_7e9,item); -} -}; -function _7e7(_7ee,_7ef,_7f0){ -var opts=$.data(_7ee,"combobox").options; -var data=$.data(_7ee,"combobox").data; -var _7f1=$(_7ee).combo("panel"); -_7f1.find("div.combobox-item-selected").removeClass("combobox-item-selected"); -var vv=[],ss=[]; -for(var i=0;i<_7ef.length;i++){ -var v=_7ef[i]; -var s=v; -var item=_7db(data,opts.valueField,v); -if(item){ -s=item[opts.textField]; -} -vv.push(v); -ss.push(s); -_7f1.find("div.combobox-item[value=\""+v+"\"]").addClass("combobox-item-selected"); -} -$(_7ee).combo("setValues",vv); -if(!_7f0){ -$(_7ee).combo("setText",ss.join(opts.separator)); -} -}; -function _7f2(_7f3,data,_7f4){ -var opts=$.data(_7f3,"combobox").options; -var _7f5=$(_7f3).combo("panel"); -data=opts.loadFilter.call(_7f3,data); -$.data(_7f3,"combobox").data=data; -var _7f6=$(_7f3).combobox("getValues"); -_7f5.empty(); -for(var i=0;i
              ").appendTo(_7f5); -item.attr("value",v); -if(opts.formatter){ -item.html(opts.formatter.call(_7f3,data[i])); -}else{ -item.html(s); -} -if(data[i]["selected"]){ -(function(){ -for(var i=0;i<_7f6.length;i++){ -if(v==_7f6[i]){ -return; -} -} -_7f6.push(v); -})(); -} -} -if(opts.multiple){ -_7e7(_7f3,_7f6,_7f4); -}else{ -if(_7f6.length){ -_7e7(_7f3,[_7f6[_7f6.length-1]],_7f4); -}else{ -_7e7(_7f3,[],_7f4); -} -} -opts.onLoadSuccess.call(_7f3,data); -}; -function _7f7(_7f8,url,_7f9,_7fa){ -var opts=$.data(_7f8,"combobox").options; -if(url){ -opts.url=url; -} -_7f9=_7f9||{}; -if(opts.onBeforeLoad.call(_7f8,_7f9)==false){ -return; -} -opts.loader.call(_7f8,_7f9,function(data){ -_7f2(_7f8,data,_7fa); -},function(){ -opts.onLoadError.apply(this,arguments); -}); -}; -function _7fb(_7fc,q){ -var opts=$.data(_7fc,"combobox").options; -if(opts.multiple&&!q){ -_7e7(_7fc,[],true); -}else{ -_7e7(_7fc,[q],true); -} -if(opts.mode=="remote"){ -_7f7(_7fc,null,{q:q},true); -}else{ -var _7fd=$(_7fc).combo("panel"); -_7fd.find("div.combobox-item").hide(); -var data=$.data(_7fc,"combobox").data; -for(var i=0;i").appendTo(_819); -$.data(_818,"combotree").tree=tree; -} -tree.tree($.extend({},opts,{checkbox:opts.multiple,onLoadSuccess:function(node,data){ -var _81a=$(_818).combotree("getValues"); -if(opts.multiple){ -var _81b=tree.tree("getChecked"); -for(var i=0;i<_81b.length;i++){ -var id=_81b[i].id; -(function(){ -for(var i=0;i<_81a.length;i++){ -if(id==_81a[i]){ -return; -} -} -_81a.push(id); -})(); -} -} -$(_818).combotree("setValues",_81a); -opts.onLoadSuccess.call(this,node,data); -},onClick:function(node){ -_81d(_818); -$(_818).combo("hidePanel"); -opts.onClick.call(this,node); -},onCheck:function(node,_81c){ -_81d(_818); -opts.onCheck.call(this,node,_81c); -}})); -}; -function _81d(_81e){ -var opts=$.data(_81e,"combotree").options; -var tree=$.data(_81e,"combotree").tree; -var vv=[],ss=[]; -if(opts.multiple){ -var _81f=tree.tree("getChecked"); -for(var i=0;i<_81f.length;i++){ -vv.push(_81f[i].id); -ss.push(_81f[i].text); -} -}else{ -var node=tree.tree("getSelected"); -if(node){ -vv.push(node.id); -ss.push(node.text); -} -} -$(_81e).combo("setValues",vv).combo("setText",ss.join(opts.separator)); -}; -function _820(_821,_822){ -var opts=$.data(_821,"combotree").options; -var tree=$.data(_821,"combotree").tree; -tree.find("span.tree-checkbox").addClass("tree-checkbox0").removeClass("tree-checkbox1 tree-checkbox2"); -var vv=[],ss=[]; -for(var i=0;i<_822.length;i++){ -var v=_822[i]; -var s=v; -var node=tree.tree("find",v); -if(node){ -s=node.text; -tree.tree("check",node.target); -tree.tree("select",node.target); -} -vv.push(v); -ss.push(s); -} -$(_821).combo("setValues",vv).combo("setText",ss.join(opts.separator)); -}; -$.fn.combotree=function(_823,_824){ -if(typeof _823=="string"){ -var _825=$.fn.combotree.methods[_823]; -if(_825){ -return _825(this,_824); -}else{ -return this.combo(_823,_824); -} -} -_823=_823||{}; -return this.each(function(){ -var _826=$.data(this,"combotree"); -if(_826){ -$.extend(_826.options,_823); -}else{ -$.data(this,"combotree",{options:$.extend({},$.fn.combotree.defaults,$.fn.combotree.parseOptions(this),_823)}); -} -_817(this); -}); -}; -$.fn.combotree.methods={options:function(jq){ -var _827=jq.combo("options"); -return $.extend($.data(jq[0],"combotree").options,{originalValue:_827.originalValue,disabled:_827.disabled,readonly:_827.readonly}); -},tree:function(jq){ -return $.data(jq[0],"combotree").tree; -},loadData:function(jq,data){ -return jq.each(function(){ -var opts=$.data(this,"combotree").options; -opts.data=data; -var tree=$.data(this,"combotree").tree; -tree.tree("loadData",data); -}); -},reload:function(jq,url){ -return jq.each(function(){ -var opts=$.data(this,"combotree").options; -var tree=$.data(this,"combotree").tree; -if(url){ -opts.url=url; -} -tree.tree({url:opts.url}); -}); -},setValues:function(jq,_828){ -return jq.each(function(){ -_820(this,_828); -}); -},setValue:function(jq,_829){ -return jq.each(function(){ -_820(this,[_829]); -}); -},clear:function(jq){ -return jq.each(function(){ -var tree=$.data(this,"combotree").tree; -tree.find("div.tree-node-selected").removeClass("tree-node-selected"); -var cc=tree.tree("getChecked"); -for(var i=0;i").appendTo(_82e); -_82d.grid=grid; -} -grid.datagrid($.extend({},opts,{border:false,fit:true,singleSelect:(!opts.multiple),onLoadSuccess:function(data){ -var _82f=$(_82c).combo("getValues"); -var _830=opts.onSelect; -opts.onSelect=function(){ -}; -_83a(_82c,_82f,_82d.remainText); -opts.onSelect=_830; -opts.onLoadSuccess.apply(_82c,arguments); -},onClickRow:_831,onSelect:function(_832,row){ -_833(); -opts.onSelect.call(this,_832,row); -},onUnselect:function(_834,row){ -_833(); -opts.onUnselect.call(this,_834,row); -},onSelectAll:function(rows){ -_833(); -opts.onSelectAll.call(this,rows); -},onUnselectAll:function(rows){ -if(opts.multiple){ -_833(); -} -opts.onUnselectAll.call(this,rows); -}})); -function _831(_835,row){ -_82d.remainText=false; -_833(); -if(!opts.multiple){ -$(_82c).combo("hidePanel"); -} -opts.onClickRow.call(this,_835,row); -}; -function _833(){ -var rows=grid.datagrid("getSelections"); -var vv=[],ss=[]; -for(var i=0;i=_838){ -_839=0; -} -} -grid.datagrid("highlightRow",_839); -if(opts.selectOnNavigation){ -_837.remainText=false; -grid.datagrid("selectRow",_839); -} -}; -function _83a(_83b,_83c,_83d){ -var _83e=$.data(_83b,"combogrid"); -var opts=_83e.options; -var grid=_83e.grid; -var rows=grid.datagrid("getRows"); -var ss=[]; -var _83f=$(_83b).combo("getValues"); -var _840=$(_83b).combo("options"); -var _841=_840.onChange; -_840.onChange=function(){ -}; -grid.datagrid("clearSelections"); -for(var i=0;i<_83c.length;i++){ -var _842=grid.datagrid("getRowIndex",_83c[i]); -if(_842>=0){ -grid.datagrid("selectRow",_842); -ss.push(rows[_842][opts.textField]); -}else{ -ss.push(_83c[i]); -} -} -$(_83b).combo("setValues",_83f); -_840.onChange=_841; -$(_83b).combo("setValues",_83c); -if(!_83d){ -var s=ss.join(opts.separator); -if($(_83b).combo("getText")!=s){ -$(_83b).combo("setText",s); -} -} -}; -function _843(_844,q){ -var _845=$.data(_844,"combogrid"); -var opts=_845.options; -var grid=_845.grid; -_845.remainText=true; -if(opts.multiple&&!q){ -_83a(_844,[],true); -}else{ -_83a(_844,[q],true); -} -if(opts.mode=="remote"){ -grid.datagrid("clearSelections"); -grid.datagrid("load",$.extend({},opts.queryParams,{q:q})); -}else{ -if(!q){ -return; -} -var rows=grid.datagrid("getRows"); -for(var i=0;i
              ").appendTo(_856).wrap("
              "); -_854.calendar.calendar({fit:true,border:false,onSelect:function(date){ -var _857=opts.formatter(date); -_85b(_853,_857); -$(_853).combo("hidePanel"); -opts.onSelect.call(_853,date); -}}); -_85b(_853,opts.value); -var _858=$("
              ").appendTo(_856); -$("").html(opts.currentText).appendTo(_858); -$("").html(opts.closeText).appendTo(_858); -_858.find(".datebox-current,.datebox-close").hover(function(){ -$(this).addClass("datebox-button-hover"); -},function(){ -$(this).removeClass("datebox-button-hover"); -}); -_858.find(".datebox-current").click(function(){ -_854.calendar.calendar({year:new Date().getFullYear(),month:new Date().getMonth()+1,current:new Date()}); -}); -_858.find(".datebox-close").click(function(){ -$(_853).combo("hidePanel"); -}); -}; -}; -function _859(_85a,q){ -_85b(_85a,q); -}; -function _85c(_85d){ -var opts=$.data(_85d,"datebox").options; -var c=$.data(_85d,"datebox").calendar; -var _85e=opts.formatter(c.calendar("options").current); -_85b(_85d,_85e); -$(_85d).combo("hidePanel"); -}; -function _85b(_85f,_860){ -var _861=$.data(_85f,"datebox"); -var opts=_861.options; -$(_85f).combo("setValue",_860).combo("setText",_860); -_861.calendar.calendar("moveTo",opts.parser(_860)); -}; -$.fn.datebox=function(_862,_863){ -if(typeof _862=="string"){ -var _864=$.fn.datebox.methods[_862]; -if(_864){ -return _864(this,_863); -}else{ -return this.combo(_862,_863); -} -} -_862=_862||{}; -return this.each(function(){ -var _865=$.data(this,"datebox"); -if(_865){ -$.extend(_865.options,_862); -}else{ -$.data(this,"datebox",{options:$.extend({},$.fn.datebox.defaults,$.fn.datebox.parseOptions(this),_862)}); -} -_852(this); -}); -}; -$.fn.datebox.methods={options:function(jq){ -var _866=jq.combo("options"); -return $.extend($.data(jq[0],"datebox").options,{originalValue:_866.originalValue,disabled:_866.disabled,readonly:_866.readonly}); -},calendar:function(jq){ -return $.data(jq[0],"datebox").calendar; -},setValue:function(jq,_867){ -return jq.each(function(){ -_85b(this,_867); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).datebox("options"); -$(this).datebox("setValue",opts.originalValue); -}); -}}; -$.fn.datebox.parseOptions=function(_868){ -var t=$(_868); -return $.extend({},$.fn.combo.parseOptions(_868),{}); -}; -$.fn.datebox.defaults=$.extend({},$.fn.combo.defaults,{panelWidth:180,panelHeight:"auto",keyHandler:{up:function(){ -},down:function(){ -},enter:function(){ -_85c(this); -},query:function(q){ -_859(this,q); -}},currentText:"Today",closeText:"Close",okText:"Ok",formatter:function(date){ -var y=date.getFullYear(); -var m=date.getMonth()+1; -var d=date.getDate(); -return m+"/"+d+"/"+y; -},parser:function(s){ -var t=Date.parse(s); -if(!isNaN(t)){ -return new Date(t); -}else{ -return new Date(); -} -},onSelect:function(date){ -}}); -})(jQuery); -(function($){ -function _869(_86a){ -var _86b=$.data(_86a,"datetimebox"); -var opts=_86b.options; -$(_86a).datebox($.extend({},opts,{onShowPanel:function(){ -var _86c=$(_86a).datetimebox("getValue"); -_86f(_86a,_86c,true); -opts.onShowPanel.call(_86a); -},formatter:$.fn.datebox.defaults.formatter,parser:$.fn.datebox.defaults.parser})); -$(_86a).removeClass("datebox-f").addClass("datetimebox-f"); -$(_86a).datebox("calendar").calendar({onSelect:function(date){ -opts.onSelect.call(_86a,date); -}}); -var _86d=$(_86a).datebox("panel"); -if(!_86b.spinner){ -var p=$("
              ").insertAfter(_86d.children("div.datebox-calendar-inner")); -_86b.spinner=p.children("input"); -var _86e=_86d.children("div.datebox-button"); -var ok=$("").html(opts.okText).appendTo(_86e); -ok.hover(function(){ -$(this).addClass("datebox-button-hover"); -},function(){ -$(this).removeClass("datebox-button-hover"); -}).click(function(){ -_874(_86a); -}); -} -_86b.spinner.timespinner({showSeconds:opts.showSeconds,separator:opts.timeSeparator}).unbind(".datetimebox").bind("mousedown.datetimebox",function(e){ -e.stopPropagation(); -}); -_86f(_86a,opts.value); -}; -function _870(_871){ -var c=$(_871).datetimebox("calendar"); -var t=$(_871).datetimebox("spinner"); -var date=c.calendar("options").current; -return new Date(date.getFullYear(),date.getMonth(),date.getDate(),t.timespinner("getHours"),t.timespinner("getMinutes"),t.timespinner("getSeconds")); -}; -function _872(_873,q){ -_86f(_873,q,true); -}; -function _874(_875){ -var opts=$.data(_875,"datetimebox").options; -var date=_870(_875); -_86f(_875,opts.formatter.call(_875,date)); -$(_875).combo("hidePanel"); -}; -function _86f(_876,_877,_878){ -var opts=$.data(_876,"datetimebox").options; -$(_876).combo("setValue",_877); -if(!_878){ -if(_877){ -var date=opts.parser.call(_876,_877); -$(_876).combo("setValue",opts.formatter.call(_876,date)); -$(_876).combo("setText",opts.formatter.call(_876,date)); -}else{ -$(_876).combo("setText",_877); -} -} -var date=opts.parser.call(_876,_877); -$(_876).datetimebox("calendar").calendar("moveTo",date); -$(_876).datetimebox("spinner").timespinner("setValue",_879(date)); -function _879(date){ -function _87a(_87b){ -return (_87b<10?"0":"")+_87b; -}; -var tt=[_87a(date.getHours()),_87a(date.getMinutes())]; -if(opts.showSeconds){ -tt.push(_87a(date.getSeconds())); -} -return tt.join($(_876).datetimebox("spinner").timespinner("options").separator); -}; -}; -$.fn.datetimebox=function(_87c,_87d){ -if(typeof _87c=="string"){ -var _87e=$.fn.datetimebox.methods[_87c]; -if(_87e){ -return _87e(this,_87d); -}else{ -return this.datebox(_87c,_87d); -} -} -_87c=_87c||{}; -return this.each(function(){ -var _87f=$.data(this,"datetimebox"); -if(_87f){ -$.extend(_87f.options,_87c); -}else{ -$.data(this,"datetimebox",{options:$.extend({},$.fn.datetimebox.defaults,$.fn.datetimebox.parseOptions(this),_87c)}); -} -_869(this); -}); -}; -$.fn.datetimebox.methods={options:function(jq){ -var _880=jq.datebox("options"); -return $.extend($.data(jq[0],"datetimebox").options,{originalValue:_880.originalValue,disabled:_880.disabled,readonly:_880.readonly}); -},spinner:function(jq){ -return $.data(jq[0],"datetimebox").spinner; -},setValue:function(jq,_881){ -return jq.each(function(){ -_86f(this,_881); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).datetimebox("options"); -$(this).datetimebox("setValue",opts.originalValue); -}); -}}; -$.fn.datetimebox.parseOptions=function(_882){ -var t=$(_882); -return $.extend({},$.fn.datebox.parseOptions(_882),$.parser.parseOptions(_882,["timeSeparator",{showSeconds:"boolean"}])); -}; -$.fn.datetimebox.defaults=$.extend({},$.fn.datebox.defaults,{showSeconds:true,timeSeparator:":",keyHandler:{up:function(){ -},down:function(){ -},enter:function(){ -_874(this); -},query:function(q){ -_872(this,q); -}},formatter:function(date){ -var h=date.getHours(); -var M=date.getMinutes(); -var s=date.getSeconds(); -function _883(_884){ -return (_884<10?"0":"")+_884; -}; -var _885=$(this).datetimebox("spinner").timespinner("options").separator; -var r=$.fn.datebox.defaults.formatter(date)+" "+_883(h)+_885+_883(M); -if($(this).datetimebox("options").showSeconds){ -r+=_885+_883(s); -} -return r; -},parser:function(s){ -if($.trim(s)==""){ -return new Date(); -} -var dt=s.split(" "); -var d=$.fn.datebox.defaults.parser(dt[0]); -if(dt.length<2){ -return d; -} -var _886=$(this).datetimebox("spinner").timespinner("options").separator; -var tt=dt[1].split(_886); -var hour=parseInt(tt[0],10)||0; -var _887=parseInt(tt[1],10)||0; -var _888=parseInt(tt[2],10)||0; -return new Date(d.getFullYear(),d.getMonth(),d.getDate(),hour,_887,_888); -}}); -})(jQuery); -(function($){ -function init(_889){ -var _88a=$("
              "+"
              "+""+""+"
              "+"
              "+"
              "+"
              "+""+"
              ").insertAfter(_889); -var name=$(_889).hide().attr("name"); -if(name){ -_88a.find("input.slider-value").attr("name",name); -$(_889).removeAttr("name").attr("sliderName",name); -} -return _88a; -}; -function _88b(_88c,_88d){ -var _88e=$.data(_88c,"slider"); -var opts=_88e.options; -var _88f=_88e.slider; -if(_88d){ -if(_88d.width){ -opts.width=_88d.width; -} -if(_88d.height){ -opts.height=_88d.height; -} -} -if(opts.mode=="h"){ -_88f.css("height",""); -_88f.children("div").css("height",""); -if(!isNaN(opts.width)){ -_88f.width(opts.width); -} -}else{ -_88f.css("width",""); -_88f.children("div").css("width",""); -if(!isNaN(opts.height)){ -_88f.height(opts.height); -_88f.find("div.slider-rule").height(opts.height); -_88f.find("div.slider-rulelabel").height(opts.height); -_88f.find("div.slider-inner")._outerHeight(opts.height); -} -} -_890(_88c); -}; -function _891(_892){ -var _893=$.data(_892,"slider"); -var opts=_893.options; -var _894=_893.slider; -var aa=opts.mode=="h"?opts.rule:opts.rule.slice(0).reverse(); -if(opts.reversed){ -aa=aa.slice(0).reverse(); -} -_895(aa); -function _895(aa){ -var rule=_894.find("div.slider-rule"); -var _896=_894.find("div.slider-rulelabel"); -rule.empty(); -_896.empty(); -for(var i=0;i").appendTo(rule); -span.css((opts.mode=="h"?"left":"top"),_897); -if(aa[i]!="|"){ -span=$("").appendTo(_896); -span.html(aa[i]); -if(opts.mode=="h"){ -span.css({left:_897,marginLeft:-Math.round(span.outerWidth()/2)}); -}else{ -span.css({top:_897,marginTop:-Math.round(span.outerHeight()/2)}); -} -} -} -}; -}; -function _898(_899){ -var _89a=$.data(_899,"slider"); -var opts=_89a.options; -var _89b=_89a.slider; -_89b.removeClass("slider-h slider-v slider-disabled"); -_89b.addClass(opts.mode=="h"?"slider-h":"slider-v"); -_89b.addClass(opts.disabled?"slider-disabled":""); -_89b.find("a.slider-handle").draggable({axis:opts.mode,cursor:"pointer",disabled:opts.disabled,onDrag:function(e){ -var left=e.data.left; -var _89c=_89b.width(); -if(opts.mode!="h"){ -left=e.data.top; -_89c=_89b.height(); -} -if(left<0||left>_89c){ -return false; -}else{ -var _89d=_8ae(_899,left); -_89e(_89d); -return false; -} -},onStartDrag:function(){ -opts.onSlideStart.call(_899,opts.value); -},onStopDrag:function(e){ -var _89f=_8ae(_899,(opts.mode=="h"?e.data.left:e.data.top)); -_89e(_89f); -opts.onSlideEnd.call(_899,opts.value); -}}); -function _89e(_8a0){ -var s=Math.abs(_8a0%opts.step); -if(sopts.max){ -_8a3=opts.max; -} -opts.value=_8a3; -$(_8a2).val(_8a3); -_8a5.find("input.slider-value").val(_8a3); -var pos=_8a7(_8a2,_8a3); -var tip=_8a5.find(".slider-tip"); -if(opts.showTip){ -tip.show(); -tip.html(opts.tipFormatter.call(_8a2,opts.value)); -}else{ -tip.hide(); -} -if(opts.mode=="h"){ -var _8a8="left:"+pos+"px;"; -_8a5.find(".slider-handle").attr("style",_8a8); -tip.attr("style",_8a8+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px"); -}else{ -var _8a8="top:"+pos+"px;"; -_8a5.find(".slider-handle").attr("style",_8a8); -tip.attr("style",_8a8+"margin-left:"+(-Math.round(tip.outerWidth()))+"px"); -} -if(_8a6!=_8a3){ -opts.onChange.call(_8a2,_8a3,_8a6); -} -}; -function _890(_8a9){ -var opts=$.data(_8a9,"slider").options; -var fn=opts.onChange; -opts.onChange=function(){ -}; -_8a1(_8a9,opts.value); -opts.onChange=fn; -}; -function _8a7(_8aa,_8ab){ -var _8ac=$.data(_8aa,"slider"); -var opts=_8ac.options; -var _8ad=_8ac.slider; -if(opts.mode=="h"){ -var pos=(_8ab-opts.min)/(opts.max-opts.min)*_8ad.width(); -if(opts.reversed){ -pos=_8ad.width()-pos; -} -}else{ -var pos=_8ad.height()-(_8ab-opts.min)/(opts.max-opts.min)*_8ad.height(); -if(opts.reversed){ -pos=_8ad.height()-pos; -} -} -return pos.toFixed(0); -}; -function _8ae(_8af,pos){ -var _8b0=$.data(_8af,"slider"); -var opts=_8b0.options; -var _8b1=_8b0.slider; -if(opts.mode=="h"){ -var _8b2=opts.min+(opts.max-opts.min)*(pos/_8b1.width()); -}else{ -var _8b2=opts.min+(opts.max-opts.min)*((_8b1.height()-pos)/_8b1.height()); -} -return opts.reversed?opts.max-_8b2.toFixed(0):_8b2.toFixed(0); -}; -$.fn.slider=function(_8b3,_8b4){ -if(typeof _8b3=="string"){ -return $.fn.slider.methods[_8b3](this,_8b4); -} -_8b3=_8b3||{}; -return this.each(function(){ -var _8b5=$.data(this,"slider"); -if(_8b5){ -$.extend(_8b5.options,_8b3); -}else{ -_8b5=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_8b3),slider:init(this)}); -$(this).removeAttr("disabled"); -} -var opts=_8b5.options; -opts.min=parseFloat(opts.min); -opts.max=parseFloat(opts.max); -opts.value=parseFloat(opts.value); -opts.step=parseFloat(opts.step); -_898(this); -_891(this); -_88b(this); -}); -}; -$.fn.slider.methods={options:function(jq){ -return $.data(jq[0],"slider").options; -},destroy:function(jq){ -return jq.each(function(){ -$.data(this,"slider").slider.remove(); -$(this).remove(); -}); -},resize:function(jq,_8b6){ -return jq.each(function(){ -_88b(this,_8b6); -}); -},getValue:function(jq){ -return jq.slider("options").value; -},setValue:function(jq,_8b7){ -return jq.each(function(){ -_8a1(this,_8b7); -}); -},enable:function(jq){ -return jq.each(function(){ -$.data(this,"slider").options.disabled=false; -_898(this); -}); -},disable:function(jq){ -return jq.each(function(){ -$.data(this,"slider").options.disabled=true; -_898(this); -}); -}}; -$.fn.slider.parseOptions=function(_8b8){ -var t=$(_8b8); -return $.extend({},$.parser.parseOptions(_8b8,["width","height","mode",{reversed:"boolean",showTip:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)}); -}; -$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,value:0,min:0,max:100,step:1,rule:[],tipFormatter:function(_8b9){ -return _8b9; -},onChange:function(_8ba,_8bb){ -},onSlideStart:function(_8bc){ -},onSlideEnd:function(_8bd){ -}}; -})(jQuery); diff --git a/spider/resources/static/js/jsontree/icons.svg b/spider/resources/static/js/jsontree/icons.svg deleted file mode 100644 index cc8298a..0000000 --- a/spider/resources/static/js/jsontree/icons.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/spider/resources/static/js/jsontree/jsontree.css b/spider/resources/static/js/jsontree/jsontree.css deleted file mode 100644 index 3c154c1..0000000 --- a/spider/resources/static/js/jsontree/jsontree.css +++ /dev/null @@ -1,107 +0,0 @@ -/* - * JSON Tree Viewer - * http://github.com/summerstyle/jsonTreeViewer - * - * Copyright 2017 Vera Lobacheva (http://iamvera.com) - * Released under the MIT license (LICENSE.txt) - */ - -/* Background for the tree. May use for element */ -.jsontree_bg { - background: #FFF; -} - -/* Styles for the container of the tree (e.g. fonts, margins etc.) */ -.jsontree_tree { - margin-left: 30px; - font-family: 'PT Mono', monospace; - font-size: 14px; -} - -/* Styles for a list of child nodes */ -.jsontree_child-nodes { - display: none; - margin-left: 35px; - margin-bottom: 5px; - line-height: 2; -} -.jsontree_node_expanded > .jsontree_value-wrapper > .jsontree_value > .jsontree_child-nodes { - display: block; -} - -/* Styles for labels */ -.jsontree_label-wrapper { - float: left; - margin-right: 8px; -} -.jsontree_label { - font-weight: normal; - vertical-align: top; - color: #000; - position: relative; - padding: 1px; - border-radius: 4px; - cursor: default; -} -.jsontree_node_marked > .jsontree_label-wrapper > .jsontree_label { - background: #fff2aa; -} - -/* Styles for values */ -.jsontree_value-wrapper { - display: block; - overflow: hidden; -} -.jsontree_node_complex > .jsontree_value-wrapper { - overflow: inherit; -} -.jsontree_value { - vertical-align: top; - display: inline; -} -.jsontree_value_null { - color: #777; - font-weight: bold; -} -.jsontree_value_string { - color: #025900; - font-weight: bold; -} -.jsontree_value_number { - color: #000E59; - font-weight: bold; -} -.jsontree_value_boolean { - color: #600100; - font-weight: bold; -} - -/* Styles for active elements */ -.jsontree_expand-button { - position: absolute; - top: 3px; - left: -15px; - display: block; - width: 11px; - height: 11px; - background-image: url('icons.svg'); -} -.jsontree_node_expanded > .jsontree_label-wrapper > .jsontree_label > .jsontree_expand-button { - background-position: 0 -11px; -} -.jsontree_show-more { - cursor: pointer; -} -.jsontree_node_expanded > .jsontree_value-wrapper > .jsontree_value > .jsontree_show-more { - display: none; -} -.jsontree_node_empty > .jsontree_label-wrapper > .jsontree_label > .jsontree_expand-button, -.jsontree_node_empty > .jsontree_value-wrapper > .jsontree_value > .jsontree_show-more { - display: none !important; -} -.jsontree_node_complex > .jsontree_label-wrapper > .jsontree_label { - cursor: pointer; -} -.jsontree_node_empty > .jsontree_label-wrapper > .jsontree_label { - cursor: default !important; -} \ No newline at end of file diff --git a/spider/resources/static/js/jsontree/jsontree.js b/spider/resources/static/js/jsontree/jsontree.js deleted file mode 100644 index 902abc6..0000000 --- a/spider/resources/static/js/jsontree/jsontree.js +++ /dev/null @@ -1,819 +0,0 @@ -/** - * JSON Tree library (a part of jsonTreeViewer) - * http://github.com/summerstyle/jsonTreeViewer - * - * Copyright 2017 Vera Lobacheva (http://iamvera.com) - * Released under the MIT license (LICENSE.txt) - */ - -var jsonTree = (function() { - - /* ---------- Utilities ---------- */ - var utils = { - - /* - * Returns js-"class" of value - * - * @param val {any type} - value - * @returns {string} - for example, "[object Function]" - */ - getClass : function(val) { - return Object.prototype.toString.call(val); - }, - - /** - * Checks for a type of value (for valid JSON data types). - * In other cases - throws an exception - * - * @param val {any type} - the value for new node - * @returns {string} ("object" | "array" | "null" | "boolean" | "number" | "string") - */ - getType : function(val) { - if (val === null) { - return 'null'; - } - - switch (typeof val) { - case 'number': - return 'number'; - - case 'string': - return 'string'; - - case 'boolean': - return 'boolean'; - } - - switch(utils.getClass(val)) { - case '[object Array]': - return 'array'; - - case '[object Object]': - return 'object'; - } - - throw new Error('Bad type: ' + utils.getClass(val)); - }, - - /** - * Applies for each item of list some function - * and checks for last element of the list - * - * @param obj {Object | Array} - a list or a dict with child nodes - * @param func {Function} - the function for each item - */ - forEachNode : function(obj, func) { - var type = utils.getType(obj), - isLast; - - switch (type) { - case 'array': - isLast = obj.length - 1; - - obj.forEach(function(item, i) { - func(i, item, i === isLast); - }); - - break; - - case 'object': - var keys = Object.keys(obj).sort(); - - isLast = keys.length - 1; - - keys.forEach(function(item, i) { - func(item, obj[item], i === isLast); - }); - - break; - } - - }, - - /** - * Implements the kind of an inheritance by - * using parent prototype and - * creating intermediate constructor - * - * @param Child {Function} - a child constructor - * @param Parent {Function} - a parent constructor - */ - inherits : (function() { - var F = function() {}; - - return function(Child, Parent) { - F.prototype = Parent.prototype; - Child.prototype = new F(); - Child.prototype.constructor = Child; - }; - })(), - - /* - * Checks for a valid type of root node* - * - * @param {any type} jsonObj - a value for root node - * @returns {boolean} - true for an object or an array, false otherwise - */ - isValidRoot : function(jsonObj) { - switch (utils.getType(jsonObj)) { - case 'object': - case 'array': - return true; - default: - return false; - } - }, - - /** - * Extends some object - */ - extend : function(targetObj, sourceObj) { - for (var prop in sourceObj) { - if (sourceObj.hasOwnProperty(prop)) { - targetObj[prop] = sourceObj[prop]; - } - } - } - }; - - - /* ---------- Node constructors ---------- */ - - /** - * The factory for creating nodes of defined type. - * - * ~~~ Node ~~~ is a structure element of an onject or an array - * with own label (a key of an object or an index of an array) - * and value of any json data type. The root object or array - * is a node without label. - * {... - * [+] "label": value, - * ...} - * - * Markup: - *
            • - * - * - * - * "label" - * - * : - * - * <(div|span) class="jsontree_value jsontree_value_(object|array|boolean|null|number|string)"> - * ... - * - *
            • - * - * @param label {string} - key name - * @param val {Object | Array | string | number | boolean | null} - a value of node - * @param isLast {boolean} - true if node is last in list of siblings - * - * @return {Node} - */ - function Node(label, val, isLast) { - var nodeType = utils.getType(val); - - if (nodeType in Node.CONSTRUCTORS) { - return new Node.CONSTRUCTORS[nodeType](label, val, isLast); - } else { - throw new Error('Bad type: ' + utils.getClass(val)); - } - } - - Node.CONSTRUCTORS = { - 'boolean' : NodeBoolean, - 'number' : NodeNumber, - 'string' : NodeString, - 'null' : NodeNull, - 'object' : NodeObject, - 'array' : NodeArray - }; - - - /* - * The constructor for simple types (string, number, boolean, null) - * {... - * [+] "label": value, - * ...} - * value = string || number || boolean || null - * - * Markup: - *
            • - * - * "age" - * : - * - * 25 - * , - *
            • - * - * @abstract - * @param label {string} - key name - * @param val {string | number | boolean | null} - a value of simple types - * @param isLast {boolean} - true if node is last in list of parent childNodes - */ - function _NodeSimple(label, val, isLast) { - if (this.constructor === _NodeSimple) { - throw new Error('This is abstract class'); - } - - var self = this, - el = document.createElement('li'), - labelEl, - template = function(label, val) { - var str = '\ - \ - "' + - label + - '" : \ - \ - \ - ' + - val + - '' + - (!isLast ? ',' : '') + - ''; - - return str; - }; - - self.label = label; - self.isComplex = false; - - el.classList.add('jsontree_node'); - el.innerHTML = template(label, val); - - self.el = el; - - labelEl = el.querySelector('.jsontree_label'); - - labelEl.addEventListener('click', function(e) { - if (e.altKey) { - self.toggleMarked(); - return; - } - - if (e.shiftKey) { - document.getSelection().removeAllRanges(); - alert(self.getJSONPath()); - return; - } - }, false); - } - - _NodeSimple.prototype = { - constructor : _NodeSimple, - - /** - * Mark node - */ - mark : function() { - this.el.classList.add('jsontree_node_marked'); - }, - - /** - * Unmark node - */ - unmark : function() { - this.el.classList.remove('jsontree_node_marked'); - }, - - /** - * Mark or unmark node - */ - toggleMarked : function() { - this.el.classList.toggle('jsontree_node_marked'); - }, - - /** - * Expands parent node of this node - * - * @param isRecursive {boolean} - if true, expands all parent nodes - * (from node to root) - */ - expandParent : function(isRecursive) { - if (!this.parent) { - return; - } - - this.parent.expand(); - this.parent.expandParent(isRecursive); - }, - - /** - * Returns JSON-path of this - * - * @param isInDotNotation {boolean} - kind of notation for returned json-path - * (by default, in bracket notation) - * @returns {string} - */ - getJSONPath : function(isInDotNotation) { - if (this.isRoot) { - return "$"; - } - - var currentPath; - - if (this.parent.type === 'array') { - currentPath = "[" + this.label + "]"; - } else { - currentPath = isInDotNotation ? "." + this.label : "['" + this.label + "']"; - } - - return this.parent.getJSONPath(isInDotNotation) + currentPath; - } - }; - - - /* - * The constructor for boolean values - * {... - * [+] "label": boolean, - * ...} - * boolean = true || false - * - * @constructor - * @param label {string} - key name - * @param val {boolean} - value of boolean type, true or false - * @param isLast {boolean} - true if node is last in list of parent childNodes - */ - function NodeBoolean(label, val, isLast) { - this.type = "boolean"; - - _NodeSimple.call(this, label, val, isLast); - } - utils.inherits(NodeBoolean,_NodeSimple); - - - /* - * The constructor for number values - * {... - * [+] "label": number, - * ...} - * number = 123 - * - * @constructor - * @param label {string} - key name - * @param val {number} - value of number type, for example 123 - * @param isLast {boolean} - true if node is last in list of parent childNodes - */ - function NodeNumber(label, val, isLast) { - this.type = "number"; - - _NodeSimple.call(this, label, val, isLast); - } - utils.inherits(NodeNumber,_NodeSimple); - - - /* - * The constructor for string values - * {... - * [+] "label": string, - * ...} - * string = "abc" - * - * @constructor - * @param label {string} - key name - * @param val {string} - value of string type, for example "abc" - * @param isLast {boolean} - true if node is last in list of parent childNodes - */ - function NodeString(label, val, isLast) { - this.type = "string"; - - _NodeSimple.call(this, label, '"' + val + '"', isLast); - } - utils.inherits(NodeString,_NodeSimple); - - - /* - * The constructor for null values - * {... - * [+] "label": null, - * ...} - * - * @constructor - * @param label {string} - key name - * @param val {null} - value (only null) - * @param isLast {boolean} - true if node is last in list of parent childNodes - */ - function NodeNull(label, val, isLast) { - this.type = "null"; - - _NodeSimple.call(this, label, val, isLast); - } - utils.inherits(NodeNull,_NodeSimple); - - - /* - * The constructor for complex types (object, array) - * {... - * [+] "label": value, - * ...} - * value = object || array - * - * Markup: - *
            • - * - * - * - * "label" - * - * : - * - *
              - * { - *
                - * } - * , - *
              - *
            • - * - * @abstract - * @param label {string} - key name - * @param val {Object | Array} - a value of complex types, object or array - * @param isLast {boolean} - true if node is last in list of parent childNodes - */ - function _NodeComplex(label, val, isLast) { - if (this.constructor === _NodeComplex) { - throw new Error('This is abstract class'); - } - - var self = this, - el = document.createElement('li'), - template = function(label, sym) { - var comma = (!isLast) ? ',' : '', - str = '\ -
              \ -
              \ - ' + sym[0] + '\ - \ -
                \ - ' + sym[1] + '' + - '
                ' + comma + - '
                '; - - if (label !== null) { - str = '\ - \ - ' + - '' + - '"' + label + - '" : \ - ' + str; - } - - return str; - }, - childNodesUl, - labelEl, - moreContentEl, - childNodes = []; - - self.label = label; - self.isComplex = true; - - el.classList.add('jsontree_node'); - el.classList.add('jsontree_node_complex'); - el.innerHTML = template(label, self.sym); - - childNodesUl = el.querySelector('.jsontree_child-nodes'); - - if (label !== null) { - labelEl = el.querySelector('.jsontree_label'); - moreContentEl = el.querySelector('.jsontree_show-more'); - - labelEl.addEventListener('click', function(e) { - if (e.altKey) { - self.toggleMarked(); - return; - } - - if (e.shiftKey) { - document.getSelection().removeAllRanges(); - alert(self.getJSONPath()); - return; - } - - self.toggle(e.ctrlKey || e.metaKey); - }, false); - - moreContentEl.addEventListener('click', function(e) { - self.toggle(e.ctrlKey || e.metaKey); - }, false); - - self.isRoot = false; - } else { - self.isRoot = true; - self.parent = null; - - el.classList.add('jsontree_node_expanded'); - } - - self.el = el; - self.childNodes = childNodes; - self.childNodesUl = childNodesUl; - - utils.forEachNode(val, function(label, node, isLast) { - self.addChild(new Node(label, node, isLast)); - }); - - self.isEmpty = !Boolean(childNodes.length); - if (self.isEmpty) { - el.classList.add('jsontree_node_empty'); - } - } - - utils.inherits(_NodeComplex, _NodeSimple); - - utils.extend(_NodeComplex.prototype, { - constructor : _NodeComplex, - - /* - * Add child node to list of child nodes - * - * @param child {Node} - child node - */ - addChild : function(child) { - this.childNodes.push(child); - this.childNodesUl.appendChild(child.el); - child.parent = this; - }, - - /* - * Expands this list of node child nodes - * - * @param isRecursive {boolean} - if true, expands all child nodes - */ - expand : function(isRecursive){ - if (this.isEmpty) { - return; - } - - if (!this.isRoot) { - this.el.classList.add('jsontree_node_expanded'); - } - - if (isRecursive) { - this.childNodes.forEach(function(item, i) { - if (item.isComplex) { - item.expand(isRecursive); - } - }); - } - }, - - /* - * Collapses this list of node child nodes - * - * @param isRecursive {boolean} - if true, collapses all child nodes - */ - collapse : function(isRecursive) { - if (this.isEmpty) { - return; - } - - if (!this.isRoot) { - this.el.classList.remove('jsontree_node_expanded'); - } - - if (isRecursive) { - this.childNodes.forEach(function(item, i) { - if (item.isComplex) { - item.collapse(isRecursive); - } - }); - } - }, - - /* - * Expands collapsed or collapses expanded node - * - * @param {boolean} isRecursive - Expand all child nodes if this node is expanded - * and collapse it otherwise - */ - toggle : function(isRecursive) { - if (this.isEmpty) { - return; - } - - this.el.classList.toggle('jsontree_node_expanded'); - - if (isRecursive) { - var isExpanded = this.el.classList.contains('jsontree_node_expanded'); - - this.childNodes.forEach(function(item, i) { - if (item.isComplex) { - item[isExpanded ? 'expand' : 'collapse'](isRecursive); - } - }); - } - }, - - /** - * Find child nodes that match some conditions and handle it - * - * @param {Function} matcher - * @param {Function} handler - * @param {boolean} isRecursive - */ - findChildren : function(matcher, handler, isRecursive) { - if (this.isEmpty) { - return; - } - - this.childNodes.forEach(function(item, i) { - if (matcher(item)) { - handler(item); - } - - if (item.isComplex && isRecursive) { - item.findChildren(matcher, handler, isRecursive); - } - }); - } - }); - - - /* - * The constructor for object values - * {... - * [+] "label": object, - * ...} - * object = {"abc": "def"} - * - * @constructor - * @param label {string} - key name - * @param val {Object} - value of object type, {"abc": "def"} - * @param isLast {boolean} - true if node is last in list of siblings - */ - function NodeObject(label, val, isLast) { - this.sym = ['{', '}']; - this.type = "object"; - - _NodeComplex.call(this, label, val, isLast); - } - utils.inherits(NodeObject,_NodeComplex); - - - /* - * The constructor for array values - * {... - * [+] "label": array, - * ...} - * array = [1,2,3] - * - * @constructor - * @param label {string} - key name - * @param val {Array} - value of array type, [1,2,3] - * @param isLast {boolean} - true if node is last in list of siblings - */ - function NodeArray(label, val, isLast) { - this.sym = ['[', ']']; - this.type = "array"; - - _NodeComplex.call(this, label, val, isLast); - } - utils.inherits(NodeArray, _NodeComplex); - - - /* ---------- The tree constructor ---------- */ - - /* - * The constructor for json tree. - * It contains only one Node (Array or Object), without property name. - * CSS-styles of .tree define main tree styles like font-family, - * font-size and own margins. - * - * Markup: - *
                  - * {Node} - *
                - * - * @constructor - * @param jsonObj {Object | Array} - data for tree - * @param domEl {DOMElement} - DOM-element, wrapper for tree - */ - function Tree(jsonObj, domEl) { - this.wrapper = document.createElement('ul'); - this.wrapper.className = 'jsontree_tree clearfix'; - - this.rootNode = null; - - this.sourceJSONObj = jsonObj; - - this.loadData(jsonObj); - this.appendTo(domEl); - } - - Tree.prototype = { - constructor : Tree, - - /** - * Fill new data in current json tree - * - * @param {Object | Array} jsonObj - json-data - */ - loadData : function(jsonObj) { - if (!utils.isValidRoot(jsonObj)) { - alert('The root should be an object or an array'); - return; - } - - this.sourceJSONObj = jsonObj; - - this.rootNode = new Node(null, jsonObj, 'last'); - this.wrapper.innerHTML = ''; - this.wrapper.appendChild(this.rootNode.el); - }, - - /** - * Appends tree to DOM-element (or move it to new place) - * - * @param {DOMElement} domEl - */ - appendTo : function(domEl) { - domEl.appendChild(this.wrapper); - }, - - /** - * Expands all tree nodes (objects or arrays) recursively - * - * @param {Function} filterFunc - 'true' if this node should be expanded - */ - expand : function(filterFunc) { - if (this.rootNode.isComplex) { - if (typeof filterFunc == 'function') { - this.rootNode.childNodes.forEach(function(item, i) { - if (item.isComplex && filterFunc(item)) { - item.expand(); - } - }); - } else { - this.rootNode.expand('recursive'); - } - } - }, - - /** - * Collapses all tree nodes (objects or arrays) recursively - */ - collapse : function() { - if (typeof this.rootNode.collapse === 'function') { - this.rootNode.collapse('recursive'); - } - }, - - /** - * Returns the source json-string (pretty-printed) - * - * @param {boolean} isPrettyPrinted - 'true' for pretty-printed string - * @returns {string} - for exemple, '{"a":2,"b":3}' - */ - toSourceJSON : function(isPrettyPrinted) { - if (!isPrettyPrinted) { - return JSON.stringify(this.sourceJSONObj); - } - - var DELIMETER = "[%^$#$%^%]", - jsonStr = JSON.stringify(this.sourceJSONObj, null, DELIMETER); - - jsonStr = jsonStr.split("\n").join("
                "); - jsonStr = jsonStr.split(DELIMETER).join("    "); - - return jsonStr; - }, - - /** - * Find all nodes that match some conditions and handle it - */ - findAndHandle : function(matcher, handler) { - this.rootNode.findChildren(matcher, handler, 'isRecursive'); - }, - - /** - * Unmark all nodes - */ - unmarkAll : function() { - this.rootNode.findChildren(function(node) { - return true; - }, function(node) { - node.unmark(); - }, 'isRecursive'); - } - }; - - - /* ---------- Public methods ---------- */ - return { - /** - * Creates new tree by data and appends it to the DOM-element - * - * @param jsonObj {Object | Array} - json-data - * @param domEl {DOMElement} - the wrapper element - * @returns {Tree} - */ - create : function(jsonObj, domEl) { - return new Tree(jsonObj, domEl); - } - }; -})(); \ No newline at end of file diff --git a/spider/resources/static/js/layui/css/layui.css b/spider/resources/static/js/layui/css/layui.css deleted file mode 100644 index f297bf6..0000000 --- a/spider/resources/static/js/layui/css/layui.css +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.4.5 MIT License By https://www.layui.com */ - .layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-elip,.layui-form-checkbox span,.layui-form-pane .layui-form-label{text-overflow:ellipsis;white-space:nowrap}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:24px;font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:1px;margin:10px 0;border:0;clear:both}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-edge{display:inline-block;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{overflow:hidden}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=240);src:url(../font/iconfont.eot?v=240#iefix) format('embedded-opentype'),url(../font/iconfont.svg?v=240#iconfont) format('svg'),url(../font/iconfont.woff?v=240) format('woff'),url(../font/iconfont.ttf?v=240) format('truetype')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-home:before{content:"\e68e"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-cols:before{content:"\e610"}.layui-icon-export:before{content:"\e67d"}.layui-icon-print:before{content:"\e66d"}.layui-icon-slider:before{content:"\e714"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:absolute;left:200px;right:0;top:0;bottom:0;z-index:998;width:auto;overflow:hidden;overflow-y:auto;box-sizing:border-box}.layui-layout-body{overflow:hidden}.layui-layout-admin .layui-header{background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{top:60px;bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;height:44px;line-height:44px;padding:0 15px;background-color:#eee}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:'';display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space3{margin:-1.5px}.layui-col-space3>*{padding:1.5px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space8{margin:-3.5px}.layui-col-space8>*{padding:3.5px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:22px;border-left:5px solid #009688;border-radius:0 2px 2px 0;background-color:#f2f2f2}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:10px 15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#e2e2e2}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#f2f2f2;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{position:relative;height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-card-body{position:relative;padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #E6E6E6;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-textarea{position:relative}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#eee!important;color:#666!important}.layui-badge-rim,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#e6e6e6}.layui-timeline-item:before,hr{background-color:#e6e6e6}.layui-text{line-height:22px;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding:0 5px!important}.layui-btn{display:inline-block;height:38px;line-height:38px;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border:none;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{margin-right:3px;font-size:18px;vertical-align:bottom;vertical-align:middle\9}.layui-btn-primary{border:1px solid #C9C9C9;background-color:#fff;color:#555}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border:1px solid #e6e6e6;background-color:#FBFBFB;color:#C9C9C9;cursor:not-allowed;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-sm i{font-size:16px!important}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:14px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#C9C9C9;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #c9c9c9}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#D2D2D2!important}.layui-input:focus,.layui-textarea:focus{border-color:#C9C9C9!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f2f2f2;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disbaled,.layui-checkbox-disbaled i{border-color:#e2e2e2!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio>i:hover,.layui-form-radioed>i{color:#5FB878}.layui-radio-disbaled>i{color:#e2e2e2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #e2e2e2}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#e2e2e2;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #e2e2e2}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#e6e6e6}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#f2f2f2}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:0 -1px 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#C9C9C9}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{padding:0 10px;color:#999}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-tree{line-height:26px}.layui-tree li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-tree li .layui-tree-spread,.layui-tree li a{display:inline-block;vertical-align:top;height:26px;*display:inline;*zoom:1;cursor:pointer}.layui-tree li a{font-size:0}.layui-tree li a i{font-size:16px}.layui-tree li a cite{padding:0 6px;font-size:14px;font-style:normal}.layui-tree li i{padding-left:6px;color:#333;-moz-user-select:none}.layui-tree li .layui-tree-check{font-size:13px}.layui-tree li .layui-tree-check:hover{color:#009E94}.layui-tree li ul{display:none;margin-left:20px}.layui-tree li .layui-tree-enter{line-height:24px;border:1px dotted #000}.layui-tree-drag{display:none;position:absolute;left:-666px;top:-666px;background-color:#f2f2f2;padding:5px 10px;border:1px dotted #000;white-space:nowrap}.layui-tree-drag i{padding-right:5px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar,.layui-nav-tree .layui-nav-itemed:after{position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s}.layui-nav-bar{z-index:1000}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{content:'';top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:50%;right:3px;margin-top:-3px;border-width:6px;border-top-color:rgba(255,255,255,.7)}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{margin-top:-9px;border-style:dashed dashed solid;border-color:transparent transparent #fff}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #d2d2d2;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#333}.layui-nav .layui-nav-child a:hover{background-color:#f2f2f2;color:#000}.layui-nav-child dd{position:relative}.layui-nav .layui-nav-child dd.layui-this a,.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:45px}.layui-nav-tree .layui-nav-item a{position:relative;height:45px;line-height:45px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item a:hover{background-color:#4E5465}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child a{height:40px;line-height:40px;color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-tree .layui-nav-more{right:10px}.layui-nav-itemed>.layui-nav-child{display:block;padding:0;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-bg-blue .layui-nav-bar,.layui-bg-blue .layui-nav-itemed:after,.layui-bg-blue .layui-this:after{background-color:#93D1FF}.layui-bg-blue .layui-nav-child dd.layui-this{background-color:#1E9FFF}.layui-bg-blue .layui-nav-itemed>a,.layui-nav-tree.layui-bg-blue .layui-nav-title a,.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover{background-color:#007DDB!important}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#e2e2e2;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:10px}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#f2f2f2}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:'';position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:last-child:before{display:none}.layui-timeline-item:first-child:before{display:block}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-8px 6px 0}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#e2e2e2;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New;font-size:12px}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #e6e6e6;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;z-index:66666666;width:280px;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#e2e2e2;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:'';position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #e6e6e6;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-15px}.layui-slider-input-btn{display:none;position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #d2d2d2}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #d2d2d2}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:34px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .3s;-webkit-transition:all .3s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout} \ No newline at end of file diff --git a/spider/resources/static/js/layui/css/layui.mobile.css b/spider/resources/static/js/layui/css/layui.mobile.css deleted file mode 100644 index 6f7f0a1..0000000 --- a/spider/resources/static/js/layui/css/layui.mobile.css +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.4.5 MIT License By https://www.layui.com */ - blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} \ No newline at end of file diff --git a/spider/resources/static/js/layui/css/modules/code.css b/spider/resources/static/js/layui/css/modules/code.css deleted file mode 100644 index d0d3822..0000000 --- a/spider/resources/static/js/layui/css/modules/code.css +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.4.5 MIT License By https://www.layui.com */ - html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} \ No newline at end of file diff --git a/spider/resources/static/js/layui/css/modules/laydate/default/laydate.css b/spider/resources/static/js/layui/css/modules/laydate/default/laydate.css deleted file mode 100644 index f7e690e..0000000 --- a/spider/resources/static/js/layui/css/modules/laydate/default/laydate.css +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.4.5 MIT License By https://www.layui.com */ - .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} \ No newline at end of file diff --git a/spider/resources/static/js/layui/css/modules/layer/default/icon-ext.png b/spider/resources/static/js/layui/css/modules/layer/default/icon-ext.png deleted file mode 100644 index bbbb669bb311514baa5db3a6a00b4644d0e280f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5911 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 bWW^%>x7XlHV^#Q1uOX^B?ki3(VEg|7!QHuF diff --git a/spider/resources/static/js/layui/css/modules/layer/default/loading-1.gif b/spider/resources/static/js/layui/css/modules/layer/default/loading-1.gif deleted file mode 100644 index db3a483e4b74971fbfb1cc0fb6499852cedfe650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 zcmZ?wbhEHbRAo?Qn8?Ji_w)@mZNLBj|1&T!DE{a6a}5c0b_{Se(lcOY1PT3QVdY|A zV$cDyff`g97?`@J^shYqmS1s(LX_+4yGox$4el*+Jm?ved2^25GBru=T^dGm#<906 za&AQCZ08H8P;Bd&{NT;vl&}c_^L4%p?g_hjBu{YB29{c>Ob}p@z~Ks3xCw+@!HClp xtZ<(QPf3`00FNu+VbOvoEE+h73k#4LIKl$IE8t;)<_eUs!0QU6uz&iJhvXcHF*h)T1OnEW1i^?zgDfop1p?usL*#PMGT;HQkSO{q6FlJyb$PWkPf|h*eTST}7h8z$}MF(XD(aQ)ZLZ zM?v0rT<1C4XHn<6PbNA{XL@>1^)apdD_@tcYDrW#m`k#MmslI7p^P;Az74wGs`!SI zLs$GEZHsafXsu1i-WleMzAL(yw$-LK{0hv;6hrx8kx!!4$``dAyBnY9Jz&DqJo2$A z!(L$H=KqBeY~CF_viHPz^tTglc?D97CqEBjzUwH}7GI zapg8YZM~>2Wk%E$d&r@9ly9b4Q zJpM7T@}r63I(OExUlG%Xcjz3MU+9U^r!SkpjNThDtaP)7>j6L5z%o5|^hlVOyI*uY zt^UU6NTuY?(Lb4ZIU2Zb5Vz}Pb7KF%ivf&j^CL>$cDz?rMNTQQ|NqDVD7mhghUp%h zhIA{gi{S8y9YhIIbSv$`B!JiPi!0#4#Jge0)p&YVPHchWcyAn zQhvb8ggXGXs9;k`u9Uq*YB>O+Q3Rq=2hlLFcG{Q3ORH_}JnY8C+r%@}6|%ySP%bWG zV~mA;?P`Q2L_Ss})nrJ{$TmeA9Tt*4=}X5x%RioM@_?ZsKSEST-f+GBv~Ya)xX3O{ z8!d=YthI-13OI;RN~`>|6u5L{z20oBp%9MIj)n$!Aw{Wpq&Rtr4~*_74Gjo@3el>B zz(Rk;;>2lp73<2;d=r*8z%WkdsG=vRuG_fvxO#uN^El|+5Qoz^X!2MfxJ3m}vyi?> zMLLDi8+${Z6YbUg?8GNR>-+SwHKdFyr%HqWcs|X_l*-DAC^bG&KCqWg7-_`UlwQ`EdOp_LJkr`L$mHHs75uP?fSgVfsDjuE#ft2b8HDt0yFt!+;C zEgL=)G9ZFt4wa+N3Xg7FGc0~`&EEt6_%7tyzmnb9B_h1~7~GD4V-Bhx7~QKRkF>&aT>(-!Us@aJxAY@8E?HW$G8g zSz@7Jcp>iCp;lU1ieF6n7!oAa-1E!rS0 zF1lBFVS%G#ZO}b@*+bIk+7@Q|iG60vIDVpV%4tW8rKyzwRo_<25;8*Ky@n z-sX>W*b;M){5lB_Edc@m1`VHy0@dg$PTR9uE$O2&a?KAe?xRlCj&Z$iZYwa{ - display: block; - padding: 0 1em; - text-decoration: none; - width: auto; - color: #000; - white-space: nowrap; - line-height: 2.4em; - text-shadow: 1px 1px 0 #fff; - border-radius: 1px; -} -#tree-menu li>a:hover{ - background-color: #e8eff7; - box-shadow: 0 0 2px #0a6aa1; -} -.tree-menu-bg{ - background-color: #ccc; -} -/* #endregion */ \ No newline at end of file diff --git a/spider/resources/static/js/layui/ext/eleTree/eleTree.js b/spider/resources/static/js/layui/ext/eleTree/eleTree.js deleted file mode 100644 index ee446fd..0000000 --- a/spider/resources/static/js/layui/ext/eleTree/eleTree.js +++ /dev/null @@ -1,1216 +0,0 @@ -/** - * 基于layui的tree重写 - * author: hsianglee - * 最近修改时间: 2019/01/07 - */ - -layui.define(["jquery","laytpl"], function (exports) { - var $ = layui.jquery; - var laytpl = layui.laytpl; - var hint = layui.hint(); - - var MOD_NAME="eleTree"; - - //外部接口 - var eleTree={ - //事件监听 - on: function(events, callback){ - return layui.onevent.call(this, MOD_NAME, events, callback); - }, - render: function(options) { - var inst = new Class(options); - return thisTree.call(inst); - } - } - - var thisTree=function() { - var _self=this; - var options = _self.config; - - // 暴漏外面的方法 - return { - // 接收两个参数,1. 节点 key 2. 节点数据的数组 - updateKeyChildren: function(key,data) { - if(options.data.length===0) return; - return _self.updateKeyChildren.call(_self,key,data); - }, - updateKeySelf: function(key,data) { - if(options.data.length===0) return; - return _self.updateKeySelf.call(_self,key,data); - }, - remove: function(key) { - if(options.data.length===0) return; - return _self.remove.call(_self,key); - }, - append: function(key,data) { - if(options.data.length===0) return; - return _self.append.call(_self,key,data); - }, - insertBefore: function(key,data) { - if(options.data.length===0) return; - return _self.insertBefore.call(_self,key,data); - }, - insertAfter: function(key,data) { - if(options.data.length===0) return; - return _self.insertAfter.call(_self,key,data); - }, - // 接收两个 boolean 类型的参数,1. 是否只是叶子节点,默认值为 false 2. 是否包含半选节点,默认值为 false - getChecked: function(leafOnly, includeHalfChecked) { - if(options.data.length===0) return; - return _self.getChecked.call(_self,leafOnly, includeHalfChecked); - }, - // 接收勾选节点数据的数组 - setChecked: function(data) { - if(options.data.length===0) return; - return _self.setChecked.call(_self,data); - }, - // 取消选中 - unCheckNodes: function() { - if(options.data.length===0) return; - return _self.unCheckNodes.call(_self); - }, - expandAll: function() { - options.elem.children(".eleTree-node").children(".eleTree-node-group").empty(); - _self.expandAll.call(_self,options.data,[],1,true); - _self.unCheckNodes(); - _self.defaultChecked(); - }, - unExpandAll: function() { - return _self.unExpandAll.call(_self); - }, - reload: function(options) { - return _self.reload.call(_self,options); - }, - search: function(value) { - return _self.search.call(_self,value); - } - } - } - - // 模板渲染 - var TPL_ELEM=function(options,floor,parentStatus) { - return [ - '{{# for(var i=0;i
                ', - '', - '', - '{{# }else{ }}', - 'leaf-icon" style="color: transparent;" >', - '{{# } }}' - ].join(""); - return str; - } - return ['{{# if(!d[i]["'+options.request.children+'"] || d[i]["'+options.request.children+'"].length===0){ }}', - 'leaf-icon" style="color: transparent;"', - '{{# } }}', - '">' - ].join(""); - }(), - '', - function() { - if(options.showCheckbox){ - var status=""; - if(parentStatus==="1"){ - status='"1" checked'; - }else if(parentStatus==="2"){ - status='"2"'; - }else{ - status='"0"'; - } - return [ - '{{# if(d[i]["'+options.request.checked+'"]) { }}', - '' - ].join(""); - } - return '' - }(), - '', - '
                ', - '
                ', - '
                ', - '
                ', - '{{# } }}' - ].join(""); - } - - var TPL_NoText=function() { - return '

                {{d.emptText}}

                '; - } - - var Class=function(options) { - options.response=$.extend({}, this.config.response, options.response); - options.request=$.extend({}, this.config.request, options.request); - this.config = $.extend({}, this.config, options); - this.prevClickEle=null; - this.addKeyIndex=20181201; - this.nameIndex=1; - this.render(); - }; - - Class.prototype={ - constructor: Class, - config: { - elem: "", - data: [], - emptText: "暂无数据", // 内容为空的时候展示的文本 - renderAfterExpand: true, // 是否在第一次展开某个树节点后才渲染其子节点 - highlightCurrent: false, // 是否高亮当前选中节点,默认值是 false。 - defaultExpandAll: false, // 是否默认展开所有节点 - expandOnClickNode: true, // 是否在点击节点的时候展开或者收缩节点, 默认值为 true,如果为 false,则只有点箭头图标的时候才会展开或者收缩节点。 - checkOnClickNode: false, // 是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点。 - defaultExpandedKeys: [], // 默认展开的节点的 key 的数组 - autoExpandParent: true, // 展开子节点的时候是否自动展开父节点 - showCheckbox: false, // 节点是否可被选择 - checkStrictly: false, // 在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 false - defaultCheckedKeys: [], // 默认勾选的节点的 key 的数组 - accordion: false, // 是否每次只打开一个同级树节点展开(手风琴效果) - indent: 16, // 相邻级节点间的水平缩进,单位为像素 - lazy: false, // 是否懒加载子节点,需与 load 方法结合使用 - load: function() {}, // 加载子树数据的方法,仅当 lazy 属性为true 时生效 - draggable: false, // 是否开启拖拽节点功能 - contextmenuList: [], // 启用右键菜单,支持的操作有:"copy","add","edit","remove" - searchNodeMethod: null, // 对树节点进行筛选时执行的方法,返回 true 表示这个节点可以显示,返回 false 则表示这个节点会被隐藏 - - method: "get", - url: "", - contentType: "", - headers: {}, - done: null, - - response: { - statusName: "code", - statusCode: 0, - dataName: "data" - }, - request: { - name: "label", - key: "id", - children: "children", - disabled: "disabled", - checked: "checked", - isLeaf: "isLeaf" - } - }, - render: function() { - if(this.config.indent>30){ - this.config.indent=30; - }else if(this.config.indent<10){ - this.config.indent=10; - } - var options=this.config; - options.where=options.where || {}; - if(!options.elem) return hint.error("缺少elem参数"); - options.elem=typeof options.elem === "string" ? $(options.elem) : options.elem; - this.filter=options.elem.attr("lay-filter"); - // load加载框 - options.elem.append('
                ') - - // 判断加载方式 - if(options.data.length===0){ - this.ajaxGetData(); - }else{ - this.renderData(); - } - }, - renderData: function() { - var options=this.config; - // 渲染第一层 - laytpl(TPL_ELEM(options,0)).render(options.data, function(string){ - options.elem.html(string).children().show(); - }); - // 懒加载 > 展开所有 > 初始展开项 > 初始渲染所有子节点 > 初始选中项 > 每次点击只渲染当前层(默认) - // 判断所有dom是否全部加载 - if(!options.lazy){ - if(!options.renderAfterExpand || options.defaultExpandAll || options.defaultExpandedKeys.length>0 || options.defaultCheckedKeys.length>0){ - this.expandAll(options.data,[],1); - } - } - - this.eleTreeEvent(); - this.checkboxRender(); - this.checkboxEvent(); - this.defaultChecked(); - this.nodeEvent(); - this.rightClickMenu(); - if(!options.checkStrictly){ - this.checkboxInit(); - } - }, - ajaxGetData: function() { - var options=this.config; - var _self=this; - if(!options.url) { - laytpl(TPL_NoText()).render(options, function(string){ - options.elem.html(string); - }); - return; - } - var data = $.extend({}, options.where); - if(options.contentType && options.contentType.indexOf("application/json") == 0){ //提交 json 格式 - data = JSON.stringify(data); - } - - $.ajax({ - type: options.method || 'get' - ,url: options.url - ,contentType: options.contentType - ,data: data - ,dataType: 'json' - ,headers: options.headers || {} - ,success: function(res){ - if(res[options.response.statusName] != options.response.statusCode || !res[options.response.dataName]){ - hint.error("请检查数据格式是否符合规范"); - typeof options.done === 'function' && options.done(res); - return; - } - options.data=res[options.response.dataName]; - _self.renderData(); - typeof options.done === 'function' && options.done(res); - } - }); - }, - reload: function(options) { - var _self=this; - if(this.config.data && this.config.data.constructor === Array) this.config.data=[]; - this.config = $.extend({}, this.config, options); - $(this.config.elem).off(); // 取消事件绑定,防止多次绑定事件 - // reload记录选中的数据 - // this.getChecked().forEach(function(val) { - // if($.inArray(val.key,this.config.defaultCheckedKeys)===-1){ - // this.config.defaultCheckedKeys.push(val.key); - // } - // },this); - return eleTree.render(this.config) - }, - // 下拉 - eleTreeEvent: function() { - var _self=this; - var options=this.config; - // 下拉 - var expandOnClickNode=options.expandOnClickNode?".eleTree-node-content":".eleTree-node-content>.eleTree-node-content-icon"; - options.elem.on("click",expandOnClickNode,function(e) { - e.stopPropagation(); - var eleTreeNodeContent=$(this).parent(".eleTree-node").length===0?$(this).parent(".eleTree-node-content"):$(this); - var eleNode=eleTreeNodeContent.parent(".eleTree-node"); - var sibNode=eleTreeNodeContent.siblings(".eleTree-node-group"); - var el=eleTreeNodeContent.children(".eleTree-node-content-icon").children(".layui-icon"); - - // 添加active背景 - if(_self.prevClickEle) _self.prevClickEle.removeClass("eleTree-node-content-active"); - if(options.highlightCurrent) eleTreeNodeContent.addClass("eleTree-node-content-active"); - _self.prevClickEle=eleTreeNodeContent; - - - - if(el.hasClass("icon-rotate")){ - // 合并 - sibNode.children(".eleTree-node:not(.eleTree-search-hide)").hide("fast"); - el.removeClass("icon-rotate"); - return; - } - - if(sibNode.children(".eleTree-node").length===0){ - var floor=Number(eleNode.attr("eletree-floor"))+1; - - var data=_self.reInitData(eleNode); - var d=data.currentData; - // 是否懒加载 - if(options.lazy && el.hasClass("lazy-icon")){ - el.removeClass("layui-icon-triangle-r").addClass("layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"); - options.load(d,function(getData) { - d[options.request.children]=getData; - var eletreeStatus=eleTreeNodeContent.children("input.eleTree-hideen").attr("eletree-status"); - if(d[options.request.children] && d[options.request.children].length>0){ - laytpl(TPL_ELEM(options,floor,eletreeStatus)).render(d[options.request.children], function(string){ - sibNode.append(string).children().show("fast"); - }); - }else{ - el.css("color","transparent").addClass("leaf-icon"); - } - el.removeClass("lazy-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop").addClass("layui-icon-triangle-r icon-rotate"); - _self.checkboxRender(); - - // 懒加载子元素选择祖父(待写) - }) - }else{ - var eletreeStatus=eleTreeNodeContent.children("input.eleTree-hideen").attr("eletree-status"); - d[options.request.children] && d[options.request.children].length>0 && laytpl(TPL_ELEM(options,floor,eletreeStatus)).render(d[options.request.children], function(string){ - sibNode.append(string); - }); - - // 选择祖父 - var eleNode1=sibNode.children(".eleTree-node").eq(0); - if(eleNode1.length===0){ - _self.checkboxRender(); - return; - } - var siblingNode1=eleNode1.siblings(".eleTree-node"); - var item1=eleNode1.children(".eleTree-node-content").children(".eleTree-hideen").get(0); - _self.selectParents(item1,eleNode1,siblingNode1); - _self.checkboxRender(); - } - } - // 显示隐藏没有搜索类的 - sibNode.children(".eleTree-node:not(.eleTree-search-hide)").show("fast"); - el.addClass("icon-rotate"); - // 手风琴效果 - if(options.accordion){ - var node=eleTreeNodeContent.parent(".eleTree-node").siblings(".eleTree-node"); - node.children(".eleTree-node-group").children(".eleTree-node:not(.eleTree-search-hide)").hide("fast"); - node.children(".eleTree-node-content").children(".eleTree-node-content-icon").children(".layui-icon").removeClass("icon-rotate"); - } - }) - }, - // checkbox选中 - checkboxEvent: function() { - var options=this.config; - var _self=this; - var checkOnClickNode=options.checkOnClickNode?".eleTree-node-content":".eleTree-checkbox"; - // input添加属性eleTree-status:即input的三种状态,"0":未选中,"1":选中,"2":子孙部分选中 - options.elem.on("click",checkOnClickNode,function(e,type) { - e.stopPropagation(); - var eleTreeNodeContent=$(this).parent(".eleTree-node").length===0?$(this).parent(".eleTree-node-content"):$(this); - var checkbox=eleTreeNodeContent.children(".eleTree-checkbox"); - if(checkbox.hasClass("eleTree-checkbox-disabled")) return; - // 获取点击所在数据 - var node=eleTreeNodeContent.parent(".eleTree-node"); - // var d=_self.reInitData(node).currentData; - // 实际的input - var inp=checkbox.siblings(".eleTree-hideen").get(0); - var childNode=eleTreeNodeContent.siblings(".eleTree-node-group").find("input[name='eleTree-node']"); - - // 添加active背景 - if(_self.prevClickEle) _self.prevClickEle.removeClass("eleTree-node-content-active"); - if(options.highlightCurrent) eleTreeNodeContent.addClass("eleTree-node-content-active"); - _self.prevClickEle=eleTreeNodeContent; - - if(!inp){ - return; - } - - if(inp.checked){ - // 反选自身 - $(inp).prop("checked",false).attr("eleTree-status","0"); - // 点击祖父层选中子孙层 - if(!options.checkStrictly){ - childNode.prop("checked",false); - childNode.attr("eleTree-status","0"); - } - - }else{ - // 反选自身 - $(inp).prop("checked",true).attr("eleTree-status","1"); - // 点击祖父层选中子孙层 - if(!options.checkStrictly){ - childNode.prop("checked",true).attr("eleTree-status","1"); - } - } - - var eleNode=eleTreeNodeContent.parent(".eleTree-node"); - // 点击子孙层选中祖父层(递归) - if(!options.checkStrictly){ - var siblingNode=eleNode.siblings(".eleTree-node"); - // 点击子孙层选中祖父层(递归) - _self.selectParents(inp,eleNode,siblingNode); - } - - _self.checkboxRender(); - - if(type==="default") return; - layui.event.call(inp, MOD_NAME, 'nodeChecked('+ _self.filter +')', { - node: eleNode, - data: _self.reInitData(eleNode), - isChecked: inp.checked - }); - }) - }, - // 对后台数据有 checked:true 的默认选中项渲染父子层 - checkboxInit: function() { - var options=this.config; - var _self=this; - options.elem.find("input[eleTree-status='1']").each(function(index,item) { - var checkboxEl=$(item).siblings(".eleTree-checkbox"); - var childNode=checkboxEl.parent(".eleTree-node-content").siblings(".eleTree-node-group").find("input[name='eleTree-node']"); - // 选择当前 - checkboxEl.addClass("eleTree-checkbox-checked"); - checkboxEl.children("i").addClass("layui-icon-ok").removeClass("eleTree-checkbox-line"); - // 选择子孙 - childNode.prop("checked","checked").attr("eleTree-status","1"); - childNode.siblings(".eleTree-checkbox").addClass("eleTree-checkbox-checked"); - childNode.siblings(".eleTree-checkbox").children("i").addClass("layui-icon-ok").removeClass("eleTree-checkbox-line"); - - // 选择祖父 - var eleNode=checkboxEl.parent(".eleTree-node-content").parent(".eleTree-node"); - var siblingNode=eleNode.siblings(".eleTree-node"); - _self.selectParents(item,eleNode,siblingNode); - }) - _self.checkboxRender(); - }, - // 通过子元素选中祖父元素 - selectParents: function(inp,eleNode,siblingNode) { - // inp: 实际input(dom元素) - // eleNode: input父层类(.eleTree-node) - // siblingNode: 父层同级兄弟 - while (Number(eleNode.attr("eletree-floor"))!==0) { - // 同级input状态存入数组 - var arr=[]; - arr.push($(inp).attr("eleTree-status")); - siblingNode.each(function(index,item) { - var siblingIsChecked=$(item).children(".eleTree-node-content").children("input[name='eleTree-node']").attr("eleTree-status"); - arr.push(siblingIsChecked); - }) - // 父元素的实际input - var parentInput=eleNode.parent(".eleTree-node-group").siblings(".eleTree-node-content").children("input[name='eleTree-node']"); - // 父元素的checkbox替代 - var parentCheckbox=parentInput.siblings(".eleTree-checkbox"); - // 子都选中则选中父 - if(arr.every(function(val) { - return val==="1"; - })){ - parentInput.prop("checked",true).attr("eleTree-status","1"); - } - // 子有一个未选中则checkbox第三种状态 - if(arr.some(function(val) { - return val==="0" || val==="2"; - })){ - parentInput.attr("eleTree-status","2"); - } - // 子全部未选中则取消父选中(并且取消第三种状态) - if(arr.every(function(val) { - return val==="0"; - })){ - parentInput.prop("checked",false); - parentInput.attr("eleTree-status","0"); - } - - var parentNode=eleNode.parents("[eletree-floor='"+(Number(eleNode.attr("eletree-floor"))-1)+"']"); - var parentCheckbox=parentNode.children(".eleTree-node-content").children("input[name='eleTree-node']").get(0); - var parentSiblingNode=parentNode.siblings(".eleTree-node"); - eleNode=parentNode; - inp=parentCheckbox; - siblingNode=parentSiblingNode; - } - }, - // 初始展开所有 - expandAll: function(data,arr,floor,isMethodsExpandAll) { - var options=this.config; - var _self=this; - data.forEach(function(val,index) { - arr.push(index); - if(val[options.request.children] && val[options.request.children].length>0){ - var el=options.elem.children(".eleTree-node").eq(arr[0]).children(".eleTree-node-group"); - for(var i=1;i0) { - // 展开指定id项 - var id=el.parent(".eleTree-node").attr("data-"+options.request.key); - id=isNaN(id) ? id : Number(id); - if($.inArray(id,options.defaultExpandedKeys)!==-1){ - el.siblings(".eleTree-node-content").children(".eleTree-node-content-icon").children(".layui-icon").addClass("icon-rotate"); - el.children().show(); - // 展开子项是否继续展开祖父项 - if(options.autoExpandParent){ - var eleP=el.parent(".eleTree-node[data-"+options.request.key+"]").parents(".eleTree-node"); - eleP.each(function(i,item) { - if($(item).attr("data-"+options.request.key)){ - $(item).children(".eleTree-node-group").siblings(".eleTree-node-content").children(".eleTree-node-content-icon").children(".layui-icon").addClass("icon-rotate"); - $(item).children(".eleTree-node-group").children().show(); - } - }) - } - } - } - }); - floor++; - _self.expandAll(val[options.request.children],arr,floor,isMethodsExpandAll); - floor--; - } - // 重置数组索引 - arr.pop(); - }) - - - }, - // 初始默认选中 - defaultChecked: function() { - var options=this.config; - if(options.defaultCheckedKeys.length===0){ - return false; - } - // 判断是否父子无关 - if(options.checkStrictly){ - options.defaultCheckedKeys.forEach(function(val,index) { - var nodeContent=options.elem.find("[data-"+options.request.key+"='"+val+"']").children(".eleTree-node-content"); - // 如果当前没选中则选中 - if(nodeContent.children(".eleTree-hideen").prop("checked")===false){ - nodeContent.children(".eleTree-checkbox").trigger("click",["default"]); - } - }) - return false; - } - // 父元素优先 - var arr=$.extend([],options.defaultCheckedKeys); - options.defaultCheckedKeys.forEach(function(val,index) { - options.elem.find("[data-"+options.request.key+"='"+val+"']").find("[data-"+options.request.key+"]").each(function(i,item) { - var id=$(item).attr("data-"+options.request.key); - id=isNaN(id) ? id : Number(id); - var isInArrayIndex=$.inArray(id,arr); - if(isInArrayIndex!==-1){ - arr.splice(isInArrayIndex,1); - } - }) - }) - arr.forEach(function(val,index) { - var nodeContent=options.elem.find("[data-"+options.request.key+"='"+val+"']").children(".eleTree-node-content"); - // 如果当前没选中则选中 - if(nodeContent.children(".eleTree-hideen").prop("checked")===false){ - nodeContent.children(".eleTree-checkbox").trigger("click",["default"]); - } - }) - }, - // 自定义checkbox解析 - checkboxRender: function() { - var options=this.config; - options.elem.find(".eleTree-checkbox").remove(); - options.elem.find("input.eleTree-hideen[type=checkbox]").each(function(index,item){ - if($(item).hasClass("eleTree-disabled")){ - $(item).after('
                '); - }else{ - $(item).after('
                '); - } - - var checkbox=$(item).siblings(".eleTree-checkbox"); - if($(item).attr("eletree-status")==="1"){ - checkbox.addClass("eleTree-checkbox-checked"); - checkbox.children("i").addClass("layui-icon-ok").removeClass("eleTree-checkbox-line"); - }else if($(item).attr("eletree-status")==="0"){ - checkbox.removeClass("eleTree-checkbox-checked"); - checkbox.children("i").removeClass("layui-icon-ok eleTree-checkbox-line"); - }else if($(item).attr("eletree-status")==="2"){ - checkbox.addClass("eleTree-checkbox-checked"); - checkbox.children("i").removeClass("layui-icon-ok").addClass("eleTree-checkbox-line"); - } - - }) - }, - // 通过dom节点找对应数据 - reInitData: function(node) { - var options=this.config; - var i=node.index(); - var floor=Number(node.attr("eletree-floor")); - var arr=[]; // 节点对应的index - while (floor>=0) { - arr.push(i); - floor=floor-1; - node=node.parents("[eletree-floor='"+floor+"']"); - i=node.index(); - } - arr=arr.reverse(); - var oData=this.config.data; - // 当前节点的父节点数据 - var parentData=oData[arr[0]]; - // 当前节点的data数据 - var d = oData[arr[0]]; - for(var i = 1; i0){ - fn(data[obj.i][options.request.children]); - } - }else{ - callback(data,obj); - } - } - } - fn(options.data); - }, - updateKeyChildren: function(key,data) { - var options=this.config; - var node=options.elem.find("[data-"+options.request.key+"='"+key+"']"); - var floor=Number(node.attr("eletree-floor"))+1; - var _self=this; - - this.keySearchToOpera(key,function(d,obj) { - // 数据更新 - d[obj.i][options.request.children]=data; - // dom更新 - node.length!==0 && laytpl(TPL_ELEM(options,floor)).render(data, function(string){ - $(node).children(".eleTree-node-group").empty().append(string); - options.defaultExpandAll && $(node).children(".eleTree-node-group").children().show(); - }); - _self.unCheckNodes(); - _self.defaultChecked(); - }); - }, - updateKeySelf: function(key,data) { - var options=this.config; - var node=options.elem.find("[data-"+options.request.key+"='"+key+"']").children(".eleTree-node-content"); - var floor=Number(node.attr("eletree-floor"))+1; - data[options.request.name] && node.children(".eleTree-node-content-label").text(data[options.request.name]); - data[options.request.disabled] && node.children(".eleTree-hideen").addClass("eleTree-disabled") - .siblings(".eleTree-checkbox").addClass("eleTree-checkbox-disabled"); - // 数据更新 - var getData=this.keySearchToOpera(key,function(d,obj) { - data[options.request.key]=d[obj.i][options.request.key]; - data[options.request.children]=d[obj.i][options.request.children]; - d[obj.i]=$.extend({},d[obj.i],data); - console.log(options.data); - }); - }, - remove: function(key) { - var options=this.config; - var node=options.elem.find("[data-"+options.request.key+"='"+key+"']"); - var pElem=node.parent(".eleTree-node-group"); - // 数据删除 - this.keySearchToOpera(key,function(data,obj) { - data.splice(obj.i,1); - obj.i--; - obj.len--; - - node.length!==0 && options.elem.find("[data-"+options.request.key+"='"+key+"']").remove(); - if(pElem.children(".eleTree-node").length===0){ - pElem.siblings(".eleTree-node-content").children(".eleTree-node-content-icon").children(".layui-icon").css("color", "transparent"); - } - }); - this.unCheckNodes(); - this.defaultChecked(); - }, - append: function(key,data) { - var options=this.config; - var node=options.elem.find("[data-"+options.request.key+"='"+key+"']"); - var floor=Number(node.attr("eletree-floor"))+1; - // 数据更新 - this.keySearchToOpera(key,function(d,obj) { - if(d[obj.i][options.request.children]){ - d[obj.i][options.request.children].push(data); - }else{ - d[obj.i][options.request.children]=[data]; - } - var arr=d[obj.i][options.request.children]; - // 添加之后长度为1,则原来没有三角,添加三角 - if(arr.length===1){ - node.children(".eleTree-node-content").find(".eleTree-node-content-icon .layui-icon").removeAttr("style").addClass("icon-rotate"); - } - var len=arr.length; - var eletreeStatus=node.children(".eleTree-node-content").children("input.eleTree-hideen").attr("eletree-status"); - eletreeStatus=eletreeStatus==="2" ? "0" : eletreeStatus; - node.length!==0 && laytpl(TPL_ELEM(options,floor,eletreeStatus)).render([arr[len-1]], function(string){ - node.children(".eleTree-node-group").append(string).children().show(); - }); - }); - this.checkboxRender(); - }, - insertBefore: function(key,data) { - var options=this.config; - var node=options.elem.find("[data-"+options.request.key+"='"+key+"']"); - var floor=Number(node.attr("eletree-floor")); - // 数据更新 - this.keySearchToOpera(key,function(d,obj) { - d.splice(obj.i,0,data); - obj.i++; - obj.len++; - var eletreeStatus=node.parent(".eleTree-node-group").length===0 ? "0" : node.parent(".eleTree-node-group").parent(".eleTree-node") - .children(".eleTree-node-content").children("input.eleTree-hideen").attr("eletree-status"); - eletreeStatus=eletreeStatus==="2" ? "0" : eletreeStatus; - node.length!==0 && laytpl(TPL_ELEM(options,floor,eletreeStatus)).render([data], function(string){ - node.before(string).prev(".eleTree-node").show(); - }); - }); - this.checkboxRender(); - }, - insertAfter: function(key,data) { - var options=this.config; - var node=options.elem.find("[data-"+options.request.key+"='"+key+"']"); - var floor=Number(node.attr("eletree-floor")); - // 数据更新 - this.keySearchToOpera(key,function(d,obj) { - d.splice(obj.i+1,0,data); - obj.i++; - obj.len++; - var eletreeStatus=node.parent(".eleTree-node-group").length===0 ? "0" : node.parent(".eleTree-node-group").parent(".eleTree-node") - .children(".eleTree-node-content").children("input.eleTree-hideen").attr("eletree-status"); - eletreeStatus=eletreeStatus==="2" ? "0" : eletreeStatus; - node.length!==0 && laytpl(TPL_ELEM(options,floor,eletreeStatus)).render([data], function(string){ - $(node).after(string).next(".eleTree-node").show(); - }); - }); - this.checkboxRender(); - // if(!options.lazy){ - // if(!options.renderAfterExpand || options.defaultExpandAll || options.defaultExpandedKeys.length>0){ - // this.expandAll(options.data,[],1); - // } - // } - }, - getChecked: function(leafOnly, includeHalfChecked) { - var options=this.config - ,el - ,arr=[]; - leafOnly=leafOnly || false; - includeHalfChecked=includeHalfChecked || false; - if(leafOnly){ - el=options.elem.find(".layui-icon.leaf-icon").parent(".eleTree-node-content-icon") - .siblings("input.eleTree-hideen[eletree-status='1']"); - }else if(includeHalfChecked){ - el=options.elem.find("input.eleTree-hideen[eletree-status='1'],input.eleTree-hideen[eletree-status='2']"); - }else{ - el=options.elem.find("input.eleTree-hideen[eletree-status='1']"); - } - el.each(function(index,item) { - var obj={}; - var id=$(item).parent(".eleTree-node-content").parent(".eleTree-node").attr("data-"+options.request.key); - id=isNaN(id) ? id : Number(id); - obj[options.request.key]=id; - obj.elem=item; - obj.othis=$(item).siblings(".eleTree-checkbox").get(0) - arr.push(obj); - }) - return arr; - }, - setChecked: function(arr) { - var options=this.config; - this.unCheckNodes(); - arr.forEach(function(val) { - if($.inArray(val,options.defaultCheckedKeys)===-1){ - options.defaultCheckedKeys.push(val); - } - }) - this.defaultChecked(); - }, - unCheckNodes: function() { - var options=this.config; - options.elem.find("input.eleTree-hideen[eletree-status='1'],input.eleTree-hideen[eletree-status='2']").each(function(index,item) { - $(item).attr("eletree-status","0").prop("checked",false); - }); - this.checkboxRender(); - }, - unExpandAll: function() { - var options=this.config; - options.elem.find(".layui-icon.icon-rotate").removeClass("icon-rotate") - .parent(".eleTree-node-content-icon").parent(".eleTree-node-content") - .siblings(".eleTree-node-group").children(".eleTree-node").hide(); - }, - // 节点事件 - nodeEvent: function() { - var _self=this; - var options=this.config; - // 节点被点击的回调事件 - options.elem.on("click",".eleTree-node-content",function(e) { - var eleNode=$(this).parent(".eleTree-node"); - $("#tree-menu").hide().remove(); - layui.event.call(eleNode, MOD_NAME, 'nodeClick('+ _self.filter +')', { - node: eleNode, - data: _self.reInitData(eleNode), - event: e - }); - }) - // 节点右键的回调事件 - options.elem.on("contextmenu",".eleTree-node-content",function(e) { - var eleNode=$(this).parent(".eleTree-node"); - layui.event.call(eleNode, MOD_NAME, 'nodeContextmenu('+ _self.filter +')', { - node: eleNode, - data: _self.reInitData(eleNode), - event: e - }); - }) - // 节点被拖拽的回调事件 - options.draggable && options.elem.on("mousedown",".eleTree-node-content",function(e) { - var time=0; - var eleNode=$(this).parent(".eleTree-node"); - var eleFloor=Number(eleNode.attr("eletree-floor")); - var groupNode=eleNode.parent(".eleTree-node-group"); - - e.stopPropagation(); - options.elem.css("user-select","none"); - var cloneNode=eleNode.clone(true); - var temNode=eleNode.clone(true); - - var x=e.clientX-options.elem.offset().left; - var y=e.clientY-options.elem.offset().top; - options.elem.append(cloneNode); - cloneNode.css({ - "display": "none", - "opacity": 0.7, - "position": "absolute", - "background-color": "#f5f5f5", - "width": "100%" - }) - - var currentData=_self.reInitData(eleNode); - - var isStop=false; - - $(document).on("mousemove",function(e) { - // t为了区别click事件 - time++; - if(time>2){ - var xx=e.clientX-options.elem.offset().left+10; - var yy=e.clientY-options.elem.offset().top+$(document).scrollTop()-5; // 加上浏览器滚动高度 - - cloneNode.css({ - display: "block", - left: xx+"px", - top: yy+"px" - }) - } - }).on("mouseup",function(e) { - $(document).off("mousemove").off("mouseup"); - var target=$(e.target).parents(".eleTree-node").eq(0); - cloneNode.remove(); - options.elem.css("user-select","auto"); - - - // 当前点击的是否时最外层 - var isCurrentOuterMost=eleNode.parent().get(0).isEqualNode(options.elem.get(0)) - // 目标是否时最外层 - var isTargetOuterMost=$(e.target).get(0).isEqualNode(options.elem.get(0)) - if(isTargetOuterMost){ - target=options.elem; - } - // 判断是否超出边界 - if(target.parents(options.elem).length===0 && !isTargetOuterMost){ - return; - } - // 判断初始与结束是否是同一个节点 - if(target.get(0).isEqualNode(eleNode.get(0))){ - return; - } - // 判断是否是父节点放到子节点 - var tFloor=target.attr("eletree-floor"); - var isInChild=false; - eleNode.find("[eletree-floor='"+tFloor+"']").each(function() { - if(this.isEqualNode(target.get(0))){ - isInChild=true; - } - }) - if(isInChild){ - return; - } - - var targetData=_self.reInitData(target); - layui.event.call(target, MOD_NAME, 'nodeDrag('+ _self.filter +')', { - current: { - node: eleNode, - data: currentData - }, - target: { - node: target, - data: targetData - }, - stop: function() { - isStop=true; - } - }); - // 拖拽是否取消 - if(isStop){ - return false; - } - - // 数据更改 - var currList=currentData.parentData.data[options.request.children] - var currIndex=currentData.parentData.childIndex - var currData=currentData.currentData; - var tarData=targetData.currentData; - // 当前是否是最外层 - isCurrentOuterMost ? options.data.splice(currIndex,1) : currList.splice(currIndex,1) - // 目标是否是最外层 - isTargetOuterMost ? options.data.push(currData) : (function() { - !tarData[options.request.children] ? tarData[options.request.children]=[] : ""; - tarData[options.request.children].push(currData); - })() - - // dom互换 - eleNode.remove(); - // 最外层判断 - if(isTargetOuterMost){ - target.append(temNode); - var floor=0; - }else{ - target.children(".eleTree-node-group").append(temNode); - var floor=Number(target.attr("eletree-floor"))+1; - } - // 加floor和padding - temNode.attr("eletree-floor",String(floor)); - temNode.children(".eleTree-node-content").css("padding-left",floor*options.indent+"px"); - // 通过floor差值计算子元素的floor - var countFloor=eleFloor-floor; - temNode.find(".eleTree-node").each(function(index,item) { - var f=Number($(item).attr("eletree-floor"))-countFloor; - $(item).attr("eletree-floor",String(f)); - $(item).children(".eleTree-node-content").css("padding-left",f*options.indent+"px"); - }) - // 原dom去三角 - var leaf=groupNode.children(".eleTree-node").length===0; - leaf && groupNode.siblings(".eleTree-node-content") - .children(".eleTree-node-content-icon").children(".layui-icon") - .removeClass("icon-rotate").css("color","transparent"); - // 当前的增加三角 - var cLeaf=target.children(".eleTree-node-group").children(".eleTree-node").length===0; - !cLeaf && target.children(".eleTree-node-content") - .children(".eleTree-node-content-icon").children(".layui-icon") - .addClass("icon-rotate").removeAttr("style"); - - _self.unCheckNodes(); - _self.defaultChecked(); - - }) - }) - }, - rightClickMenu: function() { - var _self=this; - var options=this.config; - if(options.contextmenuList.length<=0){ - return; - } - $(document).on("click",function() { - $("#tree-menu").hide().remove(); - }); - var menuStr=[''].join(""); - this.treeMenu=$(menuStr); - options.elem.off("contextmenu").on("contextmenu",".eleTree-node-content",function(e) { - var that=this; - e.stopPropagation(); - e.preventDefault(); - // 添加active背景 - if(_self.prevClickEle) _self.prevClickEle.removeClass("eleTree-node-content-active"); - $(this).addClass("eleTree-node-content-active"); - var eleNode=$(this).parent(".eleTree-node"); - var nodeData=_self.reInitData(eleNode); - - // 菜单位置 - $(document.body).after(_self.treeMenu); - $("#tree-menu li.insertBefore,#tree-menu li.insertAfter,#tree-menu li.append").hide(); - $("#tree-menu li.copy,#tree-menu li.add,#tree-menu li.edit,#tree-menu li.remove").show(); - $("#tree-menu").css({ - left: e.pageX, - top: e.pageY - }).show(); - // 复制 - $("#tree-menu li.copy").off().on("click",function() { - var el = $(that).children(".eleTree-node-content-label").get(0); - var selection = window.getSelection(); - var range = document.createRange(); - range.selectNodeContents(el); - selection.removeAllRanges(); - selection.addRange(range); - document.execCommand('Copy', 'false', null); - selection.removeAllRanges(); - }); - // 新增 - $("#tree-menu li.add").off().on("click",function(e) { - e.stopPropagation(); - $(this).hide().siblings("li.copy,li.edit,li.remove").hide(); - $(this).siblings(".append,li.insertAfter,li.insertBefore").show(); - }) - // 添加的默认数据 - var obj={}; - obj[options.request.key]=_self.addKeyIndex; - obj[options.request.name]="未命名"+_self.nameIndex; - - var arr=["Append","InsertBefore","InsertAfter"]; - arr.forEach(function(val) { - var s=val[0].toLocaleLowerCase()+val.slice(1,val.length); - $("#tree-menu li."+s).off().on("click",function(e) { - var node=$(that).parent(".eleTree-node"); - var key=node.attr("data-"+options.request.key); - key=isNaN(key) ? key : Number(key); - var isStop=false; - var s=val[0].toLocaleLowerCase()+val.slice(1,val.length); - layui.event.call(node, MOD_NAME, 'node'+val+'('+ _self.filter +')', { - node: node, - data: nodeData.currentData, - // 重新设置数据 - setData: function(o) { - _self[s](key,$.extend({},obj,o)); - isStop=true; - }, - // 停止添加 - stop: function() { - isStop=true; - } - }); - if(isStop) return; - _self[s](key,obj) - _self.nameIndex++; - _self.addKeyIndex++; - }) - }) - - // 编辑 - $("#tree-menu li.edit").off().on("click",function(e) { - e.stopPropagation(); - $("#tree-menu").hide().remove(); - var node=$(that).parent(".eleTree-node"); - var key=node.attr("data-"+options.request.key); - key=isNaN(key) ? key : Number(key); - var label=$(that).children(".eleTree-node-content-label").hide(); - var text=label.text(); - var inp=""; - label.after(inp); - label.siblings(".eleTree-node-content-input").focus().select().off().on("blur",function() { - var val=$(this).val(); - var isStop=false; - var inpThis=this; - layui.event.call(node, MOD_NAME, 'nodeEdit('+ _self.filter +')', { - node: node, - value: val, - data: nodeData.currentData, - // 停止添加 - stop: function() { - isStop=true; - $(inpThis).siblings(".eleTree-node-content-label").show(); - $(inpThis).remove(); - } - }); - if(isStop) return; - // 修改数据 - _self.reInitData(eleNode).currentData[options.request.name]=val; - // 修改dom - $(this).siblings(".eleTree-node-content-label").text(val).show(); - $(this).remove(); - }).on("mousedown",function(e) { - // 防止input拖拽 - e.stopPropagation(); - }) - }) - // 删除 - $("#tree-menu li.remove").off().on("click",function(e) { - var node=$(that).parent(".eleTree-node"); - var key=node.attr("data-"+options.request.key); - key=isNaN(key) ? key : Number(key); - var isStop=false; - layui.event.call(node, MOD_NAME, 'nodeRemove('+ _self.filter +')', { - node: node, - data: nodeData.currentData, - // 停止添加 - stop: function() { - isStop=true; - } - }); - if(isStop) return; - _self.remove(key); - }) - - _self.prevClickEle=$(this); - }) - }, - search: function(value) { - var options=this.config; - if(!options.searchNodeMethod || typeof options.searchNodeMethod !== "function"){ - return; - } - var data=options.data; - // 数据递归 - var traverse=function(data) { - data.forEach(function(val,index) { - // 所有查找到的节点增加属性 - val.visible=options.searchNodeMethod(value,val); - if(val[options.request.children] && val[options.request.children].length>0){ - traverse(val[options.request.children]); - } - //如果当前节点属性为隐藏,判断其子节点是否有显示的,如果有,则当前节点改为显示 - if(!val.visible){ - let childSomeShow = false; - if(val[options.request.children] && val[options.request.children].length>0){ - childSomeShow=val[options.request.children].some(function(v,i) { - return v.visible; - }) - } - val.visible = childSomeShow; - } - // 通过节点的属性,显示隐藏各个节点,并添加删除搜索类 - var el=options.elem.find("[data-"+options.request.key+"='"+val[options.request.key]+"']"); - if(val.visible){ - el.removeClass("eleTree-search-hide"); - // 判断父节点是否展开,如果父节点没有展开,则子节点也不要显示 - var parentEl=el.parent(".eleTree-node-group").parent(".eleTree-node"); - var isParentOpen=parentEl.children(".eleTree-node-content").children(".eleTree-node-content-icon").children(".layui-icon.layui-icon-triangle-r").hasClass("icon-rotate") - if((parentEl.length>0 && isParentOpen) || parentEl.length===0){ - el.show(); - } - }else{ - el.hide().addClass("eleTree-search-hide"); - } - // 删除子层属性 - if(val[options.request.children] && val[options.request.children].length>0){ - val[options.request.children].forEach(function(v,i) { - delete v.visible; - }) - } - }) - } - traverse(data); - // 删除最外层属性 - var arr=[]; - data.forEach(function(val) { - arr.push(val.visible); - delete val.visible; - }) - // 如果第一层的所有的都隐藏,则显示文本 - if(arr.every(function(v) { - return v===false; - })){ - laytpl(TPL_NoText()).render(options, function(string){ - options.elem.append(string); - }); - }else{ - options.elem.children(".eleTree-noText").remove(); - } - } - } - - exports(MOD_NAME,eleTree); -}) \ No newline at end of file diff --git a/spider/resources/static/js/layui/ext/treeselect/treeselect.js b/spider/resources/static/js/layui/ext/treeselect/treeselect.js deleted file mode 100644 index c001e5c..0000000 --- a/spider/resources/static/js/layui/ext/treeselect/treeselect.js +++ /dev/null @@ -1,598 +0,0 @@ - -layui.define(['form', 'jquery'], function (exports) { //提示:模块也可以依赖其它模块,如:layui.define('layer', callback); - var jQuery = layui.jquery, - $ = jQuery, - form = layui.form, - _MOD = 'treeSelect', - trss = {}, - TreeSelect = function () { - this.v = '1.0.4'; - }; - - - -/* - * JQuery zTree core v3.5.37 - * http://treejs.cn/ - * - * Copyright (c) 2010 Hunter.z - * - * Licensed same as jquery - MIT License - * http://www.opensource.org/licenses/mit-license.php - * - * email: hunter.z@263.net - * Date: 2018-08-21 - */ -(function(r){var J,K,L,M,N,O,v,t={},w={},x={},P={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nameIsHTML:!1,selectedMulti:!0,showIcon:!0,showLine:!0,showTitle:!0,txtSelectedEnable:!1},data:{key:{isParent:"isParent",children:"children",name:"name",title:"",url:"url",icon:"icon"},simpleData:{enable:!1,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:!1,leaf:!1}},async:{enable:!1,contentType:"application/x-www-form-urlencoded",type:"post", -dataType:"text",headers:{},xhrFields:{},url:"",autoParam:[],otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},y=[function(a){var b=a.treeObj,c=g.event;b.bind(c.NODECREATED, -function(b,c,i){h.apply(a.callback.onNodeCreated,[b,c,i])});b.bind(c.CLICK,function(b,c,i,e,k){h.apply(a.callback.onClick,[c,i,e,k])});b.bind(c.EXPAND,function(b,c,i){h.apply(a.callback.onExpand,[b,c,i])});b.bind(c.COLLAPSE,function(b,c,i){h.apply(a.callback.onCollapse,[b,c,i])});b.bind(c.ASYNC_SUCCESS,function(b,c,i,e){h.apply(a.callback.onAsyncSuccess,[b,c,i,e])});b.bind(c.ASYNC_ERROR,function(b,c,i,e,k,g){h.apply(a.callback.onAsyncError,[b,c,i,e,k,g])});b.bind(c.REMOVE,function(b,c,i){h.apply(a.callback.onRemove, -[b,c,i])});b.bind(c.SELECTED,function(b,c,i){h.apply(a.callback.onSelected,[c,i])});b.bind(c.UNSELECTED,function(b,c,i){h.apply(a.callback.onUnSelected,[c,i])})}],z=[function(a){var b=g.event;a.treeObj.unbind(b.NODECREATED).unbind(b.CLICK).unbind(b.EXPAND).unbind(b.COLLAPSE).unbind(b.ASYNC_SUCCESS).unbind(b.ASYNC_ERROR).unbind(b.REMOVE).unbind(b.SELECTED).unbind(b.UNSELECTED)}],A=[function(a){var b=e.getCache(a);b||(b={},e.setCache(a,b));b.nodes=[];b.doms=[]}],B=[function(a,b,c,d,f,i){if(c){var m= -e.getRoot(a),k=e.nodeChildren(a,c);c.level=b;c.tId=a.treeId+"_"+ ++m.zId;c.parentTId=d?d.tId:null;c.open=typeof c.open=="string"?h.eqs(c.open,"true"):!!c.open;b=e.nodeIsParent(a,c);h.isArray(k)&&!(b===!1||typeof b=="string"&&h.eqs(b,"false"))?(e.nodeIsParent(a,c,!0),c.zAsync=!0):(b=e.nodeIsParent(a,c,b),c.open=b&&!a.async.enable?c.open:!1,c.zAsync=!b);c.isFirstNode=f;c.isLastNode=i;c.getParentNode=function(){return e.getNodeCache(a,c.parentTId)};c.getPreNode=function(){return e.getPreNode(a,c)};c.getNextNode= -function(){return e.getNextNode(a,c)};c.getIndex=function(){return e.getNodeIndex(a,c)};c.getPath=function(){return e.getNodePath(a,c)};c.isAjaxing=!1;e.fixPIdKeyValue(a,c)}}],u=[function(a){var b=a.target,c=e.getSetting(a.data.treeId),d="",f=null,i="",m="",k=null,j=null,o=null;if(h.eqs(a.type,"mousedown"))m="mousedown";else if(h.eqs(a.type,"mouseup"))m="mouseup";else if(h.eqs(a.type,"contextmenu"))m="contextmenu";else if(h.eqs(a.type,"click"))if(h.eqs(b.tagName,"span")&&b.getAttribute("treeNode"+ -g.id.SWITCH)!==null)d=h.getNodeMainDom(b).id,i="switchNode";else{if(o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}]))d=h.getNodeMainDom(o).id,i="clickNode"}else if(h.eqs(a.type,"dblclick")&&(m="dblclick",o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}])))d=h.getNodeMainDom(o).id,i="switchNode";if(m.length>0&&d.length==0&&(o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}])))d=h.getNodeMainDom(o).id;if(d.length>0)switch(f=e.getNodeCache(c,d),i){case "switchNode":e.nodeIsParent(c, -f)?h.eqs(a.type,"click")||h.eqs(a.type,"dblclick")&&h.apply(c.view.dblClickExpand,[c.treeId,f],c.view.dblClickExpand)?k=J:i="":i="";break;case "clickNode":k=K}switch(m){case "mousedown":j=L;break;case "mouseup":j=M;break;case "dblclick":j=N;break;case "contextmenu":j=O}return{stop:!1,node:f,nodeEventType:i,nodeEventCallback:k,treeEventType:m,treeEventCallback:j}}],C=[function(a){var b=e.getRoot(a);b||(b={},e.setRoot(a,b));e.nodeChildren(a,b,[]);b.expandTriggerFlag=!1;b.curSelectedList=[];b.noSelection= -!0;b.createdNodes=[];b.zId=0;b._ver=(new Date).getTime()}],D=[],E=[],F=[],G=[],H=[],e={addNodeCache:function(a,b){e.getCache(a).nodes[e.getNodeCacheId(b.tId)]=b},getNodeCacheId:function(a){return a.substring(a.lastIndexOf("_")+1)},addAfterA:function(a){E.push(a)},addBeforeA:function(a){D.push(a)},addInnerAfterA:function(a){G.push(a)},addInnerBeforeA:function(a){F.push(a)},addInitBind:function(a){y.push(a)},addInitUnBind:function(a){z.push(a)},addInitCache:function(a){A.push(a)},addInitNode:function(a){B.push(a)}, -addInitProxy:function(a,b){b?u.splice(0,0,a):u.push(a)},addInitRoot:function(a){C.push(a)},addNodesData:function(a,b,c,d){var f=e.nodeChildren(a,b);f?c>=f.length&&(c=-1):(f=e.nodeChildren(a,b,[]),c=-1);if(f.length>0&&c===0)f[0].isFirstNode=!1,j.setNodeLineIcos(a,f[0]);else if(f.length>0&&c<0)f[f.length-1].isLastNode=!1,j.setNodeLineIcos(a,f[f.length-1]);e.nodeIsParent(a,b,!0);c<0?e.nodeChildren(a,b,f.concat(d)):(a=[c,0].concat(d),f.splice.apply(f,a))},addSelectedNode:function(a,b){var c=e.getRoot(a); -e.isSelectedNode(a,b)||c.curSelectedList.push(b)},addCreatedNode:function(a,b){(a.callback.onNodeCreated||a.view.addDiyDom)&&e.getRoot(a).createdNodes.push(b)},addZTreeTools:function(a){H.push(a)},exSetting:function(a){r.extend(!0,P,a)},fixPIdKeyValue:function(a,b){a.data.simpleData.enable&&(b[a.data.simpleData.pIdKey]=b.parentTId?b.getParentNode()[a.data.simpleData.idKey]:a.data.simpleData.rootPId)},getAfterA:function(a,b,c){for(var d=0,e=E.length;d-1&& -f.push(k);k=e.nodeChildren(a,k);f=f.concat(e.getNodesByParamFuzzy(a,k,c,d))}return f},getNodesByFilter:function(a,b,c,d,f){if(!b)return d?null:[];for(var i=d?null:[],m=0,k=b.length;m -0)},clone:function(a){if(a===null)return null;var b=h.isArray(a)?[]:{},c;for(c in a)b[c]=a[c]instanceof Date?new Date(a[c].getTime()):typeof a[c]==="object"?h.clone(a[c]):a[c];return b},eqs:function(a,b){return a.toLowerCase()===b.toLowerCase()},isArray:function(a){return Object.prototype.toString.apply(a)==="[object Array]"},isElement:function(a){return typeof HTMLElement==="object"?a instanceof HTMLElement:a&&typeof a==="object"&&a!==null&&a.nodeType===1&&typeof a.nodeName==="string"},$:function(a, -b,c){b&&typeof b!="string"&&(c=b,b="");return typeof a=="string"?r(a,c?c.treeObj.get(0).ownerDocument:null):r("#"+a.tId+b,c?c.treeObj:null)},getMDom:function(a,b,c){if(!b)return null;for(;b&&b.id!==a.treeId;){for(var d=0,e=c.length;b.tagName&&d0},uCanDo:function(){return!0}},j={addNodes:function(a,b,c,d,f){var i=e.nodeIsParent(a,b);if(!a.data.keep.leaf||!b||i)if(h.isArray(d)||(d=[d]),a.data.simpleData.enable&&(d=e.transformTozTreeFormat(a,d)),b){var i=l(b,g.id.SWITCH,a),m=l(b,g.id.ICON,a),k=l(b,g.id.UL,a);if(!b.open)j.replaceSwitchClass(b,i,g.folder.CLOSE),j.replaceIcoClass(b,m,g.folder.CLOSE),b.open=!1,k.css({display:"none"});e.addNodesData(a,b,c,d);j.createNodes(a,b.level+1,d,b,c);f||j.expandCollapseParentNode(a,b,!0)}else e.addNodesData(a, -e.getRoot(a),c,d),j.createNodes(a,0,d,null,c)},appendNodes:function(a,b,c,d,f,i,g){if(!c)return[];var k=[],h=d?d:e.getRoot(a),h=e.nodeChildren(a,h),o,l;if(!h||f>=h.length-c.length)f=-1;for(var s=0,n=c.length;s0&&(l=j.appendNodes(a,b+1,I,p,-1,i,g&&p.open));g&&(j.makeDOMNodeMainBefore(k,a,p),j.makeDOMNodeLine(k, -a,p),e.getBeforeA(a,p,k),j.makeDOMNodeNameBefore(k,a,p),e.getInnerBeforeA(a,p,k),j.makeDOMNodeIcon(k,a,p),e.getInnerAfterA(a,p,k),j.makeDOMNodeNameAfter(k,a,p),e.getAfterA(a,p,k),o&&p.open&&j.makeUlHtml(a,p,k,l.join("")),j.makeDOMNodeMainAfter(k,a,p),e.addCreatedNode(a,p))}return k},appendParentULDom:function(a,b){var c=[],d=l(b,a);!d.get(0)&&b.parentTId&&(j.appendParentULDom(a,b.getParentNode()),d=l(b,a));var f=l(b,g.id.UL,a);f.get(0)&&f.remove();f=e.nodeChildren(a,b);f=j.appendNodes(a,b.level+1, -f,b,-1,!1,!0);j.makeUlHtml(a,b,c,f.join(""));d.append(c.join(""))},asyncNode:function(a,b,c,d){var f,i;f=e.nodeIsParent(a,b);if(b&&!f)return h.apply(d),!1;else if(b&&b.isAjaxing)return!1;else if(h.apply(a.callback.beforeAsync,[a.treeId,b],!0)==!1)return h.apply(d),!1;if(b)b.isAjaxing=!0,l(b,g.id.ICON,a).attr({style:"","class":g.className.BUTTON+" "+g.className.ICO_LOADING});var m={},k=h.apply(a.async.autoParam,[a.treeId,b],a.async.autoParam);for(f=0,i=k.length;b&&f1&&(o=q[1],q=q[0]);m[o]=b[q]}k=h.apply(a.async.otherParam,[a.treeId,b],a.async.otherParam);if(h.isArray(k))for(f=0,i=k.length;f-1?JSON.stringify(m):m,dataType:a.async.dataType,headers:a.async.headers,xhrFields:a.async.xhrFields,success:function(i){if(s== -e.getRoot(a)._ver){var f=[];try{f=!i||i.length==0?[]:typeof i=="string"?eval("("+i+")"):i}catch(k){f=i}if(b)b.isAjaxing=null,b.zAsync=!0;j.setNodeLineIcos(a,b);f&&f!==""?(f=h.apply(a.async.dataFilter,[a.treeId,b,f],f),j.addNodes(a,b,-1,f?h.clone(f):[],!!c)):j.addNodes(a,b,-1,[],!!c);a.treeObj.trigger(g.event.ASYNC_SUCCESS,[a.treeId,b,i]);h.apply(d)}},error:function(c,d,i){if(s==e.getRoot(a)._ver){if(b)b.isAjaxing=null;j.setNodeLineIcos(a,b);a.treeObj.trigger(g.event.ASYNC_ERROR,[a.treeId,b,c,d,i])}}}); -return!0},cancelPreSelectedNode:function(a,b,c){var d=e.getRoot(a).curSelectedList,f,i;for(f=d.length-1;f>=0;f--)if(i=d[f],b===i||!b&&(!c||c!==i))if(l(i,g.id.A,a).removeClass(g.node.CURSELECTED),b){e.removeSelectedNode(a,b);break}else d.splice(f,1),a.treeObj.trigger(g.event.UNSELECTED,[a.treeId,i])},createNodeCallback:function(a){if(a.callback.onNodeCreated||a.view.addDiyDom)for(var b=e.getRoot(a);b.createdNodes.length>0;){var c=b.createdNodes.shift();h.apply(a.view.addDiyDom,[a.treeId,c]);a.callback.onNodeCreated&& -a.treeObj.trigger(g.event.NODECREATED,[a.treeId,c])}},createNodes:function(a,b,c,d,f){if(c&&c.length!=0){var i=e.getRoot(a),m=!d||d.open||!!l(e.nodeChildren(a,d)[0],a).get(0);i.createdNodes=[];var b=j.appendNodes(a,b,c,d,f,!0,m),k,h;d?(d=l(d,g.id.UL,a),d.get(0)&&(k=d)):k=a.treeObj;k&&(f>=0&&(h=k.children()[f]),f>=0&&h?r(h).before(b.join("")):k.append(b.join("")));j.createNodeCallback(a)}},destroy:function(a){a&&(e.initCache(a),e.initRoot(a),n.unbindTree(a),n.unbindEvent(a),a.treeObj.empty(),delete t[a.treeId])}, -expandCollapseNode:function(a,b,c,d,f){var i=e.getRoot(a),m;if(b){var k=e.nodeChildren(a,b),q=e.nodeIsParent(a,b);if(i.expandTriggerFlag)m=f,f=function(){m&&m();b.open?a.treeObj.trigger(g.event.EXPAND,[a.treeId,b]):a.treeObj.trigger(g.event.COLLAPSE,[a.treeId,b])},i.expandTriggerFlag=!1;if(!b.open&&q&&(!l(b,g.id.UL,a).get(0)||k&&k.length>0&&!l(k[0],a).get(0)))j.appendParentULDom(a,b),j.createNodeCallback(a);if(b.open==c)h.apply(f,[]);else{var c=l(b,g.id.UL,a),i=l(b,g.id.SWITCH,a),o=l(b,g.id.ICON, -a);q?(b.open=!b.open,b.iconOpen&&b.iconClose&&o.attr("style",j.makeNodeIcoStyle(a,b)),b.open?(j.replaceSwitchClass(b,i,g.folder.OPEN),j.replaceIcoClass(b,o,g.folder.OPEN),d==!1||a.view.expandSpeed==""?(c.show(),h.apply(f,[])):k&&k.length>0?c.slideDown(a.view.expandSpeed,f):(c.show(),h.apply(f,[]))):(j.replaceSwitchClass(b,i,g.folder.CLOSE),j.replaceIcoClass(b,o,g.folder.CLOSE),d==!1||a.view.expandSpeed==""||!(k&&k.length>0)?(c.hide(),h.apply(f,[])):c.slideUp(a.view.expandSpeed,f))):h.apply(f,[])}}else h.apply(f, -[])},expandCollapseParentNode:function(a,b,c,d,e){b&&(b.parentTId?(j.expandCollapseNode(a,b,c,d),b.parentTId&&j.expandCollapseParentNode(a,b.getParentNode(),c,d,e)):j.expandCollapseNode(a,b,c,d,e))},expandCollapseSonNode:function(a,b,c,d,f){var i=e.getRoot(a),i=b?e.nodeChildren(a,b):e.nodeChildren(a,i),g=b?!1:d,k=e.getRoot(a).expandTriggerFlag;e.getRoot(a).expandTriggerFlag=!1;if(i)for(var h=0,l=i.length;h=0;d--)if(b===c[d])return!0;return!1},makeDOMNodeIcon:function(a,b,c){var d=e.nodeName(b,c),d=b.view.nameIsHTML?d:d.replace(/&/g,"&").replace(//g,">");a.push("", -d,"")},makeDOMNodeLine:function(a,b,c){a.push("")},makeDOMNodeMainAfter:function(a){a.push("")},makeDOMNodeMainBefore:function(a,b,c){a.push("
              • ")},makeDOMNodeNameAfter:function(a){a.push("")},makeDOMNodeNameBefore:function(a,b,c){var d=e.nodeTitle(b,c),f=j.makeNodeUrl(b,c),i=j.makeNodeFontCss(b, -c),m=[],k;for(k in i)m.push(k,":",i[k],";");a.push("0?"href='"+f+"'":""," target='",j.makeNodeTarget(c),"' style='",m.join(""),"'");h.apply(b.view.showTitle,[b.treeId,c],b.view.showTitle)&&d&&a.push("title='",d.replace(/'/g,"'").replace(//g,">"),"'");a.push(">")},makeNodeFontCss:function(a,b){var c=h.apply(a.view.fontCss,[a.treeId,b],a.view.fontCss); -return c&&typeof c!="function"?c:{}},makeNodeIcoClass:function(a,b){var c=["ico"];if(!b.isAjaxing){var d=e.nodeIsParent(a,b);c[0]=(b.iconSkin?b.iconSkin+"_":"")+c[0];d?c.push(b.open?g.folder.OPEN:g.folder.CLOSE):c.push(g.folder.DOCU)}return g.className.BUTTON+" "+c.join("_")},makeNodeIcoStyle:function(a,b){var c=[];if(!b.isAjaxing){var d=e.nodeIsParent(a,b)&&b.iconOpen&&b.iconClose?b.open?b.iconOpen:b.iconClose:b[a.data.key.icon];d&&c.push("background:url(",d,") 0 0 no-repeat;");(a.view.showIcon== -!1||!h.apply(a.view.showIcon,[a.treeId,b],!0))&&c.push("width:0px;height:0px;")}return c.join("")},makeNodeLineClass:function(a,b){var c=[];a.view.showLine?b.level==0&&b.isFirstNode&&b.isLastNode?c.push(g.line.ROOT):b.level==0&&b.isFirstNode?c.push(g.line.ROOTS):b.isLastNode?c.push(g.line.BOTTOM):c.push(g.line.CENTER):c.push(g.line.NOLINE);e.nodeIsParent(a,b)?c.push(b.open?g.folder.OPEN:g.folder.CLOSE):c.push(g.folder.DOCU);return j.makeNodeLineClassEx(b)+c.join("_")},makeNodeLineClassEx:function(a){return g.className.BUTTON+ -" "+g.className.LEVEL+a.level+" "+g.className.SWITCH+" "},makeNodeTarget:function(a){return a.target||"_blank"},makeNodeUrl:function(a,b){var c=a.data.key.url;return b[c]?b[c]:null},makeUlHtml:function(a,b,c,d){c.push("
                  ");c.push(d);c.push("
                ")},makeUlLineClass:function(a,b){return a.view.showLine&&!b.isLastNode?g.line.LINE:""},removeChildNodes:function(a,b){if(b){var c= -e.nodeChildren(a,b);if(c){for(var d=0,f=c.length;dc.bottom||d.right>c.right||d.left0)c[0].isFirstNode=!0},setLastNode:function(a,b){var c=e.nodeChildren(a, -b);if(c.length>0)c[c.length-1].isLastNode=!0},removeNode:function(a,b){var c=e.getRoot(a),d=b.parentTId?b.getParentNode():c;b.isFirstNode=!1;b.isLastNode=!1;b.getPreNode=function(){return null};b.getNextNode=function(){return null};if(e.getNodeCache(a,b.tId)){l(b,a).remove();e.removeNodeCache(a,b);e.removeSelectedNode(a,b);for(var f=e.nodeChildren(a,d),i=0,h=f.length;i0){var q=f[i-1],i=l(q,g.id.UL,a),h=l(q,g.id.SWITCH,a);k=l(q,g.id.ICON,a);d==c?f.length==1?j.replaceSwitchClass(q,h,g.line.ROOT):(c=l(f[0],g.id.SWITCH,a),j.replaceSwitchClass(f[0],c,g.line.ROOTS),j.replaceSwitchClass(q,h,g.line.BOTTOM)):j.replaceSwitchClass(q, -h,g.line.BOTTOM);i.removeClass(g.line.LINE)}}},replaceIcoClass:function(a,b,c){if(b&&!a.isAjaxing&&(a=b.attr("class"),a!=void 0)){a=a.split("_");switch(c){case g.folder.OPEN:case g.folder.CLOSE:case g.folder.DOCU:a[a.length-1]=c}b.attr("class",a.join("_"))}},replaceSwitchClass:function(a,b,c){if(b){var d=b.attr("class");if(d!=void 0){d=d.split("_");switch(c){case g.line.ROOT:case g.line.ROOTS:case g.line.CENTER:case g.line.BOTTOM:case g.line.NOLINE:d[0]=j.makeNodeLineClassEx(a)+c;break;case g.folder.OPEN:case g.folder.CLOSE:case g.folder.DOCU:d[1]= -c}b.attr("class",d.join("_"));c!==g.folder.DOCU?b.removeAttr("disabled"):b.attr("disabled","disabled")}}},selectNode:function(a,b,c){c||j.cancelPreSelectedNode(a,null,b);l(b,g.id.A,a).addClass(g.node.CURSELECTED);e.addSelectedNode(a,b);a.treeObj.trigger(g.event.SELECTED,[a.treeId,b])},setNodeFontCss:function(a,b){var c=l(b,g.id.A,a),d=j.makeNodeFontCss(a,b);d&&c.css(d)},setNodeLineIcos:function(a,b){if(b){var c=l(b,g.id.SWITCH,a),d=l(b,g.id.UL,a),f=l(b,g.id.ICON,a),i=j.makeUlLineClass(a,b);i.length== -0?d.removeClass(g.line.LINE):d.addClass(i);c.attr("class",j.makeNodeLineClass(a,b));e.nodeIsParent(a,b)?c.removeAttr("disabled"):c.attr("disabled","disabled");f.removeAttr("style");f.attr("style",j.makeNodeIcoStyle(a,b));f.attr("class",j.makeNodeIcoClass(a,b))}},setNodeName:function(a,b){var c=e.nodeTitle(a,b),d=l(b,g.id.SPAN,a);d.empty();a.view.nameIsHTML?d.html(e.nodeName(a,b)):d.text(e.nodeName(a,b));h.apply(a.view.showTitle,[a.treeId,b],a.view.showTitle)&&l(b,g.id.A,a).attr("title",!c?"":c)}, -setNodeTarget:function(a,b){l(b,g.id.A,a).attr("target",j.makeNodeTarget(b))},setNodeUrl:function(a,b){var c=l(b,g.id.A,a),d=j.makeNodeUrl(a,b);d==null||d.length==0?c.removeAttr("href"):c.attr("href",d)},switchNode:function(a,b){b.open||!h.canAsync(a,b)?j.expandCollapseNode(a,b,!b.open):a.async.enable?j.asyncNode(a,b)||j.expandCollapseNode(a,b,!b.open):b&&j.expandCollapseNode(a,b,!b.open)}};r.fn.zTree={consts:{className:{BUTTON:"button",LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch",NAME:"node_name"}, -event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open",CLOSE:"close",DOCU:"docu"},node:{CURSELECTED:"curSelectedNode"}},_z:{tools:h, -view:j,event:n,data:e},getZTreeObj:function(a){return(a=e.getZTreeTools(a))?a:null},destroy:function(a){if(a&&a.length>0)j.destroy(e.getSetting(a));else for(var b in t)j.destroy(t[b])},init:function(a,b,c){var d=h.clone(P);r.extend(!0,d,b);d.treeId=a.attr("id");d.treeObj=a;d.treeObj.empty();t[d.treeId]=d;if(typeof document.body.style.maxHeight==="undefined")d.view.expandSpeed="";e.initRoot(d);a=e.getRoot(d);c=c?h.clone(h.isArray(c)?c:[c]):[];d.data.simpleData.enable?e.nodeChildren(d,a,e.transformTozTreeFormat(d, -c)):e.nodeChildren(d,a,c);e.initCache(d);n.unbindTree(d);n.bindTree(d);n.unbindEvent(d);n.bindEvent(d);var f={setting:d,addNodes:function(a,b,c,f){function g(){j.addNodes(d,a,b,n,f==!0)}a||(a=null);var l=e.nodeIsParent(d,a);if(a&&!l&&d.data.keep.leaf)return null;l=parseInt(b,10);isNaN(l)?(f=!!c,c=b,b=-1):b=l;if(!c)return null;var n=h.clone(h.isArray(c)?c:[c]);h.canAsync(d,a)?j.asyncNode(d,a,f,g):g();return n},cancelSelectedNode:function(a){j.cancelPreSelectedNode(d,a)},destroy:function(){j.destroy(d)}, -expandAll:function(a){a=!!a;j.expandCollapseSonNode(d,null,a,!0);return a},expandNode:function(a,b,c,f,g){function n(){var b=l(a,d).get(0);b&&f!==!1&&j.scrollIntoView(d,b)}if(!a||!e.nodeIsParent(d,a))return null;b!==!0&&b!==!1&&(b=!a.open);if((g=!!g)&&b&&h.apply(d.callback.beforeExpand,[d.treeId,a],!0)==!1)return null;else if(g&&!b&&h.apply(d.callback.beforeCollapse,[d.treeId,a],!0)==!1)return null;b&&a.parentTId&&j.expandCollapseParentNode(d,a.getParentNode(),b,!1);if(b===a.open&&!c)return null; -e.getRoot(d).expandTriggerFlag=g;!h.canAsync(d,a)&&c?j.expandCollapseSonNode(d,a,b,!0,n):(a.open=!b,j.switchNode(this.setting,a),n());return b},getNodes:function(){return e.getNodes(d)},getNodeByParam:function(a,b,c){return!a?null:e.getNodeByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodeByTId:function(a){return e.getNodeCache(d,a)},getNodesByParam:function(a,b,c){return!a?null:e.getNodesByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByParamFuzzy:function(a,b,c){return!a?null: -e.getNodesByParamFuzzy(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByFilter:function(a,b,c,f){b=!!b;return!a||typeof a!="function"?b?null:[]:e.getNodesByFilter(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b,f)},getNodeIndex:function(a){if(!a)return null;for(var b=a.parentTId?a.getParentNode():e.getRoot(d),b=e.nodeChildren(d,b),c=0,f=b.length;c0?j.createNodes(d,0,c,null,-1):d.async.enable&&d.async.url&&d.async.url!==""&&j.asyncNode(d);return f}};var Q=r.fn.zTree,l=h.$,g=Q.consts})(jQuery); - -/* - * JQuery zTree excheck v3.5.37 - * http://treejs.cn/ - * - * Copyright (c) 2010 Hunter.z - * - * Licensed same as jquery - MIT License - * http://www.opensource.org/licenses/mit-license.php - * - * email: hunter.z@263.net - * Date: 2018-08-21 - */ -(function(n){var q,r,s,p={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},w={check:{enable:!1,autoCheckTrigger:!1,chkStyle:p.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:p.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};q=function(c, -a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId);if(i.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;var d=e.nodeChecked(b,a);e.nodeChecked(b,a,!d);f.checkNodeRelation(b,a);d=m(a,h.id.CHECK,b);f.setChkClass(b,d,a);f.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(h.event.CHECK,[c,b.treeId,a]);return!0};r=function(c,a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId),d=m(a,h.id.CHECK,b);a.check_Focus=!0;f.setChkClass(b,d,a);return!0};s=function(c, -a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId),d=m(a,h.id.CHECK,b);a.check_Focus=!1;f.setChkClass(b,d,a);return!0};n.extend(!0,n.fn.zTree.consts,p);n.extend(!0,n.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,j;d=h.radio;b=e.nodeChecked(c,a);if(c.check.chkStyle==d.STYLE){var g=e.getRadioCheckedList(c);if(b)if(c.check.radioType==d.TYPE_ALL){for(d=g.length-1;d>=0;d--){b=g[d];var k=e.nodeChecked(c,b);k&&b!=a&&(e.nodeChecked(c,b,!1),g.splice(d,1),f.setChkClass(c, -m(b,h.id.CHECK,c),b),b.parentTId!=a.parentTId&&f.repairParentChkClassWithSelf(c,b))}g.push(a)}else{g=a.parentTId?a.getParentNode():e.getRoot(c);g=e.nodeChildren(c,g);for(d=0,j=g.length;d-1)&&f.setSonNodeCheckBox(c,a, -!0),!b&&(!g||g.length==0||c.check.chkboxType.N.indexOf("s")>-1)&&f.setSonNodeCheckBox(c,a,!1),b&&c.check.chkboxType.Y.indexOf("p")>-1&&f.setParentNodeCheckBox(c,a,!0),!b&&c.check.chkboxType.N.indexOf("p")>-1&&f.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=h.checkbox,d=h.radio,j="",g=e.nodeChecked(c,a),j=a.chkDisabled===!0?b.DISABLED:a.halfCheck?b.PART:c.check.chkStyle==d.STYLE?a.check_Child_State<1?b.FULL:b.PART:g?a.check_Child_State===2||a.check_Child_State===-1?b.FULL:b.PART: -a.check_Child_State<1?b.FULL:b.PART,d=c.check.chkStyle+"_"+(g?b.TRUE:b.FALSE)+"_"+j,d=a.check_Focus&&a.chkDisabled!==!0?d+"_"+b.FOCUS:d;return h.className.BUTTON+" "+b.DEFAULT+" "+d},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===h.checkbox.STYLE)for(var b=e.getRoot(c),b=e.nodeChildren(c,b),d=0,j=b.length;d0?f.repairParentChkClass(c,b[0]):f.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b)a.chkDisabled=b;f.repairChkClass(c,a);if((a=e.nodeChildren(c,a))&&d)for(var j=0,g=a.length;j0){j=!1;break}}j&&f.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var j=m(a,h.id.CHECK,c);d||(d=a);var g=!1,k=e.nodeChildren(c,a);if(k)for(var o=0,l=k.length;o0?b?2:0:-1}else a.check_Child_State=-1;f.setChkClass(c,j,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(h.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=e.getRoot(c).radioCheckedList,b=0,d=a.length;b-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var j=b&&c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL,d=!d?[]:d,g=0,f=a.length;g0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var b=!b?[]:b,d=0,j=a.length;d0?2:0,l==2){b=2;break}else l==0&&(b=0);else if(c.check.chkStyle==h.checkbox.STYLE)if(l=f.nocheck===!0||f.chkDisabled===!0?f.check_Child_State:f.halfCheck===!0?1:i?f.check_Child_State===-1||f.check_Child_State===2?2:1:f.check_Child_State>0?1:0,l===1){b=1;break}else if(l===2&&b>-1&&j>0&&l!== -b){b=1;break}else if(b===2&&l>-1&&l<2){b=1;break}else l>-1&&(b=l)}a.check_Child_State=b}}}});var n=n.fn.zTree,i=n._z.tools,h=n.consts,f=n._z.view,e=n._z.data,m=i.$;e.nodeChecked=function(c,a,b){if(!a)return!1;c=c.data.key.checked;typeof b!=="undefined"&&(typeof b==="string"&&(b=i.eqs(b,"true")),a[c]=!!b);return a[c]};e.exSetting(w);e.addInitBind(function(c){c.treeObj.bind(h.event.CHECK,function(a,b,d,e){a.srcEvent=b;i.apply(c.callback.onCheck,[a,d,e])})});e.addInitUnBind(function(c){c.treeObj.unbind(h.event.CHECK)}); -e.addInitCache(function(){});e.addInitNode(function(c,a,b,d){if(b){a=e.nodeChecked(c,b);a=e.nodeChecked(c,b,a);b.checkedOld=a;if(typeof b.nocheck=="string")b.nocheck=i.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=i.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=i.eqs(b.halfCheck,"true");b.halfCheck=!!b.halfCheck; -b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return e.getCheckStatus(c,b)};c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL&&a&&e.getRoot(c).radioCheckedList.push(b)}});e.addInitProxy(function(c){var a=c.target,b=e.getSetting(c.data.treeId),d="",f=null,g="",k=null;if(i.eqs(c.type,"mouseover")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoverCheck"}else if(i.eqs(c.type,"mouseout")){if(b.check.enable&& -i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoutCheck"}else if(i.eqs(c.type,"click")&&b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="checkNode";if(d.length>0)switch(f=e.getNodeCache(b,d),g){case "checkNode":k=q;break;case "mouseoverCheck":k=r;break;case "mouseoutCheck":k=s}return{stop:g==="checkNode",node:f,nodeEventType:g,nodeEventCallback:k,treeEventType:"",treeEventCallback:null}}, -!0);e.addInitRoot(function(c){e.getRoot(c).radioCheckedList=[]});e.addBeforeA(function(c,a,b){c.check.enable&&(e.makeChkFlag(c,a),b.push(""))});e.addZTreeTools(function(c,a){a.checkNode=function(a,b,g,k){var o=e.nodeChecked(c,a);if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!o),k=!!k,(o!==b||g)&&!(k&&i.apply(this.setting.callback.beforeCheck,[this.setting.treeId,a], -!0)==!1)&&i.uCanDo(this.setting)&&this.setting.check.enable&&a.nocheck!==!0))e.nodeChecked(c,a,b),b=m(a,h.id.CHECK,this.setting),(g||this.setting.check.chkStyle===h.radio.STYLE)&&f.checkNodeRelation(this.setting,a),f.setChkClass(this.setting,b,a),f.repairParentChkClassWithSelf(this.setting,a),k&&this.setting.treeObj.trigger(h.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){f.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var a=a!==!1,b=e.nodeChildren(c,e.getRoot(this.setting)); -return e.getTreeCheckedNodes(this.setting,b,a)};a.getChangeCheckedNodes=function(){var a=e.nodeChildren(c,e.getRoot(this.setting));return e.getTreeChangeCheckedNodes(this.setting,a)};a.setChkDisabled=function(a,b,c,e){b=!!b;c=!!c;f.repairSonChkDisabled(this.setting,a,b,!!e);f.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,e){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&m(c,this.setting).get(0)&&i.uCanDo(this.setting)){var g=m(c, -h.id.CHECK,this.setting);(e==!0||this.setting.check.chkStyle===h.radio.STYLE)&&f.checkNodeRelation(this.setting,c);f.setChkClass(this.setting,g,c);f.repairParentChkClassWithSelf(this.setting,c)}}});var t=f.createNodes;f.createNodes=function(c,a,b,d,e){t&&t.apply(f,arguments);b&&f.repairParentChkClassWithSelf(c,d)};var u=f.removeNode;f.removeNode=function(c,a){var b=a.getParentNode();u&&u.apply(f,arguments);a&&b&&(f.repairChkClass(c,b),f.repairParentChkClass(c,b))};var v=f.appendNodes;f.appendNodes= -function(c,a,b,d,h,g,i){var m="";v&&(m=v.apply(f,arguments));d&&e.makeChkFlag(c,d);return m}})(jQuery); - -/* - * JQuery zTree exedit v3.5.37 - * http://treejs.cn/ - * - * Copyright (c) 2010 Hunter.z - * - * Licensed same as jquery - MIT License - * http://www.opensource.org/licenses/mit-license.php - * - * email: hunter.z@263.net - * Date: 2018-08-21 - */ -(function(B){var I={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},v={onHoverOverNode:function(a,b){var c=i.getSetting(a.data.treeId),d=i.getRoot(c);if(d.curHoverNode!=b)v.onHoverOutNode(a);d.curHoverNode=b;e.addHoverDom(c,b)},onHoverOutNode:function(a){var a= -i.getSetting(a.data.treeId),b=i.getRoot(a);if(b.curHoverNode&&!i.isSelectedNode(a,b.curHoverNode))e.removeTreeDom(a,b.curHoverNode),b.curHoverNode=null},onMousedownNode:function(a,b){function c(a){if(m.dragFlag==0&&Math.abs(N-a.clientX)1){var o=n[0].parentTId?i.nodeChildren(f,n[0].getParentNode()):i.getNodes(f);g=[];for(b=0,c=o.length;b-1&&p+1!==b&&(j=!1),g.push(o[b]),p=b),n.length===g.length){n=g;break}}j&&(H=n[0].getPreNode(),Q=n[n.length-1].getNextNode());C=q("
                  ", -f);for(b=0,c=n.length;b0),e.removeTreeDom(f,g),b>f.edit.drag.maxShowNodeNum-1||(j=q("
                • ",f),j.append(q(g,d.id.A,f).clone()),j.css("padding","0"),j.children("#"+g.tId+d.id.A).removeClass(d.node.CURSELECTED),C.append(j),b==f.edit.drag.maxShowNodeNum-1&&(j=q("
                • ...
                • ",f),C.append(j)));C.attr("id",n[0].tId+d.id.UL+"_tmp");C.addClass(f.treeObj.attr("class"));C.appendTo(L);u=q("", -f);u.attr("id","zTreeMove_arrow_tmp");u.appendTo(L);f.treeObj.trigger(d.event.DRAG,[a,f.treeId,n])}if(m.dragFlag==1){t&&u.attr("id")==a.target.id&&w&&a.clientX+G.scrollLeft()+2>B("#"+w+d.id.A,t).offset().left?(g=B("#"+w+d.id.A,t),a.target=g.length>0?g.get(0):a.target):t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER)); -w=t=null;J=!1;h=f;g=i.getSettings();for(var z in g)if(g[z].treeId&&g[z].edit.enable&&g[z].treeId!=f.treeId&&(a.target.id==g[z].treeId||B(a.target).parents("#"+g[z].treeId).length>0))J=!0,h=g[z];z=G.scrollTop();j=G.scrollLeft();p=h.treeObj.offset();b=h.treeObj.get(0).scrollHeight;g=h.treeObj.get(0).scrollWidth;c=a.clientY+z-p.top;var E=h.treeObj.height()+p.top-a.clientY-z,r=a.clientX+j-p.left,s=h.treeObj.width()+p.left-a.clientX-j,p=cf.edit.drag.borderMin,o=Ef.edit.drag.borderMin,F=rf.edit.drag.borderMin,v=sf.edit.drag.borderMin,E=c>f.edit.drag.borderMin&&E>f.edit.drag.borderMin&&r>f.edit.drag.borderMin&&s>f.edit.drag.borderMin,r=p&&h.treeObj.scrollTop()<=0,s=o&&h.treeObj.scrollTop()+h.treeObj.height()+10>=b,M=F&&h.treeObj.scrollLeft()<=0,P=v&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=g;if(a.target&&k.isChildOrSelf(a.target,h.treeId)){for(var D=a.target;D&&D.tagName&&!k.eqs(D.tagName,"li")&&D.id!= -h.treeId;)D=D.parentNode;var R=!0;for(b=0,c=n.length;b0){R=!1;break}if(R&&a.target&&k.isChildOrSelf(a.target,D.id+d.id.A))t=B(D),w=D.id}g=n[0];if(E&&k.isChildOrSelf(a.target,h.treeId)){if(!t&&(a.target.id==h.treeId||r||s||M||P)&&(J||!J&&g.parentTId))t=h.treeObj;p?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):o&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);F?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):v&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+ -10);t&&t!=h.treeObj&&t.offset().left=-0.2)&&g?(j=1-u.width(),b=E-u.height()/2,x=d.move.TYPE_PREV):(M==0||z>=M&&z<=1.2)&&c?(j=1-u.width(),b=v==null||i.nodeIsParent(f,A)&&A.open?E+F.height()-u.height()/2:v.offset().top-u.height()/2,x=d.move.TYPE_NEXT):p?(j=5-u.width(),b=E,x=d.move.TYPE_INNER):o(),t){u.css({display:"block",top:b+"px",left:r+j+"px"});F.addClass(d.node.TMPTARGET_NODE+"_"+x);if(S!=w||T!=x)K=(new Date).getTime();if(A&&i.nodeIsParent(f, -A)&&x==d.move.TYPE_INNER&&(z=!0,window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId!==A.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===A.tId&&(z=!1),z))window.zTreeMoveTimer=setTimeout(function(){x==d.move.TYPE_INNER&&A&&i.nodeIsParent(f,A)&&!A.open&&(new Date).getTime()-K>h.edit.drag.autoOpenTime&&k.apply(h.callback.beforeDragOpen,[h.treeId,A],!0)&&(e.switchNode(h,A),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND, -[h.treeId,A]))},h.edit.drag.autoOpenTime+50),window.zTreeMoveTargetNodeTId=A.tId}}else if(x=d.move.TYPE_INNER,t&&k.apply(h.edit.drag.inner,[h.treeId,n,null],!!h.edit.drag.inner)?t.addClass(d.node.TMPTARGET_TREE):t=null,u.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;S=w;T=x;f.treeObj.trigger(d.event.DRAGMOVE,[a,f.treeId,n])}return!1}function l(a){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId= -null;T=S=null;G.unbind("mousemove",c);G.unbind("mouseup",l);G.unbind("selectstart",g);L.css("cursor","");t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));k.showIfameMask(f,!1);y.showHoverDom=!0;if(m.dragFlag!=0){m.dragFlag=0;var b,j,o;for(b=0,j=n.length;b0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(b)for(var d=q("iframe",a),g=0,e=d.length;g
                  ",a);j.appendTo(q("body",a));c.dragMaskList.push(j)}}},view:{addEditBtn:function(a,b){if(!(b.editNameFlag|| -q(b,d.id.EDIT,a).length>0)&&k.apply(a.edit.showRenameBtn,[a.treeId,b],a.edit.showRenameBtn)){var c=q(b,d.id.A,a),l="";c.append(l);q(b,d.id.EDIT,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeEditName,[a.treeId,b],!0)==!1)return!1;e.editNode(a,b);return!1}).show()}},addRemoveBtn:function(a, -b){if(!(b.editNameFlag||q(b,d.id.REMOVE,a).length>0)&&k.apply(a.edit.showRemoveBtn,[a.treeId,b],a.edit.showRemoveBtn)){var c=q(b,d.id.A,a),l="";c.append(l);q(b,d.id.REMOVE,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeRemove,[a.treeId,b],!0)==!1)return!1;e.removeNode(a,b);a.treeObj.trigger(d.event.REMOVE, -[a.treeId,b]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(a,b){if(i.getRoots().showHoverDom)b.isHover=!0,a.edit.enable&&(e.addEditBtn(a,b),e.addRemoveBtn(a,b)),k.apply(a.view.addHoverDom,[a.treeId,b])},cancelCurEditNode:function(a,b,c){var l=i.getRoot(a),g=l.curEditNode;if(g){var o=l.curEditInput,b=b?b:c?i.nodeName(a,g):o.val();if(k.apply(a.callback.beforeRename,[a.treeId,g,b,c],!0)===!1)return!1;i.nodeName(a,g,b);q(g,d.id.A,a).removeClass(d.node.CURSELECTED_EDIT); -o.unbind();e.setNodeName(a,g);g.editNameFlag=!1;l.curEditNode=null;l.curEditInput=null;e.selectNode(a,g,!1);a.treeObj.trigger(d.event.RENAME,[a.treeId,g,c])}return l.noSelection=!0},editNode:function(a,b){var c=i.getRoot(a);e.editNodeBlur=!1;if(i.isSelectedNode(a,b)&&c.curEditNode==b&&b.editNameFlag)setTimeout(function(){k.inputFocus(c.curEditInput)},0);else{b.editNameFlag=!0;e.removeTreeDom(a,b);e.cancelCurEditNode(a);e.selectNode(a,b,!1);q(b,d.id.SPAN,a).html("");var l=q(b,d.id.INPUT,a);l.attr("value",i.nodeName(a,b));a.edit.editNameSelectAll?k.inputSelect(l):k.inputFocus(l);l.bind("blur",function(){e.editNodeBlur||e.cancelCurEditNode(a)}).bind("keydown",function(b){b.keyCode=="13"?(e.editNodeBlur=!0,e.cancelCurEditNode(a)):b.keyCode=="27"&&e.cancelCurEditNode(a,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});q(b,d.id.A,a).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=l; -c.noSelection=!1;c.curEditNode=b}},moveNode:function(a,b,c,l,g,k){var j=i.getRoot(a);if(b!=c&&(!a.data.keep.leaf||!b||i.nodeIsParent(a,b)||l!=d.move.TYPE_INNER)){var f=c.parentTId?c.getParentNode():j,m=b===null||b==j;m&&b===null&&(b=j);if(m)l=d.move.TYPE_INNER;j=b.parentTId?b.getParentNode():j;if(l!=d.move.TYPE_PREV&&l!=d.move.TYPE_NEXT)l=d.move.TYPE_INNER;if(l==d.move.TYPE_INNER)if(m)c.parentTId=null;else{if(!i.nodeIsParent(a,b))i.nodeIsParent(a,b,!0),b.open=!!b.open,e.setNodeLineIcos(a,b);c.parentTId= -b.tId}var y;m?y=m=a.treeObj:(!k&&l==d.move.TYPE_INNER?e.expandCollapseNode(a,b,!0,!1):k||e.expandCollapseNode(a,b.getParentNode(),!0,!1),m=q(b,a),y=q(b,d.id.UL,a),m.get(0)&&!y.get(0)&&(y=[],e.makeUlHtml(a,b,y,""),m.append(y.join(""))),y=q(b,d.id.UL,a));var r=q(c,a);r.get(0)?m.get(0)||r.remove():r=e.appendNodes(a,c.level,[c],null,-1,!1,!0).join("");y.get(0)&&l==d.move.TYPE_INNER?y.append(r):m.get(0)&&l==d.move.TYPE_PREV?m.before(r):m.get(0)&&l==d.move.TYPE_NEXT&&m.after(r);var s;y=-1;var r=0,n=null, -m=null,B=c.level,v=i.nodeChildren(a,f),C=i.nodeChildren(a,j),u=i.nodeChildren(a,b);if(c.isFirstNode){if(y=0,v.length>1)n=v[1],n.isFirstNode=!0}else if(c.isLastNode)y=v.length-1,n=v[y-1],n.isLastNode=!0;else for(j=0,s=v.length;j=0&&v.splice(y,1);if(l!=d.move.TYPE_INNER)for(j=0,s=C.length;j0)m=u[u.length-1],m.isLastNode=!1;u.splice(u.length,0,c);c.isLastNode=!0;c.isFirstNode= -u.length==1}else b.isFirstNode&&l==d.move.TYPE_PREV?(C.splice(r,0,c),m=b,m.isFirstNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!0,c.isLastNode=!1):b.isLastNode&&l==d.move.TYPE_NEXT?(C.splice(r+1,0,c),m=b,m.isLastNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(l==d.move.TYPE_PREV?C.splice(r,0,c):C.splice(r+1,0,c),c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!1);i.fixPIdKeyValue(a,c);i.setSonNodeLevel(a,c.getParentNode(),c);e.setNodeLineIcos(a,c);e.repairNodeLevelClass(a, -c,B);!a.data.keep.parent&&v.length<1?(i.nodeIsParent(a,f,!1),f.open=!1,b=q(f,d.id.UL,a),l=q(f,d.id.SWITCH,a),j=q(f,d.id.ICON,a),e.replaceSwitchClass(f,l,d.folder.DOCU),e.replaceIcoClass(f,j,d.folder.DOCU),b.css("display","none")):n&&e.setNodeLineIcos(a,n);m&&e.setNodeLineIcos(a,m);a.check&&a.check.enable&&e.repairChkClass&&(e.repairChkClass(a,f),e.repairParentChkClassWithSelf(a,f),f!=c.parent&&e.repairParentChkClassWithSelf(a,c));k||e.expandCollapseParentNode(a,c.getParentNode(),!0,g)}},removeEditBtn:function(a, -b){q(b,d.id.EDIT,a).unbind().remove()},removeRemoveBtn:function(a,b){q(b,d.id.REMOVE,a).unbind().remove()},removeTreeDom:function(a,b){b.isHover=!1;e.removeEditBtn(a,b);e.removeRemoveBtn(a,b);k.apply(a.view.removeHoverDom,[a.treeId,b])},repairNodeLevelClass:function(a,b,c){if(c!==b.level){var e=q(b,a),g=q(b,d.id.A,a),a=q(b,d.id.UL,a),c=d.className.LEVEL+c,b=d.className.LEVEL+b.level;e.removeClass(c);e.addClass(b);g.removeClass(c);g.addClass(b);a.removeClass(c);a.addClass(b)}},selectNodes:function(a, -b){for(var c=0,d=b.length;c0)}},event:{},data:{setSonNodeLevel:function(a,b,c){if(c){var d=i.nodeChildren(a,c);c.level=b?b.level+1:0;if(d)for(var b=0,g=d.length;b0)switch(o=i.getNodeCache(c,g),j){case "mousedownNode":f=v.onMousedownNode;break;case "hoverOverNode":f=v.onHoverOverNode; -break;case "hoverOutNode":f=v.onHoverOutNode}return{stop:!1,node:o,nodeEventType:j,nodeEventCallback:f,treeEventType:"",treeEventCallback:null}});i.addInitRoot(function(a){var a=i.getRoot(a),b=i.getRoots();a.curEditNode=null;a.curEditInput=null;a.curHoverNode=null;a.dragFlag=0;a.dragNodeShowBefore=[];a.dragMaskList=[];b.showHoverDom=!0});i.addZTreeTools(function(a,b){b.cancelEditName=function(a){i.getRoot(this.setting).curEditNode&&e.cancelCurEditNode(this.setting,a?a:null,!0)};b.copyNode=function(b, -l,g,o){if(!l)return null;var j=i.nodeIsParent(a,b);if(b&&!j&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;var f=this,m=k.clone(l);if(!b)b=null,g=d.move.TYPE_INNER;g==d.move.TYPE_INNER?(l=function(){e.addNodes(f.setting,b,-1,[m],o)},k.canAsync(this.setting,b)?e.asyncNode(this.setting,b,o,l):l()):(e.addNodes(this.setting,b.parentNode,-1,[m],o),e.moveNode(this.setting,b,m,g,!1,o));return m};b.editName=function(a){a&&a.tId&&a===i.getNodeCache(this.setting,a.tId)&&(a.parentTId&&e.expandCollapseParentNode(this.setting, -a.getParentNode(),!0),e.editNode(this.setting,a))};b.moveNode=function(b,l,g,o){function j(){e.moveNode(m.setting,b,l,g,!1,o)}if(!l)return l;var f=i.nodeIsParent(a,b);if(b&&!f&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;else if(b&&(l.parentTId==b.tId&&g==d.move.TYPE_INNER||q(l,this.setting).find("#"+b.tId).length>0))return null;else b||(b=null);var m=this;k.canAsync(this.setting,b)&&g===d.move.TYPE_INNER?e.asyncNode(this.setting,b,o,j):j();return l};b.setEditable=function(a){this.setting.edit.enable= -a;return this.refresh()}});var N=e.cancelPreSelectedNode;e.cancelPreSelectedNode=function(a,b){for(var c=i.getRoot(a).curSelectedList,d=0,g=c.length;d")},showNode:function(c,a){d.isHidden(c,a,!1);d.initShowForExCheck(c,a);k(a,c).show()},showNodes:function(c,a,b){if(a&&a.length!=0){var f={},g,i;for(g=0,i=a.length;g0&&!f?b[0].isFirstNode=!0:b.length>0&&e.setFirstNodeForHide(c,b)},setLastNode:function(c,a){var b=d.nodeChildren(c,a),f=d.isHidden(c,b[0]);b.length>0&&!f?b[b.length-1].isLastNode=!0:b.length>0&&e.setLastNodeForHide(c,b)},setFirstNodeForHide:function(c,a){var b,f,g;for(f=0,g=a.length;f=0;f--){b=a[f];if(b.isLastNode)break;if(!d.isHidden(c,b)&&!b.isLastNode){b.isLastNode=!0;e.setNodeLineIcos(c,b);break}else b=null}return b},setLastNodeForShow:function(c, -a){var b,f,g,i;for(f=a.length-1;f>=0;f--){b=a[f];var h=d.isHidden(c,b);if(!g&&!h&&b.isLastNode){g=b;break}else if(!g&&!h&&!b.isLastNode)b.isLastNode=!0,g=b,e.setNodeLineIcos(c,b);else if(g&&b.isLastNode){b.isLastNode=!1;i=b;e.setNodeLineIcos(c,b);break}}return{"new":g,old:i}}},data:{initHideForExCheck:function(c,a){if(d.isHidden(c,a)&&c.check&&c.check.enable){if(typeof a._nocheck=="undefined")a._nocheck=!!a.nocheck,a.nocheck=!0;a.check_Child_State=-1;e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(c, -a)}},initShowForExCheck:function(c,a){if(!d.isHidden(c,a)&&c.check&&c.check.enable){if(typeof a._nocheck!="undefined")a.nocheck=a._nocheck,delete a._nocheck;if(e.setChkClass){var b=k(a,l.id.CHECK,c);e.setChkClass(c,b,a)}e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(c,a)}}}});var j=j.fn.zTree,m=j._z.tools,l=j.consts,e=j._z.view,d=j._z.data,k=m.$;d.isHidden=function(c,a,b){if(!a)return!1;c=c.data.key.isHidden;typeof b!=="undefined"&&(typeof b==="string"&&(b=m.eqs(checked,"true")),a[c]= -!!b);return a[c]};d.exSetting({data:{key:{isHidden:"isHidden"}}});d.addInitNode(function(c,a,b){a=d.isHidden(c,b);d.isHidden(c,b,a);d.initHideForExCheck(c,b)});d.addBeforeA(function(){});d.addZTreeTools(function(c,a){a.showNodes=function(a,b){e.showNodes(c,a,b)};a.showNode=function(a,b){a&&e.showNodes(c,[a],b)};a.hideNodes=function(a,b){e.hideNodes(c,a,b)};a.hideNode=function(a,b){a&&e.hideNodes(c,[a],b)};var b=a.checkNode;if(b)a.checkNode=function(f,e,i,h){(!f||!d.isHidden(c,f))&&b.apply(a,arguments)}}); -var n=d.initNode;d.initNode=function(c,a,b,f,g,i,h){var j=(f?f:d.getRoot(c))[c.data.key.children];d.tmpHideFirstNode=e.setFirstNodeForHide(c,j);d.tmpHideLastNode=e.setLastNodeForHide(c,j);h&&(e.setNodeLineIcos(c,d.tmpHideFirstNode),e.setNodeLineIcos(c,d.tmpHideLastNode));g=d.tmpHideFirstNode===b;i=d.tmpHideLastNode===b;n&&n.apply(d,arguments);h&&i&&e.clearOldLastNode(c,b,h)};var o=d.makeChkFlag;if(o)d.makeChkFlag=function(c,a){(!a||!d.isHidden(c,a))&&o.apply(d,arguments)};var p=d.getTreeCheckedNodes; -if(p)d.getTreeCheckedNodes=function(c,a,b,f){if(a&&a.length>0){var e=a[0].getParentNode();if(e&&d.isHidden(c,e))return[]}return p.apply(d,arguments)};var q=d.getTreeChangeCheckedNodes;if(q)d.getTreeChangeCheckedNodes=function(c,a,b){if(a&&a.length>0){var e=a[0].getParentNode();if(e&&d.isHidden(c,e))return[]}return q.apply(d,arguments)};var r=e.expandCollapseSonNode;if(r)e.expandCollapseSonNode=function(c,a,b,f,g){(!a||!d.isHidden(c,a))&&r.apply(e,arguments)};var s=e.setSonNodeCheckBox;if(s)e.setSonNodeCheckBox= -function(c,a,b,f){(!a||!d.isHidden(c,a))&&s.apply(e,arguments)};var t=e.repairParentChkClassWithSelf;if(t)e.repairParentChkClassWithSelf=function(c,a){(!a||!d.isHidden(c,a))&&t.apply(e,arguments)}})(jQuery); - - - - - TreeSelect.prototype.render = function (options) { - var elem = options.elem, - // 请求地址 - data = options.data, - // 请求方式 - type = options.type === undefined ? 'GET' : options.type, - // 节点点击回调 - click = options.click, - // 渲染成功后的回调函数 - success = options.success, - // 占位符(提示信息) - placeholder = options.placeholder === undefined ? '请选择' : options.placeholder, - // 是否开启搜索 - search = options.search === undefined ? false : options.search, - process = options.process; - // 样式配置项 - style = options.style, - // 唯一id - tmp = new Date().getTime(), - DATA = {}, - selected = 'layui-form-selected', - TREE_OBJ = undefined, - TREE_INPUT_ID = 'treeSelect-input-' + tmp, - TREE_INPUT_CLASS = 'layui-treeselect', - TREE_SELECT_ID = 'layui-treeSelect-' + tmp, - TREE_SELECT_CLASS = 'layui-treeSelect', - TREE_SELECT_TITLE_ID = 'layui-select-title-' + tmp, - TREE_SELECT_TITLE_CLASS = 'layui-select-title', - TREE_SELECT_BODY_ID = 'layui-treeSelect-body-' + tmp, - TREE_SELECT_BODY_CLASS = 'layui-treeSelect-body', - TREE_SELECT_SEARCHED_CLASS = 'layui-treeSelect-search-ed'; - - - var a = { - init: function () { - $.ajax({ - url: data, - type: type, - dataType: 'json', - success: function (d) { - if(process){ - d = process(d); - } - DATA = d; - a.hideElem().input().toggleSelect().loadCss().preventEvent(); - $.fn.zTree.init($('#' + TREE_SELECT_BODY_ID), a.setting(), d); - TREE_OBJ = $.fn.zTree.getZTreeObj(TREE_SELECT_BODY_ID); - if (search) { - a.searchParam(); - } - a.configStyle(); - if (success) { - var obj = { - treeId: TREE_SELECT_ID, - data: d - }; - success(obj); - } - } - }); - return a; - }, - // 检查input是否有默认值 - checkDefaultValue: function () { - - }, - setting: function () { - var setting = { - callback: { - onClick: a.onClick, - onExpand: a.onExpand, - onCollapse: a.onCollapse, - beforeExpand: a.ztreeCallBack.beforeExpand - } - }; - return setting; - }, - ztreeCallBack: { - beforeExpand: function () { - a.configStyle(); - }, - }, - onCollapse: function () { - a.focusInput(); - }, - onExpand: function () { - a.configStyle(); - a.focusInput(); - }, - focusInput: function () { - $('#' + TREE_INPUT_ID).focus(); - }, - onClick: function (event, treeId, treeNode) { - var name = treeNode.name, - id = treeNode.id, - $input = $('#' + TREE_SELECT_TITLE_ID + ' input'); - $input.val(name); - $(elem).attr('value', id).val(id); - $('#' + TREE_SELECT_ID).removeClass(selected); - - if (click) { - var obj = { - data: DATA, - current: treeNode, - treeId: TREE_SELECT_ID - }; - click(obj); - } - return a; - }, - hideElem: function () { - $(elem).hide(); - return a; - }, - input: function () { - var readonly = ''; - if (!search) { - readonly = 'readonly'; - } - var selectHtml = '
                  ' + - '
                  ' + - ' ' + - '' + - '
                  ' + - '
                  ' + - '
                  ' + - '
                  ' + - '
                  '; - $(elem).parent().append(selectHtml); - return a; - }, - /** - * 展开/折叠下拉框 - */ - toggleSelect: function () { - var item = '#' + TREE_SELECT_TITLE_ID; - a.event('click', item, function (e) { - var $select = $('#' + TREE_SELECT_ID); - if ($select.hasClass(selected)) { - $select.removeClass(selected); - $('#' + TREE_INPUT_ID).blur(); - } else { - // 隐藏其他picker - $('.layui-form-select').removeClass(selected); - // 显示当前picker - $select.addClass(selected); - } - e.stopPropagation(); - }); - $(document).click(function () { - var $select = $('#' + TREE_SELECT_ID); - if ($select.hasClass(selected)) { - $select.removeClass(selected); - $('#' + TREE_INPUT_ID).blur(); - } - }); - return a; - }, - // 模糊查询 - searchParam: function () { - if (!search) { - return; - } - - var item = '#' + TREE_INPUT_ID; - a.fuzzySearch(item, null, true); - }, - fuzzySearch: function (searchField, isHighLight, isExpand) { - var zTreeObj = TREE_OBJ;//get the ztree object by ztree id - if (!zTreeObj) { - alert("fail to get ztree object"); - } - var nameKey = zTreeObj.setting.data.key.name; //get the key of the node name - isHighLight = isHighLight === false ? false : true;//default true, only use false to disable highlight - isExpand = isExpand ? true : false; // not to expand in default - zTreeObj.setting.view.nameIsHTML = isHighLight; //allow use html in node name for highlight use - - var metaChar = '[\\[\\]\\\\\^\\$\\.\\|\\?\\*\\+\\(\\)]'; //js meta characters - var rexMeta = new RegExp(metaChar, 'gi');//regular expression to match meta characters - - // keywords filter function - function ztreeFilter(zTreeObj, _keywords, callBackFunc) { - if (!_keywords) { - _keywords = ''; //default blank for _keywords - } - - // function to find the matching node - function filterFunc(node) { - if (node && node.oldname && node.oldname.length > 0) { - node[nameKey] = node.oldname; //recover oldname of the node if exist - } - zTreeObj.updateNode(node); //update node to for modifications take effect - if (_keywords.length == 0) { - //return true to show all nodes if the keyword is blank - zTreeObj.showNode(node); - zTreeObj.expandNode(node, isExpand); - return true; - } - //transform node name and keywords to lowercase - if (node[nameKey] && node[nameKey].toLowerCase().indexOf(_keywords.toLowerCase()) != -1) { - zTreeObj.showNode(node);//show node with matching keywords - return true; //return true and show this node - } - - zTreeObj.hideNode(node); // hide node that not matched - return false; //return false for node not matched - } - - var nodesShow = zTreeObj.getNodesByFilter(filterFunc); //get all nodes that would be shown - processShowNodes(nodesShow, _keywords);//nodes should be reprocessed to show correctly - } - - /** - * reprocess of nodes before showing - */ - function processShowNodes(nodesShow, _keywords) { - if (nodesShow && nodesShow.length > 0) { - //process the ancient nodes if _keywords is not blank - if (_keywords.length > 0) { - $.each(nodesShow, function (n, obj) { - var pathOfOne = obj.getPath();//get all the ancient nodes including current node - if (pathOfOne && pathOfOne.length > 0) { - //i < pathOfOne.length-1 process every node in path except self - for (var i = 0; i < pathOfOne.length - 1; i++) { - zTreeObj.showNode(pathOfOne[i]); //show node - zTreeObj.expandNode(pathOfOne[i], true); //expand node - } - } - }); - } else { //show all nodes when _keywords is blank and expand the root nodes - var rootNodes = zTreeObj.getNodesByParam('level', '0');//get all root nodes - $.each(rootNodes, function (n, obj) { - zTreeObj.expandNode(obj, true); //expand all root nodes - }); - } - } - } - - //listen to change in input element - $(searchField).bind('input propertychange', function () { - var _keywords = $(this).val(); - searchNodeLazy(_keywords); //call lazy load - }); - - var timeoutId = null; - // excute lazy load once after input change, the last pending task will be cancled - function searchNodeLazy(_keywords) { - if (timeoutId) { - //clear pending task - clearTimeout(timeoutId); - } - timeoutId = setTimeout(function () { - ztreeFilter(zTreeObj, _keywords); //lazy load ztreeFilter function - $(searchField).focus();//focus input field again after filtering - }, 200); - } - }, - checkNodes: function (nodes) { - for (var i = 0; i < nodes.length; i++) { - var o = nodes[i], - pid = o.parentTId, - tid = o.tId; - if (pid !== null) { - // 获取父节点 - $('#' + pid).addClass(TREE_SELECT_SEARCHED_CLASS); - var pNode = TREE_OBJ.getNodesByParam("tId", pid, null); - TREE_OBJ.expandNode(pNode[0], true, false, true); - } - $('#' + tid).addClass(TREE_SELECT_SEARCHED_CLASS); - } - }, - // 阻止Layui的一些默认事件 - preventEvent: function () { - var item = '#' + TREE_SELECT_ID + ' .layui-anim'; - a.event('click', item, function (e) { - e.stopPropagation(); - }); - return a; - }, - loadCss: function () { - var ztree = '.ztree *{padding:0;margin:0;font-size:12px;font-family:Verdana,Arial,Helvetica,AppleGothic,sans-serif}.ztree{margin:0;padding:5px;color:#333}.ztree li{padding:0;margin:0;list-style:none;line-height:14px;text-align:left;white-space:nowrap;outline:0}.ztree li ul{margin:0;padding:0 0 0 18px}.ztree li ul.line{background:url(./img/line_conn.gif) 0 0 repeat-y;}.ztree li a{padding:1px 3px 0 0;margin:0;cursor:pointer;height:17px;color:#333;background-color:transparent;text-decoration:none;vertical-align:top;display:inline-block}.ztree li a:hover{text-decoration:underline}.ztree li a.curSelectedNode{padding-top:0px;background-color:#FFE6B0;color:black;height:16px;border:1px #FFB951 solid;opacity:0.8;}.ztree li a.curSelectedNode_Edit{padding-top:0px;background-color:#FFE6B0;color:black;height:16px;border:1px #FFB951 solid;opacity:0.8;}.ztree li a.tmpTargetNode_inner{padding-top:0px;background-color:#316AC5;color:white;height:16px;border:1px #316AC5 solid;opacity:0.8;filter:alpha(opacity=80)}.ztree li a.tmpTargetNode_prev{}.ztree li a.tmpTargetNode_next{}.ztree li a input.rename{height:14px;width:80px;padding:0;margin:0;font-size:12px;border:1px #7EC4CC solid;*border:0px}.ztree li span{line-height:16px;margin-right:2px}.ztree li span.button{line-height:0;margin:0;width:16px;height:16px;display:inline-block;vertical-align:middle;border:0 none;cursor:pointer;outline:none;background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-image:url("./img/zTreeStandard.png");*background-image:url("./img/zTreeStandard.gif")}.ztree li span.button.chk{width:13px;height:13px;margin:0 3px 0 0;cursor:auto}.ztree li span.button.chk.checkbox_false_full{background-position:0 0}.ztree li span.button.chk.checkbox_false_full_focus{background-position:0 -14px}.ztree li span.button.chk.checkbox_false_part{background-position:0 -28px}.ztree li span.button.chk.checkbox_false_part_focus{background-position:0 -42px}.ztree li span.button.chk.checkbox_false_disable{background-position:0 -56px}.ztree li span.button.chk.checkbox_true_full{background-position:-14px 0}.ztree li span.button.chk.checkbox_true_full_focus{background-position:-14px -14px}.ztree li span.button.chk.checkbox_true_part{background-position:-14px -28px}.ztree li span.button.chk.checkbox_true_part_focus{background-position:-14px -42px}.ztree li span.button.chk.checkbox_true_disable{background-position:-14px -56px}.ztree li span.button.chk.radio_false_full{background-position:-28px 0}.ztree li span.button.chk.radio_false_full_focus{background-position:-28px -14px}.ztree li span.button.chk.radio_false_part{background-position:-28px -28px}.ztree li span.button.chk.radio_false_part_focus{background-position:-28px -42px}.ztree li span.button.chk.radio_false_disable{background-position:-28px -56px}.ztree li span.button.chk.radio_true_full{background-position:-42px 0}.ztree li span.button.chk.radio_true_full_focus{background-position:-42px -14px}.ztree li span.button.chk.radio_true_part{background-position:-42px -28px}.ztree li span.button.chk.radio_true_part_focus{background-position:-42px -42px}.ztree li span.button.chk.radio_true_disable{background-position:-42px -56px}.ztree li span.button.switch{width:18px;height:18px}.ztree li span.button.root_open{background-position:-92px -54px}.ztree li span.button.root_close{background-position:-74px -54px}.ztree li span.button.roots_open{background-position:-92px 0}.ztree li span.button.roots_close{background-position:-74px 0}.ztree li span.button.center_open{background-position:-92px -18px}.ztree li span.button.center_close{background-position:-74px -18px}.ztree li span.button.bottom_open{background-position:-92px -36px}.ztree li span.button.bottom_close{background-position:-74px -36px}.ztree li span.button.noline_open{background-position:-92px -72px}.ztree li span.button.noline_close{background-position:-74px -72px}.ztree li span.button.root_docu{background:none;}.ztree li span.button.roots_docu{background-position:-56px 0}.ztree li span.button.center_docu{background-position:-56px -18px}.ztree li span.button.bottom_docu{background-position:-56px -36px}.ztree li span.button.noline_docu{background:none;}.ztree li span.button.ico_open{display:none!important;margin-right:2px;background-position:-110px -16px;vertical-align:top;*vertical-align:middle}.ztree li span.button.ico_close{display:none!important;margin-right:2px;background-position:-110px 0;vertical-align:top;*vertical-align:middle}.ztree li span.button.ico_docu{margin-right:2px;background-position:-110px -32px;vertical-align:top;*vertical-align:middle}.ztree li span.button.edit{margin-right:2px;background-position:-110px -48px;vertical-align:top;*vertical-align:middle}.ztree li span.button.remove{margin-right:2px;background-position:-110px -64px;vertical-align:top;*vertical-align:middle}.ztree li span.button.ico_loading{margin-right:2px;background:url(./img/loading.gif) no-repeat scroll 0 0 transparent;vertical-align:top;*vertical-align:middle}ul.tmpTargetzTree{background-color:#FFE6B0;opacity:0.8;filter:alpha(opacity=80)}span.tmpzTreeMove_arrow{width:16px;height:16px;display:inline-block;padding:0;margin:2px 0 0 1px;border:0 none;position:absolute;background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-110px -80px;background-image:url("./img/zTreeStandard.png");*background-image:url("./img/zTreeStandard.gif")}ul.ztree.zTreeDragUL{margin:0;padding:0;position:absolute;width:auto;height:auto;overflow:hidden;background-color:#cfcfcf;border:1px #00B83F dotted;opacity:0.8;filter:alpha(opacity=80)}.zTreeMask{z-index:10000;background-color:#cfcfcf;opacity:0.0;filter:alpha(opacity=0);position:absolute}', - ztree_ex = '.layui-treeSelect .ztree li span.button{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:none;line-height:inherit;}.layui-treeSelect .ztree li span.button.ico_open{display:none;}.layui-treeSelect .ztree li span.button.ico_close{display:none;}.layui-treeSelect .ztree li span.button.ico_docu:before{content:"\\e621";}.layui-treeSelect .ztree li span.button.bottom_close:before,.layui-treeSelect .ztree li span.button.center_close:before,.layui-treeSelect .ztree li span.button.roots_close:before,.layui-treeSelect .ztree li span.button.root_close:before{content:"\\e623";}.layui-treeSelect .ztree li span.button.bottom_open:before,.layui-treeSelect .ztree li span.button.roots_open:before,.layui-treeSelect .ztree li span.button.center_open:before,.layui-treeSelect .ztree li span.button.root_open:before{content:"\\e625";}.layui-treeSelect .ztree li a:hover{text-decoration:none;}.layui-treeSelect .ztree *{font-size:14px;}.layui-treeSelect .ztree li{line-height:inherit;padding:2px 0;}.layui-treeSelect .ztree li span.button.switch{position:relative;top:-1px;}.layui-treeSelect .ztree li a,.ztree li span{line-height:18px;height:inherit;}.layui-treeSelect .ztree li a.curSelectedNode{color:#5FB878;background:none;border:none;height:inherit;padding-top:1px;}.layui-treeSelect .layui-anim::-webkit-scrollbar{width:6px;height:6px;background-color:#F5F5F5;}.layui-treeSelect .layui-anim::-webkit-scrollbar-track{box-shadow:inset 0 0 6px rgba(107,98,98,0.3);border-radius:10px;background-color:#F5F5F5;}.layui-treeSelect .layui-anim::-webkit-scrollbar-thumb{border-radius:10px;box-shadow:inset 0 0 6px rgba(107,98,98,0.3);background-color:#555;}.layui-treeSelect.layui-form-select .layui-anim{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:9999;min-width:100%;border:1px solid #d2d2d2;max-height:185px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;}.layui-treeSelect.layui-form-selected .layui-anim{display:block;}.layui-treeSelect .ztree li ul.line{background:none;position:relative;}.layui-treeSelect .ztree li ul.line:before{content:"";height:100%;border-left:1px dotted #ece;position:absolute;left:8px;}.layui-treeSelect .ztree li .center_docu:before,.ztree li .bottom_docu::before{content:"";height:100%;border-left:1px dotted #ece;position:absolute;left:8px;}.layui-treeSelect .ztree li .center_docu::after,.ztree li .bottom_docu::after{content:"";position:absolute;left:8px;top:8px;width:8px;border-top:1px dotted #ece;}.layui-treeSelect .ztree li span.button.ico_open{display:inline-block;position:relative;top:1px;}.layui-treeSelect .ztree li span.button.ico_close{display:inline-block;position:relative;top:1px;}.layui-treeSelect .ztree li span.button.ico_open:before{content:"\\e643";}.layui-treeSelect .ztree li span.button.ico_close:before{content:"\\e63f";}'; - $head = $('head'), - ztreeStyle = $head.find('style[ztree]'); - - if (ztreeStyle.length === 0) { - $head.append($(''*/ - ,''].join('') - ,_WIN = $(window) - ,_DOC = $(document) - - //构造器 - ,Class = function(options){ - var that = this; - that.index = ++table.index; - that.config = $.extend({}, that.config, table.config, options); - that.configFirst = $.extend({}, that.config, table.config, options); - that.render(); - table.pushClass(options.id,that); - }; - /** - * 表格行为属性(默认配置) - */ - Class.prototype.config = { - limit: 10 //每页显示的数量 - ,loading: true //请求数据时,是否显示loading - ,cellMinWidth: 60 //所有单元格默认最小宽度 - ,heightRemove:[]//非固定高度情况下,不参与计算的高度 - ,text: { - none: '无数据' - } - ,isFilter:false//是否开启行内过滤 - ,method:'post'//默认以post方式请求后台 - ,radDisabledNum:0//禁止单选的记录数 - ,cheDisabledNum:0//禁止多选的记录数 - //树相关图表 - ,branch: ['', ''] //父节点 - ,leaf: '' //叶节点 - ,iconOpen:true//默认开启树节点图标 - ,isOpenDefault:true//默认展开还是折叠节点 - ,parseData:null//加载数据后的回调方法 - ,onClickRow:null//行单击事件 - ,onDblClickRow:null//行双击事件 - ,onBeforeCheck:null//复选前事件 - ,onCheck:null//复选事件 (obj 对象,checked 选中状态,isAll 是否全选) - ,onRadio:null//单选事件 () - ,isTree:true//默认为树表格 - ,isPage:false//不分页 - ,height:'100%'//默认高度100% - }; - Class.prototype.configFirst={};//页面定义时原始参数 - //表格渲染 - Class.prototype.render = function(){ - var that = this - ,options = that.config; - options.elem = $(options.elem); - options.where = options.where || {}; - options.id = options.id || options.elem.attr('id'); - that.test(); - //请求参数的自定义格式 - options.request = $.extend({ - pageName: 'page' - ,limitName: 'limit' - }, options.request) - //响应数据的自定义格式 - options.response = $.extend({ - statusName: 'code' - ,statusCode: 0 - ,msgName: 'msg' - ,dataName: 'data' - ,countName: 'count' - }, options.response); - //如果 page 传入 laypage 对象 - if(typeof options.page === 'object'){ - options.limit = options.page.limit || options.limit; - options.limits = options.page.limits || options.limits; - that.page = options.page.curr = options.page.curr || 1; - delete options.page.elem; - delete options.page.jump; - } - if(!options.elem[0]) return that; - that.columnWidthInit();//列宽度计算 - //开始插入替代元素 - var othis = options.elem - ,hasRender = othis.next('.' + ELEM_VIEW) - //主容器 - ,reElem = that.elem = $(laytpl(TPL_MAIN).render({ - VIEW_CLASS: ELEM_VIEW - ,data: options - ,index: that.index //索引 - })); - options.index = that.index; - //生成替代元素 - hasRender[0] && hasRender.remove(); //如果已经渲染,则Rerender - othis.after(reElem); - that.renderTdCss(); - //各级容器 - that.layHeader = reElem.find(ELEM_HEADER); //表头 - that.layMain = reElem.find(ELEM_MAIN);//内容区域 - that.layBody = reElem.find(ELEM_BODY);//内容区域 - that.layFixed = reElem.find(ELEM_FIXED);//浮动区域 - that.layFixLeft = reElem.find(ELEM_FIXL);//左浮动 - that.layFixRight = reElem.find(ELEM_FIXR);//有浮动 - that.layTool = reElem.find(ELEM_TOOL);//工具栏区域 - that.layPage = reElem.find(ELEM_PAGE);//分页区域 - that.layFilter=reElem.find(ELEM_FILTER);//行内过滤条件区域 - that.layTool.html( - laytpl($(options.toolbar).html()||'').render(options) - ); - if(options.height){ - that.tableHeight();//表格高度计算 - that.resizeHeight();//高度控制 - that.renderCss(); - } - //如果多级表头,则填补表头高度 - if(options.cols.length > 1){ - var th = that.layFixed.find(ELEM_HEADER).find('th'); - th.height(that.layHeader.height() - 1 - parseFloat(th.css('padding-top')) - parseFloat(th.css('padding-bottom'))); - } - //渲染过滤区域 - if(options.isFilter){ - that.layFilter.html( - that.renderFilter() - ); - } - //请求数据 - that.pullData(that.page,that.loading()); - that.test(); - }; - //根据列类型,定制化参数 - Class.prototype.initOpts = function(item){ - var that = this, - options = that.config; - //让 type 参数兼容旧版本 - if(item.checkbox) item.type = "checkbox"; - if(item.space) item.type = "space"; - if(!item.type) item.type = "normal"; - - if(item.type !== "normal"){ - item.unresize = true; - item.width = item.width || table.config.initWidth[item.type]; - } - - if(options.isFilter){//开启行内过滤 - if(item.isFilter!=false){ - item.isFilter=true; - } - } - }; - - /** - * 表格获取父容器高度 - * @param tableId - */ - Class.prototype.getParentDivHeight = function(tableId){ - var th=$("#"+tableId).parent().height(); - return th; - }; - - /** - * 获取列定义 - * @param tableId - */ - Class.prototype.getCols = function(field){ - var that = this; - var o={}; - var cols=that.config.cols[0]; - var isInt=false; - var reg = /^[0-9]+.?[0-9]*$/; - if (reg.test(field)) {//数字 - isInt=true; - } - for(var ii in cols){ - if(isInt){ - if(ii==parseInt(field)) return cols[ii]; - }else{ - if(field==cols[ii].field)return cols[ii]; - } - } - return o; - }; - - //表格重载 - Class.prototype.reload = function(options){ - var that = this; - if(that.config.data && that.config.data.constructor === Array) delete that.config.data; - that.config = $.extend({}, that.config, options); - that.configFirst = $.extend({}, that.config, options); - //获取行内过滤的值 - that.render(); - }; - //页码 - Class.prototype.page = 1; - /** - * 重置下标(插入删除等操作) - * 1、data-index中的下标 - * 2、tr中data的值 - * 3、下标字段的值 - * @param list - */ - Class.prototype.restNumbers=function(){ - var that = this - ,options = that.config; - var trs=that.layBody.find('table tbody tr'); - var i=0; - trs.each(function (o) { - $(this).attr("data-index",i); - $(this).find(".laytable-cell-numbers p").text(i+1); - $(this).data('index',i); - i++; - }); - } - - /** - * 初始化节点 - * 在每一次数据加载时只执行一次 - * query、reload时会执行 - * @param o - */ - Class.prototype.resetData=function(n) { - var that = this - ,options = that.config; - if(options.isTree){ - if(!n.hasOwnProperty(table.config.cols.isOpen)){//如果不存在该属性则默认为true - n[table.config.cols.isOpen]=options.isOpenDefault; - } - if(!n.hasOwnProperty(table.config.cols.isShow)){//如果不存在该属性则默认为true - n[table.config.cols.isShow]=options.isOpenDefault?true:false; - } - } - //禁止设置 - if(!n.hasOwnProperty(table.config.cols.cheDisabled)){//不存在则默认为false - n[table.config.cols.cheDisabled]=false; - } - //记录禁止多选、单选的记录数 - if(n[table.config.cols.cheDisabled])options.cheDisabledNum++; - if(n[table.config.cols.radDisabled])options.radDisabledNum++; - n.children=[]; - } - /** - * 构建map数据 - * @param list - * @return {{}} - */ - Class.prototype.resetDataMap=function(list) { - var that = this - ,options = that.config; - var field_Id=options.idField; - var map={}; - if(list){ - list.forEach(function (o) { - map[o[field_Id]]=o; - }); - } - return map; - } - Class.prototype.resetDataresetRoot=true;//是否重新确定根节点 - /** - * 确定根节点id(重新登录根节点) - */ - Class.prototype.resetDataRoot=function (list) { - var that = this - ,options = that.config; - var field_Id=options[TREE_ID]; - var field_upId=options[TREE_UPID]; - var map=table.getDataMap(that.config.id);//列表map,fieldId为key //设置map数据集合 - var rootList=table.cache[options.id].data.upIds||[];//根节点list集合 - var rootMap={};//根节点map集合 - table.cache[options.id].data.upIds=[]; - rootList=table.cache[options.id].data.upIds; - for(var i=0;i0) { - fa2(n.children,1+level); - } - } - return; - } - fa2(treeList,1); - - //设置isOpen 和is_show状态 - tableList.forEach(function (o) { - var uo=that.treeFindUpData(o); - if(!uo||(uo[table.config.cols.isOpen]&&uo[table.config.cols.isShow])){//没有父亲:显示;父亲打开状态(显示状态:显示;隐藏状态:隐藏) - o[table.config.cols.isShow]=true; - }else{ - o[table.config.cols.isShow]=false; - } - }); - return tableList; - } - - /** - * 重置当前表格的数据(1、普通列表;2树状表格) - * 将列表数据转成树形结构和符合table展示的列表 - * @param list 列表数据 - * @param field_Id 树形结构主键字段 - * @param field_upId 树形结构上级字段 - * @returns {Array} [0]表格列表 [1]树形结构 - */ - Class.prototype.resetDatas=function(list) { - //console.time("resetDatas"); - var that = this - ,options = that.config; - var field_Id=options[TREE_ID]; - var field_upId=options[TREE_UPID]; - var datas=[]; - var treeList=[]; - var tableList=list; - var map=that.resetDataMap(list);//列表map,fieldId为key //设置map数据集合 - datas.push(tableList);//table结构 - datas.push(treeList)//tree树结构 - datas.push(map)//data数据 map结构 - //设置到内存中去 - table.setDataList(that.config.id,tableList); - table.setDataTreeList(that.config.id,treeList); - table.setDataMap(that.config.id,map); - if(list==null||list.length<=0)return datas; - //设置默认参数 - for (var i = 0; i < list.length; i++) { - that.resetData(list[i]); - } - if(options.isTree){//树状 - tableList=[]; - table.setDataList(that.config.id,tableList); - var rootList=table.cache[options.id].data.upIds||[];//根节点list集合 - if(rootList.length<=0||that.resetDataresetRoot){//确定根节点 - table.cache[options.id].data.upIds=[]; - rootList=that.resetDataRoot(list); - that.resetDataresetRoot=false; - } - treeList=that.resetDataTreeList(list,rootList); - table.setDataTreeList(that.config.id,treeList);//设置树结构到缓存 - tableList=that.resetDataTableList(treeList); - table.setDataList(that.config.id,tableList);//设置数据列表结构到缓存 - } - //console.timeEnd("resetDatas"); - return datas; - } - /** - * 根据id从表格数据中获取对象 - * @param data - * @param field_Id - * @param field_upId - * @returns {Array} - */ - Class.prototype.treeFindDataById=function(u_Id) { - var that = this - ,options = that.config; - var e=null; - var list=table.getDataList(that.key); - var key=options[TREE_ID]; - list.forEach(function (o) { - if(o[key]==u_Id){ - e=o; - return; - } - }); - return e; - } - /** - * 获取父节点 - * @param u_Id - */ - Class.prototype.treeFindUpData=function(o){ - var uOjb=null; - var that = this - ,options = that.config; - //处理父级 - var key=options[TREE_UPID];//父节点key名称 - var mapData=table.getDataMap(that.config.id);//获取map形式对象集合 - uOjb=mapData[o[key]]; - return uOjb; - } - /** - * 获取全部父节点集合,返回list(不包含自己) - * @param u_Id - */ - Class.prototype.treeFindUpDatas=function(o){ - var uOjb=null; - var that = this - ,options = that.config; - var list=[]; - var temf=function (temo) { - var uo=that.treeFindUpData(temo); - if(uo){ - list.push(uo); - temf(uo); - } - }; - temf(o); - return list; - } - /** - * 根据父id获取全部的叶子节点(递归) - * @param o 数据对象 - * @return {string} - */ - Class.prototype.treeFindSonData=function (data) { - var objs=[]; - function f(o) { - if(o.children.length>0){ - o.children.forEach(function (i) { - objs.push(i); - if(i.children.length>0){ - f(i); - } - }); - } - }f(data); - return objs; - }; - /** - * 叶子节点显示转换 - * @param o 数据 - * @param fieldName 树显示列名 - * @returns {string} - */ - Class.prototype.treeConvertShowName=function (o) { - var that = this - ,options = that.config; - var isTreeNode=(o.children&&o.children.length>0); - var temhtml='
                  ' - +function () {//位移量 - var nbspHtml=""//一次位移 - for(var i=1;i"; - return nbspHtml; - }() - +function () {//图标或占位符 - var temTreeHtml=''; - var temTreeIsOpen=o[table.config.cols.isOpen]?"":""; - if(isTreeNode){//父节点 - temTreeHtml=''+temTreeIsOpen+'' - +that.treeIconRender(o,true); - }else{//叶子节点 - temTreeHtml+=that.treeIconRender(o,true); - } - return temTreeHtml; - }() - +'
                  '; - return temhtml; - }; - /** - * 节点的展开或折叠 - * @param o 节点数据(树状表格) - * @param isOpen 展开(true)或折叠(false) - * - * 每个节点有两种状态, - * 1、打开状态(isOpen) 打开状态只需在点击瞬间控制,其他时候不需要变动 - * 2、显示状态(显示或隐藏) 显示状态根据父级节点控制,父级节点是显示并且打开状态的则显示,否则不显示,但不影响其打开状态 - */ - Class.prototype.treeNodeOpen=function (o,isOpen) { - var that = this - ,tr = that.layBody.find('tr[data-index="'+ o[table.config.indexName] +'"]'); - if(!o){ - return - } - o[table.config.cols.isOpen]=isOpen; - //处理树结构 - var fa = function(e) { - if(e.children&&e.children.length>0){ - var temList=e.children; - for (var i = 0; i < temList.length; i++) { - var n = temList[i]; - if(o[table.config.cols.isOpen]){//打开状态的,关闭 - if(e[table.config.cols.isOpen]&&e[table.config.cols.isShow]){//该节点显示 - var temo=that.layBody.find('tr[data-index="'+ n[table.config.indexName] +'"]'); - temo.css('display', ''); - n[table.config.cols.isShow]=true; - } - }else{ - var temo=that.layBody.find('tr[data-index="'+ n[table.config.indexName] +'"]'); - temo.css('display', 'none'); - n[table.config.cols.isShow]=false; - } - fa(n); - } - } - } - fa(o); - //处理图标 - that.treeIconRender(o,false); - var dbClickI=tr.find('.layui-tree-head'); - if(o[table.config.cols.isOpen]){//打开状态 - dbClickI.html(''); - }else{ - dbClickI.html(''); - } - }; - - /** - * icon渲染 - * @param o - * @param isHtml true(返回html) false(立即渲染) - */ - Class.prototype.treeIconRender=function (o,isHtml) { - var that = this - ,options = that.config - ,iconOpen=options.iconOpen - ,isTreeNode=(o.children&&o.children.length>0); - var temTreeHtml=''; - if(iconOpen){ - var temf=function () {//自定义图标 - var temhtml=''; - return temhtml; - } - if(isTreeNode){//父节点 - if((o[table.config.cols.iconOpen]||o[table.config.cols.iconClose])){ - temTreeHtml=temf(); - }else{ - temTreeHtml=''+(o[table.config.cols.isOpen]?that.config.branch[1]:that.config.branch[0])+''; - } - }else{//叶子节点 - if(o[table.config.cols.icon]){ - temTreeHtml=temf(); - }else{ - temTreeHtml+=''+that.config.leaf+''; - } - } - if(isHtml){ - return temTreeHtml; - }else{ - var temdiv=that.layBody.find('tr[data-index="'+ o[table.config.indexName] +'"]').find('td[data-field='+options[TREE_SHOW_NAME]+']').find('.layui-table-cell'); - $(temdiv).find('div .layui-tree-'+o[options.idField]).remove();//节点附加div - $(temdiv).find('div').append(temTreeHtml); - } - }else{ - return temTreeHtml; - } - } - //获得数据 - Class.prototype.pullData = function(curr, loadIndex){ - var that = this - ,options = that.config - ,request = options.request - ,response = options.response - ,sort = function(){ - if(typeof options.initSort === 'object'){ - that.sort(options.initSort.field, options.initSort.type); - } - }; - that.startTime = new Date().getTime(); //渲染开始时间 - if(options.url){ //Ajax请求 - var params = {}; - params[request.pageName] = curr; - params[request.limitName] = options.limit; - that.filterRulesSet(params);//行内过滤条件 - // that.sortSet(params);//排序条件 - $.ajax({ - type: options.method || 'get' - ,url: options.url - ,data: $.extend(params, options.where) - ,dataType: 'json' - ,success: function(res){ - if(!res[response.dataName]){//返回是未定义或null时转成[] - res[response.dataName]=[] - res[response.statusName]=0; - res[response.countName]=0; - res[response.msgName]='返回的数据状态异常'; - }; - that.resetDataresetRoot=true; - //如果有数据解析的回调,则获得其返回的数据 - if(typeof options.parseData === 'function'){ - res = options.parseData(res) || res; - } - that.resetDatas(res[response.dataName]); - res[response.dataName]=table.getDataList(options.id); - if(res[response.statusName] != response.statusCode){ - that.renderForm(); - that.layMain.html('
                  '+ (res[response.msgName] || '返回的数据状态异常') +'
                  '); - } else { - that.renderData(res, curr, res[response.countName]); - options.time = (new Date().getTime() - that.startTime) + ' ms'; //耗时(接口请求+视图渲染) - } - loadIndex && layer.close(loadIndex); - that.events(); - typeof options.done === 'function' && options.done(res, curr, res[response.countName]); - } - ,error: function(e, m){ - that.layMain.html('
                  数据接口请求异常
                  '); - that.renderForm(); - loadIndex && layer.close(loadIndex); - } - }); - } else if(options.data && options.data.constructor === Array){ //已知数据 - var res = {},startLimit = curr*options.limit - options.limit - res[response.dataName] = options.data.concat().splice(startLimit, options.limit); - res[response.countName] = options.data.length; - that.renderData(res, curr, options.data.length); - that.events(); - typeof options.done === 'function' && options.done(res, curr, res[response.countName]); - } - }; - /** - * 设置过滤条件 - */ - Class.prototype.filterRulesSet=function (p) { - var that = this; - p["filterRules"]=JSON.stringify(that.filterRules()); - } - /** - * 获取过滤条件 - * filterRules: - * [ - * {"field":"XXXX","op":"equals","value":["1"],"datatype":"array"} - * ,{"field":"XXXX","op":"contains","value":"3","datatype":"string"} - * ] - */ - Class.prototype.filterRules=function () { - var that = this; - var filterRules=[]; - //行内过滤条件 - var list=that.layFilter.find("[name^='filter_']"); - layui.each(list,function (i, o) { - if($(o).val()){ - var tem={ - "field":o.name - ,"op":"like" - ,"value":$(o).val() - ,"datatype":"string" - } - filterRules.push(tem); - } - }); - // console.log(filterRules,filterRules.toString(),JSON.stringify(filterRules)); - return filterRules; - } - - //遍历表头 - Class.prototype.eachCols = function(callback){ - var cols = $.extend(true, [], this.config.cols) - ,arrs = [], index = 0; - - //重新整理表头结构 - layui.each(cols, function(i1, item1){ - layui.each(item1, function(i2, item2){ - //如果是组合列,则捕获对应的子列 - if(item2.colspan > 1){ - var childIndex = 0; - index++ - item2.CHILD_COLS = []; - layui.each(cols[i1 + 1], function(i22, item22){ - if(item22.PARENT_COL || childIndex == item2.colspan) return; - item22.PARENT_COL = index; - item2.CHILD_COLS.push(item22); - childIndex = childIndex + (item22.colspan > 1 ? item22.colspan : 1); - }); - } - if(item2.PARENT_COL) return; //如果是子列,则不进行追加,因为已经存储在父列中 - arrs.push(item2) - }); - }); - - //重新遍历列,如果有子列,则进入递归 - var eachArrs = function(obj){ - layui.each(obj || arrs, function(i, item){ - if(item.CHILD_COLS) return eachArrs(item.CHILD_COLS); - callback(i, item); - }); - }; - - eachArrs(); - }; - /** - * 渲染节点显示 - * @param callback - */ - Class.prototype.renderTreeConvertShowName = function(o){ - var that = this - ,options = that.config - ,m=options.elem - ,hasRender = m.next('.' + ELEM_VIEW); - var temhtml=that.treeConvertShowName(o); - var temdiv=that.layBody.find('tr[data-index="'+ o[table.config.indexName] +'"]').find('td[data-field='+options[TREE_SHOW_NAME]+']').find('.layui-table-cell'); - $(temdiv).find('div').remove(); - $(temdiv).prepend(temhtml); - } - /** - * 渲染表格单元格样式(宽度样式设置) - * @param callback - */ - Class.prototype.renderTdCss = function(){ - var that = this - ,options = that.config - ,m=options.elem - ,hasRender = m.next('.' + ELEM_VIEW); - var id= that.index+"_"+MOD_NAME+'_td_style'; - hasRender.find("#"+id).remove(); - var styel=''; - hasRender.append(styel); - } - - /** - * 插件内css - */ - Class.prototype.renderCss = function(){ - var that = this - ,options = that.config - ,m=options.elem - ,hasRender = m.next('.' + ELEM_VIEW); - var id=that.index+"_"+MOD_NAME+'_style'; - hasRender.find("#"+id).remove(); - var styel=''; - hasRender.append(styel); - } - - /** - * 生成单元格 - * @param obj 行数据 - * @param numbers 下标 - * @param cols 列定义数据 - * @param i3 第几列 - */ - Class.prototype.renderTrUpids=function (obj) { - var that = this - ,options = that.config; - var tree_upid_key=options[TREE_UPID]; - var upids=' upids="'+obj["upIds"]+'" '; - var u_id=' u_id="'+obj[tree_upid_key]+'" ' - var ret=options.isTree?u_id:''; - return ret; - } - /** - * 生成单元格 - * @param obj 行数据 - * @param numbers 下标 - * @param cols 列定义数据 - * @param i3 第几列 - */ - Class.prototype.renderTd=function (obj,cols,numbers,i3) { - var that = this - ,options = that.config; - var v=obj[cols.field]==null?'':String(obj[cols.field]); - - var field = cols.field || i3, content = v - ,cell = that.getColElem(that.layHeader, field); - - var treeImgHtml=''; - if(options.isTree){ - if(options.treeShowName==cols.field){ - treeImgHtml=that.treeConvertShowName(obj); - } - } - //td内容 - var td = ['' - ,'
                  '+treeImgHtml+'

                  '+ function(){ - var tplData = $.extend(true, {LAY_INDEX: numbers}, obj); - //渲染复选框列视图 - if(cols.type === 'checkbox'){ - return tplData[table.config.cols.cheDisabled]?'' - :''; - } else if(cols.type === 'numbers'){ //渲染序号 - return numbers; - }else if(cols.type === 'drop'){//下拉框 - var rowsField=dl.ui.table.drop.findFieldObj(options.cols[0],field); - if(rowsField&&rowsField['drop']){ - var o=dl.cache.code.get(rowsField.drop); - return dl.ui.table.drop.findDropLable(rowsField.drop,content); - } - }else if(cols.type === 'radio'){//单选 - return tplData[table.config.cols.radDisabled]?'' - :''; - } - - //解析工具列模板 - if(cols.toolbar){ - return laytpl($(cols.toolbar).html()||'').render(tplData); - } - - return cols.templet ? function(){ - return typeof cols.templet === 'function' - ? cols.templet(tplData) - : laytpl($(cols.templet).html() || String(content)).render(tplData) - }() : content; - }() - ,'

                  '].join(''); - return td; - } - /** - * 生成tr中的一行 - * @param obj 行数据 - * @param numbers 行号 - */ - Class.prototype.renderTr=function (obj,numbers) { - var that = this - ,options = that.config; - var tds= []; - that.eachCols(function(i3, cols){//cols列定义 - var field = cols.field || i3, content = obj[field]; - if(cols.colspan > 1) return; - var td = that.renderTd(obj,cols,numbers,i3);//td内容 - tds.push(td); - // if(item3.fixed && item3.fixed !== 'right') tds_fixed.push(td); - // if(item3.fixed === 'right') tds_fixed_r.push(td); - }); - return tds; - }; - /** - * 表格数据部分渲染入口 - * @param res - * @param curr - * @param count - * @param sort - */ - Class.prototype.renderData = function(res, curr, count, sort){ - var that = this - ,options = that.config - ,data = res[options.response.dataName] || [] - ,trs = [] - ,trs_fixed = [] - ,trs_fixed_r = [] - //渲染视图 - ,render = function(){ //后续性能提升的重点 - if(!sort && that.sortKey){ - return that.sort(that.sortKey.field, that.sortKey.sort, true); - } - - layui.each(data, function(i1, obj){ - var uo=that.treeFindUpData(obj); - var display=""; - if(!obj[table.config.cols.isShow]&&options.isTree){ - display="display: none;"; - } - var tds = [], tds_fixed = [], tds_fixed_r = [] - ,numbers = i1 + options.limit*(curr - 1) + 1; //序号 - if(obj.length === 0) return; - if(!sort){ - obj[table.config.indexName] = i1; - } - tds=that.renderTr(obj,numbers); - trs.push(''+ tds.join('') + ''); - trs_fixed.push(''+ tds_fixed.join('') + ''); - trs_fixed_r.push(''+ tds_fixed_r.join('') + ''); - }); - //if(data.length === 0) return; - that.layBody.scrollTop(0); - that.layMain.find('.'+ NONE).remove(); - that.layMain.find('tbody').html(trs.join('')); - that.layFixLeft.find('tbody').html(trs_fixed.join('')); - that.layFixRight.find('tbody').html(trs_fixed_r.join('')); - that.renderForm(); - that.haveInit ? that.scrollPatch() : setTimeout(function(){ - that.scrollPatch(); - }, 50); - that.haveInit = true; - layer.close(that.tipsIndex); - }; - that.key = options.id || options.index; - // table.cache[that.key] = data; //记录数据 - table.setDataList(that.key,data); - //显示隐藏分页栏 - that.layPage[data.length === 0 && curr == 1 ? 'addClass' : 'removeClass'](HIDE); - //排序 - if(sort){ - return render(); - } - if(data.length === 0){ - that.renderForm(); - that.layFixed.remove(); - that.layMain.find('tbody').html(''); - that.layMain.find('.'+ NONE).remove(); - return that.layMain.append('
                  '+(res[options.response.msgName]?res[options.response.msgName]:options.text.none)+'
                  '); - } - render(); - that.renderPage(count);//分页渲染 - //calss加载完成 - table.pushClassIds(options.id,true); - }; - /** - * 渲染分页 - */ - Class.prototype.renderPage=function (count) { - var that = this - ,options = that.config; - //同步分页状态 - if(options.isPage){ - options.page = $.extend({ - elem: 'layui-table-page' + options.index - ,count: count - ,limit: options.limit - ,limits: options.limits || [10,15,20,30,40,50,60,70,80,90] - ,groups: 3 - ,layout: ['prev', 'page', 'next', 'skip', 'count', 'limit'] - ,prev: '' - ,next: '' - ,jump: function(obj, first){ - if(!first){ - //分页本身并非需要做以下更新,下面参数的同步,主要是因为其它处理统一用到了它们 - //而并非用的是 options.page 中的参数(以确保分页未开启的情况仍能正常使用) - that.page = obj.curr; //更新页码 - options.limit = obj.limit; //更新每页条数 - that.pullData(obj.curr, that.loading()); - } - } - }, options.page); - options.page.count = count; //更新总条数 - laypage.render(options.page); - } - }; - /** - * 过滤区域的渲染 - */ - Class.prototype.renderFilter = function(){ - var that = this - ,options = that.config - ,VIEW_CLASS=ELEM_VIEW - ,index=that.index; //索引 - var v = []; - v.push('
                  '); - v.push(''); - layui.each(options.cols,function (i, o) { - layui.each(o, function(i2, item2){ - var field=item2.field||i2; - var minW=item2.minWidth?"data-minwidth='"+item2.minWidth+"'":""; - var rowCols=item2.colspan?'colspan="'+item2.colspan+'"':''; - var rowspan=item2.rowspan?'rowspan="'+item2.rowspan+'"':''; - var unresize=item2.unresize?'data-unresize="true"':''; - v.push(''); - - }); - }); - v.push('
                  '); - v.push('
                  1) { - tem='group'; - }else{ - tem=index+"-"+field; - if(item2.type !== "normal"){ - tem+=" laytable-cell-"+item2.type; - } - } - return tem; - }()+'">'); - if(!item2.isFilter||!item2.field){//不开启行内过滤或没有列名 - v.push(''); - }else{ - v.push(''); - } - v.push('
                  '); - v.push('
                  '); - return v.join(''); - }; - //找到对应的列元素 - Class.prototype.getColElem = function(parent, field){ - var that = this - ,options = that.config; - return parent.eq(0).find('.laytable-cell-'+ (options.index + '-' + field) + ':eq(0)'); - }; - //渲染表单 - Class.prototype.renderForm = function(type){ - form.render(type, 'LAY-table-'+ this.index); - } - /** - * 设置排序参数 - * @param p - */ - Class.prototype.sortSet=function (p) { - var that = this; - var sort=[]; - var cols=that.config.cols[0]; - cols.forEach(function (t) { - if(t.sortType){ - var tem={ - "field":t.field - ,"sort":t.sortType - } - sort.push(tem); - } - }); - p.sort=JSON.stringify(sort); - } - /** - * 设置排序字段 - * @param th - * @param type - * @param pull - * @param formEvent - */ - Class.prototype.sort = function(th, type, pull, formEvent){ - var that = this - ,field - ,res = {} - ,options = that.config - ,filter = options.elem.attr('lay-filter') - ,data = table.getDataList(that.key), thisData; - //字段匹配 - if(typeof th === 'string'){ - that.layHeader.find('th').each(function(i, item){ - var othis = $(this) - ,_field = othis.data('field'); - if(_field === th){ - th = othis; - field = _field; - return false; - } - }); - } - try { - var field = field || th.data('field'); - //如果欲执行的排序已在状态中,则不执行渲染 - if(that.sortKey && !pull){ - if(field === that.sortKey.field && type === that.sortKey.sort){ - return; - } - } - var elemSort = that.layHeader.find('th .laytable-cell-'+ options.index +'-'+ field).find(ELEM_SORT); - //that.layHeader.find('th').find(ELEM_SORT).removeAttr('lay-sort'); //清除其它标题排序状态 - elemSort.attr('lay-sort', type || null); - that.layFixed.find('th') - } catch(e){ - return hint.error('Table modules: Did not match to field'); - } - /* //记录排序索引和类型 - that.sortKey = { - field: field - ,sort: type - }; - if(type === 'asc'){ //升序 - } else if(type === 'desc'){ //降序 - thisData = layui.sort(data, field, true); - } else { //清除排序 - thisData = layui.sort(data, table.config.indexName); - } - */ - var cols=that.getCols(field); - if(cols){ - cols.sortType=type - } - }; - //请求loading - Class.prototype.loading = function(){ - var that = this - ,options = that.config; - if(options.loading && options.url){ - return layer.msg('数据请求中', { - icon: 16 - ,offset: [ - that.elem.offset().top + that.elem.height()/2 - 35 - _WIN.scrollTop() + 'px' - ,that.elem.offset().left + that.elem.width()/2 - 90 - _WIN.scrollLeft() + 'px' - ] - ,time: -1 - ,anim: -1 - ,fixed: false - }); - } - }; - //同步选中值状态 - Class.prototype.setCheckData = function(index, checked){ - var that = this - ,options = that.config - ,thisData = table.getDataList(that.key); - if(!thisData[index]) return; - if(thisData[index].constructor === Array) return; - thisData[index][table.config.cols.isCheckName] = checked; - }; - //同步全选按钮状态 - Class.prototype.syncCheckAll = function(){ - var that = this - ,options = that.config; - var list=table.getDataList(that.config.id); - if(!list)return; - var temis=true;//全选 - var checkNum=0;//选中的个数 - list.forEach(function (t) { - if(!t[table.config.cols.cheDisabled]){ - if(t[table.config.cols.isCheckName]){ - var checkAllElem = that.layBody.find('tr[data-index='+t[table.config.indexName]+']').find('input[name="'+TABLE_CHECKBOX_ID+'"]'); - checkAllElem.prop('checked', true); - checkNum++; - }else{ - temis=false; - var checkAllElem = that.layBody.find('tr[data-index='+t[table.config.indexName]+']').find('input[name="'+TABLE_CHECKBOX_ID+'"]'); - checkAllElem.prop('checked', false); - } - } - }); - if(temis){//设置全选 - var checkAllElem = that.layHeader.find('input[name="'+TABLE_CHECKBOX_ID+'"]'); - checkAllElem.prop('checked', true); - } - if(checkNum<(list.length-options.cheDisabledNum)){ - var checkAllElem = that.layHeader.find('input[name="'+TABLE_CHECKBOX_ID+'"]'); - checkAllElem.prop('checked', false); - } - // console.time("pullData"); - // console.timeEnd("pullData"); - that.renderForm('checkbox'); - }; - //获取cssRule - Class.prototype.getCssRule = function(field, callback){ - var that = this - ,style = that.elem.find('style')[0] - ,sheet = style.sheet || style.styleSheet || {} - ,rules = sheet.cssRules || sheet.rules; - layui.each(rules, function(i, item){ - if(item.selectorText === ('.laytable-cell-'+ that.index +'-'+ field)){ - return callback(item), true; - } - }); - }; - - Class.prototype.test = function(){ - } - /** - * 窗体变化自适应 - */ - Class.prototype.resize = function(){ - var that = this; - //根据父窗体高度设置table的高度 - // 1、table自身顶级容器高度(layui-table-view) - // 2、内容区域高度(layui-table-main) - that.columnWidthInit();//列宽度计算 - that.tableHeight();//表格高度计算 - that.resizeHeight();//高度控制 - that.resizeWidth();//宽度控制 - }; - - //动态分配列宽高 - Class.prototype.setArea = function(){ - var that = this; - that.columnWidthInit();//列宽度计算 - that.tableHeight();//表格高度计算 - }; - /** - * 列宽度计算 - */ - Class.prototype.columnWidthInit = function(){ - var that = this, - options = that.config - ,colNums = 0 //列个数 - ,autoColNums = 0 //自动列宽的列个数 - ,autoWidth = 0 //自动列分配的宽度 - ,countWidth = 0 //所有列总宽度和 - ,cntrWidth = options.width ||function(){ //获取容器宽度 - //如果父元素宽度为0(一般为隐藏元素),则继续查找上层元素,直到找到真实宽度为止 - var getWidth = function(parent){ - var width, isNone; - parent = parent || options.elem.parent() - width = parent.width(); - try { - isNone = parent.css('display') === 'none'; - } catch(e){} - if(parent[0] && (!width || isNone)) return getWidth(parent.parent()); - return width; - }; - return getWidth(); - }()-17; - //统计列个数 - that.eachCols(function(){ - colNums++; - }); - //减去边框差 - cntrWidth = cntrWidth - function(){ - return (options.skin === 'line' || options.skin === 'nob') ? 2 : colNums + 1; - }(); - - //遍历所有列 - layui.each(options.cols, function(i1, item1){ - layui.each(item1, function(i2, item2){ - var width; - if(!item2){ - item1.splice(i2, 1); - return; - } - that.initOpts(item2); - width = item2.width || 0; - if(item2.colspan > 1) return; - if(/\d+%$/.test(width)){ - item2.width = width = Math.floor((parseFloat(width) / 100) * cntrWidth); - } else if(item2._is_width_dev||!width){ //列宽未填写 - item2._is_width_dev=true;//采用默认宽度的列 - item2.width = width = 0; - autoColNums++; - } - countWidth = countWidth + width; - }); - }); - that.autoColNums = autoColNums; //记录自动列数 - //如果未填充满,则将剩余宽度平分。否则,给未设定宽度的列赋值一个默认宽 - (cntrWidth > countWidth && autoColNums) && ( - autoWidth = (cntrWidth - countWidth) / autoColNums - ); - layui.each(options.cols, function(i1, item1){ - layui.each(item1, function(i2, item2){ - var minWidth = item2.minWidth || options.cellMinWidth; - if(item2.colspan > 1) return; - if(item2.width === 0){ - item2.width = Math.floor(autoWidth >= minWidth ? autoWidth : minWidth); //不能低于设定的最小宽度 - } - }); - }); - }; - /** - * 重新渲染宽度 - */ - Class.prototype.resizeWidth = function(){ - var that = this; - that.renderTdCss(); - }; - /** - * 表格高度计算 - */ - Class.prototype.tableHeight = function(){ - var that = this, - options = that.config, - optionsFirst = that.configFirst; - //确定高度 - if(!table.kit.isNumber(optionsFirst.height)){//如果非固定高度,则计算高度 - var htremove=0;//减去的高度 - if(options.heightRemove&&table.kit.isArray(options.heightRemove)){ - var htatt=options.heightRemove; - htatt.forEach(function (t) { - var temh=table.kit.isNumber(t)?t:$(t).outerHeight(true); - if(table.kit.isNumber(temh)){ - htremove+=temh; - } - }); - } - //高度铺满:full-差距值 - var th=_WIN.height()-htremove-1;//that.getParentDivHeight(options.id); - that.fullHeightGap=0; - if(options.height){ - if(/^full-\d+$/.test(options.height)){ - that.fullHeightGap = options.height.split('-')[1]; - } - } - options.height = th - that.fullHeightGap; - } - }; - /** - * 重新渲染高度 - */ - Class.prototype.resizeHeight = function(){ - var that = this - ,options = that.config - ,height = options.height, bodyHeight; - if(height < 135) height = 135; - that.elem.css('height', height); - //tbody区域高度 - // bodyHeight = parseFloat(height) - parseFloat(that.layHeader.height()) - 1;//原本代码 - var theader=options.isFilter?76:38;//没有行内过滤区域 - bodyHeight = parseFloat(height) - theader - 1;//###注意:现在写死表头固定高度为38px,即不支持多表头方式(在tab方式下无法获取正确的高度,待处理) - if(options.toolbar){ - bodyHeight = bodyHeight - that.layTool.outerHeight(); - } - if(options.isPage){ - bodyHeight = bodyHeight - that.layPage.outerHeight() - 1; - } - that.layMain.css('height', bodyHeight); - }; - //获取滚动条宽度 - Class.prototype.getScrollWidth = function(elem){ - var width = 0; - if(elem){ - width = elem.offsetWidth - elem.clientWidth; - } else { - elem = document.createElement('div'); - elem.style.width = '100px'; - elem.style.height = '100px'; - elem.style.overflowY = 'scroll'; - - document.body.appendChild(elem); - width = elem.offsetWidth - elem.clientWidth; - document.body.removeChild(elem); - } - return width; - }; - //滚动条补丁 - Class.prototype.scrollPatch = function(){ - var that = this - ,layMainTable = that.layMain.children('table') - ,scollWidth = that.layMain.width() - that.layMain.prop('clientWidth') //纵向滚动条宽度 - ,scollHeight = that.layMain.height() - that.layMain.prop('clientHeight') //横向滚动条高度 - ,getScrollWidth = that.getScrollWidth(that.layMain[0]) //获取主容器滚动条宽度,如果有的话 - ,outWidth = layMainTable.outerWidth() - that.layMain.width(); //表格内容器的超出宽度 - - //如果存在自动列宽,则要保证绝对填充满,并且不能出现横向滚动条 - if(that.autoColNums && outWidth < 5 && !that.scrollPatchWStatus){ - var th = that.layHeader.eq(0).find('thead th:last-child') - ,field = th.data('field'); - that.getCssRule(field, function(item){ - var width = item.style.width || th.outerWidth(); - item.style.width = (parseFloat(width) - getScrollWidth - outWidth) + 'px'; - //二次校验,如果仍然出现横向滚动条 - if(that.layMain.height() - that.layMain.prop('clientHeight') > 0){ - item.style.width = parseFloat(item.style.width) - 1 + 'px'; - } - that.scrollPatchWStatus = true; - }); - } - if(scollWidth && scollHeight){ - if(that.elem.find('.layui-table-patch').length<=0){ - var patchElem = $('
                  '); //补丁元素 - patchElem.find('div').css({ - width: scollWidth - }); - that.layHeader.eq(0).find('thead tr').append(patchElem); - //that.layFilter.find('table thead tr').append(patchElem); - } - } else { - that.layFilter.eq(0).find('.layui-table-patch').remove(); - that.layHeader.eq(0).find('.layui-table-patch').remove(); - } - //固定列区域高度 - var mainHeight = that.layMain.height() - ,fixHeight = mainHeight - scollHeight; - that.layFixed.find(ELEM_BODY).css('height', layMainTable.height() > fixHeight ? fixHeight : 'auto'); - //表格宽度小于容器宽度时,隐藏固定列 - that.layFixRight[outWidth > 0 ? 'removeClass' : 'addClass'](HIDE); - //操作栏 - that.layFixRight.css('right', scollWidth - 1); - }; - //事件处理 - Class.prototype.events = function(){ - var that = this - ,options = that.config - ,_BODY = $('body') - ,dict = {} - ,th = that.layHeader.find('th') - ,bodytr=that.layBody.find('tr') - ,resizing; - //行点击事件 - bodytr.unbind('click').on('click',function (e) { - var index=$(this).attr("data-index"); - var list=table.getDataList(that.config.id); - var o=list[index]; - typeof options.onClickRow === 'function' && options.onClickRow(index,o); - }); - //行双击事件 - bodytr.unbind('dblclick').on('dblclick',function (e) { - var index=$(this).attr("data-index"); - var list=table.getDataList(that.config.id); - var o=list[index]; - typeof options.onDblClickRow === 'function' && options.onDblClickRow(index,o); - }); - //拖拽调整宽度 - th.unbind('mousemove').on('mousemove', function(e){ - var othis = $(this) - ,oLeft = othis.offset().left - ,pLeft = e.clientX - oLeft; - if(othis.attr('colspan') > 1 || othis.data('unresize') || dict.resizeStart){ - return; - } - dict.allowResize = othis.width() - pLeft <= 10; //是否处于拖拽允许区域 - _BODY.css('cursor', (dict.allowResize ? 'col-resize' : '')); - }) - th.unbind('mouseleave').on('mouseleave', function(){ - var othis = $(this); - if(dict.resizeStart) return; - _BODY.css('cursor', ''); - }) - th.unbind('mousedown').on('mousedown', function(e){ - var othis = $(this); - if(dict.allowResize){ - var field = othis.data('field'); - e.preventDefault(); - dict.resizeStart = true; //开始拖拽 - dict.offset = [e.clientX, e.clientY]; //记录初始坐标 - - that.getCssRule(field, function(item){ - var width = item.style.width || othis.outerWidth(); - dict.rule = item; - dict.ruleWidth = parseFloat(width); - dict.minWidth = othis.data('minwidth') || options.cellMinWidth; - }); - } - }); - //拖拽中 - _DOC.unbind('mousemove').on('mousemove', function(e){ - if(dict.resizeStart){ - e.preventDefault(); - if(dict.rule){ - var setWidth = dict.ruleWidth + e.clientX - dict.offset[0]; - if(setWidth < dict.minWidth) setWidth = dict.minWidth; - dict.rule.style.width = setWidth + 'px'; - layer.close(that.tipsIndex); - } - resizing = 1 - } - }) - _DOC.unbind('mouseup').on('mouseup', function(e){ - if(dict.resizeStart){ - dict = {}; - _BODY.css('cursor', ''); - that.scrollPatch(); - } - if(resizing === 2){ - resizing = null; - } - }); - //排序 - th.unbind('click').on('click', function(){//点击标题列 - var othis = $(this) - ,elemSort = othis.find(ELEM_SORT) - ,nowType = elemSort.attr('lay-sort') - ,type; - - if(!elemSort[0] || resizing === 1) return resizing = 2; - - if(nowType === 'asc'){ - type = 'desc'; - } else if(nowType === 'desc'){ - type = null; - } else { - type = 'asc'; - } - that.sort(othis, type, null, true); - table.query(that.key);//从新查询 - }) - th.find(ELEM_SORT+' .layui-edge ').unbind('click').on('click', function(e){//点击小三角形 - var othis = $(this) - ,index = othis.index() - ,field = othis.parents('th').eq(0).data('field') - layui.stope(e); - if(index === 0){ - that.sort(field, 'asc', null, true); - } else { - that.sort(field, 'desc', null, true); - } - table.query(that.key);//从新查询 - }); - if(!that.eventsinitIsRun){ - that.eventsinit(); - that.eventsinitIsRun=true; - } - //同步滚动条 - that.layMain.unbind('scroll').on('scroll', function(){ - var othis = $(this) - ,scrollLeft = othis.scrollLeft() - ,scrollTop = othis.scrollTop(); - - that.layHeader.scrollLeft(scrollLeft); - that.layFilter.scrollLeft(scrollLeft); - that.layFixed.find(ELEM_BODY).scrollTop(scrollTop); - - layer.close(that.tipsIndex); - }); - _WIN.unbind('resize').on('resize', function(){ //自适应 - that.resize(); - }); - }; - //事件处理单元格编辑(只执行一次) - Class.prototype.eventsinitIsRun=false; - //只执行一次的事件 - Class.prototype.eventsinit = function(){ - var that = this - ,options = that.config - ,ELEM_CELL = '.layui-table-cell' - ,filter = options.elem.attr('lay-filter'); - //行内过滤 - that.layFilter.on('keyup',"[name^='filter_']",function () { - that.page=1; - that.pullData(that.page, that.loading()); - }); - //行事件 - that.layBody.on('mouseenter','tr',function(){ - var othis = $(this) - ,index = othis.index(); - that.layBody.find('tr:eq('+ index +')').addClass(ELEM_HOVER) - }) - that.layBody.on('mouseleave','tr', function(){ - var othis = $(this) - ,index = othis.index(); - that.layBody.find('tr:eq('+ index +')').removeClass(ELEM_HOVER) - }); - //单元格事件 - that.layBody.on('click','td div.layui-table-cell p',function(){ - var othis = $(this).parent().parent() - ,field = othis.data('field') - ,editType = othis.data('edit') - ,index = othis.parents('tr').eq(0).data('index') - ,data = table.getDataList(that.key)[index] - ,elemCell = othis.children(ELEM_CELL); - var options = that.config; - layer.close(that.tipsIndex); - if(othis.data('off')) return; - - //显示编辑表单 - if(editType){ - if(editType === 'select') { //选择框 - var dropName=othis.data('drop'); - var rowsField=dl.ui.table.drop.findFieldObj(options.cols[0],field); - var o=dl.cache.code.get(rowsField.drop); - var html=''; - var scv=o.syscodevaluecache; - for(var i in scv){ - var isSelected=""; - if(scv[i].scv_value==data[field]){ - isSelected="selected='selected'"; - } - //选中 - html+='' - } - var select = $(''); - othis.find('.'+ELEM_EDIT)[0] || othis.append(select); - } else { //输入框 - var input = $(''); - input[0].value = $.trim($(this).text());// othis.data('content') || elemCell.text(); - othis.find('.'+ELEM_EDIT)[0] || othis.append(input); - input.focus(); - } - return; - } - - //如果出现省略,则可查看更多 - var c=that.getCols(field); - - if(!table.config.initWidth[c["type"]]){ - if(elemCell.find('.layui-form-switch,.layui-form-checkbox')[0]) return; //限制不出现更多(暂时) - if(Math.round(elemCell.prop('scrollWidth')) > Math.round(elemCell.outerWidth())){ - that.tipsIndex = layer.tips([ - '
                  ' - ,elemCell.html() - ,'
                  ' - ,'' - ].join(''), elemCell[0], { - tips: [3, ''] - ,time: -1 - ,anim: -1 - ,maxWidth: (device.ios || device.android) ? 300 : 600 - ,isOutAnim: false - ,skin: 'layui-table-tips' - ,success: function(layero, index){ - layero.find('.layui-table-tips-c').on('click', function(){ - layer.close(index); - }); - } - }); - } - } - }); - that.layBody.on('change','.'+ELEM_EDIT, function(){ - var othis = $(this) - ,value = this.value - ,field = othis.parent().data('field') - ,index = othis.parents('tr').eq(0).data('index') - ,data = table.getDataList(that.key)[index]; - data[field] = value; //更新缓存中的值 - layui.event.call(this, MOD_NAME, 'edit('+ filter +')', { - value: value - ,data: data - ,field: field - }); - }); - that.layBody.on('blur','.'+ELEM_EDIT, function(){//单元格失去焦点 - var templet - ,othis = $(this) - ,field = othis.parent().data('field') - ,index = othis.parents('tr').eq(0).data('index') - ,editType = othis.parent().data('edit') - ,data = table.getDataList(that.key)[index]; - var options = that.config; - that.eachCols(function(i, item){ - if(item.field == field && item.templet){ - templet = item.templet; - } - }); - var value=""; - if(editType === 'select') { //选择框 - var rowsField=dl.ui.table.drop.findFieldObj(options.cols[0],field); - if(rowsField&&rowsField['drop']){ - var o=dl.cache.code.get(rowsField.drop); - value=dl.ui.table.drop.findDropLable(rowsField.drop,this.value); - } - othis.parent().find(ELEM_CELL+' p').html( - templet ? laytpl($(templet).html() || value).render(data) : value - ); - } else {//输入框 - othis.parent().find(ELEM_CELL+' p').html( - templet ? laytpl($(templet).html() || this.value).render(data) : this.value - ); - } - othis.parent().data('content', this.value); - othis.remove(); - }); - //树形节点点击事件(隐藏展开下级节点) - that.elem.on('click','i.layui-tree-head', function(){ - var othis = $(this) - ,index = othis.parents('tr').eq(0).data('index') - ,options=that.config - ,datas=table.getDataList(that.key);//数据 - var o=datas[index]; - that.treeNodeOpen(o,!o[table.config.cols.isOpen]); - that.resize(); - }); - //复选框选择 - that.elem.on('click','input[name="'+TABLE_CHECKBOX_ID+'"]+', function(){ - var checkbox = $(this).prev() - ,childs = that.layBody.find('input[name="'+TABLE_CHECKBOX_ID+'"]') - ,index = checkbox.parents('tr').eq(0).data('index') - ,checked = checkbox[0].checked - ,obj=table.getDataList(that.config.id)[index] - ,isAll = checkbox.attr('lay-filter') === 'layTableAllChoose'; - //全选 - if(isAll){ - var list=table.getDataList(that.key); - list.forEach(function (temo) { - if(!temo[table.config.cols.cheDisabled]){//可以选择的才设置 - that.setCheckData(temo[table.config.indexName], checked); - } - }); - } else { - that.setCheckData(index, checked); - if(options.isTree){ - //处理下级 - var sonList=that.treeFindSonData(obj); - sonList.forEach(function (temo) { - if(!temo[table.config.cols.cheDisabled]){//可以选择的才设置 - that.setCheckData(temo[table.config.indexName], checked); - } - }); - - //处理上级 - var temf=function (o) { - if(o==null)return; - if(o&&o.children.length>0){ - var temis=true; - o.children.forEach(function (temo) { - if(temo[table.config.cols.isCheckName]){ - temis=false; - } - }); - if(checked||temis){ - that.setCheckData(o[table.config.indexName], checked); - } - var temuo=that.treeFindUpData(o); - if(temuo){ - temf(temuo); - } - } - } - var uo=that.treeFindUpData(obj); - temf(uo); - } - } - that.syncCheckAll(); - layui.event.call(this, MOD_NAME, 'checkbox('+ filter +')', { - checked: checked - ,data: table.getDataList(that.key) ? (obj || {}) : {} - ,type: isAll ? 'all' : 'one' - }); - typeof options.onCheck === 'function' && options.onCheck(obj,checked,isAll); - }); - - //单选框选择 - that.elem.on('click','input[name="'+TABLE_RADIO_ID+'"]+', function(){ - var checkbox = $(this).prev() - ,index = checkbox.parents('tr').eq(0).data('index') - ,obj=table.getDataList(that.config.id)[index]; - typeof options.onRadio === 'function' && options.onRadio(obj); - }); - - //工具条操作事件 - that.layBody.on('click', '*[lay-event]',function(){ - var othis = $(this) - ,index = othis.parents('tr').eq(0).data('index') - ,tr = that.layBody.find('tr[data-index="'+ index +'"]') - ,ELEM_CLICK = 'layui-table-click' - ,list = table.getDataList(that.key) - ,data = table.getDataList(that.key)[index]; - layui.event.call(this, MOD_NAME, 'tool('+ filter +')', { - data: data//table.clearCacheKey(data) - ,event: othis.attr('lay-event') - ,tr: tr - ,del: function(){ - table.delRow(options.id,data); - } - ,update: function(fields){ - fields = fields || {}; - layui.each(fields, function(key, value){ - if(key in data){ - var templet, td = tr.children('td[data-field="'+ key +'"]'); - data[key] = value; - that.eachCols(function(i, item2){ - if(item2.field == key && item2.templet){ - templet = item2.templet; - } - }); - td.children(ELEM_CELL).html( - templet ? laytpl($(templet).html() || value).render(data) : value - ); - td.data('content', value); - } - }); - } - }); - tr.addClass(ELEM_CLICK).siblings('tr').removeClass(ELEM_CLICK); - }); - } - //表格重载 - thisTable.config = {}; - //自动完成渲染 - table.init(); - // layui.link('treeGrid.css'); - exports(MOD_NAME, table); -}); \ No newline at end of file diff --git a/spider/resources/static/js/layui/font/iconfont.eot b/spider/resources/static/js/layui/font/iconfont.eot deleted file mode 100644 index 93b3d5abc04e87eac6643c7ba27d62f94cdce4c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40844 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 dS2dWbc-(>9=%hBYV - - - - -Created by iconfont - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spider/resources/static/js/layui/font/iconfont.ttf b/spider/resources/static/js/layui/font/iconfont.ttf deleted file mode 100644 index 0c8b0a50f686021dd59dbd6c61d212406a8ad3ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40668 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 ALI3~& diff --git a/spider/resources/static/js/layui/font/iconfont.woff b/spider/resources/static/js/layui/font/iconfont.woff deleted file mode 100644 index 786bb2a8c4d1aaa7d3d80b3692b27d013815eae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26744 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 diff --git a/spider/resources/static/js/layui/images/face/0.gif b/spider/resources/static/js/layui/images/face/0.gif deleted file mode 100644 index a63f0d523561c523476e5330a0d67eb7318cb187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2689 zcmbVNX;c%*77h|fSVf7btRc9;2uTMBA%GGHLDVpaID<1f5|U^lkc1>iKxY6!1rbG@ zd2aAjaK>G62Sr5@Tv%lj5ZMBV%8n>ts{1vL_@3u@=Ev*PeX8o#z2E)rQq{hGY`QDg z1Y?5vfMDRklNoDFn+y1$-V+&nI?*1FjNVaKeTNKPP*>Wj%Sp)S#fb{Le6b$#p-{ol zsW=k|kKKQjucL0^f#x9i&7RS^Kv2J=HOHjvYO1<34zzKv#bH4$O z#ZFq03?oqI0iLr!jWcLn2O9kz?9&3Z4A8^@wQiuy9MsUj%i!U1H=q*1{h6R?C3x4%9Z~bY?lcTmR7j#Mw>w(q{eMOd|)qc5L4N&c* zuC#-D;)kkvpmjZHTn0Kef@(+gGxF;@#-Mq1Z|Ta0Q`*Srt;^f+@S9XnW&vKOd~B6~ zHyNOJFDSJDP5y6-g21a^k$3r^XIIl%Q@Cp@Xb*$?kBqma0hL(Ye-`v4To=x`Eyook z8;-r))qmH#x4;x0I$fJ%qOMq2{D&DbUW-iBk2QvUX!>cQSp;gFz)RlCiz^#1xfLC- z87Zj=eCi$V&2U#t-?L}$cK{g8qbIOabq>? zp4*0{8D2G6Ot>!#v2jzcD7SojpVX4O3Vsy}_iV4&YYK*PK%Fl#a&`FG zM$objsAAv_jp9{L8DlbVvx3c0C zr|Pl<9y$m2ro$@nL4nz&9SmgnEc|9WGSQyB1p-}ha92Fse?ZQ_Bctc8B-z2L2xQ`g z`dyy7!B5?H1nxhi9>_)z#2V4__X%3<%?$9NI#4tL15Xk`R&u3e$bmwRh?tD)leSzDDEKdpZ)(efVx$6cpg=B(lJNwny3Ld^ zn!A5?G^vQPVSFzWp+(__vn0Hz2!UAP$MPVdI}UsipFwe?qgixuqPS2gG&%&)Szcb= zUTn5A#oNb)?!ubF_?9i(g+_B>QeAz}{6mlrgqnM?ATOpDlj_W-In$Ej}3 z2Pdarnjc+!IX(h0dS+zk;m|-}p#C^9KK9}L=(~~Op}~RvzTUTQUiZA}?&?%^w70dk zylj5a)Y$O6zOJ^W`dL+FMR{52(=Vb2{W~l3=#j&R4*u(p-w$N$Pv5sUZBOd%l;mAIcO)flPl%8E z?bmHvV`G%jTcQ+lS)^1VjtCFiED~ zT(R75nJ?Rih87J7rZv4a|qPj4f%`NKP{w9zJutaJ^PRj7vDCX2@s-1fMsBq7R3UP)M+%4tA?D+}XvHFzz*y%L=kmCmK7^vJPkuUQkAmPS3^L3MDk2U`FtXG(OBw%kf#qS1^68svpOwv@mo8;P zDGCaXYN>-Qp0~Xx+rV_GI`^sF6U7K8(~zl=;$%)R)~gj@bP&VoMw_I4V?6f(!^$+;TlKZKNWRvr5bBw-5Huyw**;mBJ z$e)Q{?zFlcJ6(9*C`9kUZrt2~XFpTKnRkA%Zm|z`^-ujm+}lE&XVKZs-c=Znar+N+ CBC!|% diff --git a/spider/resources/static/js/layui/images/face/1.gif b/spider/resources/static/js/layui/images/face/1.gif deleted file mode 100644 index b2b78b218996f70773540d0d3a8649d3c2d199a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5514 zcmeI0X;f2Z8pm%|0tv}wF|q`>VUY-kh?astAQA;dB?6_fabYVUO9#+)7)Q(s2}KDA zighC_TBPE*AR-hSAO%6du#{TxXn-QNiVcVgN|Fij%v8I5oO9-!+)ww*d!7%!|9hVI z{|nx@!P_T>2oQmXY@j$fRCS-Fst#8Fl-Ji<_wt8B#oMn7hHBnZ4SIK-bRDmyJo~XxHIe<@S;}yGsph#%R&3pM=?m3xsA@drb+`R>L5S-6 zz>yk^YAiuB+oYNAZ_LF?#Sxmh?wKCnks9lU+z5q2ar+DGPfeziHw@J?S6jsf&!0cP zdJv^~b+7qw%%v2U$@--gvCCCsdk<_PHte%$Jmk_-lRDCrG;npxi~bPRgV?D7zN#&_ zCe2g*w7m0(@9fi`>xz@w^U1XtK2y!sP1)pEFP~|YwX*|ZH)_kL?|yde{AtyLq;?6r zrS5!RPuG*%o2S}r6<3x__s6NL<5VMzZyPSC`gf@xv3stwub#tO^-JmF&hTmZ_Q|h(Unn2|LQqcJljcz`CqNT-d#=P4TsI+`$f9Ch+HH6_=gXNx+LO~J;=#8M2bsj0pAsmE~jpC z+e9r#gRZAtL!FaYC?7{MaSw`>N^<&&ALWFFS+Qsk`6z^CS-}uaQG8o7OPH^h*N!^J zB?bn*FiR_2UPN3N6Xq3j4@!m%=yWd_((FOaO!^t=l&v`jJMzn0XXJy!`5gR078K1v9z+wE}3v}$MR=6 zIFTWuo=H)j?LKN}v%e&C+c=j~Y*=?dE}h{YLpr1Us*A?L@@)yGj!AMTkYgK|JtLTp zUWYwtNqJJ#_vQJ4FS9uod6LmbIk@-lL+QNel<(bl-msVKb!gj$+4V_uU<(q(x}GL@ zP{By=zzPD^M&24#*nggXldXc+BNE$8YZmMYeZm}wO7Pr>N#jQ-B(?~MM===Y3%&*=Az{%xjzo9W+X z`aYxYGyeyD21WR52Y^Qx#cLG+wFnJr4M0ddVvCPf0r+fTZ3%Hb=^BdjXJOs64!{j- z=8t&W0hH)!X479OfRW#}%z;G(K(o*q2{@ATH=C@;d9$e&vFpb-3t_8bq(m%AT5@Bi zGKi3|JlPKn^yD5RScM;yAK_GS4BiW0*wZ&o;~|Z$kQjO8WbdgJcAJw{tw!Ydd%mLV z?5ZPx4kl~B=EBi-Yvfii`n%!vDN)FMpTt8(Ew_zvl;e_+rl=Jxb0hxKtiGzC91`BW zqTyE4hbwpcrhAe4$e0eaKLebbF8(+pE&#b81IH#>A%oS!(rt_mamlx3=#H zfJ`;IZGvzuAmC!j{5rHu0AsnC&xJqi665{5&Q?zcb2^b9QInYSv`~04FS!aFd?!vT z?KXphV}y6&glQ}sz4LCID8Gpl_h}Ya87wsNA?=`Nl$ZW;|K?|kRPTx)u)uh~1X4b8 z&WAd9zsAXep^cMydzlIptr}~=83}fgrZaeGbNI#uc}5V>o9Fz&=fwToM4rGRP+`G| nqjLpT%jon>&iI|hI5DGFNqSH|Meaf1bVU=!q}mt-2YmkxGX3TC diff --git a/spider/resources/static/js/layui/images/face/10.gif b/spider/resources/static/js/layui/images/face/10.gif deleted file mode 100644 index 556c7e326801a0ea090bd693ca43807925d3cbc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2797 zcmd^A`#)6c8Xsolx+O`H%Q93$nTyL{n9MM)A-684%gM}GWn?bROqpmGJGZ^Fi(PxC zQc0BVBpao@iAv-WQX~e2E`%;_^UgXmoi68xeb(o*-uGGG@ArA0^?g3?^6~R_ zc3~Q#3{evksAPYm+ldxe`B>25hYY5H$5ilyap#a4=-C9i!a--i^?{+Kq>xB__^Jl4Vn&qDieZbVwCxhx2@ zILKOvg+lCu6V~AQ`is#P@}Y#M=jR}wYR+vn|5TiK@RaXU!OgY6vPDVqMt==D71BV~Djr?Wup*KT5)s0Nt z1Ea;`y*Z$Vg^U%+NAu)^dy4m>3*sq2x(&3`O809f`!AG_6@bUi^1&ZV_v?Zdd(dFk zaB1^UmD5ngJo#|eL{F^zWjuI$5Ol4%mt`$$vYF`IF#R$WJTyT@^O32h{2hyB4HojL z=IPO!U?>rcovq1KN5(EAA1kK%5`D7*2eJ&VEMP|C>Q*F(8D`a)X#VL03k>m1L zNkAHLnrro;Eo8bcxh+q#qdYo0+G?;|YpN42;h4%E5#%GMLHA}^^K#ikNY-R6d*oOs zTKf3>vYC2QS))~Z!7^DZ^;7j+S>2+dJsMN@jAc!@>Domz^^oi_W2V7c*5V2pOc4Y@ z&2m{F+Cg67VV?A0FFQODt)hS_LhA#AAqG>-R6O0>B?2aUJ1mA+@HP&QihXzMZ!E-# zq+-`O1`-1Wo^TY$H%P1BC+l(AvXy{!WD2~F%yz-V|XHpgowuN zu~vo&Sm-lEyq$`rD_=m$oSu9k3_0TMZP`Q;2_lp6BnL+_nY043Ba-Y0M8!?EB{@(W z$rL*$=*xvwWD`birGzrPzvNQvsMsj6SU@2VVq;_RvG#bra2tW-;^Lyzu(PvOAZ$gu zd19u-mM60Os=$CnY#~P==J0utQjy8x?-Wz9ic0_80$1=&mM6l0ZU@iia|sfrfIz|% zl`VY*1_u6bD3|*UEfR;q-|PLa!lLlq0+> z3;A5=bJG;g?6o+|s`rH(IeRURvvLWFVhBoW|HJC9A;tVCm){0gvH3RoFi$b>Ld9UK zAaWp^nVy=Q`1J9^`|+{ScO%1Z-@JY`G&u0`MSowfw5R)d*R#%!r%&1+x3#uBYHn(5 zcvxTep!WW~yEWB!sw)5f>vqMho8@Jtf0o=RzFt&#?dp}wmo8o?IDalb?`-awoYSXH zW}i5IEbHhWzaKgLTV}?ggTJO9_~qxc)Rg3;{XZop?A!a}p7^-klGt54#UkMj0iVZ> z*&fY_+O`#rWV4tNTmHFu)5Z<|Sif%Vn((mDkl@upfdQ-h{d|4Ay%?Szbej80s+%jt z#o3AM=wNS0A`&{X=-C5hG6x_Mhp(KcU9@@YgLMeldR?axtN zwEd5V&Z~-T*Iv@rI8N2DD@?W3Rvb>{t;?G1!&v7sZ$i}`xn`>FQLpFZa5oZbQ!WU# z6N0id*ekoxJ8V?Re!96gG%&ojbC{6bC=zRL(qC9 z9AVRaGo3jGR+2<4BiUquM~)5rObdsjH=o&{j`7Fgq#-%QIg)q|V7l8WN}3~Mr^HPsnv zYBVTkuWYI`!P&3tY=gmCJ!#Glz7;G6+M758sp#>>(`c$v8b;e4Wr3n58|AJ_HBZ4M zKkT%FdUFzk{<}(CnOdM}KuhNHXeOR1V!?SZ4Gh!>qiTZn!)^dLP>z z5V6E{^;KymZ80qbv*Od_xEFz6_>=chubAD346L#aA6UNh2+PBUmt8$z7(H-o8%=4b z+W)tqA(h_^MWGdj)+!Cv!1vT~=&*>=JeMuyj@YH oWz4#Y8lWniX5g=81^=RXq3ldhwpWFqvq6_o40028>wtN;K2 diff --git a/spider/resources/static/js/layui/images/face/11.gif b/spider/resources/static/js/layui/images/face/11.gif deleted file mode 100644 index 2bfc58be8c70d512f4371b50b2b98c7b8adbe719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4121 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 diff --git a/spider/resources/static/js/layui/images/face/15.gif b/spider/resources/static/js/layui/images/face/15.gif deleted file mode 100644 index c9f25fa1d25412e2e929347c0db0878b0b641d58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 zcmZ?wbhEHb6k`x$cvjC)UFLjcxo+2{sU44AEqro)?t{~@-b%N3XFR-Hwxr+ulK%oH+No|8@joUb;8o>khO;% z-pt54c=5$f_l$zz1xIF9ZC!k8rPSX?m75>!3YoF0@6_@yw?fNicKtc8QFZZ3q7CQQ zJ28K6dKNF8dwdf2>Dz5FoA&JK_I!S*#c%QM(+{R^st_tYd#Py0=A#ot|K1Au_q1vD z6!%ScSEOWk{yZ-7e1G7dQxZR(%&R%HD{|8GPuFK(p3ArTeE-+$eg#|BB~~S$dA0ra zCi@?c7ri|%pb4sD-Qd^>BZ@TkN^$;DL)19`Dfod@V3w#!8pDhc-E$->ITP|u(PWCJ5fjDdmu ze?xs!vs8YWOpZ)hzDjdnpQuc^mXOXgX{{oe-u@~|ZFy%{R@dafm z@IQa9kQKz2C85GpugPS}VD;TfljXPO4=V=Kgd@?P4xMV}iXHU$+K4vH=vCN_(f6?!dfWS6n2`SY^jFjF5#yp%}dht@+k^lQ5mUcOp* zcs?^%!Geg4gAHe92$#NpR-1INsfoGiRz$%hw=FUkg|bMf)@r}A%N=>H&t=-OGD)%dJ&%aS1;>?S28-4y56)#MguSwF{Wn{Bi0wrzT;!uy3&oA(_^ zP4_wBW87?f(kHzUYzsfa7D1pbvq83K2{lV=HFwoZ*)}QIN_Dj=yXlz=G?~}CDNBnw z0PXZuXlB-166sJM;cnU891&3uiN0ojaP%=)9kJ4E);wy(ATN9lXld$sVfl^MZ`{0f z`<5JUy@-h7JMl*sta~4a6oo18!%LOf$q&}sITYaYiet1X;M?G&Sqt4V`0s%?q;x>VWruo zITPfDMZ!^SQHzD;+gGnyyKeo4jrC#{^>Vzt^*iM1EyS8U1jSr=;w_HEA1-Lp7hf0JU8dSF%T&D%E<+7ylUKYC)M*n|{ZEMUu7fY$3aNE)ViSQzrOwtGm1);sbf z_Dz^%r|aYuqCS15lTnC&w5K1hmuJ8d&l*pEtR`qRKwZ!p-%_Ak4|D*~1b>MAGiJ?5 Y2vsx^3s|^#p`syH?V}DDY9U|^06Jl%MgRZ+ diff --git a/spider/resources/static/js/layui/images/face/16.gif b/spider/resources/static/js/layui/images/face/16.gif deleted file mode 100644 index 34f28e4cde0cd13acdbbd7482282eb306f5b21e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6721 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 diff --git a/spider/resources/static/js/layui/images/face/17.gif b/spider/resources/static/js/layui/images/face/17.gif deleted file mode 100644 index 39cd03538a5bc595fbc46c97cf2b06c8bd8dadd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4439 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 IdD(dV7kW}yvj6}9 diff --git a/spider/resources/static/js/layui/images/face/18.gif b/spider/resources/static/js/layui/images/face/18.gif deleted file mode 100644 index 7bce2997f86e477a6008fb1cae8dd03cda10abf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3017 zcmeH}`&W`_9>8Dl1yK_aL;=Ob3nGb&N=AwoykI7&SsFG?;bls#Q?`m}L+3&8mQre& zIhILwGPi9z*=?-c$}De97tM;9W?i*RZLH05$~M7$)uy&if585*zr8;^=RME!`JU(V zdBVcQg2f3|kQMY4K>D$L6S^e*VCwsu-ujWeGlg;bq3@?|+D^5LdymJCUa~Y8^!gsY z{z2f>E#`2~Uw$8|*Z2Aw-rjh4oPRNYo?+rb`(D}^h4Ei=yw2tG^*=}Kj3iFKyRZM} zw>>}ZHeB#+uVQcHV~3jDI;&&G?pO8JbDnoe441zu5^60UJokvzr zv@PhaVNYFm*7q#wK9SmdwCvfV*1neFSKZ$}>n?nC)p6=?;rbSj_t$KHAL}3PEa<7l z>mRPT*&x4NGr#As@2yM6pSLjn(Y*dj>7NEpTfVv_{OyY4+Zz^dS_zZCtkypa)!&IX zoLZ*8lhA*0#ic^$@t)+qlbrW=g8yD6d*A8Wcf0xDy12e8^3j1`$4=T$Pfs(a%_2ir zt_T)IhkCm6j8G5+G2g)$PY6J6$Tu=1D+n^4RsxkeFTbELWWAf4sj1ugkixtW)6Ecv zWNS;}U`@q)+|pne3uOy!gtTyu*sY)rX4J3DCQt+`soayN)bb+?bUm^900+)sKxuL{ z8%=Mmr~F_`>6A0*Shk9_(VXAA|H04URGZCwbQ%k!hM3(&Bw}bBN2+@$iK77J6p;J1m6pocLCoTxg|5!y ze0Aaf=r6G|2gf1@CqP8x;N4093&QL$)a(tQM5EzQI10xor(GH%kwT&%jUNV^Cc!$Qr>))HJJ+FdjJP<~NCyx1LPaqE_63aOSL zgJ#3zZC@Ma=aC`_vIgR0DmB(FDmg1eWaa-$x(nHA>C)vM+xn(*6BFAkVVCoQt)yUc zi`;qCl*tU^fl7hP3x0~0)j?;Ir{@K}9Dr56MqFM(BC4y7VU+0E<@FR@0E;H2X%)v} z@f=?+L)W;zvo>&cXtSq;Arxc*kv?21kSdccVylbQVo%pZV7DqhphS%gSiH`C74Qou zvSgKjLh&Xz#rpvTd8hh^c&7$$;F+OHld7a#6W1_8So~tSn(GC`T+gsL@33|2Jmpdm zS>YrI@jDy0{X2rUlOH+5eK0+6lrp`Ee8TDsDT5j z{-{H!`6`2m$W+<;CXJK>VGkKG6H^utqr~ZXveDXw4q44brq@gD?PV95b>qfeAzVB@vs@)69ynJ_({9pf zhXVH+nX;txC(7&P0o&fLE>_-)ne&9@%ylt>um~*^gjS9cFwg+8GeA@d_$)LQ;uHZi zgD)qu=rnE_w5OnwK~M8frDxL6Wr(NuN%zy8qu5)>%nUU;MT(Z%M9@8KPp(5}(^nwq}4<2ejm;;1)1H#-RipPvSpCYvuGQVrc%(rF&-pS>snM~eV|J%Sv zVq-^GX)VgPl2}_>75Xf-Tx#V}ke21+QxWOo&{t9T)y@1L%_lUNxjB7y$3Ez%ct$^V zbNYej{G*ulPYDA+6bhIzPzGY4;_7%OZ-TeLGlR7lNL7qa5<4|1H190@IRAMg5(j8}L?(phY-y`50aH_-& z8U{DVAdq$){Y{AivqB20s8-wpxRcT?Z`FaicaB1cs)H@ zqu@!rE~yt8sHR{M}v6=UaO z1;V8&kz9rTSSvM(4H%a_|H#z?Bv%Z^7s2BH^hL48W|DP0J3FWiUv6)uh@L!>i#eM%g!m2b=EomsZoMrFNGwm%(_p IDGd4k2Wv_t&Hw-a diff --git a/spider/resources/static/js/layui/images/face/19.gif b/spider/resources/static/js/layui/images/face/19.gif deleted file mode 100644 index adac542fd33e152fc08baf165d1c5a467f0c2747..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3040 zcmeH}`&Uxg9>5Q86bs~`fKmvGN=OJ=XsCdSFDfllZ)I9iBDJa+pA|D35dp&{&8Do( zY;4M!>h`{Mb4u-@Ju!RP^cd|iS-0+W(rKJY^ny7y&FUYxYu(?@4||=p&*yvg=d)wt z6ylJDZjc-F6M$^5zP`10c7JD6)#SchlXsnjv(6| z>EJc5=N)_dp6s#Rns#?z&_7FEhJL*;)OV`2igr|s`EHfycxjOBUP9S){P1tLZ9k?D zotoBK?YlGx{p=*K^F;QQZAq_hZ@zN8_Vs1ut=;}ZXX5Vf!w&stkF7!6_vF~~Q_e42 zQwFd5Z7rPp{N$7umsj06{^iwb7u)?=E$cCNcT@WxZGL;VwCh{n!S+dC&tvtpE@`a} z>AzoKJ09@5IkaXOckr_N+m5)tp0@s5Nzbou89I^r`sNqsEVLj0A>Wii8n{S$u_w6y z;-m-7>#a51!Sg=0j@TRfa~i*`czOR^-;MN_H%xDu*n0ImrrWFwyHC$LZSv{uP`$H8K03&4+LrO|lK-RYjlXxMJUUzOqWi(CgUsRKVXtA_ zjOgUqk+Q^SAzy%iK@jBi8xkdi0K~ID+lS-^L6~73(3coWjV2JaB*57@AYe(9xkTZN z;gUT)$y{i;^9ECZf)YoQcu0yM3<{+QFxGSV)MPOQUzEI`@%O_e`5K6ki{etYdJ-TM z;*2K0#2-UvmP|bqDW)S>ja&4r@f$q3$u32Ab{dUSUB|Z%WYr@|umzzS z8QeEhTIEOcJk%^~L;JWA>!g)T<+^(M3`J&BCNvYLYXAONR(5JEH6pX5PP3yhWsM7pwJ6#Sc%<&*+cVb)n|V zh-4;ne&?aZnDT9c#FhGX)TQZ0^OACDKVgbXM=viAc2#xr(0#$lKv*R*bgH0gibqRJ zbzDV+@}yMTVz^!khmDZOJIG@pIE00ecJg$cSRz3KBcQUm)Ka6COO6(qHUb{N6n|&g#oQ7BP0T2A!<>-(?d%YZ0Y)3g*%^dbs`F=VP_01?5WkkRBu3`YSH!tr@T1}2Wn1C6=y;p(WM zWE@W9o>0S$Q{{;k;1YeipWs%ri5L|d|K#7jL8K?~x~|Wy-Mz)(-0;z7` zrq|^&C|BA1fvl{xrB3eEY3+&ZHWU{hzbx~cNWxl5Xx@XQzMs|^32qyeiQk+<6h}x? z_II}EitEth^oI8CsGdy`U+SRBH;ZD-!C)=1mzno+V$iIU%#{_E@PxslwJZbq4VGTz5S8EOsyqc)urqel zLWyG*BFPf<0W+yl>L!t_yn1dTA@k6anYFyaiw{<@{N!+aVi=*V?=k+epF6+(RAd(( z2A|h5E5En3wRQqb>vyVhPme{ilEq*Wj(NvoV4v$%pGgY{aO8Bi*F9@9+vY3G!!EQ9 z12dT;M{Nw-pPfBwCg2DZum@_nB|u?M6tE}Cemk;o2C_C$fvM3wl%!KSf9 zA%G)N){#hEY(p^qk|_q`<4|=5kCv+8YJ(nzps^Vmtng>=7LRFx7yXhJHOCRe!9jzE zcNW7Crh=jKD<4PUHXvs|!gh=#OaH3QTz?@FKFxJVTePUyiG&MusvD@%=~@}t`h^1` x&iYmvvfx#bmpT3`PtF^0k?a@iE%))*1NVySmZizF-M!R86}DbhY`;HF`!D7eFhu|W diff --git a/spider/resources/static/js/layui/images/face/2.gif b/spider/resources/static/js/layui/images/face/2.gif deleted file mode 100644 index 7edbb58a843cec27a1641a5c9b6d30b8fc1f8c26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3222 zcmeH}Sx{4F97iv?30p`p30s7afI%Y0usQ~*kRTvo39F(M9fDyo)qyIGxZdPOAXfuw zMXOZ@MT%f;N3m|GEf6fID6)v4qTr4|g<*?Gl4b#gPG5ZI?R!4|GvE0w;|8(3`Bs1x z@CE`_yJD2}b|0SX8E<8)R4Qff@v))So3@t97s9rhpC4WH_pkwL!xySPHq{)oZ7p>h zzvrkPIQOBeShx`LV*^5%D6C%`ebEiEl~ zk7CE4B~|Y;QY-4zgO`-;+$Y!56kQ@|0&T3P_~I^%dg!{c*>mvT;;r*BVqy5BGo%N1 z>y$4yj<eSIAsOnz$S)c;g7`UNK{5a%gXzk9w@* zb+!N1Z*Z#q(|tE>A72qE-$~S?mF?$QKjr5tH)lqBI}f!)-Psh@T^p)=9MN)#S6{a5 z)5GBNdp(u?=bL}eIw4v-(&%^nXp+1*wON*U)QfoKAiI@LkEEj?KB(WsGWwPb_Q~x# z%Pj_))}E%~{$aCw?}kb3!SMzc<>;fP!fzD)jmqa~!+lLXRgS8nQwfW3qmScXUR|)( z58qz3wdeK<)!QANf2Y5%2`s^ZidsvxTJ505@&aRHmU1EkJ(zBw0RR9FAJG_700J1A zx8_Jz0AQpRL9k>=GRa;_N?sz#%Zsq5<3pC>LV|oY+spD{Qbe2&7lU`gW43MM#*2ar*Rwx+$e-nGQen7iJ*HH&6s0DE)T16NM@URLM4sVjkz-7 zEVM@ox@)%#;|K;6VBO^yGDT45hL=an%;wJ9`Sg_goSH(sqv#czn<8!~#3sD~%K0_n zM8E1+ZQZBKnoC0ED>;cRViOmBxv=BT@LrSCmTmn8?91ocFUGXRDmGPv$5s+|%)PO4 zu!z}lmB=t-ZS|%1LinMQX;MOwcmS^G?9*u1hBP-+<}$vIIbo+9TL7Q-4AIssuw z=N}TG(+?p~3br$0y?OA2c(7hNM6a9{%@o_D&;*eH}6v}Ak*0_@l)tisouy=(k7zah6uVrZhe;O``p=gyk5s|!3?bZf88ne*I%R2?0u zS@(sfB0s%2$%Th?;siz>TCk?_9ePuuvyJQQP8vMj7X;0X5*K4F3?nP3QSNhuu{urs z84)e)87pS2n6YB!ulU@SnZM$z3t}))Q*A*^DVoWmscAMP6tU3N6pmY^9V;nttf6+O z=$l~2j(DK-Bo4lc`8k zQg{>bzl{g&%nN?YhqNV#O ztd%y!jg0~xk-W}^+K#6lpv-gGpDC^eLab>noeHkN6PT!JRZZ+!1SKWgcK&*DT0tgB zXm^Ef+`*7`+buyz`jvr4Q3^sy@c+#WJ(tOup_y~jhsI<}!D%hkERC;dDT30s^pD^v pEloJ|-EsmUGDRV$ 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 TKb&t*bx4GV=Q(`>7FhdV^sO<; diff --git a/spider/resources/static/js/layui/images/face/21.gif b/spider/resources/static/js/layui/images/face/21.gif deleted file mode 100644 index b98421282467fb377dced2eabd72bcc5525f3e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5191 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 TguQ+mZP{ha!SUN*Q#T$ZGKvWRLv@}vHJ9z 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 Lls229f${$VzcBA< diff --git a/spider/resources/static/js/layui/images/face/25.gif b/spider/resources/static/js/layui/images/face/25.gif deleted file mode 100644 index 0b4a88322946c1b65e9236657d6f42c71e412a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3127 zcmeH}Sy)r~8OBdG60(?tEF?im2r+;L1lbWy5OoM5NLU65Q$b)@h6?I*ijH!^Ie`Ra zC+-{I0$SlgMa2~iD4?}c!BMND2!czsN^wC=U``U8YM-`Oz34^na(Djk_j{LoC12#{ zpTq{(z%U3*yz6*VPh5@91jVmp9hk*h_ue zPJQ3W9I7V2)w{mF$m+;*>u>N~s}C$^0`3@1m;r!i)ctaNxQyEFz(9+eC`^XN3!8BQIW zt(<1eq0t%6P)gK1?i~Ktd>1RgD&R3clgnP50)~j$^r-=)g}=2U`P7FrwO!vqU_*lU zFw_kbR;~X&u~yc;$&E*};A ze5@dpf)h2mKgvz4`5VTT6Y|IUpn?~B`O!Xow+E^_0HQ)fRwZ|q!mi;yyT(Q|dNO5( z(vaIEBo^5_+8bJG6foKk?C;Q)qcmHc(BdBLY_wYC6rS^a^2noz&3GFqSXDV4J%vAC z=ygah&ds5MJuT_7^Jnmlu+);;JL9n6_Cf`txBd`g4RhfCW$xgc}fq5F^bFhU|C@tyaSPrXmiWx_-;j z5{OH5aS8B-y#rjF!nZ?Npn#VKr||^yXmubK7N3GoHlI6xp_vXT&t-${;6-psCed4Z zju{@l@;WGkgg5K1S4V?6;eLXa^J0PgH(&%T2jlBr%DGT{sEszJRRQMz+ZQ1&fFZ;L zTCD{?98kf}EP*W8;ThJXyzh2EtH5btM3@+smE~CvCcpxi0iQZ?p|$PAT1a%k0lb8~ zN*V1XM=G=P7E0aLQrUW{8%L`2wu_dUPcC+qVwegWOwJEdU(ghkP-diGnZMYcPcW7@VbmOIpx>pYmRCzed%2X+OamT;YIX&wUMpf-{_n-e{s zN%$P^C$0a3oe}+cXRJY+JA)~xIrynF;Ke9!5mD7YqETbKiJ6Anb{rbZpvC2^4Zc{! z@Rbq`?@=ki6uJ~mORT8L#Gz4nS%;41Un!I3?CJ-SYA;dAvBLTW)x%B-Lr`6rn?L$k zUQFOV%IqF#gC5}Bdi>;-4rr1qs0)dcpyspYF!zUWfX;B1Pw|1=G5GRA`1$l9>H$VDpJQo!fe^lQ++|HN)tdbJB?X#PIO)x4gJ8!2~2 z#cM>{Dvru&7`$UFnDf{c`}j!Jz`M*RZyV@ z^7Pj#MM@!7tHBCOaFE%PsLDbV6GZ%IZL;I;y%5Uc#Be!-<|=i7Qv73~>`5Pbu))rF z4u;KN_alhm#Gf?TP=UVBjrl==;SVbw#biM?3VSySG~J$pUOaa$xC~86cY`RyE~c(y z;VHb7q8o$qEoz*V&^-!AW>ZrGnNNZrm(c~e^_=&;`>AxV)ar!vH+7{Dj`*x8YjbMB zHIxKdFw=fb%KE~K|CGA|=P)WgdLGg&yjf|cZgHZsr#XXx0-Pulm#|#GXl8gM;4(!x zK_DnH%g;`r(Zn=Kf+dqU&=N`%R>FP2!cLyzQz()2zGiX$kx5}ne_g7o0A|~ha|cB7 zLV~2(5Gkyw#S&tyLY|H|Y{a_6+>X-?Jf!k$DT*zx1Tt9>YjOOZusexEd`ajc0VncO z5C&z(?hjceaQeanUKQm*8~Y?)J-YnWH9d5H%9D_3Gk;f#^_)%f$Z?0hy@IC_R`#iE1Ud98@p~5HAYTDuK4U(zc<#GppqcpSq`GsG$aR6;x2k0_?6-$i z7m=~qrPV9qZVTWbdZ diff --git a/spider/resources/static/js/layui/images/face/26.gif b/spider/resources/static/js/layui/images/face/26.gif deleted file mode 100644 index 45c4fb5563081d684f00cc3560df41b803cf7bbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3291 zcmeHI`#;p_7awFU=3N(!aa z)@F63%VJeZ7o=9ZQnt0-6xqs9JUi^x?ho7dFZh0*&+GMhp7S~9ywBzRI**T^H`7C4 z2s4C@Ps2a}4)C#HI~NoigHSB6*8!HOC}Tq)*G;fC2OKPj(FGJVaMc0jhEI`juo?%# zaMPRdAVYurYr<3!zjB>V21i&gak{lAP5J_jKOvfu-^l)FrbJJ zYMHdu?mXbW<6M<|Y| zA7M8>`ZC!V2bA`phykRIr;IV+AX^n{3v%H74Duba8K{B=jqE_49XJ^VR%_n&!S)dB z9_rY26KnuO1C-jd*p-SfdSR<_g2Or}K^W7S`c_1>>H(0|FnoE2Dtn+MKt7mk-&j=y~ypsn%lmxoVC zdZ5H|I>KavivdiXQX}mqD?~$B*i#4WNk77aw9K>q-nW-Wl{i>Tyn5Y}zx7_pjuXpm z-amiVI}dkG5I%)vQPqK4LQ?mp&HY5Z8&QJyH1vm&(Xlk* z^NW`zUCN#(D_Jix)u)Q(37JxkRKCK&g@>X)-I7O%@1c zF(Q_FKO=S~L$fN%L^j!T<_9!`=_ON$Aa{zZQ!JH6gXnY$&CQ)or#V6{RGN!3RsGVP zXl^WbI?IIt{r!;DXbNE*E12i~Hba%90aga>y%$4%zw(V#U%Kf!(Zyzdy@QnyeH^V?};EHd*b1A{Gl- z3|Bs#>dBzWidmzAMzk)=-blj~^x{RO9d8z5QeC&FIMMSHmw~Jb(7|_o3gO{5tsf(ZIw0Uw(ej z_tX7*y?1-MyYAe+b+hxv^^R*-ueATz*4pyJGV% z-LO7InXFhRmq{f_iEG6P@o^$yY>Xg!&FZMgi14sgD_1NJ4G9hkTo&N})zT$?zCPZ3 zo)_1Xvv?7E;R2QilR>co;>YZj#w?Q2>&na`qI z;P6A9*UbBTGj5qHeb0NMbcesk>yo7nt>&=64j3%Gu)bZ(E-AD_%hEo&CC|scp>@Z? zB&#mGyRfCTjNaG9(VE+vk+&0#)yRV{sBXxHXUVS)?Mav<;AeZMGt;}7F;7r07;<#B zcYzt6SxCK7!7kZSa~aA~zn0s5Gh?nELQ$(3%P%ybUKFn@4$Lx4U+a6kuT_ag6*8M`RjFL!A)XSUC?DQd$IFpPS^kjr2)m5Fadb!#?~ zU?17hwYm<~GGKB$Q+BxvfZm2h8moZb!vTPlnm{-Fbvs zTiy8VW>&3@PL@xR?~6<-^j{c3F!98{F|xnG&BMSuQmipmE8=;oyT7A{X96tV-m~NL8l~6+F7aUlOIu@M5({Ic8FO>gh^2MGk_!BcJ BI{yFw diff --git a/spider/resources/static/js/layui/images/face/27.gif b/spider/resources/static/js/layui/images/face/27.gif deleted file mode 100644 index 7a4c0131dc926ee932804276038bf053a5cc1634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4377 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 G^ZyND2?^l< diff --git a/spider/resources/static/js/layui/images/face/3.gif b/spider/resources/static/js/layui/images/face/3.gif deleted file mode 100644 index 86df67b7aad1ac80079562c74945d9c4ced3c397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4017 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 Z`!_Z%27Br#6>oByc-ZnwM>1&V{{f6`u%rM0 diff --git a/spider/resources/static/js/layui/images/face/30.gif b/spider/resources/static/js/layui/images/face/30.gif deleted file mode 100644 index b751f98abcf8173ae3c08402c99ae885a0dfe162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2555 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 diff --git a/spider/resources/static/js/layui/images/face/35.gif b/spider/resources/static/js/layui/images/face/35.gif deleted file mode 100644 index a9322643dae616390d8263e8cf1bc4d9fdfa03ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1800 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 diff --git a/spider/resources/static/js/layui/images/face/38.gif b/spider/resources/static/js/layui/images/face/38.gif deleted file mode 100644 index 8b1c88a3e8658cde7b25b6e063d23d010f7ed86a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3615 zcmeHIc~ld39-o=q5R!1nAxDM?f(RjrT#0}Q2{9;W1Xl3ang9_}4T&Mv=qe;!f?|nR zi+8-Swp;6Jz1lSiqLiwQXzQ(@Xwia#r2;hxJ3+DAee1q`uYc@6J2UUi%x}Ku@ALV7 zW@?%+fi3k0ynz87P&M7p-d3J?AIn+ z>TyrbxZA#)FnHd}b|u>W(>nV@wWIg2{Ri%ajee)AiT3NMw#(yxJVmhGTlDd~G4_Y= z5BHyP{A_;NmS+1l@b)J-OU)QZ&;A_?Ny9^J*AK^BXb8W5)XV;Tyko#*d$RTF{)il= z`-@AHtviAo&vu@ujdk=Mt;=$CJlopZ;M()G|Mi2uJxxK6kNey{Q`G%!`q0x)zN(Kp zQ61iSlKy!mudgltrIM8&!g3GsE`hxY)Zk z8H>Z7T$npN*g9})?)n^(Y1{0cmZWbE$sI%Y`mITQch|jaBDd`#{n{E(HU;W?uz#T0 zy~85Ca#xzP4>$E%C9mmO;k<$3j8ne+T|&dFVJ+vEC^yOsStfi=#7RV&meNkuZzFWJNQOD=vx| z!-SMH-EY6CJ&5*)saFNpz*UFq+9`vz;+mtSH1H zs$_YwMyib}E*Uo(K_Dy1SIbozxw05`MwI3$muiw|NTsh^P^jL9EiR#tv_sEVDx$Sg zRWy^%aJDpRn33_HO%;l_)+L%u*>Cm!+rTB+%T==IOj(I?sXAYVn2&R&QgQfdnN*`x zXDgM9M|V+Nq|_)&ij*ptpA`p(XGrtq#m#wR zpTdqwWyPej83HCVm6^hh6$<0nf>?G8Q^?@QjQR?c`AZeDV$G;;!Ee5?@AP$&L7_r2 z3uJ2f2eJa8TB(3Xn&!ygT?^}-@!t3ryt|f3@AQpEiivhY`%h4hE+PDJKE5R`^75AY zvSNhqYJ}L}u)}V9_3O~!z{_9ye}2)|`}|o?_fJosbp81FQRl-49qsq;-Mw@B*3BE& zfB62|)wV0v?=D}u_-*SqEf>x=pKG$1O=ti9^;c(3pE`Ns%j3uXcJzxQpa1om48{W zT)XUprJ54;5|y%8v3Sw@@}k0pvV#0Psbs->f1W>Y?ws75*?-E;%A6&hIU^%|`m{9B zRAH)spTgr#Nlr?f%wZ?Q$Hm4>Vlf%f^r*;*5fj40#)pQCqXom%puhnCv3|Zj-ebHx zJ=`f|k{i+0g@DIlF=!No$V2cDnot1ffJmoiIe(%6ei#4=0eISKEDj&r2{4aHn?gwj zajw4k+?sfg0|}BYin!K8uuzmssj!S8#aIGz4XG9ULf+%q`g2pSb7?79okFtGb1QR9*h8c^l8IGmiuNVyF8j;l5v zXX-)M@fmlp33o$GxG*uH*Lg0BJCBmgh2WLt;yv+sHmM7P;`TB<(bNTQn0slDODoe zmZWkkKJyVi3oIL7LuqMht@aMJ`dXp=)5se=#-k}*V~R(RE)(6@TUgsb(j2>Hr0}7u zr^+I9B2ZKbV$1M&yw$AJV{k-G!}NA?1(2_38RX49@8#Dx3)gPLp(+S*KrF!ZHw8k+ z6|TnHTlG|wTS1wx!`wuD&^&qIrKgmyaxHTa^fnnGEV1n9g3sG0r|74cXC>Bm{cO}x zpMF14HPADHnHad$VVq8V(e~X>0}i;!?mrpd$){2(+ne>cHUqD0po(Eac@s6|q+qW2 zT$K-9wSXE719~dwm{knL69Ev7-`AM8Mj|kzs7Rrvs#=$8MSG!njk+dGAVFgxClKL% zhKNR>62s`fVI_pmH<&j1%!l`E$ev9Qah(`p{t!kYCq`yztw-_-d;+DZ!fQfKf)(${ zwXFRJwYw`4ECg%G)N-phvuXwobbSx+7jDsQrm~7k^(
                  1. ap0JjxBHsOrGeE$JcnI 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 diff --git a/spider/resources/static/js/layui/images/face/4.gif b/spider/resources/static/js/layui/images/face/4.gif deleted file mode 100644 index d52200c51ee924f0b91132e5cd3737fadcf40ef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5689 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 E2fD;K%>V!Z diff --git a/spider/resources/static/js/layui/images/face/42.gif b/spider/resources/static/js/layui/images/face/42.gif deleted file mode 100644 index 0eb1434b4e81d4437098efe06cb4e1ab44a86211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5305 zcmeH~Ygkj~0mo0^kOXo&KnQ_Au3TbK#w}bT)dT{>Ajri^K(Gmy8kCK&isJR;LP$U^ zkqSk0YrG-a+6lUjwbVgCMJo$M$H`}j>#dkk(v3$GV{6*}BFogLpYc0=u zKR>~-Jn6LD+if0BwA`ZyF>EB(yK615x?nd;V zkF(F}WncgC7d>^znVFf&rS|QWQ8Qz^F6|@k@jx{eP(~{%ERT7eL*BjtR{s)r*-F7F|Ic4F_%#>Q{@-nzWU<6+;@FF#!;2?VbE)@$TkUDu(F{Rab{ zj>xqV_J=Cp+vnDtP{#JY{`!;Ax~JbheE7xI8*MRH58y{m2Yl5|ynp}x-^TY0o{Y7O z@9L}%KkQ4|>W6s#dHUGze0%DNmS_z<3TiIsq`S*!pdSL;?WRoB~#w?QxscUMI-QzHu z9RfFt7+c({YgNI?1e!k?L%@)Wi~Y9-|K_~_X=(u>Fwl!okSfiLI;q|k#b6fXMPxfP zWJlzIZvIi*)S+(cq(Ugdb9;klgiuHX@S!SSF~^MzqM#h=W@^q~z*dhkUw9+OgYF|l zIPaA}t+)ArkBpaJ*8a`aY9@;pDSq6|cL+%OV6|KxQ;CLH8}y+j3Ao&wqLWFx(l7^b zTw*OGHLcQnvRA5jgK3vVNL2ozGS^-|G%>1RdgzeyZW_SSbJUk z$B+c*`WQ{YtbMo?Ej#6G+>fiF zQ;MG5NExrIbjNwF3^L}Pt0P@?SS)QTh?#Qt1NZSDuzM0)jI5Y8*!MmCc6h1zE&wRY zpP`}YlvRH^dzkmX!17J|9@ctZ@Na^XK`FG;Mr$WTT>pYrZsN`eltY7)r(I(1OIjfU zVPwSih6qnc5VAn)mvSg4+)67v$MnnM1zbT0s)XDM#-gzVJ3X*x^kVb!(5h-+)Ra`S z81<{5NWYfz6cjyvh`qk68x3=fLE?+`2rqAJf-dN>zYs_CFE}%D(WeJZELII2s6Ve& z24K&ylRkb@g`gF-pg*}OI$WuxsqC7e8)W&N5YuCC z#<-Ez`fb`JjnO-Te5gsr*Ptkjj>1h_y+0{sITre1O-z%v1Oa|)C{r5VG2lbiRhwK# z`Q_ns#nA9rXDSLn`{)uBT?xEHc^HXSJn4nYkQoasGLXv((^cs~US0(6jGXYmhVYyWZ>ks7XK-x`2II^ZVXSyC zBEIvzqw%ne#>6ujDOaiyZ`*&?^a~*7iR?Lq^G4Nv`}{6;Byclf2ubG?#IYF7t*qrF300 zAW&(@H;!-P^HG9<09?GWo4=+uIVztMe&uTU^++%IKY=p8|fRqn49 zmG`|BdlYkxv)FQ^aVnvz{PLEL>eRmzdGk6 zNVYb~_q{JtiwFpzjP9{&V`vpjOZfla(xZ(XpOgf7bio~uqS|J)(Qa;O5=Ojt#Ftu^}7U&!WricKDW0ccoQSQQT;IoEgc;-VL~uu zB2OCf!=|uBQ-s<8_D!HOeLZqi8XYV~lqbw^iYkT+q}J~HE%3VjdZO(C7wKd zj&>nYT(nOxv(Dc=P#~x9l~o=uIj5)#OK(Y1 zb{|}=4ZwzM$d?~gqwrMW%IBvG22~Eus-hvXk8#C{f5?AkBHxgXQ9zuy9TSgHRkc*% zBl>`W&$>>h=%4=62(nAKUhOGAbt8mv- %FKWjtVdL1P%I)BVn;-eLqw9kid`E}a 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 Sh@V0@dM8BG^xew?0{#K$QUnA5 diff --git a/spider/resources/static/js/layui/images/face/44.gif b/spider/resources/static/js/layui/images/face/44.gif deleted file mode 100644 index ad44497691d150ea5d02a900231e48ff519d9616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4126 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 diff --git a/spider/resources/static/js/layui/images/face/45.gif b/spider/resources/static/js/layui/images/face/45.gif deleted file mode 100644 index 6837fcaf214a394d8efb68f5d48c9ec6f9ea1fa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3417 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 Be_#Lr diff --git a/spider/resources/static/js/layui/images/face/47.gif b/spider/resources/static/js/layui/images/face/47.gif deleted file mode 100644 index 58a083611d7c1afd95d136e3a7fa798c86d0c2ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2333 zcmeH|YfMuI7>2)d+R_WymLAH@(krc}g@UaIXysZc6v|DCFw{lML_tx9cp184*`ZL1 z8relh&=?dGG3o?08na|UL^p_06A@IL<1U+y4ZKZ27)xB1?B{;%hyT9c&-c9VYf4Gd z>GQq88%FK$%pZF7=(9wa`2rr;b`38_u1Ni#YoJ?-PQ<{Q1Mt)dw;~qzlI6dI!E6&; zR4S&=!}MYJULot>=bAnPrxl7WG3{Y~-ZMS?R7Fmx;JV!ZrqlUU4ZS8>Z=`Gh;F>w* zWhsn$!lPWuh!*)(43jHi(gHKv;NC*y$D;Kw)BTS}1Ph!lJ4eqYW z{g%g>PJ`Dq@YVr0ZM$bS!gWJbUl8S%5Sg+-e-LyD{YIE@A&eMd!^;HdTx;!1^10x_ zc$`oDtrVHP22a+a6LRQY#Ggupb_~Y&@Tv?ZN#um07ao2`LhsAe+>VK!o12r&xo0FU z&rUEbOVoxerXTCRc;d(gnBusp#@^!YJb!2 zEjv?U4%vf|HLNuvF}0Gq+TAmiuS;9EgNm>?9F_(VG~2`EI{r7h$iiJ^X3FI&h0z%4 zL6hltEXxP6ib9p1!Xj|?EmBaZ#MNqCo0Ah8sZwch=Bm7K5>qgR3O1d7XW6dOArs4w zeTi$Z#&Hh_i;mYzcq1Kd6%cVmEO9zGLXsFOmM(H|d63aejf+oa1m%s#@d~JB5|f|p zkhEvl9ORZ>`lH{%a6?t;-40NlJkhCOSOwY!SO8(U=fBerAgKw)j~WY_$x-8%lobMT zW7F7yst~s7Xu+w;z)Ft$W}2Y_4NP#ueD06(iH`OLp_|x4(cOjy1niZi9*xp*|H8+7 zhYy*DhrPq+6`BzeOuFpBOEN^>#J7Aurs3C{ZP@)Gp7QeZ;u1*0eVkjWV_tTGL5lLsZ%QmVr#~iiiTQ&bn%& zAUN6hdnd%DpD^<88eN#Qi{-iWM!ilP=s2j$lAgWD8yu=<+sn3hwix!OON`05TM$!!`a0qYQ+D0Gm zjNQ!D;g+hwM9lVZCZ`~Ozsn=@Xkban)%L+;Zpe$0I!N|e`gP{GrlKDW&>WlF*Kz-^fm&{KNpQTa;MH3VbMTSO)Iy`7$cc!}$F;)1yn)K77`oAz1q&dbPwMcqZS4-Gw#0WxD0%0Pa38b|9mayJf#kALK}E#J$BBuS_BN>|>~!Pl rL2H#EiEFFJCp(ZsP5Wj&2CVH=rzDGc@3T0Qspp*aTJ3^`42b*_XAT7W diff --git a/spider/resources/static/js/layui/images/face/48.gif b/spider/resources/static/js/layui/images/face/48.gif deleted file mode 100644 index 7ffd1613b5fa36c3ffa7daca94e7e8cd6f8d82ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2689 zcmaLYdstKF9l-JTB(?$ovqbO|y z2`B`F;9XW3>N;UMhjvxl$L$gDLajQ~l}jJ@2$VXz>IUkpST9Qux6a4*zw^)eo$vXa z_q?wzWvN_I7ytsm9UHhvhlj(kw^DphziWL`3BJ-r{7ELA#DEzdxcBiN{u+p!)$1-+ zRSg%ex~qrIc*Ca|wBed9m)4Yg)lh${toU9KnCjSfHj+1pVE)KuJwF4UX~F#(XnGMe z?s)I{Z@`5>|GuouF$pq?K#xS=*$!|`CLG)?R7~Ctw+_6CS6wrMxxXcSa#^ZjHZGK)09%O=9 zCAits^ToEt$yVpHTyT|*dzK1D<;)R-ZaNjb7y$jr$+s%ry+Z~6RzVY7a5OmhaRYe1 z7JN$sU-O}dIbhZV?y$fqvG98-=*=+n$3-7cNI0cl+(ROcB*uQX6`V**n_+`*c5eTE zKloC>{yPaA6NsL#0+)p$4-bO7M(Q{DVYiFG=@8bq3L4+C{&5@hFBj;qwOz?s_UF}w zPZs-plDG2efdkhTFS_2=I#IIZ@gkp>FJE$A`WUsD%a^E4TCqTgg#ZAYS=gHfY#`cw z?fyss0N`HM+U$<{hOOHgn;f*lQgJ~2f|kO_ZHP#uh$p1lYcQ4U5?N_OX-tq1HbCVz zFN{c-78I@EJA4)4!kD9yBwM*Wn%yHZ$M3dD6Ncr6?8Ncm;OYEKqzn?U-d(5<3Ls|-b>y7hh^^vd8C^jQzp3TuSujU)+ zQ9CY4a;$Kx9doPEU!xHnuhFEa+f1p9MF;G;(As&miC{e5jW%pAccb-2kM&^@4B2a= z^;22Dwoy$)VYIIH(oQUIWqtwqTnHwPksrsYf>cNxj+BW+SdfOkh@V_+W zi)18pWn)eJT6lSQc(;L-jc#g`NG(g{x75;DJWs%BOa@X7i=|BW55t!+$X?WK973Z1 zG9J!fgHP;iDW5^H*d^qlX=Uxj)NL`~XriJPYB`9*iL*aH`P)m)wpmkwE2G=nYb!J& zL~n!>XdI0`nWJd*!^3zz@2G&bbG7eq6o*8#YmMvGz^83N%{qAuzjOP7Me%D@CH$mT ziq7PIT|#c#FVcf8azgnginfKS!^bLl3^I8|F2_j`WR)$$;X*?hj3{aog)xH5njB%Q zX(S3laXemFSdo8GQF_L<3;0Kg%eaXe%_-~X^f?1(Vbq~yZ&ah*i{H5Ak)<-M*2m!p zDmqgz{>1?$(U=yL!y~_~zw9mjJ9q8g>CSEURF@N7M0YVm zQ10$+S?HHlHecIJVc>?Y;}|QQbFuTOP1G~D6YJjgaQ#m_eDA*f9o`W;0z%dUAJ;;6 z1OITFCxV~k@>CFVU7id=IaM35-DCIG;i8`z{;Ln0wGlf#fHU;!2Qxi{p$)!J;u?_&^}-EKrMVr`Q#!5Xxh8(~jPC@E2JBW(eglC-oK zm|L@-Eo7@mx&U#4NGObk)da38JSH4AK{XL1xr`|@TTB*Mr8*N!kVJ4T(0#DE0J-cH<#%za zYO{_2Kp=y7RWa4PhqJ_e2zid6IVT8U01Z%H9YHql4RI-{TD!eioDxU#b_O6!Yt=7x zzIGayS;@qtP#nl=VVY2+07eS8lFg2mS1j_TVMIrIGAn>i7JlO63Y|D20Tz{1!fP$@ z6|gEiT4k2%B$5iXSuQv0gY_2oJ}NV_atMo7K&))(qcDvr*z(jM%_$>DG+;CxK|1(F zWS2!hiL@=mb%HYS`37GYN9wB1s3ZD`{X4q`85bHl7w3X1bZ2^K$KFs$3Dl*f)B{uX zdFy@((gw&h@6W~x4M=C%;8{G-b#o*AHd;sfmmGAl1RV)kyYAF&_tnH(duPzA*+*7o zGsjMZf_>~#%4yQ{M1MnDLd9SH5m;HOzoqghy}6oxbWq!i=d|kQu-fb2#4BKO@v9 z2%*DLsMn$MkITw`mILbGCVFBgvl^pnMw0|qbf{5Nw`+06U}m*_@?0HHU?kqabYU@j zan4B9%^SsgS{qQfw*T-Eh%Qf`#+$CVhDdq*sj8-}SDHaNHDz<}I|BhBs2)Ey!9D6; zR#q$dWT9g_ZVi{_`}E}GU@I#-zq;K}R@)W|y*D+H*WJ38NW@32ymF=j13pkW%8~(&F%4ti3Hu{=Q^k>F57<{rBbHKJEzeD-kT0S#_SZA9A)+r1Uf*@S@B4hueLv6h-p}>8domoI z5FCI5`lLYJ&Rq|4az55pj@6!gaiwv3=q=ls+N&&@e9-!!sJuQmue;#jg|LW$6URrd zR8M~VFx}tZ6q|5&@7`-kX${fw6`Q$jN&CjznqQqL>QEk1Yz&y{dpf47oa*VieYn_v z4K&nPKU7uGt2{h$_uBiKivH>g!%YpNb!Ts;9~i&YFn+D}Zgy^ND7P~&cew6ih^@=} zM_p|xIbFGj?(NUNUsW~P+xu$>Z|e1{muJsZg+@-?yS0nH>2>Atj?CoB)UKPd7)MFGXHK-DN+&Jb$)U6hHR3>(<_kw!FhiX5b&CWv8}rr-$G5 zo;!D06g_^Y>0bGX^WmcNY|+@@n?`B+#MAD9Q>RC|9!@^)9BylWbNSNq+UnaSrO(fu zf8TO@w5DS4e#gVI(_<|+noExk-D&MORM=5bUXz;MS5{K)7dkyXy?lCs7v0a7O7W(X z2sWA;005w-0H!xcLnH{guip?QL|EY*2^h=?zdZ)$$SgIu-?ev3WRhAE_S!nhtW zB93p2mme!8oaMyEZ}p+qXL?YUtAK4nRgYC&M$pQSd@MtsR~O8=1Y($Yrc5JECY=rW{J2$ z30J@e)r?56AVT7TM>G9T2|VFvTE3VtQx1V8;1Qz`ArT_js7so4WHSH1E06ctTP*S6 z{F(3nBo_Nc3pqp|j#v;OVsTLS73xqzm@48R5`oB1AlNbcir!%Yi9j4C5Q0=+GHA&} zSX{o^U^RnaGGR}?Sc33b98a1H9_1i#xop^pL?=^dGz#6GWCuZX$c+q<9Nj1sngfO6 zW>2x3#nJ?<2p)$onZ>gI#JbIiRW}1qh(@MyMBJSmHbW%ffip$J+_`gcoRjYpmOXba zPIF?3Xfi~#w11I$)`a$t`uMqV(aY!7=kU>f7om-xQpf);q&ajt*pdJ6jTDLnK(Q`^Q=<%QdT4 ztz3a$4lc7WU;5<|GgA}XV&g>%zc4a1(AQfqUl*&RjnUGahmMEkqguLbKnkowCj~mf zaR8t*9VewwbSYA~Vy`SIS+>d*2GdjI6cBb@m27E3@(G0Xb#NsmI{I*+56Q$*%C%xp zsU*j59SkuJ-;2X>XQ)@vf4lc)OOJU?JyZNpr%E*;?d-HXawzJ2-9^3Ea|po`PCY?@d?lt?kq@!1q?iRa z8+(v~;u7NacP?H!WJI(YSJ`r8sGy11w1kC|IAmPfuf;;XzQP zH{UX#lA0eBlBCt2f*&!{yquQ)E(Gu%Toj*!2ZBy+d;7F^zA5nf-M|)OtXeXR#or{8 z`ReM*#G*0;7II6%e`#gK zm2>~5)OLBHL0dcKA;$l@fx*%eIke`vm5I4O=9M{?y|zwYvD_mW6(}G!OI0)@kR=-x z2x}(&5o;=xHOURXA%LzzB+)% z&6d;b=IgrqX_+Qm-2}i34oM)Wh^$!5!Wnb3t0N5ctbulb+Nm9fn-?=2Vywzc#8?-2 d7-lKmld${p3g7ywGC$h3pGjSoX=wyF{~Jh9!Jz;E diff --git a/spider/resources/static/js/layui/images/face/5.gif b/spider/resources/static/js/layui/images/face/5.gif deleted file mode 100644 index 4e8b09f15101f3e3fad0777ad068fb559ed483a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4567 zcmeH~X;4#V7=^#=34uUzNk~irAqEB!Ayf=8K)DD)z+gcTtwjuIMJ=|VXsudqHdezT z))uuWDs@5aNX5F-2ng;3)QU?L5Lw)*eMwI*LBv-Krh%=YVBU0W?tUuf?o3Kz8q<4U)9}GsGkA7 zsD=9KU2>wS=9holI_FMh)cupf z>di4bQmuRHMx)J%X`zJchE(&jijLpydhVC?T%UEh#Omc)-mBIXrXItd)%+WkNPV$A zdPQ1YX#2nz*V~Hpb`(9Yv1_Z~cU7>uD%eL52eaAiXr@k`932%H5Ha}^cQFnF0C4QZ zQ>+03-1`6fA+Z1;nN^5JJ3dCp&l1Lr*XHJa%3mQ$naoPzP#5#{c^cuT6R2!hv`7>> zd$uG_SiD6+neDdJjzxD2^`}so`?NEeo;0bOD}%M(Tj?$xC1K9g^8A+sO`kWFanO$8 z?HIIRi~~(#srS1h>^k&aVDhD6LE7#Au|%EV9h{1PmZ$@s5moBNef#93Km%| zESuF_pa>FylBC}88luWUu5*$;+uDYeP$gnEP}OGnlS{gRSap&}qLqkLnkc7p_Ty{} z^CA-Fhcg2tUghl&oX>F3rNt|^xrCG5*g+GgHOmPAaxPK|x@!t>fr{?Va@Yd+67u1! zma23t!QFXk-$G-{1x&^CtJr32;1q~0w_LhVAg@*PgH5#1uM#W>T>4#4y6dhpqef4P zW1mSW(W^)p=ccA)1DS`*jqt^sxN~Za0Ncs)RJN-YU(Sm-j6oAZa9HMxPO(9)>! z;q1*M**3^v?8?V-te3Pk!FS+d8T7!o`5E>f#S$ zic~x2yoV{d)IfK#j8W{0dKVK`P?Ov;NsYCG{=<~dl4A_7G5M`}i|N~;-~>D=eT(U# z4nRpsQYAi5?eQ)qveIx~ZRcT+Z*CaGq$JUkgEBER-p$VB21+`&(PO!nV1KJRuLCbm zWt76TTHZv7Q5v!HBHkx;hxeN(8Cms}=$3b)WC19^0#N(col=E3Ai8uNC4!cb9v(EE zi{OBtE;57=!UPbcTR{*c#Kzj%>Oib`R=8NcC)PP?hg>e=D9DI429j_|!O27}O(w&$5%q`in?0~&b?F(IS=l*j^tpNY1#1h}6*?qRlc-!v z9PrXdF0iL|8I>vSrRqTLX6swhcbXh;2t~J7U}a@o*X0wj zw*8oGYdc(P;>Tm#p+gP_Fo4+q0g|Bq%tXXfwMev;Cc({hQFMO`&lsrP9E3|t^w$jD frtc3q4h)G>v$!OJk!PKU0t;UWS8!4|vVH3G6|b(C5yT59(s*voG9OQ$>AnUYVL$;_Ge zyuUp2d)~N&Sn;cAY={kw0;sC0N+=YXOs3C1`>dv>rm3kZA|k@q*LUmIt^NJ|b#-;w z+1cggCx3{-asSFJbZEkLkj*b?K#f^=POeXX4<;x#`{4tNmD=jT8EG+!|^Urtf z+GVrZl9G}d8X8n8RZdQh)oR_gZJR=&IDPu`i4!NdT<)Gddn^`_k^2FhA3=R&qw6xs1b?fHMn~xtqK7Rc8y?gh*{`%`L zzWCzNqeq>coev*A)MzwaU0vhjC+kpFV{k=sWj^{~aYc zX7#FNQh7}Hd=VCd{=k2XBatBhg`(flkk}AJ_znRYtxj*yc(Q`x7aBE0!4j_s&CY#g zWiR38hs=s4<6bQf`~RZUH664t`(G9mEV$M>Z# z|A(U~CCc|~Ah4_uar>@p-J6B~8_1?6t+~=CZ}HWJt>cm@Z>~&{tK#dusVx-yrQD^};e@VPzjObe=dzrFu;skp3p(`zOCiGrd-i=Mt23 zB4jVpKyxo~#Wr<2!Uo|~- z?k|^_tz?eEIhJMD>&V^$;vVLDxt~vTQ^UZ?w@rn#6&-idvh-SZ$Qr_hVELh37HKWn z)-W!EIRV}}M5Ke_*{`gbun#h4Ci+mZ!84f+k~aEmW{V>W78u2G((62N%e5p5Vt_I3 zn7n=#Qy3ah1TdM+XhZ^{DQsU!$%0(-&e9T3fH_d|EUcg^G@Ao2t$1Tu^qfDW1ykY< z2!Wu)FML&^Le<*($Aq=vfh7V!jQ2ycYU^)BvtkD=G_laIE)Jn#SxqpS)zC%xIfglG z-6q-He%VIlUrejX$=vQx&Wso`D@tz1`M#`%jB};XWSZP*)Y35)ImBx(@_9K@WT@kh zBxs`;2!~{oVsjS+R!%$~mzYgf4CmOE@j1&Z9)6izo0JDZQDpd-a)%Sajkt>!h?Ka}pD9aB8ZDM}lX7@4p4Cf^tu&R1IlLzX^P zyMz050ty%}LNFT+uuLgwk^-OCT9gdwO_>#!!bsxt(nxq}Qm-pG6O-!Q#WK?uFbd$9 zdQ-6|D=}A4trqlsHb51c}i0-QCwL~!9>)|aKQw*VS-SYJW-fvi=PEF3$77N!Gs3X)Px3v z!XyT)pThJJMeqYmrN9-C3nm{FrcJUjhioGj(umN2HoL&GO{n3Zj&c%C{01p~#7hfD zadkvQ2SZ`1)8&IeaJ9GL;r&l zE9r`u3M?Ul$NA9d@Cc_xa7E*oI08{tmu(+c*BjW%awnDP(b-?`wLet&C1fPcAmlDC z-5p@X`1rp~wQ(`yonE1V5w*nPb^_g7lR@qKv{q6|#%?|BWW?qXL*{%aP==T=7}9c) zLb)9uSA>l%Rn*B3$K#5%N>*@6Oumjk_mv1tSh6I#~c`3;qe_e%7Mj7&( zV#t4~ZbESb7w?%>nAs%FtUX=9rh0n7(-2KVG!4--M8A_J@_11b5#3E>LaokKL{{q$ zMO0=*i>Uf1MO2LkLMv)@Xc3(`<1Qkr5Jb8eYU(|MnnD{3xSPn~*1Clnx7Io2&5Wrg z>P1xn*0@yRXH7IT^!z45ZSH^6M0u_z+DU#+6TuqXbDGE$rX)Y7iM(~cpot0-3UP1k z);djl7R}>u$v9UPP341wNDvjmquRX`Sv3z%R;hqtFH8Xi>_tXZFslFvg&43DBm`p0 z2>$+JunLG~imUxW5CP0?0ED3TKLXxhedPP6^YV>? zf;=(HVlFB*5dmDL_o*~sAt2JbvylV0ej8%VEGQkMZjLln82o}afn*Tnl^EbxOo+gN zYBFZ-JA}M`bPPIJ4aEMI>mUKdc;!;7^dTVpmKKavRXlf)9S9))WDtBoo-op4W|f*3 zg6uLqqtc*+!D{`p_pe9a-!R|IUUXCyY&Fu1KWyMk-j6Hj%$wT50J;OqRo4zm%so{) zbjYeO-DqV9aL++{#=!r5A>R-3-!~STj7tpXf%n`p_#SW_TP`eZ`+nr`okROjFl`vO zvNtxmmEDF)y&J?&x*A=|zRv|F>V)S9QD?{C0nH_agXiUE7zcsN3P-#ClSTQY1T!O} z8wYbw;0`@7O4a_J(Ktyo2H`}dcHgmZstuMow5KvCU4YS zH1H@9PO(HQfglwNx9-BI9YZ4;LML{pS72#`6*=|`7?=?dx#%6#v( zRIcZdmb2%4v2)^Bhy{bUGW=3>@x#~-mK4S-x1{iLt={j_BH{xy zUFJ}dm3$yt(!!*2a%#is`C7W$+3oa|B|Pe#v5p$S1^&WakDTk%Ba4eJozVtP@%5sW zYo<;7H)`VUL+STQg#K3`B9rdEVz)4L>X|e5l)A52;xeN9itRbLWVh9I#X>Y0%to)+ wnopSQWMpJrS#ax1xVVubT$vmsiQJ08Zq;0SjC;&Hw-a diff --git a/spider/resources/static/js/layui/images/face/51.gif b/spider/resources/static/js/layui/images/face/51.gif deleted file mode 100644 index ad3f4d3a8158106dbfa48e521084e6c56fc6406f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2785 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 Y?y9hKVE|Dl+bifDKf^#>4e-@}0Qq7Ywg3PC diff --git a/spider/resources/static/js/layui/images/face/52.gif b/spider/resources/static/js/layui/images/face/52.gif deleted file mode 100644 index 39f8a22846945358446ed010e2b9bd50dfcc7a25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 777 zcmV+k1NQt!Nk%w1VHN-u0Oo%H_RysE&7t_xrK?&j)|+hq+_3!Ft?IFT)0AV!c0$aC zRqD8h_|TsJ>&E)ltKOw@>9vIN%AU!BNyvIc?7@=%;kM9?T>taZ_{^H%oM+RGRsZhF z`r5JEo^R2GQ{9+i_}Q%gdgjaz^&bp0Z&w@W+~| zS1ZnjO~rUYx^+wGxrybje(A1!?Z1)y)1|L4Q~-nP||Tg`+@%Y8|vQYP4yVcL>g zvt~NObU**!w6tnI+^U8B*sH*IM&_z|#eGZp)T8>;r>$c?$Bk&qfJV7zHKbH2=(mZ+ zgI36gSAsHn*{k%yj=+0P^2nRuqi?otLDrynz;{Fc`{2HH zLjBdIzja5VP9(HtHTc)8{no1Ese0nAeZ78I+ml?_ms$MWwEzGAA^8LW004ggEC2ui z02Tli000O7fPaF6gnvseg^7xP76J~4i-a$bjEyHm@r9@V1n%lQKHaE#3h9gAw5QHw^!C@58A-z#?=7-ZCbD#S>_nhy%@3*|?JLj$r zU5vC!qK3OKOyIjL&=f_HLf;KT*4p zQZHIL*>mDv-L`YvVqf%rGdps+K56x(eBtbHo$;}uzd}0JS}|NHxm~Bf|9!#3hMa)| zDaI$A1BX-3rLP^W*F9<~ynSN(aJBl!)R389s$bvw?#gaq-51dF?#kK0W4(oOk6Vjd zl)UkdlJ?B7ryW&o`i)(Mab3EYQ(Gg(4dpMdA02BcGLHN()!#I5aO>55Th64cdC-(| zwOC--@u~4nqj9|JV(vQQqt;8=(I;hVCN5SESIegd&yKZyJy4;Xxn48%Yi)PVrrDum zwVPMYj&|Ov(T&s>bmqnO6vK~ON+vEGtV;-P&x!A?*#7eJ{->>_51Vs-Z`$|ZOwr`k zQzuiRjZ=f?cYHSW^ZuKa>Y;{;!RoB3YgL!?HW>SkyuMb`y;nRv)bQ$7qwz+=!{*|X zim<)|Dg70x&o7rxc9a*g78|FA2CFj9?@E{%ta~+Ff2TU_Zf%CqXmm4LNAO~zIqXOt znLsk12LJ$KS|1(>as_Gu^7RkYC- zP{Pp}5i!DyWFb?83tR>IYgihoLJF$|phhZ@saTo-oIoUxhgrzjWG3RkHxPAl0FG^1 z08KGDawQB>34Xpp5(I%X8UdnEX*9?OB$FUAk%YW7Ux>n@(pY3V`0l|W(UhVstSB!3 zT`Xi4fJ;=X6)Yk#EiH|Z=0}h#6NnI#$u#*OlYJ3{uPR-p7HE8BD*T)WF02wN#R|1p zE(1*-1@ZC}bpQ^@^lb@JMR@po$1)Y+O+f^qTuRgk6hw$XB1)yEy568w>L~a>X?zf^ zib+?%#3)!LPf-eC1dg90Bij9WAQKSDhP75HMm9wt;mU<6Qdp)A-l=L?+7Ba#f;S0dk^gpjWs+ zD3+NF-lh$DTQ3(@ic?_`Un!S@Zxm*UKac^%j|uTeTr!FOzbb#r75zV|5s_qwruO)+ zc9}CFJ!l%fZ+>L*{`kN$I5A-hEE2{GHgEc3W88+%KU=@WKC$uYCez431$Zct_tv9$zn3-G%Cf943UTgU!N7ry}dk_dAQ?oZlLSO zE`RyRd8yM9$Hfkd?Coq9E|_m)ZH2{HqEQy+X2=!eHf@1*0JMM)a@!!k0Y?C^G-hda zIt)gi?Vp>kx0Ypw>SM!KI2GiF%B@^;w6Q!MswCgqRYTBm(HyWU*Wbpa`euwQ`( z?ld}ph9XzSBFsm1-tb@LJnV#;e?cw?yRuZ+b(fAQtFN7aB`_E zNo`e`D+i->_KEXu((}=12xIHxlF_CMVxWVt_~h+fx(#$2+s{26mvxzO&0IWFah{&+ zHZ~Ycu#012!K9HY_Ixv&V3Zp+BG}70G0sXSEHbzCdVyK*#_hCN*q4 S8f7`(nZXDyt@tenSosGvnoLjt diff --git a/spider/resources/static/js/layui/images/face/54.gif b/spider/resources/static/js/layui/images/face/54.gif deleted file mode 100644 index e289d929b9552beb7be70329b7cbefb1d0618008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2196 zcmbW2X;@QN8i2zdHUU9)$4j6T6|#|pkg|m=0&O4yDyY*Ek}CwrViIH#8X#;!fP&G% z;({n0L5fgC!J;fx7EuSJ6skCc5iO!DMeEQ(dwT=o^oP?QbD#S>_nhy1>wCU)?zUhi z*_&gHutq$QBVOLB89$TJt%#ne&wlbv@m#0sX>;C<%y8&wJ2chSpS2xY=pHNs@2L{U zzf2e|2=B-Ug`Qu7rmsG0DeB4I(UlVN=EvrdNtcv+MjPfjj@?zpydF6ZJ!*j_uRN|hID75rRAc^~Lwn{g zW4=?uQ?iy3^hE$T7wu+`$(t{dFyU>5G{}eRaK6)a#zgz&_Klf^|wk3%H z&0HOBIJ`7;daF>sZ5x-zo0fVGFF$U1Gu=AVrh0z$2sD4~a)OV#K1W@jyZBwz z-Lm+*M}&*lmC*QwpW4d1vUbi~DTmaT=Gx1kpKnamruP=@8z_ib8me0!se>ji&30Fg zoe*`)7_)6(K(ig==j2ljiifoahK@-F%E0cd2nd3lAmdO*WCV@MX5i6S9W4X`0gIwo zY=F*@ap13yf2x?nO$22?EEvZZ`l9B)?LYy1o-b+_k%eW6X<$4*C|v?Zq=!aw(-XPg zJe0p5;FC&86^I3(j02T32z@IoX&h33!eF+;$<>1 z1%pXRNkON0qD7K849?rzTjK+d_kcA#q-jDKC)GnJbzbv82c=vIUo7K`gn-5)Csvd! z^F_g#u9hGWvsmvO3#I6lg3w%%0F%lQV{m9JMj+7CwW2MRg@gZ1lKn6Y#&mc2AaX1Dp(3{9)lDz3eZvu{qr4iO_ zgN0HVN5}=&;_~6RZ*6gZYD=L>K#oi#i4=*F);fS4FOrF*@ggxmiy#4REDo11)Ce|f zHfXh8Iw;{E0C`M_NC2!5rtsgB0fFF+V_@lcEc1U=zG}<+f2d*LWH6fc_(Qv_iQpd8 z4Bs_BJb8C~Kp}i)B=F(Tf_{7Rdig)UF8%w}FE3v#{=6_hH~akA%+u+go;;p<^shdJ$t6+boHr|CyrNrd93npM~|ouSCoHIR$8JgE;>|Lke`>U$jQ!< zf1a6fFg-0bE+QwwiX@S%Le?MQJk0{<`FA|a9iN|3vXb<S)7PjMJ~WhE@nU!X3VC;NO5X0$~7U$#WEPGlS39 z&90mn}`MmRFg6x+I1XVw*+WNk9Lpx7AVlVoRR zbl_uKZEe*S8+U9{^bUPHJ6~TLa|I(L+0-GKhP1$7kZ3BEKoAbewLt`SI}(WroEI3Q zo$Y_w5SintW9>snreds-dlwkSI?lK0XZs3zx=T0GT$-wEwTkTQcV=W&It3Z6w~dP` zoT66TEY*Esb*=%Rv5mBy8mBAyUEL)P^dDMdnw)wqwD`LHh-|LX&=L{rR$^hGpJiz2 z_j-XH$}HWa|I!vacypk@EJbX-fUODC!zvP{rqxr(LWCAUKi7hm6Og6P3vF+v1_?^7 zw}z|6I;+EU%uPes|4rGyebcC2z;H-TQS)rxf zYik)q%Pq8U)-^#`x@Ig*P99e}`hRa8Q1ex>%_cvw8c=iSc}6k%BZGrohK^QRp4uiz z=X~94glXULAg*F?x2eZYmpXBPmLA}i71`NzR&?5atL_KU%{2`5t*G7P>yO>c5g+{y DWiE05 diff --git a/spider/resources/static/js/layui/images/face/55.gif b/spider/resources/static/js/layui/images/face/55.gif deleted file mode 100644 index 4351083ac8e0e65a64ff362cbd480f2c86eab4fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1971 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 O9M diff --git a/spider/resources/static/js/layui/images/face/57.gif b/spider/resources/static/js/layui/images/face/57.gif deleted file mode 100644 index 0bf130f0d930a1fb72ca83265bb504304cb08090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2705 zcmd_rYc$(=8o=?tHVAr&EryxV4b`qo$MkfjMYWnBM5zY7pcssCsY_gop*9h>q^2$n z;+mvEw{eNVL1;+QkRTYPTe3ZES{2fRy0p}&{$}>gp54`bwS715es7*PpYwd5pR
                    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 diff --git a/spider/resources/static/js/layui/images/face/6.gif b/spider/resources/static/js/layui/images/face/6.gif deleted file mode 100644 index f7715bf52817bc577c0d33cd0cbd17da898848a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2213 zcmb`IX;4$=8plt_AuCxRt64A+37`QYgiSy;A*=!cG=Rvy6qmXn7Zp9^Bp@mfkhUuH z_7b$X)Rj`VQcKDr2-L8NbZ`K@;)Y%jO0g5*CU9r2cIJM&bH1E;KRnOO`}@EDpCl;2 z)h(G0(1CFX7&z~|xG?|Yvkx~8qTlyt4Af^_-7Z|5xzkb+^6D;ie(bZ%Q|B(l(R9!D zW!!(K>*TamvhsqgT1wHkVCuvA^7%f;g+JO|O8e#qeRbWd=7&Pxce%f~jqR+qndl6? zcQjz(ZS~8CCC~5YFMJpry0m(JWSeeW`Shm4i?;0VtBwvg$Yv)7-!yy94@c>=!ubJ@ z#uBSP-_-tg0iAbmGVJ2Zp*nWw8T_>?+pE${(uKgA&g~~QqMvBn2I_ncxFQxNFP{lD znQdl-eKn|iX#Kw1|H`q{-+Mz|w@Kf<8XviCF*WgOw4S1^=InGt{C3@Ms404`jWVIJ znC^?38_6p^{rS_TwBK9U-D<1qU;54@8fn$*(hujo?ns|~AnK|QudO?9RUH^tsG1)N z+*2z5&@b6$4P?2Pz0+`e|3QR2z}aTf*YV~B!6c=Wa3aohveo|e*ds_P8oA}y)7&uj z^S*yQx%FXoQkm=i;N})h+(uvc<(k{vv*pe{__ePlUgNod}5l z0D%7iG{ylCAk_csA<+Q8s2Xci^<7-;}LrVPZZ}tAy%s%rDq6EkM`OUn-EgFQTDV1 zCC?6&c2#I=-#s>rh%qWg7lK2`ij|cV^k^FPZ`g z8FleA7qO!w!!F6u$jBE8O7&$VLYYpX$if6C?(%r-(s&|()_*4Y@d5hr5K{rC*jpAc z?Fot!n!pUU-$=t%+9%-iQYvYC8TbS)l#ogk12Iq}<6=CNpJdnpMJz2*#QQR2{~7(4 z(B&9Hrz|WwT72yIiIUPXRe6Of18K`*riG}ePPY1u4l1(nls&;&wZ2ZjR%Oeyr_pfN z%Iax$b}6??8|?g6*l|^w744ZZs&*2|k6iw1Bn=zan~hJpSC$>lh)0}^CyGyQ@g+LS zDr91rqpxD=3b8Bxuj#+?*YLB!Pr^S)u{5ChIQ*|YVwXwj!#|LoK?&VGMt?Cd=#UJ;_?saCpR8x}tRTLbx{nd?HB1p$3imy*ed|hevm%ey>5iq6z>r*z1 z`0BbM9D%5ds8JV28GCs@J`|~j;aYOb?cI@M#wZhEaTeKPeC@!Ml;gR~lgXGtmz|2M zcao>zY-7fbgq*o3oX?c#@wHbnW8OH3jboTn-Tr78i1>Xjz~f8lu^ zQOkn9KRZ(<-r?+3Amz*H5~S{ZEb?6LTdvRMEi&m$4((E^mXyI{eMbrO zrNpm6tvSs3J11@(E{2b$(=q#bQ5XUHvI1oDEOBSiU((S$0nV~fPldp0ZoS{pxy*x& zvu!4vLqGT85xSP1O$d$>JMGHl@i4B_v6LZw4j0-*Q$;N_+f7t)mgxC0iq&3S19`d@ zbYVYx@Fi01jlh(i5+~*LG_~nFs6{N&)GI?$gzU?QA~i~7C2LJ|p4_LTi0&=VCOb;c z!_@`~Hzz*e_Tkxkqn|)@mS?(*U6MQfSvDVWH-s`z`Klw*Ue1RNONX7|( zoGfPlXcNg;N!0;8z7Zd_Bw62v#sEfNSAqfviiRP+Zz7yX#6wcN4DX_n$&v!LMJGC^ P39Yu8!3k0NI&%Lv5@Qml4c=k1d>olBoGL}ghjF-AtFTt5$2RKfGmm3P;IqSN6Z@$ z0&0|{NEuXiEht(*+u{NRWDyWW!Io69h*S|l0WAV542lPp+B0Xq_n+_I=ef`Q-Rr$d zCUl7)K_uudfc{f;D>SjOvT5MZ_kDMUCUzC;uH70t)pozD|HQWE-5q6Z)7uaC+`2#U z#eu734R?<=PZgf&fBs@7^{7sL_}a;i>7wf1&KnOWr(fj#cw1Yl+js0{^YxLQ{_)Hc zH`2;`ho@$BLsJuz&j%-FzHOdp{dpujxi#y%-ukP<+j6^im+DSjxH~xV^k_|gUFXnm z_nz!4`}zLE$<&hTy(81d8}DTt`&GH`%C_8V)op|I-6Ic1C%??;`o87&Cf!)??~l)Q z4j-u*7#N+-I-zUsevone`iZ*!>ejm@XZ!zs@Or~9qnG=}f4DT1ed@QdXS0o0hvN1$ z>hAurxAf-sErTbU?}3BY_LtxI6x4<9YB^Rnpvv!Q(LHLsHj-R;B_X%t#+~uUv$H)9 zW_OnlR$iG-uNoPCGW}V4$E^oXtFH{-c|4nQ_EBh3lk%JXv)#|4(|TrKee_w3pVzuT zPl>-5&)xyngCK}Lg+%cn0CDF2=R_hwkp8S1m~2l<)}$nv0I*{_KOsFM^K1V09a_FB z_u!$!x%_W-Bpjp?@{E=pN+>LrTNo*YEK=lY8JToObzEB<6GN4)=2=no^kmeS?@!{rat>EKD6a`J8qCBYMf#-4_8JsrXAYTsZtmeu97b0`ts9- z5s1E3vXA&dotwM@&u$I4smH+`L!ym1{2XEK!%_{|C!nWJoOM+r_^gW6R@bN_956-HA%q&3Zxz;LXq) z+T`V;VF-py<{qTqtp>ah1WuDegD4ab_X&;bj1!Wwlw6^Qv$1iAk_iGrjLnrU#;d*J z{o-g|0K&)HgxC`a-oS@V^R18q5W=Pqy(O?R1PR~*pk(uiArK8^&h)icLIN6-ZA>dq+9N6f-_1O)`ZTs)J2 z6mhtP2pAcUfk<);K>FK;0R$ZY0evq9cb@D1Q!rp)=}0@sjmwpufw94CTR|`^zz|%q zcmPF6rM9k8R{>Ij5jF(Db~ccL2)uxZ^7Dh?5lAYGhWP4gv9CVx%+pR5 zd$lLxLZwILj);pENI{+{4T9$%Cw|l}dW+>t2{ndp9tF)qxY6Efl5ye`(xQZn= zHF)2wooZmf4Mu2ExKN}Jh&V9aL+BfM0AefLL>f1@^&l)#6Ui3a3w?kPMlb^95+njv zc=+z4V{J~70AmF#NBUCS1Z*5|t^qKNMn-Z%1=w;r4Cn$3-CyCWh{iC3F2@5areuTK43gCI@!wwv=Z`+jG$VKm22=tALVW zXVDh5*HNY?wq~^?I7l9uiLPNH!Vbi4;f zOL;WrSBn-I4ctJ8Td?+_>yvIHESH#}u>ZEAR3x^m^`h7F`!c=SNlSxgR<4Du!!Rfo zvGji7hD-VMkLzx(!WG4&lCcgRQy(ywB-&vU(Fgp)QCVg?=TW%maO>4TPEJZr3L&E~ zfENd0*idGsz~0K0=Z-`Z{TMijdv1`@6~_Vuz)=;jc=4_%4icbIDA5TY07%t52?LJWp=8le(%?=GHu=G zeQOX%&(spfmBtvd!|SPD0sakla@4BeSiNLTaxB$FrIIu8RvDRAQL!>DLxh$vv|3g$ z)m$sGUFMvpm6%gWEER_;LzXc}RB9fZD)=ssr=&u8tBc6Wi%PPr2qvn?u}LYZ%VqR3 zU7mv4^Q-PhI;MKy_oZe(vi-LXj|`JNKl>Mz{prNh$q9Oc!wUztdA31lf4%2nh#tc_ zAOVuV=HyG>mLT5;)Vx%{4Mpdj1FSg(>i$B3+Y1VG$eDzT zL&N96oCGMsOATgbh+?sKNA3SF0sk!t79G}=cMZgOZ6IjDK&)2=N{XidIUq3>8ORPS zI0%%9Y5~mkXqlCcmo`+HS67ctE2Q2EM=@uFSHIE9g!+IsWO9Ap1IM%xf; z_hyTjGn;N_GMWr5f$7b!0yfRHJxrT?+l2S(U3TGw!ETp+O`^5qOsO6Nl4KWquX^5E zWGQ(s`+NS>S^!Q6-fAtpcUueZ-PQu2MYV+qR13YO^WEA47HUhwd~LA-FKbJ}3&V+& z3q(TL=TYI6C5B5~0}R~<(iv^}OouAYl+y-u`bW`QqA;gQIxJ8wUm7^oYmiGg<~gSZxkxNVLV?59FzOd{fBnzm7Jk0RR91 diff --git a/spider/resources/static/js/layui/images/face/61.gif b/spider/resources/static/js/layui/images/face/61.gif deleted file mode 100644 index f092d7e351cb195eaf707dbec74d32ced42f432f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2495 zcmZvddpwls0>@{J%gYR7j4+up;~ps-g^~<|amh}yl}_7Y+vT7Wvfa*3b5mn-Xw(QEPFk@m^%H;^Pm=R@3$tBn3-FJp|Pv^7m^UwSD_xb+5kGGGPlXIvZOb_;w z4hu>WRu9bO^{zf1oIGFNTQT^7Th-I``h94IsJwfkq%pUy5n8e4q73P$oDwNA;h+TRVnUA`_FJACO6c)M++_wCByGB~^fmi{J_E`ZV%ux@x^UqeupTcd6~3D0Ton_H_0dMVc-Ceds;7_7Op3fM?JF4-(bWew!@<4uipnOUf!5Fgk22^bcK<9t@@i zGUzOJ!o^FRL@r%h`{;L9cxhLT+S;;hHGHjda`bQ9$hGqE`;ukr>qwwg1iB)Ba1E>= zIQo{*H$+bQXPwkpP7f2#7?1(FWFz!_ND+*?I0CmU!Y%?{_}D zgB9YeWcn`vZu)Kp4uqR3Ift;0s3_^+y^owVpxk|gF^N>x?KB?ea#FcF4ONmD~V zOSFv{O=Ol(xcPUxJUjIaHyf_N$Ui51Du&lY#~(285j^#0 z+p)y$5wMc&90YA8OG+(0$;KU54((qFY0GR#-E>RB_@<5BWT5+m-*`@lH`jD>3>hhz zO~73TLx7mVd9In)PVrDkF?$jV7g=gyLt50aTFVsNwqKcC>~5umE*o)@KCH9I?^-I1 zneX=3MJU0PVLC93;v#%wA)ts0iChFHIM&yQOGI(gh+HEG+aj=;={M8#GNt0Ik;)Iwz)ZYnw*K#u=Ajy&HMWM(0U$r z8WcwtvX<6=aIbLZ?X}1*j+C92WHcJL^@OhOiBq^avgOX`vt{m75!@Q6lt`x;`D%um z?Jn0NMjJ)kEy>0Fh*CkaD%CyCN!$K7PU~y;^Q(&xo3w3TlqNDEHdnE60n`H)%qPm< zipFzoO~l+H3u8)cb!gM39T?sXK*x=f9A)oD8L(0jeU7z{R|c?*%fVLe>6YAlQ!cOi zD<#NKxt}PxpPyiX%)1Dg$8`<72${F8-8KH2c1C;@iq9t!`EpKj;qLyZ5UzYpw)%!O z*%YSPZ0>k$J(D9)C5odx@fG2tVqgz{w$-kxU{cj& zQ`HSX+q^LqYmT2w6K16$uolXvd78?9fsqdv4jq^pfTBc1g@vvj=GIqKdz z>}2-8ad;CGJZ?`4i9pK^M8;a*G;+zN5lBHrIj+bG*TAx%sI?v6t5pDvGO9(PYHNwa z+K)gxyA(j%)_@KTe*$#s%{tI@xp^zAa-P0oCN(TEbFaCMl|SI##?#UGbFB8zSkvTV zjm{^`NJxel)l|G4qskPctFUi2#n9TR60Z&Clq&4QMUFn{ETAVB8$^~0ZmLoXA^Ubj zLiQEzqAf%A-9GlPRI$uTx_Mb%Q!(?Is=w-kvOI#N_TQnIhg!$-^3&(&W4wIWDJ*=n zD>5SH_I#u^`C373Y>nE|@)|V_fY&IcAkhG}#wm=P!cdCyN*22z zDC{HyrbKL8n1Bb&E>X^f6c)Fp6N*t=3SeBV&1Ae2C8p%%Rb_kbbSG1!s$q=Y{1YZr zBE}%dY#mbQiz^%}>TvCk?!9erOiccHgSq00G{hJ8OKsB&D?W|QM@i-wbUNU@UEhku z(%0Ya4RFKvAzk(Msa{jvr{{{?7f$y@X3%k4b#LjO!qIY(zCJ~CV>M)K&2~J2p6kP9 zd8t(**0*4*=}hVpw~ zk>4iKC;9E}`7^(Cw7Eno`6R#7|DRt=YQ#S*Joc_vr63V;(D;a;NlNliR7Kb&hNt4? zZ&a6}DrHbrO4^{Rl(}$cpsH*=IpmK)Kvi+D0P^xn16W1s6NxyeDm*OpGcqqGyy?>J tNMrII%;*&@oa8uz=YCKFxNClV+=*Obvw`TNkx8belN0|*V!~j%{{ZDj7zF?T diff --git a/spider/resources/static/js/layui/images/face/62.gif b/spider/resources/static/js/layui/images/face/62.gif deleted file mode 100644 index 7fe49840bf69219fa40585741f901fa0b187c044..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2017 zcmb7E2~<-@6b%XriWPA~E&7S5U?CeMKrqS@kf@<3s92X0ldnl3i^)eK*p}kPCV~ix zfJKFXfD#rh3MxeF%Bm~@$`%k=RFE|W0{x-ja#}p6bLO0xdGqdl@7;N4Hc}idt!Rr7 zix6#oh~B}G&K^Ze*N58H!N&G6xk4GARi+#rdr?2s-mN$Zt8|D2&!)bX9 z@fj60tpjNVjWOA^RZV?0ErU@hrAfEy&WTE&RlgllC~rT09U&^daj!XAEKSO4Z0OE?(wdM}k@xJCRMvO;(u1r*Sz~*@ zq`Y0$DZiRi^Q5v@Qr1~s|L**?@+fgtLCM?PXKk_BwY9CiaoN&K;!4HHXkmFrbBA21 z9KBQYI=!&*?6v1`Er`#C!PsnP2RB!HTNei$3Nu{|zJg8eR2P6ugJ|%&ZiA3VqkDo7 zupd0g;*gNtdH0b3i$Ox}#8WX;o;}E9Ir;KIS6^p0y00hQih}inbI*>EI=Tju;zFI0c!%_ zFjyQK15bh})|`kZ5OEg3#6ZH)_>2R@ZDhxZSn!F2WI_;+h(`PP_@I2uP+a~&G}g+> zO2vW0nZh2Xf+HM=CN$*;R!%aIK>?l5;z2Af2T(E6_H(@<5)#hzpAy)-kF*>CYP=j2 zoy$fGX*@I*g;A9>=}4u1-IdM$=q-S@fuHjIPhx@F5gv%%1`4>|d^!lbuT+KN5$*XP z4dU|MxLmJE6^PHtOFLFmUsf*4rhUJu(PwYFgL?aV#!>(Hyh+YlUT+lEN)7ysu|ckI5HXJ zvkrp{M?RMgj2BI0O_>YMaZ0`kEMw|iFjHdDa58As(|-2UlP0)-RNIe@3m-nVKFERl zoewv*+SsUaWLWV*J~TMc-`D%Tr~BR8H(i|_?XTNjwYJEbn;IMH|EjC4kyck#R=j*s zURGLCT=e|e($a^f-#b&cY~Dn1+UV#&wzspj*|46p z&YEatX+gl7o8hn+G|JTEyS2tfYgVr^T!}OQRxH>5cG=P;dW#n=TrgjEp3dBF=4j8J zrKLG@hKBm|Y4G=8@IhT`0m2VqqWVNspEzRXh`(RJvEwIBo(c>K4hiuvHMQOtdR#}q zFwx(=H_}f>UlZqsTW+Eky2fa^dRm$zKn^rB_L`5MHH*J~PM-F`%<2aO_;S@38RMvJ~yY(nXQh9H$#C+X_N6J7*$<3$?X(0mkzJForwl@3YZR zD(7ypEO`2UwUg#jKaV}(l2@CjA#_$wOK5tyC3Nl~OJ>c>w!&a-TDZC%g`ap*7qR1L z3eZjo)z+#wr(=^XLRhaYF-#~^4@uA#A)`uxOotZCF_r@COs07jYnjoR41IHx^3z(23>`O(`)4x0N+N9Ug7`A4=;!*$FD3vz)I&(EtPkek$P3WH+wR>*i|S;@u67A}zhS~gjRlsT&q z>2ep_vPiupx+%s62_mZ6VYfJn&1J1cwzHwYdCiDZL26Es7v)%gW`st7wp5Hko~cZ8 fzaAzQ7Zd=~XY>c^Z;pPWn-TRQb#LAp9fbAYHD_Zj diff --git a/spider/resources/static/js/layui/images/face/63.gif b/spider/resources/static/js/layui/images/face/63.gif deleted file mode 100644 index cf8e23e5b2e83bf4f383cd994510a7a04a74f57c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5871 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 diff --git a/spider/resources/static/js/layui/images/face/64.gif b/spider/resources/static/js/layui/images/face/64.gif deleted file mode 100644 index a7797198af0f3bb98361b1b8737784d0a8c2cba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6448 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 E1xN?}xc~qF diff --git a/spider/resources/static/js/layui/images/face/66.gif b/spider/resources/static/js/layui/images/face/66.gif deleted file mode 100644 index bb6d077504e3b39871f72150c1f5fa43d4e18bfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3029 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 n_4QGfNp-c(#;#v)!?fJ=R?7`D2^Hm diff --git a/spider/resources/static/js/layui/images/face/67.gif b/spider/resources/static/js/layui/images/face/67.gif deleted file mode 100644 index 6e33f7c4f762b5c4eda2a630793d681345423734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2701 zcmeHHX;@Qd7QP`wAR!P4LKMNv4ag!{fe<2l0wNMfff>RmQ$ung5we&B2sE}NQQ0hl z0##@QM5-uS7zc}jV`Pm>RVw1%Vylj=ZLzi0Qai)kFhb|YIKSsdzvp|N`+eu0_dVx) zXIZ;0ksTp&2i$>2dSD!leuTm7o^ZHfYuo>&Z`mPt!x{U-cRY5C*l#mC41LSmbHT;( zUGkI2nA2#Rrb`|(j*iO1cHQ?pn>;WFZ!LY-f^QrJJ1>S+WVvi^!dIWSuQ{>0b;9GY z9lH1^R@7iOPITRW)o1$v;bH{m?OsCtkax=nP1QzdzT*05X7UsP*FHsTpY$DAMmjku zHJ&8a40_cKyS{&MMd$Uv!e*DAJDlB@v7OgebU^t17Vx9nkfdcv>K1JA{$-LT+^>20 z*PhFU9}1p=KA*p=ujus4GGL#0dDncr?3a|ZhSRZ=1VYCp|7s4ldSK}bF7J8PhFLnj z>w4I+JCvP6u7>XATl;W>Unkd$;tqWpd@ms2%JYp!ZuyKpf*;VCr@mm{{^?CcEAB@( zx33b`9=e<|HY094!#O-AZXH=K-Q{|9M)S;X)z$<44FiFZSoG=!L84kW$5MoU&$>XH+5?|RuZc&g_t5tDm zw33n%YDoxHsm`Y{A|fKJ984w!(V%Eb6l7NT zNFj#T@uDDvgDR6rIAIZS^zd+cNJ1Es%U~oh;#mwPJ3cOs7akWE9~Kw7faNL0MRHi7 zUBF6y!-l>VYb^%33bD+C)v{t(lBib7!TF#$ve)~s zFNl!(u^tx-7r88!KCD3MU5ykrYVM!^`1R#4vp>Ih{?m`oe)#_B%y-{@^W^KV9{>H( z!v|k}aew;r&+gs5bNklK8&lUOuYEdk^~&W>E?vBE-ZDNmIx;+T&V2T7X9fpOpX&ek zWZz#;{H3?&qvOZAj~?kdeCWf@gB=Ij+gkU3@P144zP;}?H8$+oU0=7W_T8N|)m4=h zJGO5#84cy{yuDTbR#~a8q_{|{QEyQx74pJ@%`$0z9xM^(iZ;FZ=bVij{**1u`r{um zGt%D>q^0sx)+et^TAP@_xD9-fyB-6$pG36_y?M{(1_q6hr8^^LS-#_kcH}58IGV?6=MdMD+5tUHk&0(>?g&0>`2iA*g?VMdC zmdaRm(jLeZy-5U`hE1NFpy2)?1KNnSCyiL>(s4(Os~bURs4yDQHnyRo9cFXYNIGc+ z2pWb^k*-f4kC~d!HQq2r>t@r}blF69IS`U4(--l}tGJdA<(@ATpV^Rn%cCu8r)H*y zXJ*^F24{JO`Q$h_FC=Fvu=G`Oaw*$$jg{LdK^2uoN{&7$7w~EV$Z4s1O07Phh&(;P zi7c;3?jY#3wHQ5$fI{nY1UVqkhjNOl%+DnD^*I6KUdCi}PyuZ8SChsXNkzrQMJbbP z&$HsoB}DcV&l6UA7AQy$)S2Q?E>}s-%cII9FJ&8%K{F=ojVJH2ccCY(D4jSsf~(-W zdI!dCx2=jSjZe8Bl8{_!$~YioOMS3AJ)9Y-*=>w5H{8ngl|A$y4q_@wuWq_~{zQIS zs9x9Ieyv05ygZZ{kkf2Pb@4V<6V}B)v}v(%;|n6T7^|ynU?vzJvZJP|MYuUd2HD`6 zOi+Hm&_WL2x-moYw(a$Kc+P|g7G~-Mh7)u*?!>io2`ZH#lbLZlN1QCU3@6uz?6Qi{de e&Ns&5+yCAe|96dnSxgQJK<1box?FDn*8B_Be&pBy diff --git a/spider/resources/static/js/layui/images/face/68.gif b/spider/resources/static/js/layui/images/face/68.gif deleted file mode 100644 index 1a6c400d2aee3c2bf384ea98105ea143a7be97a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1424 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 ig6vPE;(vp8vN=19VTuwMWT7@8^o diff --git a/spider/resources/static/js/layui/images/face/7.gif b/spider/resources/static/js/layui/images/face/7.gif deleted file mode 100644 index e6d4db80572a8321fa233d7efd82636fd896bf49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3398 zcmd^>X;@Qd7RPTELI_!bkd;Wn76gSL8VCjmtHxL~xKN`N+n}hegVj>h8D8>cxj_Xi zSjVMQtw_~*7^&k@lqw)n5L%Qf;?}a%$_S(4Sc^ztZUR`_vClK#=R=++pYA>9{D0^C zZu0D;h{zS5h$r$BKyDljeeg~Gzpv>>pPpV9$sVltd~rxR`uyh5zR4p4e|vFC+O#|H zv~`i~-j?S%p|-YZRTls5(~6<90^7Bykw*t_{yoLk9^2PA*Vd`G-JE0VS^KObdni9- zrJysV)|MRV zaBJYG?OEYU%}|A8=;|Avr3>mxX52f;8N5DkxF+IZrSRUFsV^@0bbS{2%grTUf2o$GyCOZ|TCDz;sYyO{G90Ih5#fO`;Ud>i6G9Sc>o%d*M-cshOA3A78FdM{l3e3 z=iv1o5zA&zFEoa5a1lOUE(8}Z0nH~Xq%>s4f(3602*DW{)Gyc(>Ix$sVT<^*41ecb ze}Y$%isPfk8w2pXi+Yb!A2;jyVLW~SpYku+tU=qPli8pW=;!x4wjSv$pR&(F+B z_YEXRt-{9|pf4I)HIeQ!AzOyucb@(bM=` z(PEI~p50sx_;3Nc9 z5xKbS5K0$YDtkL?YQ-f1a9u?2idnO)BD(NSXl0^lvMR{K`%0sstSMecA>VpCmWdB^ z@(>jtRYRiLFa{*W4kQjCV$D&p_HwZHqNP}SnKaZqq4a2a~w^|4;5dy4mPab+0 z@VU$0XQ*Ye@MVyO=Y)qZjsZ(tUFW#U_<&P=UIrJ=CC(>K`nsukk{Tw!D5MIx2HKYc zBoPM^@!4k+E#||T@_s1pJ1iuZQyxDx{C3t%$E@qIVmLUg7y%7+kPk8Nv2wxU0{nWd0|dEHQp6|+bed(ZJD^M+%YPXeg< z6m|}mqJlK4fJ}`HEkT=%@he;Igy!|N?h2UV^j_`sm712_GyXK<@;ive8awt1M6WUg zUttK?8A2_YhYx{qhAP?cw+z`4I>+BPh7d+j(>cJu#l0HCdkIiacX&I7&!dHl0sG-& zcVOoSC*Xn9XHL@Yp4v%)%FVsZx5?Y+bfE|TY}bM0V=;8$(mRb;uk6Bmr5gIVty( z*3rs1?|2L_`#PWd<0PV`j&%l^G`RF|{_l-Q8s7*$=lf0> zkGpU#m=7kwKH|ekY95k6Bt{`{aA0Vi1JVHSj2pOC0oIHR4z%rp`lwn0V+d)tfSZtNXQOIQR zHj`(XLTM6{ghJBRI5GJ!nW9xHNg7j1%Arc&2DBuK6Ds+~ISQ&PHt8;SYBft&kjUgWbx@~;SRvvy;0@rWbt?pvmb>Pe*9vuRaX&t0 zpsy_?GY`Z8li6Yl&o-@Aps9d^x|`BSg`mhHHY??HI$5!LwOF}-zmP;(A^coUP7^CC z=zxBl0!sHE*NI6dPYcOaCZ$lR)#3Xyby_@m+qPkM0*+oFwZGrfJm%=S6h3H2pyl(Iu2|m8IIiYIUBrX7AZE zQl{fthK+q4Onm%wVLeU=8N4)dA=~m>BSSoI--MB&!^qnlLWT|@e>5)S^S=`^_|?dr z_VW*ZRdP3`WZ-bJC78J}iSdy%zMZRZM<^b?EMkV;0463JGl1C78#6$y%Gq5-Z~1Y> zlg?IxSn*`{`mBpJyApMu4sSXUhl2uoM90$bmD{~p^3kWU-ihR^iLgxn=0E@wiTV!_ Ch@v0> diff --git a/spider/resources/static/js/layui/images/face/70.gif b/spider/resources/static/js/layui/images/face/70.gif deleted file mode 100644 index 416c5c14a19fbdaf8fb8d6baf5cf7e31e54f751a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4590 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 diff --git a/spider/resources/static/js/layui/images/face/71.gif b/spider/resources/static/js/layui/images/face/71.gif deleted file mode 100644 index c17d60cbd15e80d83629b2220b562a224eec5554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5304 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 diff --git a/spider/resources/static/js/layui/images/face/8.gif b/spider/resources/static/js/layui/images/face/8.gif deleted file mode 100644 index 66f967b48da173b68cbfc92986e4426ea35ade74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4050 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 JEmCgizW{zshWG#g diff --git a/spider/resources/static/js/layui/images/face/9.gif b/spider/resources/static/js/layui/images/face/9.gif deleted file mode 100644 index 60447400d31b035f56554b29af1aefc76bda1698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4221 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 diff --git a/spider/resources/static/js/layui/layui.all.js b/spider/resources/static/js/layui/layui.all.js deleted file mode 100644 index d3ae41f..0000000 --- a/spider/resources/static/js/layui/layui.all.js +++ /dev/null @@ -1,13 +0,0 @@ -/** layui-v2.4.5 MIT License By https://www.layui.com */ - ;!function(e){"use strict";var t=document,o={modules:{},status:{},timeout:10,event:{}},n=function(){this.v="2.4.5"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,o=t.scripts,n=o.length-1,r=n;r>0;r--)if("interactive"===o[r].readyState){e=o[r].src;break}return e||o[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),i=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},a="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,i=function(){var e=function(e,t){layui[e]=t,o.status[e]=!0};return"function"==typeof t&&t(function(n,r){e(n,r),o.callback[n]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?i.call(n):(n.use(e,i),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":/^\{\/\}/.test(y.modules[f])?"":o.base||"")+(y.modules[f]||f)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||a?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var a=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?a:(function p(){return++y>1e3*o.timeout/100?i(e+" timeout"):void(1989===parseInt(a.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),a)},o.callback={},n.prototype.factory=function(e){if(layui[e])return"function"==typeof o.callback[e]?o.callback[e]:null},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,"function"==typeof t&&t(n)},void(n.onerror=function(e){n.onerror=null,"function"==typeof o&&o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?i("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),o.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o,n){if(t=t||"layui",n=n||localStorage,e.JSON&&e.JSON.parse){if(null===o)return delete n[t];o="object"==typeof o?o:{key:o};try{var r=JSON.parse(n[t])}catch(i){var r={}}return"value"in o&&(r[o.key]=o.value),o.remove&&delete r[o.key],n[t]=JSON.stringify(r),o.key?r[o.key]:r}},n.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:i}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;oi?1:r/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
                    ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
                    "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期
                    建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push(''+n.timeTips+""),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push(''+o+""))}),e.push('"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));t.elem&&(n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3))},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length必须遵循下述格式:
                    "+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"
                    已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html(''+n+""),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.nowl.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.yeard[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e=t&&e=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["

                    "+r.time[e]+"

                      "];w.each(new Array(t),function(t){i.push(""+w.digit(t,2)+"")}),a.innerHTML=i.join("")+"
                    ",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), -l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
                    a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
                    ","
                    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
                    "],tr:[2,"","
                    "],col:[2,"","
                    "],td:[3,"","
                    "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
                    ","
                    "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
                    a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
                    ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ -for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe});!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
                    '+(f?r.title[0]:r.title)+"
                    ":"";return r.zIndex=s,t([r.shade?'
                    ':"",'
                    '+(e&&2!=r.type?"":u)+'
                    '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
                    '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
                    '+e+"
                    "}():"")+(r.resize?'':"")+"
                    "],u,i('
                    ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
                      '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
                    • '+(t[0].content||"no content")+"
                    • ";i'+(t[i].content||"no content")+"";return a}()+"
                    ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
                    '+(u.length>1?'':"")+'
                    '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
                    ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
                    是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='
                  2. "+(i.title||"unnaming")+"
                  3. ";return s[0]?s.before(r):n.append(r),o.append('
                    '+(i.content||"")+"
                    "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)});layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
                    '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
                    ',"
                    "].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='
                    '+(t.tips?'
                    ':"")+'
                    '+(t.range?'
                    ':"")+"
                    ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
                    ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
                    f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['
                    ',"",'3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','',"","","
                    "].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['
                    ','
                    ','
                    ','
                    ','
                    ','
                    ',"
                    ",'
                    ','
                    ',"
                    ","
                    ",'
                    ','
                    ','
                    ',"
                    ","
                    ",function(){if(o.predefine){var e=['
                    '];return layui.each(o.colors,function(i,o){e.push(['
                    ','
                    ',"
                    "].join(""))}),e.push("
                    "),e.join("")}return""}(),'
                    ','
                    ','',"
                    ",'
                    ','','',"","
                    "].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:fa()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['
                    t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)});layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=t(r+'[lay-filter="'+e+'"]');a.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value===t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e)},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),x=i.find("dl"),g=x.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=x.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),g.removeClass(o),y=null,g.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),$()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||T(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},$=function(){var e=x.children("dd."+s);if(e[0]){var t=e.position().top,i=x.height(),a=e.height();t>i&&x.scrollTop(t+x.scrollTop()-i+a-5),t<0&&x.scrollTop(t+x.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),x.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=x.children("dd."+s);if(x.children("dd."+o)[0]&&"next"===t){var i=x.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n无匹配项

                    '):x.find("."+r).remove()},"keyup"),""===t&&x.find("."+r).remove(),void $())};f&&k.on("keyup",j).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){T(k.val(),function(e){d||k.val("")},"blur")},200)}),g.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['
                    ','
                    ','','
                    ','
                    ',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("
                    "+a.label+"
                    "):t.push('
                    '+a.innerHTML+"
                    "):t.push('
                    '+(a.innerHTML||i)+"
                    ")}),0===t.length&&t.push('
                    没有选项
                    '),t.join("")}(r.find("*"))+"
                    ","
                    "].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['
                    ",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?s[0]:s[1])||"")+""};return t[r]||t.checkbox}(),"
                    "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=u.find("input[type=radio]"),n=function(a){var n=t(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['
                    ',''+i[l.checked?0:1]+"","
                    "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"
                    ","
                    "].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=t(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),v=e.parents("form")[0],h=u.find("input,select,textarea"),y=e.attr("lay-filter");if(layui.each(d,function(e,l){var r=t(this),c=r.attr("lay-verify").split("|"),u=r.attr("lay-verType"),d=r.val();if(r.removeClass(o),layui.each(c,function(e,t){var c,f="",v="function"==typeof a[t];if(a[t]){var c=v?f=a[t](d,l):!a[t][0].test(d);if(f=f||a[t][1],c)return"tips"===u?i.tips(f,function(){return"string"==typeof r.attr("lay-ignore")||"select"!==l.tagName.toLowerCase()&&!/^checkbox|radio$/.test(l.type)?r:r.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}}),s)return s}),s)return!1;var p={};return layui.each(h,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];p[i]=0|p[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+p[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(c[t.name]=t.value)}}),layui.event.call(this,l,"submit("+y+")",{elem:this,form:v,field:c})},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
                      '),s=o(["
                    • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
                    • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
                      '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})});layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,layui.hint()),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,u,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)},config:t}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u="table",h=".layui-table",y="layui-hide",f="layui-none",p="layui-table-view",v=".layui-table-tool",m=".layui-table-box",g=".layui-table-init",b=".layui-table-header",x=".layui-table-body",k=".layui-table-main",C=".layui-table-fixed",w=".layui-table-fixed-l",T=".layui-table-fixed-r",A=".layui-table-total",L=".layui-table-page",S=".layui-table-sort",N="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
                      ','
                      ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
                      ","
                      "].join("")},E=['',"","
                      "].join(""),z=['
                      ',"{{# if(d.data.toolbar){ }}",'
                      ','
                      ','
                      ',"
                      ","{{# } }}",'
                      ',"{{# if(d.data.loading){ }}",'
                      ','',"
                      ","{{# } }}","{{# var left, right; }}",'
                      ',_(),"
                      ",'
                      ',E,"
                      ","{{# if(left){ }}",'
                      ','
                      ',_({fixed:!0}),"
                      ",'
                      ',E,"
                      ","
                      ","{{# }; }}","{{# if(right){ }}",'
                      ','
                      ',_({fixed:"right"}),'
                      ',"
                      ",'
                      ',E,"
                      ","
                      ","{{# }; }}","
                      ","{{# if(d.data.totalRow){ }}",'
                      ','','',"
                      ","
                      ","{{# } }}","{{# if(d.data.page){ }}",'
                      ','
                      ',"
                      ","{{# } }}","","
                      "].join(""),H=t(window),R=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+p),o=e.elem=t(i(z).render({VIEW_CLASS:p,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(v),e.layBox=o.find(m),e.layHeader=o.find(b),e.layMain=o.find(k),e.layBody=o.find(x),e.layFixed=o.find(C),e.layFixLeft=o.find(w),e.layFixRight=o.find(T),e.layTotal=o.find(A),e.layPage=o.find(L),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(b).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
                      ','
                      ','
                      '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i=r[t];i&&d.push('
                      ')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](y),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;i.config.data&&i.config.data.constructor===Array&&delete i.config.data,i.config=t.extend({},i.config,e),i.render()},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.layMain.html('
                      '+(t[n.msgName]||"返回的数据不符合规范,正确的成功状态码 ("+n.statusName+") 应为:"+n.statusCode)+"
                      ")):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.layMain.html('
                      数据接口请求异常:'+t+"
                      "),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,i.renderData(c,e,a.data.length),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=[],p=[],v=[],m=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(a,l){var o=[],u=[],f=[],m=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,h=s.index+"-"+r.key,p=l[c];if(void 0!==p&&null!==p||(p=""),!r.colGroup){var v=['','
                      '+function(){var n=t.extend(!0,{LAY_INDEX:m},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return m}return r.toolbar?i(t(r.toolbar).html()||"").render(n):r.templet?function(){return"function"==typeof r.templet?r.templet(n):i(t(r.templet).html()||String(p)).render(n)}():p}(),"
                      "].join("");o.push(v),r.fixed&&"right"!==r.fixed&&u.push(v),"right"===r.fixed&&f.push(v)}}),h.push(''+o.join("")+""),p.push(''+u.join("")+""),v.push(''+f.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(p.join("")),c.layFixRight.find("tbody").html(v.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return c.key=s.id||s.index,d.cache[c.key]=u,c.layPage[0==o||0===u.length&&1==n?"addClass":"removeClass"](y),r?m():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('
                      '+s.text.none+"
                      ")):(m(),c.renderTotal(u),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.loading(),c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e){var t=this,i=t.config,a={};if(i.totalRow){layui.each(e,function(e,i){0!==i.length&&t.eachCols(function(e,t){var l=t.field||e,n=i[l];t.totalRow&&(a[l]=(a[l]||0)+(parseFloat(n)||0))})});var l=[];t.eachCols(function(e,t){var n=t.field||e,o=['','
                      '+function(){var e=t.totalRowText||"";return t.totalRow?parseFloat(a[n]).toFixed(2)||e:e}(),"
                      "].join("");l.push(o)}),t.layTotal.find("tbody").html(""+l.join("")+"")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},h=c.config,y=h.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},h.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[h.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,u,"sort("+y+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(g).remove()):(i.layInit=t(['
                      ','',"
                      "].join("")),i.layBox.append(i.layInit)))},F.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},F.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},F.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e=e-(t.layPage.outerHeight()||41)-2),t.layMain.css("height",e))},F.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},F.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
                      ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(x).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](y),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,a=this,o=a.config,c=t("body"),s={},h=a.layHeader.find("th"),f=".layui-table-cell",p=o.elem.attr("lay-filter");a.layTool.on("click","*[lay-event]",function(e){var i=t(this),c=i.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
                        ');n.html(l),o.height&&n.css("max-height",o.height-(a.layTool.outerHeight()||50)),i.find(".layui-table-tool-panel")[0]||i.append(n),a.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),R.trigger("table.tool.panel.remove"),l.close(a.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return a.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
                      • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var i=t(e.elem),l=this.checked,n=i.data("key"),r=i.data("parentkey");layui.each(o.cols,function(e,t){layui.each(t,function(t,i){if(e+"-"+t===n){var d=i.hide;i.hide=!l,a.elem.find('*[data-key="'+o.index+"-"+n+'"]')[l?"removeClass":"addClass"](y),d!=i.hide&&a.setParentCol(!l,r),a.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['
                      • 导出到 Csv 文件
                      • ','
                      • 导出到 Excel 文件
                      • '].join("")}(),done:function(e,i){i.on("click",function(){var e=t(this).data("type");d.exportFile(o.id,null,e)})}});break;case"LAYTABLE_PRINT":var h=window.open("打印窗口","_blank"),f=[""].join(""),v=t(a.layHeader.html());v.append(a.layMain.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),h.document.write(f+v.prop("outerHTML")),h.document.close(),h.print(),h.close()}layui.event.call(this,u,"toolbar("+p+")",t.extend({event:c,config:o},{}))}),h.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||s.resizeStart||(s.allowResize=i.width()-l<=10,c.css("cursor",s.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);s.resizeStart||c.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(s.allowResize){var l=i.data("key");e.preventDefault(),s.resizeStart=!0,s.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();s.rule=e,s.ruleWidth=parseFloat(t),s.minWidth=i.data("minwidth")||o.cellMinWidth})}}),R.on("mousemove",function(t){if(s.resizeStart){if(t.preventDefault(),s.rule){var i=s.ruleWidth+t.clientX-s.offset[0];i');return n[0].value=i.data("content")||l.text(),i.find("."+N)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(f);if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
                        ')}};a.layBody.on("click","."+g,function(e){var i=t(this),n=i.parent(),d=n.children(f);a.tipsIndex=l.tips(['
                        ',d.html(),"
                        ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:a.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),i=e.parents("tr").eq(0).data("index");layui.event.call(this,u,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),a.setThisRowChecked(i)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layTotal.scrollLeft(i),a.layFixed.find(x).scrollTop(n),l.close(a.tipsIndex)}),R.on("click",function(){R.trigger("table.remove.tool.panel")}),R.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()}),H.on("resize",function(){a.resize()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var a=c.config[e]||{},l={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],n=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(n.href="data:"+l+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],a=[];return layui.each(t,function(t,l){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(l),function(e,t){n.push(t)})):d.eachCols(e,function(e,a){a.field&&"normal"==a.type&&!a.hide&&(0==t&&i.push(a.title||""),n.push(l[a.field]))}),a.push(n.join(","))}),i.join(",")+"\r\n"+a.join("\r\n")}()),n.download=(a.title||"table_"+(a.index||""))+"."+i,document.body.appendChild(n),n.click(),void document.body.removeChild(n))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,i){i=i||{};var a=s(e);if(a)return i.data&&i.data.constructor===Array&&delete a.data,d.render(t.extend(!0,{},a,i))},d.render=function(e){var t=new F(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(u,d)});layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
                          ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
                        "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a",u=1;u<=i.length;u++){var r='
                      • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
                      • ":n+=r}n+=""+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)});layui.define("jquery",function(t){"use strict";var e=layui.$,i={fixbar:function(t){var i,a,n="layui-fixbar",r="layui-fixbar-top",o=e(document),l=e("body");t=e.extend({showHeight:200},t),t.bar1=t.bar1===!0?"":t.bar1,t.bar2=t.bar2===!0?"":t.bar2,t.bgcolor=t.bgcolor?"background-color:"+t.bgcolor:"";var c=[t.bar1,t.bar2,""],g=e(['
                          ',t.bar1?'
                        • '+c[0]+"
                        • ":"",t.bar2?'
                        • '+c[1]+"
                        • ":"",'
                        • '+c[2]+"
                        • ","
                        "].join("")),s=g.find("."+r),u=function(){var e=o.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+n)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),a=i.attr("lay-type");"top"===a&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,a)}),o.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var a=this,n="function"==typeof e,r=new Date(t).getTime(),o=new Date(!e||n?(new Date).getTime():e).getTime(),l=r-o,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];n&&(i=e);var g=setTimeout(function(){a.countdown(t,o+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],e,g),l<=0&&clearTimeout(g),g},timeAgo:function(t,e){var i=this,a=[[],[]],n=(new Date).getTime()-new Date(t).getTime();return n>6912e5?(n=new Date(t),a[0][0]=i.digit(n.getFullYear(),4),a[0][1]=i.digit(n.getMonth()+1),a[0][2]=i.digit(n.getDate()),e||(a[1][0]=i.digit(n.getHours()),a[1][1]=i.digit(n.getMinutes()),a[1][2]=i.digit(n.getSeconds())),a[0].join("-")+" "+a[1].join(":")):n>=864e5?(n/1e3/60/60/24|0)+"天前":n>=36e5?(n/1e3/60/60|0)+"小时前":n>=12e4?(n/1e3/60|0)+"分钟前":n<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var a=t.length;a/g,">").replace(/'/g,"'").replace(/"/g,""")}};!function(t,e,i){"$:nomunge";function a(){n=e[l](function(){r.each(function(){var e=t(this),i=e.width(),a=e.height(),n=t.data(this,g);(i!==n.w||a!==n.h)&&e.trigger(c,[n.w=i,n.h=a])}),a()},o[s])}var n,r=t([]),o=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";o[s]=250,o[u]=!0,t.event.special[c]={setup:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===r.length&&a()},teardown:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.not(e),e.removeData(g),r.length||clearTimeout(n)},add:function(e){function a(e,a,r){var o=t(this),l=t.data(this,g)||{};l.w=a!==i?a:o.width(),l.h=r!==i?r:o.height(),n.apply(this,arguments)}if(!o[u]&&this[l])return!1;var n;return t.isFunction(e)?(n=e,a):(n=e.handler,void(e.handler=a))}}}(e,window),t("util",i)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
                        ','
                        '+f+"
                        ",'
                        ','',"
                        ","
                        "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

                        ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

                        "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

                        "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

                          ','
                        • ','','
                          ','',"
                          ","
                        • ",'
                        • ','','
                          ','",'","
                          ","
                        • ",'
                        • ','','',"
                        • ","
                        "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
                      • '+e+'
                      • ')}),'
                          '+t.join("")+"
                        "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
                          ','
                        • ','','
                          ','","
                          ","
                        • ",'
                        • ','','
                          ','',"
                          ","
                        • ",'
                        • ','','',"
                        • ","
                        "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)});layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
                        1. '+o.replace(/[\r\t\n]+/g,"
                        2. ")+"
                        "),c.find(">.layui-code-h3")[0]||c.prepend('

                        '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

                        ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); -var _ajax = layui.$.ajax; -layui.$.ajax = function(options){ - options = options || {}; - if(location.host === 'demo.spiderflow.org'){ - options.url = 'http://49.233.182.130:8088/' + options.url; - } - return _ajax(options); -} \ No newline at end of file diff --git a/spider/resources/static/js/log-viewer.js b/spider/resources/static/js/log-viewer.js deleted file mode 100644 index 591f81a..0000000 --- a/spider/resources/static/js/log-viewer.js +++ /dev/null @@ -1,168 +0,0 @@ -function LogViewer(options){ - options = options || {}; - this.element = options.element; - this.maxLines = options.maxLines || 10; - this.onSearchFinish = options.onSearchFinish || function(){}; - this.bufferSize = this.maxLines * 10; - this.logId = options.logId; - this.taskId = options.taskId; - this.url = options.url; - this.buffer = []; - this.displayIndex = -1; - this.index = -1; - this.loading = false; - this.reversed = true; - this.matchcase = true; - this.initEvent(); - this.init(options.onLoad); -} -LogViewer.prototype.init = function(callback){ - var _this = this; - _this.index = -1; - this.autoLoad(callback); -} -LogViewer.prototype.autoLoad = function(callback){ - var _this = this; - this.loadLines(this.maxLines,function(hasData){ - if(_this.reversed){ - _this.displayIndex = _this.buffer.length - _this.maxLines; - }else{ - _this.displayIndex = 0; - } - _this.render(_this.buffer.slice(_this.displayIndex,_this.displayIndex + _this.maxLines)); - callback&&callback(hasData); - },false); -} -LogViewer.prototype.render = function(lines){ - if(lines.length == 0){ - return; - } - this.firstFrom = lines[0].from; - this.firstTo = lines[0].to; - this.lastFrom = lines[lines.length - 1].from; - this.lastTo = lines[lines.length - 1].to; - var html = []; - if(this.reversed){ - lines = lines.reverse(); - } - var find = this.keywords === undefined || this.keywords === ''; - var regx = new RegExp('(' + this.keywords + ')',this.matchcase ? "ig" : "g"); - for (var i = 0; i < lines.length; i++) { - var text = lines[i].text; - if(find == false && (find = text.match(regx))){ - text = text.replace(regx,'b4430885ba83495_$1_88d1220d37eac831d'); - } - //转义html - text = text.replace(/$1'); - html.push('
                        ' + text + '
                        '); - } - if(this.reversed){ - html = html.reverse(); - } - this.element.html(html.join('')); -} -LogViewer.prototype.search = function(reversed){ - if(reversed === undefined){ - reversed = this.reversed; - } - this.index = reversed ? this.lastFrom : this.firstTo; - var _this = this; - this.autoLoad(function(hasData){ - _this.onSearchFinish(hasData); - }); -} -LogViewer.prototype.initEvent = function(){ - var _this = this; - function eventFunc(e){ - e.stopPropagation(); - _this.scroll((e.wheelDelta||e.detail) > 0,3); - return false; - } - document.addEventListener('DOMMouseScroll',eventFunc,false); - window.onmousewheel = document.onmousewheel = eventFunc; - document.addEventListener('keydown', function (e) { - e = e || event; - var currKey = e.keyCode || e.which || e.charCode; - if (currKey === 38 || currKey === 40) { - if(_this.keywords){ - _this.search(currKey === 38); - }else{ - _this.scroll(currKey === 38, 1); - } - } - if (currKey === 33 || currKey === 34) { - _this.scroll(currKey === 33, _this.maxLines); - } - if (currKey === 36 || currKey ===35){ - _this.reversed = currKey === 35; - _this.init(); - } - }); -} -LogViewer.prototype.setOptions = function(key,value){ - var _this = this; - _this[key] = value; -} -LogViewer.prototype.scroll = function(reversed,count){ - var _this = this; - _this.reversed = reversed; - var ignore = false; - if(reversed){ - if(this.displayIndex == 0){ - this.index = this.buffer[0].from; - this.loadLines(this.bufferSize,function(hasData){ - if(hasData){ - _this.displayIndex = Math.max(_this.buffer.length - _this.maxLines,0); - } - },false); - }else{ - _this.displayIndex-=count; - } - }else{ - if(this.displayIndex + this.maxLines >= this.buffer.length){ - this.index = this.buffer[this.buffer.length - 1].to; - this.loadLines(this.bufferSize,function(hasData){ - if(hasData){ - _this.displayIndex = 0; - } - },false); - }else{ - _this.displayIndex+=count; - } - } - this.render(this.buffer.slice(this.displayIndex,this.displayIndex + this.maxLines)); - -} -LogViewer.prototype.loadLines = function(count,callback,async){ - if(this.loading){ - return; - } - this.loading = true; - var _this = this; - $.ajax({ - url : this.url, - async : async, - type : 'post', - data : { - reversed : this.reversed, - count : this.bufferSize, - id : this.logId, - taskId: this.taskId, - index : _this.index, - keywords : this.keywords, - matchcase : this.matchcase, - regx : this.regx - }, - dataType : 'json', - success : function(json){ - var hasData = json&&json.data&&json.data.length > 0; - if(hasData){ - _this.buffer = json.data; - } - callback && callback(hasData); - _this.loading = false; - } - }) -} diff --git a/spider/resources/static/js/mxgraph/css/common.css b/spider/resources/static/js/mxgraph/css/common.css deleted file mode 100644 index 37bfb0e..0000000 --- a/spider/resources/static/js/mxgraph/css/common.css +++ /dev/null @@ -1,162 +0,0 @@ -div.mxRubberband { - position: absolute; - overflow: hidden; - border-style: solid; - border-width: 1px; - border-color: #0000FF; - background: #0077FF; -} -.mxCellEditor { - background: url(data:image/gif;base64,R0lGODlhMAAwAIAAAP///wAAACH5BAEAAAAALAAAAAAwADAAAAIxhI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8egpAAA7); - _background: url('../images/transparent.gif'); - border-color: transparent; - border-style: solid; - display: inline-block; - position: absolute; - overflow: visible; - word-wrap: normal; - border-width: 0; - min-width: 1px; - resize: none; - padding: 0px; - margin: 0px; -} -.mxPlainTextEditor * { - padding: 0px; - margin: 0px; -} -div.mxWindow { - -webkit-box-shadow: 3px 3px 12px #C0C0C0; - -moz-box-shadow: 3px 3px 12px #C0C0C0; - box-shadow: 3px 3px 12px #C0C0C0; - background: url('../images/window.gif'); - border:1px solid #c3c3c3; - position: absolute; - overflow: hidden; - z-index: 1; -} -table.mxWindow { - border-collapse: collapse; - table-layout: fixed; - font-family: Arial; - font-size: 8pt; -} -td.mxWindowTitle { - background: url('../images/window-title.gif') repeat-x; - text-overflow: ellipsis; - white-space: nowrap; - text-align: center; - font-weight: bold; - overflow: hidden; - height: 13px; - padding: 2px; - padding-top: 4px; - padding-bottom: 6px; - color: black; -} -td.mxWindowPane { - vertical-align: top; - padding: 0px; -} -div.mxWindowPane { - overflow: hidden; - position: relative; -} -td.mxWindowPane td { - font-family: Arial; - font-size: 8pt; -} -td.mxWindowPane input, td.mxWindowPane select, td.mxWindowPane textarea, td.mxWindowPane radio { - border-color: #8C8C8C; - border-style: solid; - border-width: 1px; - font-family: Arial; - font-size: 8pt; - padding: 1px; -} -td.mxWindowPane button { - background: url('../images/button.gif') repeat-x; - font-family: Arial; - font-size: 8pt; - padding: 2px; - float: left; -} -img.mxToolbarItem { - margin-right: 6px; - margin-bottom: 6px; - border-width: 1px; -} -select.mxToolbarCombo { - vertical-align: top; - border-style: inset; - border-width: 2px; -} -div.mxToolbarComboContainer { - padding: 2px; -} -img.mxToolbarMode { - margin: 2px; - margin-right: 4px; - margin-bottom: 4px; - border-width: 0px; -} -img.mxToolbarModeSelected { - margin: 0px; - margin-right: 2px; - margin-bottom: 2px; - border-width: 2px; - border-style: inset; -} -div.mxTooltip { - -webkit-box-shadow: 3px 3px 12px #C0C0C0; - -moz-box-shadow: 3px 3px 12px #C0C0C0; - box-shadow: 3px 3px 12px #C0C0C0; - background: #FFFFCC; - border-style: solid; - border-width: 1px; - border-color: black; - font-family: Arial; - font-size: 8pt; - position: absolute; - cursor: default; - padding: 4px; - color: black; -} -div.mxPopupMenu { - -webkit-box-shadow: 3px 3px 12px #C0C0C0; - -moz-box-shadow: 3px 3px 12px #C0C0C0; - box-shadow: 3px 3px 12px #C0C0C0; - background: url('../images/window.gif'); - position: absolute; - border-style: solid; - border-width: 1px; - border-color: black; -} -table.mxPopupMenu { - border-collapse: collapse; - margin-top: 1px; - margin-bottom: 1px; -} -tr.mxPopupMenuItem { - color: black; - cursor: pointer; -} -tr.mxPopupMenuItemHover { - background-color: #000066; - color: #FFFFFF; - cursor: pointer; -} -td.mxPopupMenuItem { - padding: 2px 30px 2px 10px; - white-space: nowrap; - font-family: Arial; - font-size: 8pt; -} -td.mxPopupMenuIcon { - background-color: #D0D0D0; - padding: 2px 4px 2px 4px; -} -.mxDisabled { - opacity: 0.2 !important; - cursor:default !important; -} diff --git a/spider/resources/static/js/mxgraph/css/explorer.css b/spider/resources/static/js/mxgraph/css/explorer.css deleted file mode 100644 index 50e704f..0000000 --- a/spider/resources/static/js/mxgraph/css/explorer.css +++ /dev/null @@ -1,18 +0,0 @@ -div.mxTooltip { - filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=4, OffY=4, - Color='#A2A2A2', Positive='true'); -} -div.mxPopupMenu { - filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=4, OffY=4, - Color='#C0C0C0', Positive='true'); -} -div.mxWindow { - _filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=4, OffY=4, - Color='#C0C0C0', Positive='true'); -} -td.mxWindowTitle { - _height: 23px; -} -.mxDisabled { - filter:alpha(opacity=20) !important; -} diff --git a/spider/resources/static/js/mxgraph/mxgraph.js b/spider/resources/static/js/mxgraph/mxgraph.js deleted file mode 100644 index fafdcab..0000000 --- a/spider/resources/static/js/mxgraph/mxgraph.js +++ /dev/null @@ -1,89762 +0,0 @@ -/** - * Copyright (c) 2006-2017, JGraph Ltd - * Copyright (c) 2006-2017, Gaudenz Alder - */ -var mxClient = -{ - /** - * Class: mxClient - * - * Bootstrapping mechanism for the mxGraph thin client. The production version - * of this file contains all code required to run the mxGraph thin client, as - * well as global constants to identify the browser and operating system in - * use. You may have to load chrome://global/content/contentAreaUtils.js in - * your page to disable certain security restrictions in Mozilla. - * - * Variable: VERSION - * - * Contains the current version of the mxGraph library. The strings that - * communicate versions of mxGraph use the following format. - * - * versionMajor.versionMinor.buildNumber.revisionNumber - * - * Current version is 4.0.1. - */ - VERSION: '4.0.1', - - /** - * Variable: IS_IE - * - * True if the current browser is Internet Explorer 10 or below. Use - * to detect IE 11. - */ - IS_IE: navigator.userAgent.indexOf('MSIE') >= 0, - - /** - * Variable: IS_IE6 - * - * True if the current browser is Internet Explorer 6.x. - */ - IS_IE6: navigator.userAgent.indexOf('MSIE 6') >= 0, - - /** - * Variable: IS_IE11 - * - * True if the current browser is Internet Explorer 11.x. - */ - IS_IE11: !!navigator.userAgent.match(/Trident\/7\./), - - /** - * Variable: IS_EDGE - * - * True if the current browser is Microsoft Edge. - */ - IS_EDGE: !!navigator.userAgent.match(/Edge\//), - - /** - * Variable: IS_QUIRKS - * - * True if the current browser is Internet Explorer and it is in quirks mode. - */ - IS_QUIRKS: navigator.userAgent.indexOf('MSIE') >= 0 && (document.documentMode == null || document.documentMode == 5), - - /** - * Variable: IS_EM - * - * True if the browser is IE11 in enterprise mode (IE8 standards mode). - */ - IS_EM: 'spellcheck' in document.createElement('textarea') && document.documentMode == 8, - - /** - * Variable: VML_PREFIX - * - * Prefix for VML namespace in node names. Default is 'v'. - */ - VML_PREFIX: 'v', - - /** - * Variable: OFFICE_PREFIX - * - * Prefix for VML office namespace in node names. Default is 'o'. - */ - OFFICE_PREFIX: 'o', - - /** - * Variable: IS_NS - * - * True if the current browser is Netscape (including Firefox). - */ - IS_NS: navigator.userAgent.indexOf('Mozilla/') >= 0 && - navigator.userAgent.indexOf('MSIE') < 0 && - navigator.userAgent.indexOf('Edge/') < 0, - - /** - * Variable: IS_OP - * - * True if the current browser is Opera. - */ - IS_OP: navigator.userAgent.indexOf('Opera/') >= 0 || - navigator.userAgent.indexOf('OPR/') >= 0, - - /** - * Variable: IS_OT - * - * True if -o-transform is available as a CSS style, ie for Opera browsers - * based on a Presto engine with version 2.5 or later. - */ - IS_OT: navigator.userAgent.indexOf('Presto/') >= 0 && - navigator.userAgent.indexOf('Presto/2.4.') < 0 && - navigator.userAgent.indexOf('Presto/2.3.') < 0 && - navigator.userAgent.indexOf('Presto/2.2.') < 0 && - navigator.userAgent.indexOf('Presto/2.1.') < 0 && - navigator.userAgent.indexOf('Presto/2.0.') < 0 && - navigator.userAgent.indexOf('Presto/1.') < 0, - - /** - * Variable: IS_SF - * - * True if the current browser is Safari. - */ - IS_SF: navigator.userAgent.indexOf('AppleWebKit/') >= 0 && - navigator.userAgent.indexOf('Chrome/') < 0 && - navigator.userAgent.indexOf('Edge/') < 0, - - /** - * Variable: IS_IOS - * - * Returns true if the user agent is an iPad, iPhone or iPod. - */ - IS_IOS: (navigator.userAgent.match(/(iPad|iPhone|iPod)/g) ? true : false), - - /** - * Variable: IS_GC - * - * True if the current browser is Google Chrome. - */ - IS_GC: navigator.userAgent.indexOf('Chrome/') >= 0 && - navigator.userAgent.indexOf('Edge/') < 0, - - /** - * Variable: IS_CHROMEAPP - * - * True if the this is running inside a Chrome App. - */ - IS_CHROMEAPP: window.chrome != null && chrome.app != null && chrome.app.runtime != null, - - /** - * Variable: IS_FF - * - * True if the current browser is Firefox. - */ - IS_FF: navigator.userAgent.indexOf('Firefox/') >= 0, - - /** - * Variable: IS_MT - * - * True if -moz-transform is available as a CSS style. This is the case - * for all Firefox-based browsers newer than or equal 3, such as Camino, - * Iceweasel, Seamonkey and Iceape. - */ - IS_MT: (navigator.userAgent.indexOf('Firefox/') >= 0 && - navigator.userAgent.indexOf('Firefox/1.') < 0 && - navigator.userAgent.indexOf('Firefox/2.') < 0) || - (navigator.userAgent.indexOf('Iceweasel/') >= 0 && - navigator.userAgent.indexOf('Iceweasel/1.') < 0 && - navigator.userAgent.indexOf('Iceweasel/2.') < 0) || - (navigator.userAgent.indexOf('SeaMonkey/') >= 0 && - navigator.userAgent.indexOf('SeaMonkey/1.') < 0) || - (navigator.userAgent.indexOf('Iceape/') >= 0 && - navigator.userAgent.indexOf('Iceape/1.') < 0), - - /** - * Variable: IS_VML - * - * True if the browser supports VML. - */ - IS_VML: navigator.appName.toUpperCase() == 'MICROSOFT INTERNET EXPLORER', - - /** - * Variable: IS_SVG - * - * True if the browser supports SVG. - */ - IS_SVG: navigator.appName.toUpperCase() != 'MICROSOFT INTERNET EXPLORER', - - /** - * Variable: NO_FO - * - * True if foreignObject support is not available. This is the case for - * Opera, older SVG-based browsers and all versions of IE. - */ - NO_FO: !document.createElementNS || document.createElementNS('http://www.w3.org/2000/svg', - 'foreignObject') != '[object SVGForeignObjectElement]' || navigator.userAgent.indexOf('Opera/') >= 0, - - /** - * Variable: IS_WIN - * - * True if the client is a Windows. - */ - IS_WIN: navigator.appVersion.indexOf('Win') > 0, - - /** - * Variable: IS_MAC - * - * True if the client is a Mac. - */ - IS_MAC: navigator.appVersion.indexOf('Mac') > 0, - - /** - * Variable: IS_TOUCH - * - * True if this device supports touchstart/-move/-end events (Apple iOS, - * Android, Chromebook and Chrome Browser on touch-enabled devices). - */ - IS_TOUCH: 'ontouchstart' in document.documentElement, - - /** - * Variable: IS_POINTER - * - * True if this device supports Microsoft pointer events (always false on Macs). - */ - IS_POINTER: window.PointerEvent != null && !(navigator.appVersion.indexOf('Mac') > 0), - - /** - * Variable: IS_LOCAL - * - * True if the documents location does not start with http:// or https://. - */ - IS_LOCAL: document.location.href.indexOf('http://') < 0 && - document.location.href.indexOf('https://') < 0, - - /** - * Variable: defaultBundles - * - * Contains the base names of the default bundles if mxLoadResources is false. - */ - defaultBundles: [], - - /** - * Function: isBrowserSupported - * - * Returns true if the current browser is supported, that is, if - * or is true. - * - * Example: - * - * (code) - * if (!mxClient.isBrowserSupported()) - * { - * mxUtils.error('Browser is not supported!', 200, false); - * } - * (end) - */ - isBrowserSupported: function() - { - return mxClient.IS_VML || mxClient.IS_SVG; - }, - - /** - * Function: link - * - * Adds a link node to the head of the document. Use this - * to add a stylesheet to the page as follows: - * - * (code) - * mxClient.link('stylesheet', filename); - * (end) - * - * where filename is the (relative) URL of the stylesheet. The charset - * is hardcoded to ISO-8859-1 and the type is text/css. - * - * Parameters: - * - * rel - String that represents the rel attribute of the link node. - * href - String that represents the href attribute of the link node. - * doc - Optional parent document of the link node. - * id - unique id for the link element to check if it already exists - */ - link: function(rel, href, doc, id) - { - doc = doc || document; - - // Workaround for Operation Aborted in IE6 if base tag is used in head - if (mxClient.IS_IE6) - { - doc.write(''); - } - else - { - var link = doc.createElement('link'); - - link.setAttribute('rel', rel); - link.setAttribute('href', href); - link.setAttribute('charset', 'UTF-8'); - link.setAttribute('type', 'text/css'); - - if (id) - { - link.setAttribute('id', id); - } - - var head = doc.getElementsByTagName('head')[0]; - head.appendChild(link); - } - }, - - /** - * Function: loadResources - * - * Helper method to load the default bundles if mxLoadResources is false. - * - * Parameters: - * - * fn - Function to call after all resources have been loaded. - * lan - Optional string to pass to . - */ - loadResources: function(fn, lan) - { - var pending = mxClient.defaultBundles.length; - - function callback() - { - if (--pending == 0) - { - fn(); - } - } - - for (var i = 0; i < mxClient.defaultBundles.length; i++) - { - mxResources.add(mxClient.defaultBundles[i], lan, callback); - } - }, - - /** - * Function: include - * - * Dynamically adds a script node to the document header. - * - * In production environments, the includes are resolved in the mxClient.js - * file to reduce the number of requests required for client startup. This - * function should only be used in development environments, but not in - * production systems. - */ - include: function(src) - { - document.write(''); - } -}; - -/** - * Variable: mxLoadResources - * - * Optional global config variable to toggle loading of the two resource files - * in and . Default is true. NOTE: This is a global variable, - * not a variable of mxClient. If this is false, you can use - * with its callback to load the default bundles asynchronously. - * - * (code) - * - * - * (end) - */ -if (typeof(mxLoadResources) == 'undefined') -{ - mxLoadResources = true; -} - -/** - * Variable: mxForceIncludes - * - * Optional global config variable to force loading the JavaScript files in - * development mode. Default is undefined. NOTE: This is a global variable, - * not a variable of mxClient. - * - * (code) - * - * - * (end) - */ -if (typeof(mxForceIncludes) == 'undefined') -{ - mxForceIncludes = false; -} - -/** - * Variable: mxResourceExtension - * - * Optional global config variable to specify the extension of resource files. - * Default is true. NOTE: This is a global variable, not a variable of mxClient. - * - * (code) - * - * - * (end) - */ -if (typeof(mxResourceExtension) == 'undefined') -{ - mxResourceExtension = '.txt'; -} - -/** - * Variable: mxLoadStylesheets - * - * Optional global config variable to toggle loading of the CSS files when - * the library is initialized. Default is true. NOTE: This is a global variable, - * not a variable of mxClient. - * - * (code) - * - * - * (end) - */ -if (typeof(mxLoadStylesheets) == 'undefined') -{ - mxLoadStylesheets = true; -} - -/** - * Variable: basePath - * - * Basepath for all URLs in the core without trailing slash. Default is '.'. - * Set mxBasePath prior to loading the mxClient library as follows to override - * this setting: - * - * (code) - * - * - * (end) - * - * When using a relative path, the path is relative to the URL of the page that - * contains the assignment. Trailing slashes are automatically removed. - */ -if (typeof(mxBasePath) != 'undefined' && mxBasePath.length > 0) -{ - // Adds a trailing slash if required - if (mxBasePath.substring(mxBasePath.length - 1) == '/') - { - mxBasePath = mxBasePath.substring(0, mxBasePath.length - 1); - } - - mxClient.basePath = mxBasePath; -} -else -{ - mxClient.basePath = '.'; -} - -/** - * Variable: imageBasePath - * - * Basepath for all images URLs in the core without trailing slash. Default is - * + '/images'. Set mxImageBasePath prior to loading the - * mxClient library as follows to override this setting: - * - * (code) - * - * - * (end) - * - * When using a relative path, the path is relative to the URL of the page that - * contains the assignment. Trailing slashes are automatically removed. - */ -if (typeof(mxImageBasePath) != 'undefined' && mxImageBasePath.length > 0) -{ - // Adds a trailing slash if required - if (mxImageBasePath.substring(mxImageBasePath.length - 1) == '/') - { - mxImageBasePath = mxImageBasePath.substring(0, mxImageBasePath.length - 1); - } - - mxClient.imageBasePath = mxImageBasePath; -} -else -{ - mxClient.imageBasePath = mxClient.basePath + '/images'; -} - -/** - * Variable: language - * - * Defines the language of the client, eg. en for english, de for german etc. - * The special value 'none' will disable all built-in internationalization and - * resource loading. See for handling identifiers - * with and without a dash. - * - * Set mxLanguage prior to loading the mxClient library as follows to override - * this setting: - * - * (code) - * - * - * (end) - * - * If internationalization is disabled, then the following variables should be - * overridden to reflect the current language of the system. These variables are - * cleared when i18n is disabled. - * , , - * , , - * , , , - * , , - * , , - * , , - * , , - * and - * . - */ -if (typeof(mxLanguage) != 'undefined' && mxLanguage != null) -{ - mxClient.language = mxLanguage; -} -else -{ - mxClient.language = (mxClient.IS_IE) ? navigator.userLanguage : navigator.language; -} - -/** - * Variable: defaultLanguage - * - * Defines the default language which is used in the common resource files. Any - * resources for this language will only load the common resource file, but not - * the language-specific resource file. Default is 'en'. - * - * Set mxDefaultLanguage prior to loading the mxClient library as follows to override - * this setting: - * - * (code) - * - * - * (end) - */ -if (typeof(mxDefaultLanguage) != 'undefined' && mxDefaultLanguage != null) -{ - mxClient.defaultLanguage = mxDefaultLanguage; -} -else -{ - mxClient.defaultLanguage = 'en'; -} - -// Adds all required stylesheets and namespaces -if (mxLoadStylesheets) -{ - mxClient.link('stylesheet', mxClient.basePath + '/css/common.css'); -} - -/** - * Variable: languages - * - * Defines the optional array of all supported language extensions. The default - * language does not have to be part of this list. See - * . - * - * (code) - * - * - * (end) - * - * This is used to avoid unnecessary requests to language files, ie. if a 404 - * will be returned. - */ -if (typeof(mxLanguages) != 'undefined' && mxLanguages != null) -{ - mxClient.languages = mxLanguages; -} - -// Adds required namespaces, stylesheets and memory handling for older IE browsers -if (mxClient.IS_VML) -{ - if (mxClient.IS_SVG) - { - mxClient.IS_VML = false; - } - else - { - // Enables support for IE8 standards mode. Note that this requires all attributes for VML - // elements to be set using direct notation, ie. node.attr = value. The use of setAttribute - // is not possible. - if (document.documentMode == 8) - { - document.namespaces.add(mxClient.VML_PREFIX, 'urn:schemas-microsoft-com:vml', '#default#VML'); - document.namespaces.add(mxClient.OFFICE_PREFIX, 'urn:schemas-microsoft-com:office:office', '#default#VML'); - } - else - { - document.namespaces.add(mxClient.VML_PREFIX, 'urn:schemas-microsoft-com:vml'); - document.namespaces.add(mxClient.OFFICE_PREFIX, 'urn:schemas-microsoft-com:office:office'); - } - - // Workaround for limited number of stylesheets in IE (does not work in standards mode) - if (mxClient.IS_QUIRKS && document.styleSheets.length >= 30) - { - (function() - { - var node = document.createElement('style'); - node.type = 'text/css'; - node.styleSheet.cssText = mxClient.VML_PREFIX + '\\:*{behavior:url(#default#VML)}' + - mxClient.OFFICE_PREFIX + '\\:*{behavior:url(#default#VML)}'; - document.getElementsByTagName('head')[0].appendChild(node); - })(); - } - else - { - document.createStyleSheet().cssText = mxClient.VML_PREFIX + '\\:*{behavior:url(#default#VML)}' + - mxClient.OFFICE_PREFIX + '\\:*{behavior:url(#default#VML)}'; - } - - if (mxLoadStylesheets) - { - mxClient.link('stylesheet', mxClient.basePath + '/css/explorer.css'); - } - } -} - -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -var mxLog = -{ - /** - * Class: mxLog - * - * A singleton class that implements a simple console. - * - * Variable: consoleName - * - * Specifies the name of the console window. Default is 'Console'. - */ - consoleName: 'Console', - - /** - * Variable: TRACE - * - * Specified if the output for and should be visible in the - * console. Default is false. - */ - TRACE: false, - - /** - * Variable: DEBUG - * - * Specifies if the output for should be visible in the console. - * Default is true. - */ - DEBUG: true, - - /** - * Variable: WARN - * - * Specifies if the output for should be visible in the console. - * Default is true. - */ - WARN: true, - - /** - * Variable: buffer - * - * Buffer for pre-initialized content. - */ - buffer: '', - - /** - * Function: init - * - * Initializes the DOM node for the console. This requires document.body to - * point to a non-null value. This is called from within if the - * log has not yet been initialized. - */ - init: function() - { - if (mxLog.window == null && document.body != null) - { - var title = mxLog.consoleName + ' - mxGraph ' + mxClient.VERSION; - - // Creates a table that maintains the layout - var table = document.createElement('table'); - table.setAttribute('width', '100%'); - table.setAttribute('height', '100%'); - - var tbody = document.createElement('tbody'); - var tr = document.createElement('tr'); - var td = document.createElement('td'); - td.style.verticalAlign = 'top'; - - // Adds the actual console as a textarea - mxLog.textarea = document.createElement('textarea'); - mxLog.textarea.setAttribute('wrap', 'off'); - mxLog.textarea.setAttribute('readOnly', 'true'); - mxLog.textarea.style.height = '100%'; - mxLog.textarea.style.resize = 'none'; - mxLog.textarea.value = mxLog.buffer; - - // Workaround for wrong width in standards mode - if (mxClient.IS_NS && document.compatMode != 'BackCompat') - { - mxLog.textarea.style.width = '99%'; - } - else - { - mxLog.textarea.style.width = '100%'; - } - - td.appendChild(mxLog.textarea); - tr.appendChild(td); - tbody.appendChild(tr); - - // Creates the container div - tr = document.createElement('tr'); - mxLog.td = document.createElement('td'); - mxLog.td.style.verticalAlign = 'top'; - mxLog.td.setAttribute('height', '30px'); - - tr.appendChild(mxLog.td); - tbody.appendChild(tr); - table.appendChild(tbody); - - // Adds various debugging buttons - mxLog.addButton('Info', function (evt) - { - mxLog.info(); - }); - - mxLog.addButton('DOM', function (evt) - { - var content = mxUtils.getInnerHtml(document.body); - mxLog.debug(content); - }); - - mxLog.addButton('Trace', function (evt) - { - mxLog.TRACE = !mxLog.TRACE; - - if (mxLog.TRACE) - { - mxLog.debug('Tracing enabled'); - } - else - { - mxLog.debug('Tracing disabled'); - } - }); - - mxLog.addButton('Copy', function (evt) - { - try - { - mxUtils.copy(mxLog.textarea.value); - } - catch (err) - { - mxUtils.alert(err); - } - }); - - mxLog.addButton('Show', function (evt) - { - try - { - mxUtils.popup(mxLog.textarea.value); - } - catch (err) - { - mxUtils.alert(err); - } - }); - - mxLog.addButton('Clear', function (evt) - { - mxLog.textarea.value = ''; - }); - - // Cross-browser code to get window size - var h = 0; - var w = 0; - - if (typeof(window.innerWidth) === 'number') - { - h = window.innerHeight; - w = window.innerWidth; - } - else - { - h = (document.documentElement.clientHeight || document.body.clientHeight); - w = document.body.clientWidth; - } - - mxLog.window = new mxWindow(title, table, Math.max(0, w - 320), Math.max(0, h - 210), 300, 160); - mxLog.window.setMaximizable(true); - mxLog.window.setScrollable(false); - mxLog.window.setResizable(true); - mxLog.window.setClosable(true); - mxLog.window.destroyOnClose = false; - - // Workaround for ignored textarea height in various setups - if (((mxClient.IS_NS || mxClient.IS_IE) && !mxClient.IS_GC && - !mxClient.IS_SF && document.compatMode != 'BackCompat') || - document.documentMode == 11) - { - var elt = mxLog.window.getElement(); - - var resizeHandler = function(sender, evt) - { - mxLog.textarea.style.height = Math.max(0, elt.offsetHeight - 70) + 'px'; - }; - - mxLog.window.addListener(mxEvent.RESIZE_END, resizeHandler); - mxLog.window.addListener(mxEvent.MAXIMIZE, resizeHandler); - mxLog.window.addListener(mxEvent.NORMALIZE, resizeHandler); - - mxLog.textarea.style.height = '92px'; - } - } - }, - - /** - * Function: info - * - * Writes the current navigator information to the console. - */ - info: function() - { - mxLog.writeln(mxUtils.toString(navigator)); - }, - - /** - * Function: addButton - * - * Adds a button to the console using the given label and function. - */ - addButton: function(lab, funct) - { - var button = document.createElement('button'); - mxUtils.write(button, lab); - mxEvent.addListener(button, 'click', funct); - mxLog.td.appendChild(button); - }, - - /** - * Function: isVisible - * - * Returns true if the console is visible. - */ - isVisible: function() - { - if (mxLog.window != null) - { - return mxLog.window.isVisible(); - } - - return false; - }, - - - /** - * Function: show - * - * Shows the console. - */ - show: function() - { - mxLog.setVisible(true); - }, - - /** - * Function: setVisible - * - * Shows or hides the console. - */ - setVisible: function(visible) - { - if (mxLog.window == null) - { - mxLog.init(); - } - - if (mxLog.window != null) - { - mxLog.window.setVisible(visible); - } - }, - - /** - * Function: enter - * - * Writes the specified string to the console - * if is true and returns the current - * time in milliseconds. - * - * Example: - * - * (code) - * mxLog.show(); - * var t0 = mxLog.enter('Hello'); - * // Do something - * mxLog.leave('World!', t0); - * (end) - */ - enter: function(string) - { - if (mxLog.TRACE) - { - mxLog.writeln('Entering '+string); - - return new Date().getTime(); - } - }, - - /** - * Function: leave - * - * Writes the specified string to the console - * if is true and computes the difference - * between the current time and t0 in milliseconds. - * See for an example. - */ - leave: function(string, t0) - { - if (mxLog.TRACE) - { - var dt = (t0 != 0) ? ' ('+(new Date().getTime() - t0)+' ms)' : ''; - mxLog.writeln('Leaving '+string+dt); - } - }, - - /** - * Function: debug - * - * Adds all arguments to the console if is enabled. - * - * Example: - * - * (code) - * mxLog.show(); - * mxLog.debug('Hello, World!'); - * (end) - */ - debug: function() - { - if (mxLog.DEBUG) - { - mxLog.writeln.apply(this, arguments); - } - }, - - /** - * Function: warn - * - * Adds all arguments to the console if is enabled. - * - * Example: - * - * (code) - * mxLog.show(); - * mxLog.warn('Hello, World!'); - * (end) - */ - warn: function() - { - if (mxLog.WARN) - { - mxLog.writeln.apply(this, arguments); - } - }, - - /** - * Function: write - * - * Adds the specified strings to the console. - */ - write: function() - { - var string = ''; - - for (var i = 0; i < arguments.length; i++) - { - string += arguments[i]; - - if (i < arguments.length - 1) - { - string += ' '; - } - } - - if (mxLog.textarea != null) - { - mxLog.textarea.value = mxLog.textarea.value + string; - - // Workaround for no update in Presto 2.5.22 (Opera 10.5) - if (navigator.userAgent.indexOf('Presto/2.5') >= 0) - { - mxLog.textarea.style.visibility = 'hidden'; - mxLog.textarea.style.visibility = 'visible'; - } - - mxLog.textarea.scrollTop = mxLog.textarea.scrollHeight; - } - else - { - mxLog.buffer += string; - } - }, - - /** - * Function: writeln - * - * Adds the specified strings to the console, appending a linefeed at the - * end of each string. - */ - writeln: function() - { - var string = ''; - - for (var i = 0; i < arguments.length; i++) - { - string += arguments[i]; - - if (i < arguments.length - 1) - { - string += ' '; - } - } - - mxLog.write(string + '\n'); - } - -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -var mxObjectIdentity = -{ - /** - * Class: mxObjectIdentity - * - * Identity for JavaScript objects and functions. This is implemented using - * a simple incrementing counter which is stored in each object under - * . - * - * The identity for an object does not change during its lifecycle. - * - * Variable: FIELD_NAME - * - * Name of the field to be used to store the object ID. Default is - * mxObjectId. - */ - FIELD_NAME: 'mxObjectId', - - /** - * Variable: counter - * - * Current counter. - */ - counter: 0, - - /** - * Function: get - * - * Returns the ID for the given object or function or null if no object - * is specified. - */ - get: function(obj) - { - if (obj != null) - { - if (obj[mxObjectIdentity.FIELD_NAME] == null) - { - if (typeof obj === 'object') - { - var ctor = mxUtils.getFunctionName(obj.constructor); - obj[mxObjectIdentity.FIELD_NAME] = ctor + '#' + mxObjectIdentity.counter++; - } - else if (typeof obj === 'function') - { - obj[mxObjectIdentity.FIELD_NAME] = 'Function#' + mxObjectIdentity.counter++; - } - } - - return obj[mxObjectIdentity.FIELD_NAME]; - } - - return null; - }, - - /** - * Function: clear - * - * Deletes the ID from the given object or function. - */ - clear: function(obj) - { - if (typeof(obj) === 'object' || typeof obj === 'function') - { - delete obj[mxObjectIdentity.FIELD_NAME]; - } - } - -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -/** - * Class: mxDictionary - * - * A wrapper class for an associative array with object keys. Note: This - * implementation uses to turn object keys into strings. - * - * Constructor: mxEventSource - * - * Constructs a new dictionary which allows object to be used as keys. - */ -function mxDictionary() -{ - this.clear(); -}; - -/** - * Function: map - * - * Stores the (key, value) pairs in this dictionary. - */ -mxDictionary.prototype.map = null; - -/** - * Function: clear - * - * Clears the dictionary. - */ -mxDictionary.prototype.clear = function() -{ - this.map = {}; -}; - -/** - * Function: get - * - * Returns the value for the given key. - */ -mxDictionary.prototype.get = function(key) -{ - var id = mxObjectIdentity.get(key); - - return this.map[id]; -}; - -/** - * Function: put - * - * Stores the value under the given key and returns the previous - * value for that key. - */ -mxDictionary.prototype.put = function(key, value) -{ - var id = mxObjectIdentity.get(key); - var previous = this.map[id]; - this.map[id] = value; - - return previous; -}; - -/** - * Function: remove - * - * Removes the value for the given key and returns the value that - * has been removed. - */ -mxDictionary.prototype.remove = function(key) -{ - var id = mxObjectIdentity.get(key); - var previous = this.map[id]; - delete this.map[id]; - - return previous; -}; - -/** - * Function: getKeys - * - * Returns all keys as an array. - */ -mxDictionary.prototype.getKeys = function() -{ - var result = []; - - for (var key in this.map) - { - result.push(key); - } - - return result; -}; - -/** - * Function: getValues - * - * Returns all values as an array. - */ -mxDictionary.prototype.getValues = function() -{ - var result = []; - - for (var key in this.map) - { - result.push(this.map[key]); - } - - return result; -}; - -/** - * Function: visit - * - * Visits all entries in the dictionary using the given function with the - * following signature: function(key, value) where key is a string and - * value is an object. - * - * Parameters: - * - * visitor - A function that takes the key and value as arguments. - */ -mxDictionary.prototype.visit = function(visitor) -{ - for (var key in this.map) - { - visitor(key, this.map[key]); - } -}; -/** - * Copyright (c) 2006-2016, JGraph Ltd - * Copyright (c) 2006-2016, Gaudenz Alder - */ -var mxResources = -{ - /** - * Class: mxResources - * - * Implements internationalization. You can provide any number of - * resource files on the server using the following format for the - * filename: name[-en].properties. The en stands for any lowercase - * 2-character language shortcut (eg. de for german, fr for french). - * - * If the optional language extension is omitted, then the file is used as a - * default resource which is loaded in all cases. If a properties file for a - * specific language exists, then it is used to override the settings in the - * default resource. All entries in the file are of the form key=value. The - * values may then be accessed in code via . Lines without - * equal signs in the properties files are ignored. - * - * Resource files may either be added programmatically using - * or via a resource tag in the UI section of the - * editor configuration file, eg: - * - * (code) - * - * - * - * (end) - * - * The above element will load examples/resources/mxWorkflow.properties as well - * as the language specific file for the current language, if it exists. - * - * Values may contain placeholders of the form {1}...{n} where each placeholder - * is replaced with the value of the corresponding array element in the params - * argument passed to . The placeholder {1} maps to the first - * element in the array (at index 0). - * - * See for more information on specifying the default - * language or disabling all loading of resources. - * - * Lines that start with a # sign will be ignored. - * - * Special characters - * - * To use unicode characters, use the standard notation (eg. \u8fd1) or %u as a - * prefix (eg. %u20AC will display a Euro sign). For normal hex encoded strings, - * use % as a prefix, eg. %F6 will display a "o umlaut" (ö). - * - * See to disable this. If you disable this, make sure that - * your files are UTF-8 encoded. - * - * Asynchronous loading - * - * By default, the core adds two resource files synchronously at load time. - * To load these files asynchronously, set to false - * before loading mxClient.js and use instead. - * - * Variable: resources - * - * Object that maps from keys to values. - */ - resources: {}, - - /** - * Variable: extension - * - * Specifies the extension used for language files. Default is . - */ - extension: mxResourceExtension, - - /** - * Variable: resourcesEncoded - * - * Specifies whether or not values in resource files are encoded with \u or - * percentage. Default is false. - */ - resourcesEncoded: false, - - /** - * Variable: loadDefaultBundle - * - * Specifies if the default file for a given basename should be loaded. - * Default is true. - */ - loadDefaultBundle: true, - - /** - * Variable: loadDefaultBundle - * - * Specifies if the specific language file file for a given basename should - * be loaded. Default is true. - */ - loadSpecialBundle: true, - - /** - * Function: isLanguageSupported - * - * Hook for subclassers to disable support for a given language. This - * implementation returns true if lan is in . - * - * Parameters: - * - * lan - The current language. - */ - isLanguageSupported: function(lan) - { - if (mxClient.languages != null) - { - return mxUtils.indexOf(mxClient.languages, lan) >= 0; - } - - return true; - }, - - /** - * Function: getDefaultBundle - * - * Hook for subclassers to return the URL for the special bundle. This - * implementation returns basename + or null if - * is false. - * - * Parameters: - * - * basename - The basename for which the file should be loaded. - * lan - The current language. - */ - getDefaultBundle: function(basename, lan) - { - if (mxResources.loadDefaultBundle || !mxResources.isLanguageSupported(lan)) - { - return basename + mxResources.extension; - } - else - { - return null; - } - }, - - /** - * Function: getSpecialBundle - * - * Hook for subclassers to return the URL for the special bundle. This - * implementation returns basename + '_' + lan + or null if - * is false or lan equals . - * - * If is not null and contains - * a dash, then this method checks if returns true - * for the full language (including the dash). If that returns false the - * first part of the language (up to the dash) will be tried as an extension. - * - * If is null then the first part of the language is - * used to maintain backwards compatibility. - * - * Parameters: - * - * basename - The basename for which the file should be loaded. - * lan - The language for which the file should be loaded. - */ - getSpecialBundle: function(basename, lan) - { - if (mxClient.languages == null || !this.isLanguageSupported(lan)) - { - var dash = lan.indexOf('-'); - - if (dash > 0) - { - lan = lan.substring(0, dash); - } - } - - if (mxResources.loadSpecialBundle && mxResources.isLanguageSupported(lan) && lan != mxClient.defaultLanguage) - { - return basename + '_' + lan + mxResources.extension; - } - else - { - return null; - } - }, - - /** - * Function: add - * - * Adds the default and current language properties file for the specified - * basename. Existing keys are overridden as new files are added. If no - * callback is used then the request is synchronous. - * - * Example: - * - * At application startup, additional resources may be - * added using the following code: - * - * (code) - * mxResources.add('resources/editor'); - * (end) - * - * Parameters: - * - * basename - The basename for which the file should be loaded. - * lan - The language for which the file should be loaded. - * callback - Optional callback for asynchronous loading. - */ - add: function(basename, lan, callback) - { - lan = (lan != null) ? lan : ((mxClient.language != null) ? - mxClient.language.toLowerCase() : mxConstants.NONE); - - if (lan != mxConstants.NONE) - { - var defaultBundle = mxResources.getDefaultBundle(basename, lan); - var specialBundle = mxResources.getSpecialBundle(basename, lan); - - var loadSpecialBundle = function() - { - if (specialBundle != null) - { - if (callback) - { - mxUtils.get(specialBundle, function(req) - { - mxResources.parse(req.getText()); - callback(); - }, function() - { - callback(); - }); - } - else - { - try - { - var req = mxUtils.load(specialBundle); - - if (req.isReady()) - { - mxResources.parse(req.getText()); - } - } - catch (e) - { - // ignore - } - } - } - else if (callback != null) - { - callback(); - } - } - - if (defaultBundle != null) - { - if (callback) - { - mxUtils.get(defaultBundle, function(req) - { - mxResources.parse(req.getText()); - loadSpecialBundle(); - }, function() - { - loadSpecialBundle(); - }); - } - else - { - try - { - var req = mxUtils.load(defaultBundle); - - if (req.isReady()) - { - mxResources.parse(req.getText()); - } - - loadSpecialBundle(); - } - catch (e) - { - // ignore - } - } - } - else - { - // Overlays the language specific file (_lan-extension) - loadSpecialBundle(); - } - } - }, - - /** - * Function: parse - * - * Parses the key, value pairs in the specified - * text and stores them as local resources. - */ - parse: function(text) - { - if (text != null) - { - var lines = text.split('\n'); - - for (var i = 0; i < lines.length; i++) - { - if (lines[i].charAt(0) != '#') - { - var index = lines[i].indexOf('='); - - if (index > 0) - { - var key = lines[i].substring(0, index); - var idx = lines[i].length; - - if (lines[i].charCodeAt(idx - 1) == 13) - { - idx--; - } - - var value = lines[i].substring(index + 1, idx); - - if (this.resourcesEncoded) - { - value = value.replace(/\\(?=u[a-fA-F\d]{4})/g,"%"); - mxResources.resources[key] = unescape(value); - } - else - { - mxResources.resources[key] = value; - } - } - } - } - } - }, - - /** - * Function: get - * - * Returns the value for the specified resource key. - * - * Example: - * To read the value for 'welomeMessage', use the following: - * (code) - * var result = mxResources.get('welcomeMessage') || ''; - * (end) - * - * This would require an entry of the following form in - * one of the English language resource files: - * (code) - * welcomeMessage=Welcome to mxGraph! - * (end) - * - * The part behind the || is the string value to be used if the given - * resource is not available. - * - * Parameters: - * - * key - String that represents the key of the resource to be returned. - * params - Array of the values for the placeholders of the form {1}...{n} - * to be replaced with in the resulting string. - * defaultValue - Optional string that specifies the default return value. - */ - get: function(key, params, defaultValue) - { - var value = mxResources.resources[key]; - - // Applies the default value if no resource was found - if (value == null) - { - value = defaultValue; - } - - // Replaces the placeholders with the values in the array - if (value != null && params != null) - { - value = mxResources.replacePlaceholders(value, params); - } - - return value; - }, - - /** - * Function: replacePlaceholders - * - * Replaces the given placeholders with the given parameters. - * - * Parameters: - * - * value - String that contains the placeholders. - * params - Array of the values for the placeholders of the form {1}...{n} - * to be replaced with in the resulting string. - */ - replacePlaceholders: function(value, params) - { - var result = []; - var index = null; - - for (var i = 0; i < value.length; i++) - { - var c = value.charAt(i); - - if (c == '{') - { - index = ''; - } - else if (index != null && c == '}') - { - index = parseInt(index)-1; - - if (index >= 0 && index < params.length) - { - result.push(params[index]); - } - - index = null; - } - else if (index != null) - { - index += c; - } - else - { - result.push(c); - } - } - - return result.join(''); - }, - - /** - * Function: loadResources - * - * Loads all required resources asynchronously. Use this to load the graph and - * editor resources if is false. - * - * Parameters: - * - * callback - Callback function for asynchronous loading. - */ - loadResources: function(callback) - { - mxResources.add(mxClient.basePath+'/resources/editor', null, function() - { - mxResources.add(mxClient.basePath+'/resources/graph', null, callback); - }); - } - -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -/** - * Class: mxPoint - * - * Implements a 2-dimensional vector with double precision coordinates. - * - * Constructor: mxPoint - * - * Constructs a new point for the optional x and y coordinates. If no - * coordinates are given, then the default values for and are used. - */ -function mxPoint(x, y) -{ - this.x = (x != null) ? x : 0; - this.y = (y != null) ? y : 0; -}; - -/** - * Variable: x - * - * Holds the x-coordinate of the point. Default is 0. - */ -mxPoint.prototype.x = null; - -/** - * Variable: y - * - * Holds the y-coordinate of the point. Default is 0. - */ -mxPoint.prototype.y = null; - -/** - * Function: equals - * - * Returns true if the given object equals this point. - */ -mxPoint.prototype.equals = function(obj) -{ - return obj != null && obj.x == this.x && obj.y == this.y; -}; - -/** - * Function: clone - * - * Returns a clone of this . - */ -mxPoint.prototype.clone = function() -{ - // Handles subclasses as well - return mxUtils.clone(this); -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -/** - * Class: mxRectangle - * - * Extends to implement a 2-dimensional rectangle with double - * precision coordinates. - * - * Constructor: mxRectangle - * - * Constructs a new rectangle for the optional parameters. If no parameters - * are given then the respective default values are used. - */ -function mxRectangle(x, y, width, height) -{ - mxPoint.call(this, x, y); - - this.width = (width != null) ? width : 0; - this.height = (height != null) ? height : 0; -}; - -/** - * Extends mxPoint. - */ -mxRectangle.prototype = new mxPoint(); -mxRectangle.prototype.constructor = mxRectangle; - -/** - * Variable: width - * - * Holds the width of the rectangle. Default is 0. - */ -mxRectangle.prototype.width = null; - -/** - * Variable: height - * - * Holds the height of the rectangle. Default is 0. - */ -mxRectangle.prototype.height = null; - -/** - * Function: setRect - * - * Sets this rectangle to the specified values - */ -mxRectangle.prototype.setRect = function(x, y, w, h) -{ - this.x = x; - this.y = y; - this.width = w; - this.height = h; -}; - -/** - * Function: getCenterX - * - * Returns the x-coordinate of the center point. - */ -mxRectangle.prototype.getCenterX = function () -{ - return this.x + this.width/2; -}; - -/** - * Function: getCenterY - * - * Returns the y-coordinate of the center point. - */ -mxRectangle.prototype.getCenterY = function () -{ - return this.y + this.height/2; -}; - -/** - * Function: add - * - * Adds the given rectangle to this rectangle. - */ -mxRectangle.prototype.add = function(rect) -{ - if (rect != null) - { - var minX = Math.min(this.x, rect.x); - var minY = Math.min(this.y, rect.y); - var maxX = Math.max(this.x + this.width, rect.x + rect.width); - var maxY = Math.max(this.y + this.height, rect.y + rect.height); - - this.x = minX; - this.y = minY; - this.width = maxX - minX; - this.height = maxY - minY; - } -}; - -/** - * Function: intersect - * - * Changes this rectangle to where it overlaps with the given rectangle. - */ -mxRectangle.prototype.intersect = function(rect) -{ - if (rect != null) - { - var r1 = this.x + this.width; - var r2 = rect.x + rect.width; - - var b1 = this.y + this.height; - var b2 = rect.y + rect.height; - - this.x = Math.max(this.x, rect.x); - this.y = Math.max(this.y, rect.y); - this.width = Math.min(r1, r2) - this.x; - this.height = Math.min(b1, b2) - this.y; - } -}; - -/** - * Function: grow - * - * Grows the rectangle by the given amount, that is, this method subtracts - * the given amount from the x- and y-coordinates and adds twice the amount - * to the width and height. - */ -mxRectangle.prototype.grow = function(amount) -{ - this.x -= amount; - this.y -= amount; - this.width += 2 * amount; - this.height += 2 * amount; -}; - -/** - * Function: getPoint - * - * Returns the top, left corner as a new . - */ -mxRectangle.prototype.getPoint = function() -{ - return new mxPoint(this.x, this.y); -}; - -/** - * Function: rotate90 - * - * Rotates this rectangle by 90 degree around its center point. - */ -mxRectangle.prototype.rotate90 = function() -{ - var t = (this.width - this.height) / 2; - this.x += t; - this.y -= t; - var tmp = this.width; - this.width = this.height; - this.height = tmp; -}; - -/** - * Function: equals - * - * Returns true if the given object equals this rectangle. - */ -mxRectangle.prototype.equals = function(obj) -{ - return obj != null && obj.x == this.x && obj.y == this.y && - obj.width == this.width && obj.height == this.height; -}; - -/** - * Function: fromRectangle - * - * Returns a new which is a copy of the given rectangle. - */ -mxRectangle.fromRectangle = function(rect) -{ - return new mxRectangle(rect.x, rect.y, rect.width, rect.height); -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -var mxEffects = -{ - - /** - * Class: mxEffects - * - * Provides animation effects. - */ - - /** - * Function: animateChanges - * - * Asynchronous animated move operation. See also: . - * - * Example: - * - * (code) - * graph.model.addListener(mxEvent.CHANGE, function(sender, evt) - * { - * var changes = evt.getProperty('edit').changes; - * - * if (changes.length < 10) - * { - * mxEffects.animateChanges(graph, changes); - * } - * }); - * (end) - * - * Parameters: - * - * graph - that received the changes. - * changes - Array of changes to be animated. - * done - Optional function argument that is invoked after the - * last step of the animation. - */ - animateChanges: function(graph, changes, done) - { - var maxStep = 10; - var step = 0; - - var animate = function() - { - var isRequired = false; - - for (var i = 0; i < changes.length; i++) - { - var change = changes[i]; - - if (change instanceof mxGeometryChange || - change instanceof mxTerminalChange || - change instanceof mxValueChange || - change instanceof mxChildChange || - change instanceof mxStyleChange) - { - var state = graph.getView().getState(change.cell || change.child, false); - - if (state != null) - { - isRequired = true; - - if (change.constructor != mxGeometryChange || graph.model.isEdge(change.cell)) - { - mxUtils.setOpacity(state.shape.node, 100 * step / maxStep); - } - else - { - var scale = graph.getView().scale; - - var dx = (change.geometry.x - change.previous.x) * scale; - var dy = (change.geometry.y - change.previous.y) * scale; - - var sx = (change.geometry.width - change.previous.width) * scale; - var sy = (change.geometry.height - change.previous.height) * scale; - - if (step == 0) - { - state.x -= dx; - state.y -= dy; - state.width -= sx; - state.height -= sy; - } - else - { - state.x += dx / maxStep; - state.y += dy / maxStep; - state.width += sx / maxStep; - state.height += sy / maxStep; - } - - graph.cellRenderer.redraw(state); - - // Fades all connected edges and children - mxEffects.cascadeOpacity(graph, change.cell, 100 * step / maxStep); - } - } - } - } - - if (step < maxStep && isRequired) - { - step++; - window.setTimeout(animate, delay); - } - else if (done != null) - { - done(); - } - }; - - var delay = 30; - animate(); - }, - - /** - * Function: cascadeOpacity - * - * Sets the opacity on the given cell and its descendants. - * - * Parameters: - * - * graph - that contains the cells. - * cell - to set the opacity for. - * opacity - New value for the opacity in %. - */ - cascadeOpacity: function(graph, cell, opacity) - { - // Fades all children - var childCount = graph.model.getChildCount(cell); - - for (var i=0; i 0) - { - window.setTimeout(f, delay); - } - else - { - node.style.visibility = 'hidden'; - - if (remove && node.parentNode) - { - node.parentNode.removeChild(node); - } - } - }; - window.setTimeout(f, delay); - } - else - { - node.style.visibility = 'hidden'; - - if (remove && node.parentNode) - { - node.parentNode.removeChild(node); - } - } - } - -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -var mxUtils = -{ - /** - * Class: mxUtils - * - * A singleton class that provides cross-browser helper methods. - * This is a global functionality. To access the functions in this - * class, use the global classname appended by the functionname. - * You may have to load chrome://global/content/contentAreaUtils.js - * to disable certain security restrictions in Mozilla for the , - * , and function. - * - * For example, the following code displays an error message: - * - * (code) - * mxUtils.error('Browser is not supported!', 200, false); - * (end) - * - * Variable: errorResource - * - * Specifies the resource key for the title of the error window. If the - * resource for this key does not exist then the value is used as - * the title. Default is 'error'. - */ - errorResource: (mxClient.language != 'none') ? 'error' : '', - - /** - * Variable: closeResource - * - * Specifies the resource key for the label of the close button. If the - * resource for this key does not exist then the value is used as - * the label. Default is 'close'. - */ - closeResource: (mxClient.language != 'none') ? 'close' : '', - - /** - * Variable: errorImage - * - * Defines the image used for error dialogs. - */ - errorImage: mxClient.imageBasePath + '/error.gif', - - /** - * Function: removeCursors - * - * Removes the cursors from the style of the given DOM node and its - * descendants. - * - * Parameters: - * - * element - DOM node to remove the cursor style from. - */ - removeCursors: function(element) - { - if (element.style != null) - { - element.style.cursor = ''; - } - - var children = element.childNodes; - - if (children != null) - { - var childCount = children.length; - - for (var i = 0; i < childCount; i += 1) - { - mxUtils.removeCursors(children[i]); - } - } - }, - - /** - * Function: getCurrentStyle - * - * Returns the current style of the specified element. - * - * Parameters: - * - * element - DOM node whose current style should be returned. - */ - getCurrentStyle: function() - { - if (mxClient.IS_IE && (document.documentMode == null || document.documentMode < 9)) - { - return function(element) - { - return (element != null) ? element.currentStyle : null; - }; - } - else - { - return function(element) - { - return (element != null) ? - window.getComputedStyle(element, '') : - null; - }; - } - }(), - - /** - * Function: parseCssNumber - * - * Parses the given CSS numeric value adding handling for the values thin, - * medium and thick (2, 4 and 6). - */ - parseCssNumber: function(value) - { - if (value == 'thin') - { - value = '2'; - } - else if (value == 'medium') - { - value = '4'; - } - else if (value == 'thick') - { - value = '6'; - } - - value = parseFloat(value); - - if (isNaN(value)) - { - value = 0; - } - - return value; - }, - - /** - * Function: setPrefixedStyle - * - * Adds the given style with the standard name and an optional vendor prefix for the current - * browser. - * - * (code) - * mxUtils.setPrefixedStyle(node.style, 'transformOrigin', '0% 0%'); - * (end) - */ - setPrefixedStyle: function() - { - var prefix = null; - - if (mxClient.IS_OT) - { - prefix = 'O'; - } - else if (mxClient.IS_SF || mxClient.IS_GC) - { - prefix = 'Webkit'; - } - else if (mxClient.IS_MT) - { - prefix = 'Moz'; - } - else if (mxClient.IS_IE && document.documentMode >= 9 && document.documentMode < 10) - { - prefix = 'ms'; - } - - return function(style, name, value) - { - style[name] = value; - - if (prefix != null && name.length > 0) - { - name = prefix + name.substring(0, 1).toUpperCase() + name.substring(1); - style[name] = value; - } - }; - }(), - - /** - * Function: hasScrollbars - * - * Returns true if the overflow CSS property of the given node is either - * scroll or auto. - * - * Parameters: - * - * node - DOM node whose style should be checked for scrollbars. - */ - hasScrollbars: function(node) - { - var style = mxUtils.getCurrentStyle(node); - - return style != null && (style.overflow == 'scroll' || style.overflow == 'auto'); - }, - - /** - * Function: bind - * - * Returns a wrapper function that locks the execution scope of the given - * function to the specified scope. Inside funct, the "this" keyword - * becomes a reference to that scope. - */ - bind: function(scope, funct) - { - return function() - { - return funct.apply(scope, arguments); - }; - }, - - /** - * Function: eval - * - * Evaluates the given expression using eval and returns the JavaScript - * object that represents the expression result. Supports evaluation of - * expressions that define functions and returns the function object for - * these expressions. - * - * Parameters: - * - * expr - A string that represents a JavaScript expression. - */ - eval: function(expr) - { - var result = null; - - if (expr.indexOf('function') >= 0) - { - try - { - eval('var _mxJavaScriptExpression='+expr); - result = _mxJavaScriptExpression; - // TODO: Use delete here? - _mxJavaScriptExpression = null; - } - catch (e) - { - mxLog.warn(e.message + ' while evaluating ' + expr); - } - } - else - { - try - { - result = eval(expr); - } - catch (e) - { - mxLog.warn(e.message + ' while evaluating ' + expr); - } - } - - return result; - }, - - /** - * Function: findNode - * - * Returns the first node where attr equals value. - * This implementation does not use XPath. - */ - findNode: function(node, attr, value) - { - if (node.nodeType == mxConstants.NODETYPE_ELEMENT) - { - var tmp = node.getAttribute(attr); - - if (tmp != null && tmp == value) - { - return node; - } - } - - node = node.firstChild; - - while (node != null) - { - var result = mxUtils.findNode(node, attr, value); - - if (result != null) - { - return result; - } - - node = node.nextSibling; - } - - return null; - }, - - /** - * Function: getFunctionName - * - * Returns the name for the given function. - * - * Parameters: - * - * f - JavaScript object that represents a function. - */ - getFunctionName: function(f) - { - var str = null; - - if (f != null) - { - if (f.name != null) - { - str = f.name; - } - else - { - str = mxUtils.trim(f.toString()); - - if (/^function\s/.test(str)) - { - str = mxUtils.ltrim(str.substring(9)); - var idx2 = str.indexOf('('); - - if (idx2 > 0) - { - str = str.substring(0, idx2); - } - } - } - } - - return str; - }, - - /** - * Function: indexOf - * - * Returns the index of obj in array or -1 if the array does not contain - * the given object. - * - * Parameters: - * - * array - Array to check for the given obj. - * obj - Object to find in the given array. - */ - indexOf: function(array, obj) - { - if (array != null && obj != null) - { - for (var i = 0; i < array.length; i++) - { - if (array[i] == obj) - { - return i; - } - } - } - - return -1; - }, - - /** - * Function: forEach - * - * Calls the given function for each element of the given array and returns - * the array. - * - * Parameters: - * - * array - Array that contains the elements. - * fn - Function to be called for each object. - */ - forEach: function(array, fn) - { - if (array != null && fn != null) - { - for (var i = 0; i < array.length; i++) - { - fn(array[i]); - } - } - - return array; - }, - - /** - * Function: remove - * - * Removes all occurrences of the given object in the given array or - * object. If there are multiple occurrences of the object, be they - * associative or as an array entry, all occurrences are removed from - * the array or deleted from the object. By removing the object from - * the array, all elements following the removed element are shifted - * by one step towards the beginning of the array. - * - * The length of arrays is not modified inside this function. - * - * Parameters: - * - * obj - Object to find in the given array. - * array - Array to check for the given obj. - */ - remove: function(obj, array) - { - var result = null; - - if (typeof(array) == 'object') - { - var index = mxUtils.indexOf(array, obj); - - while (index >= 0) - { - array.splice(index, 1); - result = obj; - index = mxUtils.indexOf(array, obj); - } - } - - for (var key in array) - { - if (array[key] == obj) - { - delete array[key]; - result = obj; - } - } - - return result; - }, - - /** - * Function: isNode - * - * Returns true if the given value is an XML node with the node name - * and if the optional attribute has the specified value. - * - * This implementation assumes that the given value is a DOM node if the - * nodeType property is numeric, that is, if isNaN returns false for - * value.nodeType. - * - * Parameters: - * - * value - Object that should be examined as a node. - * nodeName - String that specifies the node name. - * attributeName - Optional attribute name to check. - * attributeValue - Optional attribute value to check. - */ - isNode: function(value, nodeName, attributeName, attributeValue) - { - if (value != null && !isNaN(value.nodeType) && (nodeName == null || - value.nodeName.toLowerCase() == nodeName.toLowerCase())) - { - return attributeName == null || - value.getAttribute(attributeName) == attributeValue; - } - - return false; - }, - - /** - * Function: isAncestorNode - * - * Returns true if the given ancestor is an ancestor of the - * given DOM node in the DOM. This also returns true if the - * child is the ancestor. - * - * Parameters: - * - * ancestor - DOM node that represents the ancestor. - * child - DOM node that represents the child. - */ - isAncestorNode: function(ancestor, child) - { - var parent = child; - - while (parent != null) - { - if (parent == ancestor) - { - return true; - } - - parent = parent.parentNode; - } - - return false; - }, - - /** - * Function: getChildNodes - * - * Returns an array of child nodes that are of the given node type. - * - * Parameters: - * - * node - Parent DOM node to return the children from. - * nodeType - Optional node type to return. Default is - * . - */ - getChildNodes: function(node, nodeType) - { - nodeType = nodeType || mxConstants.NODETYPE_ELEMENT; - - var children = []; - var tmp = node.firstChild; - - while (tmp != null) - { - if (tmp.nodeType == nodeType) - { - children.push(tmp); - } - - tmp = tmp.nextSibling; - } - - return children; - }, - - /** - * Function: importNode - * - * Cross browser implementation for document.importNode. Uses document.importNode - * in all browsers but IE, where the node is cloned by creating a new node and - * copying all attributes and children into it using importNode, recursively. - * - * Parameters: - * - * doc - Document to import the node into. - * node - Node to be imported. - * allChildren - If all children should be imported. - */ - importNode: function(doc, node, allChildren) - { - if (mxClient.IS_IE && (document.documentMode == null || document.documentMode < 10)) - { - switch (node.nodeType) - { - case 1: /* element */ - { - var newNode = doc.createElement(node.nodeName); - - if (node.attributes && node.attributes.length > 0) - { - for (var i = 0; i < node.attributes.length; i++) - { - newNode.setAttribute(node.attributes[i].nodeName, - node.getAttribute(node.attributes[i].nodeName)); - } - - if (allChildren && node.childNodes && node.childNodes.length > 0) - { - for (var i = 0; i < node.childNodes.length; i++) - { - newNode.appendChild(mxUtils.importNode(doc, node.childNodes[i], allChildren)); - } - } - } - - return newNode; - break; - } - case 3: /* text */ - case 4: /* cdata-section */ - case 8: /* comment */ - { - return doc.createTextNode(node.value); - break; - } - }; - } - else - { - return doc.importNode(node, allChildren); - } - }, - - /** - * Function: createXmlDocument - * - * Returns a new, empty XML document. - */ - createXmlDocument: function() - { - var doc = null; - - if (document.implementation && document.implementation.createDocument) - { - doc = document.implementation.createDocument('', '', null); - } - else if (window.ActiveXObject) - { - doc = new ActiveXObject('Microsoft.XMLDOM'); - } - - return doc; - }, - - /** - * Function: parseXml - * - * Parses the specified XML string into a new XML document and returns the - * new document. - * - * Example: - * - * (code) - * var doc = mxUtils.parseXml( - * ''+ - * ''+ - * ''+ - * ''+ - * ''); - * (end) - * - * Parameters: - * - * xml - String that contains the XML data. - */ - parseXml: function() - { - if (window.DOMParser) - { - return function(xml) - { - var parser = new DOMParser(); - - return parser.parseFromString(xml, 'text/xml'); - }; - } - else // IE<=9 - { - return function(xml) - { - var result = mxUtils.createXmlDocument(); - result.async = false; - // Workaround for parsing errors with SVG DTD - result.validateOnParse = false; - result.resolveExternals = false; - result.loadXML(xml); - - return result; - }; - } - }(), - - /** - * Function: clearSelection - * - * Clears the current selection in the page. - */ - clearSelection: function() - { - if (document.selection) - { - return function() - { - document.selection.empty(); - }; - } - else if (window.getSelection) - { - return function() - { - if (window.getSelection().empty) - { - window.getSelection().empty(); - } - else if (window.getSelection().removeAllRanges) - { - window.getSelection().removeAllRanges(); - } - }; - } - else - { - return function() { }; - } - }(), - - /** - * Function: getPrettyXML - * - * Returns a pretty printed string that represents the XML tree for the - * given node. This method should only be used to print XML for reading, - * use instead to obtain a string for processing. - * - * Parameters: - * - * node - DOM node to return the XML for. - * tab - Optional string that specifies the indentation for one level. - * Default is two spaces. - * indent - Optional string that represents the current indentation. - * Default is an empty string. - */ - getPrettyXml: function(node, tab, indent) - { - var result = []; - - if (node != null) - { - tab = tab || ' '; - indent = indent || ''; - - if (node.nodeType == mxConstants.NODETYPE_TEXT) - { - var value = mxUtils.trim(mxUtils.getTextContent(node)); - - if (value.length > 0) - { - result.push(indent + mxUtils.htmlEntities(value) + '\n'); - } - } - else - { - result.push(indent + '<' + node.nodeName); - - // Creates the string with the node attributes - // and converts all HTML entities in the values - var attrs = node.attributes; - - if (attrs != null) - { - for (var i = 0; i < attrs.length; i++) - { - var val = mxUtils.htmlEntities(attrs[i].value); - result.push(' ' + attrs[i].nodeName + '="' + val + '"'); - } - } - - // Recursively creates the XML string for each - // child nodes and appends it here with an - // indentation - var tmp = node.firstChild; - - if (tmp != null) - { - result.push('>\n'); - - while (tmp != null) - { - result.push(mxUtils.getPrettyXml(tmp, tab, indent + tab)); - tmp = tmp.nextSibling; - } - - result.push(indent + '\n'); - } - else - { - result.push('/>\n'); - } - } - } - - return result.join(''); - }, - - /** - * Function: removeWhitespace - * - * Removes the sibling text nodes for the given node that only consists - * of tabs, newlines and spaces. - * - * Parameters: - * - * node - DOM node whose siblings should be removed. - * before - Optional boolean that specifies the direction of the traversal. - */ - removeWhitespace: function(node, before) - { - var tmp = (before) ? node.previousSibling : node.nextSibling; - - while (tmp != null && tmp.nodeType == mxConstants.NODETYPE_TEXT) - { - var next = (before) ? tmp.previousSibling : tmp.nextSibling; - var text = mxUtils.getTextContent(tmp); - - if (mxUtils.trim(text).length == 0) - { - tmp.parentNode.removeChild(tmp); - } - - tmp = next; - } - }, - - /** - * Function: htmlEntities - * - * Replaces characters (less than, greater than, newlines and quotes) with - * their HTML entities in the given string and returns the result. - * - * Parameters: - * - * s - String that contains the characters to be converted. - * newline - If newlines should be replaced. Default is true. - */ - htmlEntities: function(s, newline) - { - s = String(s || ''); - - s = s.replace(/&/g,'&'); // 38 26 - s = s.replace(/"/g,'"'); // 34 22 - s = s.replace(/\'/g,'''); // 39 27 - s = s.replace(//g,'>'); // 62 3E - - if (newline == null || newline) - { - s = s.replace(/\n/g, ' '); - } - - return s; - }, - - /** - * Function: isVml - * - * Returns true if the given node is in the VML namespace. - * - * Parameters: - * - * node - DOM node whose tag urn should be checked. - */ - isVml: function(node) - { - return node != null && node.tagUrn == 'urn:schemas-microsoft-com:vml'; - }, - - /** - * Function: getXml - * - * Returns the XML content of the specified node. For Internet Explorer, - * all \r\n\t[\t]* are removed from the XML string and the remaining \r\n - * are replaced by \n. All \n are then replaced with linefeed, or if - * no linefeed is defined. - * - * Parameters: - * - * node - DOM node to return the XML for. - * linefeed - Optional string that linefeeds are converted into. Default is - * - */ - getXml: function(node, linefeed) - { - var xml = ''; - - if (window.XMLSerializer != null) - { - var xmlSerializer = new XMLSerializer(); - xml = xmlSerializer.serializeToString(node); - } - else if (node.xml != null) - { - xml = node.xml.replace(/\r\n\t[\t]*/g, ''). - replace(/>\r\n/g, '>'). - replace(/\r\n/g, '\n'); - } - - // Replaces linefeeds with HTML Entities. - linefeed = linefeed || ' '; - xml = xml.replace(/\n/g, linefeed); - - return xml; - }, - - /** - * Function: extractTextWithWhitespace - * - * Returns the text content of the specified node. - * - * Parameters: - * - * elems - DOM nodes to return the text for. - */ - extractTextWithWhitespace: function(elems) - { - // Known block elements for handling linefeeds (list is not complete) - var blocks = ['BLOCKQUOTE', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'OL', 'P', 'PRE', 'TABLE', 'UL']; - var ret = []; - - function doExtract(elts) - { - // Single break should be ignored - if (elts.length == 1 && (elts[0].nodeName == 'BR' || - elts[0].innerHTML == '\n')) - { - return; - } - - for (var i = 0; i < elts.length; i++) - { - var elem = elts[i]; - - // DIV with a br or linefeed forces a linefeed - if (elem.nodeName == 'BR' || elem.innerHTML == '\n' || - ((elts.length == 1 || i == 0) && (elem.nodeName == 'DIV' && - elem.innerHTML.toLowerCase() == '
                        '))) - { - ret.push('\n'); - } - else - { - if (elem.nodeType === 3 || elem.nodeType === 4) - { - if (elem.nodeValue.length > 0) - { - ret.push(elem.nodeValue); - } - } - else if (elem.nodeType !== 8 && elem.childNodes.length > 0) - { - doExtract(elem.childNodes); - } - - if (i < elts.length - 1 && mxUtils.indexOf(blocks, elts[i + 1].nodeName) >= 0) - { - ret.push('\n'); - } - } - } - }; - - doExtract(elems); - - return ret.join(''); - }, - - /** - * Function: replaceTrailingNewlines - * - * Replaces each trailing newline with the given pattern. - */ - replaceTrailingNewlines: function(str, pattern) - { - // LATER: Check is this can be done with a regular expression - var postfix = ''; - - while (str.length > 0 && str.charAt(str.length - 1) == '\n') - { - str = str.substring(0, str.length - 1); - postfix += pattern; - } - - return str + postfix; - }, - - /** - * Function: getTextContent - * - * Returns the text content of the specified node. - * - * Parameters: - * - * node - DOM node to return the text content for. - */ - getTextContent: function(node) - { - // Only IE10- - if (mxClient.IS_IE && node.innerText !== undefined) - { - return node.innerText; - } - else - { - return (node != null) ? node[(node.textContent === undefined) ? 'text' : 'textContent'] : ''; - } - }, - - /** - * Function: setTextContent - * - * Sets the text content of the specified node. - * - * Parameters: - * - * node - DOM node to set the text content for. - * text - String that represents the text content. - */ - setTextContent: function(node, text) - { - if (node.innerText !== undefined) - { - node.innerText = text; - } - else - { - node[(node.textContent === undefined) ? 'text' : 'textContent'] = text; - } - }, - - /** - * Function: getInnerHtml - * - * Returns the inner HTML for the given node as a string or an empty string - * if no node was specified. The inner HTML is the text representing all - * children of the node, but not the node itself. - * - * Parameters: - * - * node - DOM node to return the inner HTML for. - */ - getInnerHtml: function() - { - if (mxClient.IS_IE) - { - return function(node) - { - if (node != null) - { - return node.innerHTML; - } - - return ''; - }; - } - else - { - return function(node) - { - if (node != null) - { - var serializer = new XMLSerializer(); - return serializer.serializeToString(node); - } - - return ''; - }; - } - }(), - - /** - * Function: getOuterHtml - * - * Returns the outer HTML for the given node as a string or an empty - * string if no node was specified. The outer HTML is the text representing - * all children of the node including the node itself. - * - * Parameters: - * - * node - DOM node to return the outer HTML for. - */ - getOuterHtml: function() - { - if (mxClient.IS_IE) - { - return function(node) - { - if (node != null) - { - if (node.outerHTML != null) - { - return node.outerHTML; - } - else - { - var tmp = []; - tmp.push('<'+node.nodeName); - - var attrs = node.attributes; - - if (attrs != null) - { - for (var i = 0; i < attrs.length; i++) - { - var value = attrs[i].value; - - if (value != null && value.length > 0) - { - tmp.push(' '); - tmp.push(attrs[i].nodeName); - tmp.push('="'); - tmp.push(value); - tmp.push('"'); - } - } - } - - if (node.innerHTML.length == 0) - { - tmp.push('/>'); - } - else - { - tmp.push('>'); - tmp.push(node.innerHTML); - tmp.push(''); - } - - return tmp.join(''); - } - } - - return ''; - }; - } - else - { - return function(node) - { - if (node != null) - { - var serializer = new XMLSerializer(); - return serializer.serializeToString(node); - } - - return ''; - }; - } - }(), - - /** - * Function: write - * - * Creates a text node for the given string and appends it to the given - * parent. Returns the text node. - * - * Parameters: - * - * parent - DOM node to append the text node to. - * text - String representing the text to be added. - */ - write: function(parent, text) - { - var doc = parent.ownerDocument; - var node = doc.createTextNode(text); - - if (parent != null) - { - parent.appendChild(node); - } - - return node; - }, - - /** - * Function: writeln - * - * Creates a text node for the given string and appends it to the given - * parent with an additional linefeed. Returns the text node. - * - * Parameters: - * - * parent - DOM node to append the text node to. - * text - String representing the text to be added. - */ - writeln: function(parent, text) - { - var doc = parent.ownerDocument; - var node = doc.createTextNode(text); - - if (parent != null) - { - parent.appendChild(node); - parent.appendChild(document.createElement('br')); - } - - return node; - }, - - /** - * Function: br - * - * Appends a linebreak to the given parent and returns the linebreak. - * - * Parameters: - * - * parent - DOM node to append the linebreak to. - */ - br: function(parent, count) - { - count = count || 1; - var br = null; - - for (var i = 0; i < count; i++) - { - if (parent != null) - { - br = parent.ownerDocument.createElement('br'); - parent.appendChild(br); - } - } - - return br; - }, - - /** - * Function: button - * - * Returns a new button with the given level and function as an onclick - * event handler. - * - * (code) - * document.body.appendChild(mxUtils.button('Test', function(evt) - * { - * alert('Hello, World!'); - * })); - * (end) - * - * Parameters: - * - * label - String that represents the label of the button. - * funct - Function to be called if the button is pressed. - * doc - Optional document to be used for creating the button. Default is the - * current document. - */ - button: function(label, funct, doc) - { - doc = (doc != null) ? doc : document; - - var button = doc.createElement('button'); - mxUtils.write(button, label); - - mxEvent.addListener(button, 'click', function(evt) - { - funct(evt); - }); - - return button; - }, - - /** - * Function: para - * - * Appends a new paragraph with the given text to the specified parent and - * returns the paragraph. - * - * Parameters: - * - * parent - DOM node to append the text node to. - * text - String representing the text for the new paragraph. - */ - para: function(parent, text) - { - var p = document.createElement('p'); - mxUtils.write(p, text); - - if (parent != null) - { - parent.appendChild(p); - } - - return p; - }, - - /** - * Function: addTransparentBackgroundFilter - * - * Adds a transparent background to the filter of the given node. This - * background can be used in IE8 standards mode (native IE8 only) to pass - * events through the node. - */ - addTransparentBackgroundFilter: function(node) - { - node.style.filter += 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + - mxClient.imageBasePath + '/transparent.gif\', sizingMethod=\'scale\')'; - }, - - /** - * Function: linkAction - * - * Adds a hyperlink to the specified parent that invokes action on the - * specified editor. - * - * Parameters: - * - * parent - DOM node to contain the new link. - * text - String that is used as the link label. - * editor - that will execute the action. - * action - String that defines the name of the action to be executed. - * pad - Optional left-padding for the link. Default is 0. - */ - linkAction: function(parent, text, editor, action, pad) - { - return mxUtils.link(parent, text, function() - { - editor.execute(action); - }, pad); - }, - - /** - * Function: linkInvoke - * - * Adds a hyperlink to the specified parent that invokes the specified - * function on the editor passing along the specified argument. The - * function name is the name of a function of the editor instance, - * not an action name. - * - * Parameters: - * - * parent - DOM node to contain the new link. - * text - String that is used as the link label. - * editor - instance to execute the function on. - * functName - String that represents the name of the function. - * arg - Object that represents the argument to the function. - * pad - Optional left-padding for the link. Default is 0. - */ - linkInvoke: function(parent, text, editor, functName, arg, pad) - { - return mxUtils.link(parent, text, function() - { - editor[functName](arg); - }, pad); - }, - - /** - * Function: link - * - * Adds a hyperlink to the specified parent and invokes the given function - * when the link is clicked. - * - * Parameters: - * - * parent - DOM node to contain the new link. - * text - String that is used as the link label. - * funct - Function to execute when the link is clicked. - * pad - Optional left-padding for the link. Default is 0. - */ - link: function(parent, text, funct, pad) - { - var a = document.createElement('span'); - - a.style.color = 'blue'; - a.style.textDecoration = 'underline'; - a.style.cursor = 'pointer'; - - if (pad != null) - { - a.style.paddingLeft = pad+'px'; - } - - mxEvent.addListener(a, 'click', funct); - mxUtils.write(a, text); - - if (parent != null) - { - parent.appendChild(a); - } - - return a; - }, - - /** - * Function: getDocumentSize - * - * Returns the client size for the current document as an . - */ - getDocumentSize: function() - { - var b = document.body; - var d = document.documentElement; - - try - { - return new mxRectangle(0, 0, b.clientWidth || d.clientWidth, Math.max(b.clientHeight || 0, d.clientHeight)); - } - catch (e) - { - return new mxRectangle(); - } - }, - - /** - * Function: fit - * - * Makes sure the given node is inside the visible area of the window. This - * is done by setting the left and top in the style. - */ - fit: function(node) - { - var ds = mxUtils.getDocumentSize(); - var left = parseInt(node.offsetLeft); - var width = parseInt(node.offsetWidth); - - var offset = mxUtils.getDocumentScrollOrigin(node.ownerDocument); - var sl = offset.x; - var st = offset.y; - - var b = document.body; - var d = document.documentElement; - var right = (sl) + ds.width; - - if (left + width > right) - { - node.style.left = Math.max(sl, right - width) + 'px'; - } - - var top = parseInt(node.offsetTop); - var height = parseInt(node.offsetHeight); - - var bottom = st + ds.height; - - if (top + height > bottom) - { - node.style.top = Math.max(st, bottom - height) + 'px'; - } - }, - - /** - * Function: load - * - * Loads the specified URL *synchronously* and returns the . - * Throws an exception if the file cannot be loaded. See for - * an asynchronous implementation. - * - * Example: - * - * (code) - * try - * { - * var req = mxUtils.load(filename); - * var root = req.getDocumentElement(); - * // Process XML DOM... - * } - * catch (ex) - * { - * mxUtils.alert('Cannot load '+filename+': '+ex); - * } - * (end) - * - * Parameters: - * - * url - URL to get the data from. - */ - load: function(url) - { - var req = new mxXmlRequest(url, null, 'GET', false); - req.send(); - - return req; - }, - - /** - * Function: get - * - * Loads the specified URL *asynchronously* and invokes the given functions - * depending on the request status. Returns the in use. Both - * functions take the as the only parameter. See - * for a synchronous implementation. - * - * Example: - * - * (code) - * mxUtils.get(url, function(req) - * { - * var node = req.getDocumentElement(); - * // Process XML DOM... - * }); - * (end) - * - * So for example, to load a diagram into an existing graph model, the - * following code is used. - * - * (code) - * mxUtils.get(url, function(req) - * { - * var node = req.getDocumentElement(); - * var dec = new mxCodec(node.ownerDocument); - * dec.decode(node, graph.getModel()); - * }); - * (end) - * - * Parameters: - * - * url - URL to get the data from. - * onload - Optional function to execute for a successful response. - * onerror - Optional function to execute on error. - * binary - Optional boolean parameter that specifies if the request is - * binary. - * timeout - Optional timeout in ms before calling ontimeout. - * ontimeout - Optional function to execute on timeout. - */ - get: function(url, onload, onerror, binary, timeout, ontimeout) - { - var req = new mxXmlRequest(url, null, 'GET'); - - if (binary != null) - { - req.setBinary(binary); - } - - req.send(onload, onerror, timeout, ontimeout); - - return req; - }, - - /** - * Function: getAll - * - * Loads the URLs in the given array *asynchronously* and invokes the given function - * if all requests returned with a valid 2xx status. The error handler is invoked - * once on the first error or invalid response. - * - * Parameters: - * - * urls - Array of URLs to be loaded. - * onload - Callback with array of . - * onerror - Optional function to execute on error. - */ - getAll: function(urls, onload, onerror) - { - var remain = urls.length; - var result = []; - var errors = 0; - var err = function() - { - if (errors == 0 && onerror != null) - { - onerror(); - } - - errors++; - }; - - for (var i = 0; i < urls.length; i++) - { - (function(url, index) - { - mxUtils.get(url, function(req) - { - var status = req.getStatus(); - - if (status < 200 || status > 299) - { - err(); - } - else - { - result[index] = req; - remain--; - - if (remain == 0) - { - onload(result); - } - } - }, err); - })(urls[i], i); - } - - if (remain == 0) - { - onload(result); - } - }, - - /** - * Function: post - * - * Posts the specified params to the given URL *asynchronously* and invokes - * the given functions depending on the request status. Returns the - * in use. Both functions take the as the - * only parameter. Make sure to use encodeURIComponent for the parameter - * values. - * - * Example: - * - * (code) - * mxUtils.post(url, 'key=value', function(req) - * { - * mxUtils.alert('Ready: '+req.isReady()+' Status: '+req.getStatus()); - * // Process req.getDocumentElement() using DOM API if OK... - * }); - * (end) - * - * Parameters: - * - * url - URL to get the data from. - * params - Parameters for the post request. - * onload - Optional function to execute for a successful response. - * onerror - Optional function to execute on error. - */ - post: function(url, params, onload, onerror) - { - return new mxXmlRequest(url, params).send(onload, onerror); - }, - - /** - * Function: submit - * - * Submits the given parameters to the specified URL using - * and returns the . - * Make sure to use encodeURIComponent for the parameter - * values. - * - * Parameters: - * - * url - URL to get the data from. - * params - Parameters for the form. - * doc - Document to create the form in. - * target - Target to send the form result to. - */ - submit: function(url, params, doc, target) - { - return new mxXmlRequest(url, params).simulate(doc, target); - }, - - /** - * Function: loadInto - * - * Loads the specified URL *asynchronously* into the specified document, - * invoking onload after the document has been loaded. This implementation - * does not use , but the document.load method. - * - * Parameters: - * - * url - URL to get the data from. - * doc - The document to load the URL into. - * onload - Function to execute when the URL has been loaded. - */ - loadInto: function(url, doc, onload) - { - if (mxClient.IS_IE) - { - doc.onreadystatechange = function () - { - if (doc.readyState == 4) - { - onload(); - } - }; - } - else - { - doc.addEventListener('load', onload, false); - } - - doc.load(url); - }, - - /** - * Function: getValue - * - * Returns the value for the given key in the given associative array or - * the given default value if the value is null. - * - * Parameters: - * - * array - Associative array that contains the value for the key. - * key - Key whose value should be returned. - * defaultValue - Value to be returned if the value for the given - * key is null. - */ - getValue: function(array, key, defaultValue) - { - var value = (array != null) ? array[key] : null; - - if (value == null) - { - value = defaultValue; - } - - return value; - }, - - /** - * Function: getNumber - * - * Returns the numeric value for the given key in the given associative - * array or the given default value (or 0) if the value is null. The value - * is converted to a numeric value using the Number function. - * - * Parameters: - * - * array - Associative array that contains the value for the key. - * key - Key whose value should be returned. - * defaultValue - Value to be returned if the value for the given - * key is null. Default is 0. - */ - getNumber: function(array, key, defaultValue) - { - var value = (array != null) ? array[key] : null; - - if (value == null) - { - value = defaultValue || 0; - } - - return Number(value); - }, - - /** - * Function: getColor - * - * Returns the color value for the given key in the given associative - * array or the given default value if the value is null. If the value - * is then null is returned. - * - * Parameters: - * - * array - Associative array that contains the value for the key. - * key - Key whose value should be returned. - * defaultValue - Value to be returned if the value for the given - * key is null. Default is null. - */ - getColor: function(array, key, defaultValue) - { - var value = (array != null) ? array[key] : null; - - if (value == null) - { - value = defaultValue; - } - else if (value == mxConstants.NONE) - { - value = null; - } - - return value; - }, - - /** - * Function: clone - * - * Recursively clones the specified object ignoring all fieldnames in the - * given array of transient fields. is always - * ignored by this function. - * - * Parameters: - * - * obj - Object to be cloned. - * transients - Optional array of strings representing the fieldname to be - * ignored. - * shallow - Optional boolean argument to specify if a shallow clone should - * be created, that is, one where all object references are not cloned or, - * in other words, one where only atomic (strings, numbers) values are - * cloned. Default is false. - */ - clone: function(obj, transients, shallow) - { - shallow = (shallow != null) ? shallow : false; - var clone = null; - - if (obj != null && typeof(obj.constructor) == 'function') - { - clone = new obj.constructor(); - - for (var i in obj) - { - if (i != mxObjectIdentity.FIELD_NAME && (transients == null || - mxUtils.indexOf(transients, i) < 0)) - { - if (!shallow && typeof(obj[i]) == 'object') - { - clone[i] = mxUtils.clone(obj[i]); - } - else - { - clone[i] = obj[i]; - } - } - } - } - - return clone; - }, - - /** - * Function: equalPoints - * - * Compares all mxPoints in the given lists. - * - * Parameters: - * - * a - Array of to be compared. - * b - Array of to be compared. - */ - equalPoints: function(a, b) - { - if ((a == null && b != null) || (a != null && b == null) || - (a != null && b != null && a.length != b.length)) - { - return false; - } - else if (a != null && b != null) - { - for (var i = 0; i < a.length; i++) - { - if (a[i] == b[i] || (a[i] != null && !a[i].equals(b[i]))) - { - return false; - } - } - } - - return true; - }, - - /** - * Function: equalEntries - * - * Returns true if all properties of the given objects are equal. Values - * with NaN are equal to NaN and unequal to any other value. - * - * Parameters: - * - * a - First object to be compared. - * b - Second object to be compared. - */ - equalEntries: function(a, b) - { - if ((a == null && b != null) || (a != null && b == null) || - (a != null && b != null && a.length != b.length)) - { - return false; - } - else if (a != null && b != null) - { - // Counts keys in b to check if all values have been compared - var count = 0; - - for (var key in b) - { - count++; - } - - for (var key in a) - { - count-- - - if ((!mxUtils.isNaN(a[key]) || !mxUtils.isNaN(b[key])) && a[key] != b[key]) - { - return false; - } - } - } - - return count == 0; - }, - - /** - * Function: removeDuplicates - * - * Removes all duplicates from the given array. - */ - removeDuplicates: function(arr) - { - var dict = new mxDictionary(); - var result = []; - - for (var i = 0; i < arr.length; i++) - { - if (!dict.get(arr[i])) - { - result.push(arr[i]); - dict.put(arr[i], true); - } - } - - return result; - }, - - /** - * Function: isNaN - * - * Returns true if the given value is of type number and isNaN returns true. - */ - isNaN: function(value) - { - return typeof(value) == 'number' && isNaN(value); - }, - - /** - * Function: extend - * - * Assigns a copy of the superclass prototype to the subclass prototype. - * Note that this does not call the constructor of the superclass at this - * point, the superclass constructor should be called explicitely in the - * subclass constructor. Below is an example. - * - * (code) - * MyGraph = function(container, model, renderHint, stylesheet) - * { - * mxGraph.call(this, container, model, renderHint, stylesheet); - * } - * - * mxUtils.extend(MyGraph, mxGraph); - * (end) - * - * Parameters: - * - * ctor - Constructor of the subclass. - * superCtor - Constructor of the superclass. - */ - extend: function(ctor, superCtor) - { - var f = function() {}; - f.prototype = superCtor.prototype; - - ctor.prototype = new f(); - ctor.prototype.constructor = ctor; - }, - - /** - * Function: toString - * - * Returns a textual representation of the specified object. - * - * Parameters: - * - * obj - Object to return the string representation for. - */ - toString: function(obj) - { - var output = ''; - - for (var i in obj) - { - try - { - if (obj[i] == null) - { - output += i + ' = [null]\n'; - } - else if (typeof(obj[i]) == 'function') - { - output += i + ' => [Function]\n'; - } - else if (typeof(obj[i]) == 'object') - { - var ctor = mxUtils.getFunctionName(obj[i].constructor); - output += i + ' => [' + ctor + ']\n'; - } - else - { - output += i + ' = ' + obj[i] + '\n'; - } - } - catch (e) - { - output += i + '=' + e.message; - } - } - - return output; - }, - - /** - * Function: toRadians - * - * Converts the given degree to radians. - */ - toRadians: function(deg) - { - return Math.PI * deg / 180; - }, - - /** - * Function: toDegree - * - * Converts the given radians to degree. - */ - toDegree: function(rad) - { - return rad * 180 / Math.PI; - }, - - /** - * Function: arcToCurves - * - * Converts the given arc to a series of curves. - */ - arcToCurves: function(x0, y0, r1, r2, angle, largeArcFlag, sweepFlag, x, y) - { - x -= x0; - y -= y0; - - if (r1 === 0 || r2 === 0) - { - return result; - } - - var fS = sweepFlag; - var psai = angle; - r1 = Math.abs(r1); - r2 = Math.abs(r2); - var ctx = -x / 2; - var cty = -y / 2; - var cpsi = Math.cos(psai * Math.PI / 180); - var spsi = Math.sin(psai * Math.PI / 180); - var rxd = cpsi * ctx + spsi * cty; - var ryd = -1 * spsi * ctx + cpsi * cty; - var rxdd = rxd * rxd; - var rydd = ryd * ryd; - var r1x = r1 * r1; - var r2y = r2 * r2; - var lamda = rxdd / r1x + rydd / r2y; - var sds; - - if (lamda > 1) - { - r1 = Math.sqrt(lamda) * r1; - r2 = Math.sqrt(lamda) * r2; - sds = 0; - } - else - { - var seif = 1; - - if (largeArcFlag === fS) - { - seif = -1; - } - - sds = seif * Math.sqrt((r1x * r2y - r1x * rydd - r2y * rxdd) / (r1x * rydd + r2y * rxdd)); - } - - var txd = sds * r1 * ryd / r2; - var tyd = -1 * sds * r2 * rxd / r1; - var tx = cpsi * txd - spsi * tyd + x / 2; - var ty = spsi * txd + cpsi * tyd + y / 2; - var rad = Math.atan2((ryd - tyd) / r2, (rxd - txd) / r1) - Math.atan2(0, 1); - var s1 = (rad >= 0) ? rad : 2 * Math.PI + rad; - rad = Math.atan2((-ryd - tyd) / r2, (-rxd - txd) / r1) - Math.atan2((ryd - tyd) / r2, (rxd - txd) / r1); - var dr = (rad >= 0) ? rad : 2 * Math.PI + rad; - - if (fS == 0 && dr > 0) - { - dr -= 2 * Math.PI; - } - else if (fS != 0 && dr < 0) - { - dr += 2 * Math.PI; - } - - var sse = dr * 2 / Math.PI; - var seg = Math.ceil(sse < 0 ? -1 * sse : sse); - var segr = dr / seg; - var t = 8/3 * Math.sin(segr / 4) * Math.sin(segr / 4) / Math.sin(segr / 2); - var cpsir1 = cpsi * r1; - var cpsir2 = cpsi * r2; - var spsir1 = spsi * r1; - var spsir2 = spsi * r2; - var mc = Math.cos(s1); - var ms = Math.sin(s1); - var x2 = -t * (cpsir1 * ms + spsir2 * mc); - var y2 = -t * (spsir1 * ms - cpsir2 * mc); - var x3 = 0; - var y3 = 0; - - var result = []; - - for (var n = 0; n < seg; ++n) - { - s1 += segr; - mc = Math.cos(s1); - ms = Math.sin(s1); - - x3 = cpsir1 * mc - spsir2 * ms + tx; - y3 = spsir1 * mc + cpsir2 * ms + ty; - var dx = -t * (cpsir1 * ms + spsir2 * mc); - var dy = -t * (spsir1 * ms - cpsir2 * mc); - - // CurveTo updates x0, y0 so need to restore it - var index = n * 6; - result[index] = Number(x2 + x0); - result[index + 1] = Number(y2 + y0); - result[index + 2] = Number(x3 - dx + x0); - result[index + 3] = Number(y3 - dy + y0); - result[index + 4] = Number(x3 + x0); - result[index + 5] = Number(y3 + y0); - - x2 = x3 + dx; - y2 = y3 + dy; - } - - return result; - }, - - /** - * Function: getBoundingBox - * - * Returns the bounding box for the rotated rectangle. - * - * Parameters: - * - * rect - to be rotated. - * angle - Number that represents the angle (in degrees). - * cx - Optional that represents the rotation center. If no - * rotation center is given then the center of rect is used. - */ - getBoundingBox: function(rect, rotation, cx) - { - var result = null; - - if (rect != null && rotation != null && rotation != 0) - { - var rad = mxUtils.toRadians(rotation); - var cos = Math.cos(rad); - var sin = Math.sin(rad); - - cx = (cx != null) ? cx : new mxPoint(rect.x + rect.width / 2, rect.y + rect.height / 2); - - var p1 = new mxPoint(rect.x, rect.y); - var p2 = new mxPoint(rect.x + rect.width, rect.y); - var p3 = new mxPoint(p2.x, rect.y + rect.height); - var p4 = new mxPoint(rect.x, p3.y); - - p1 = mxUtils.getRotatedPoint(p1, cos, sin, cx); - p2 = mxUtils.getRotatedPoint(p2, cos, sin, cx); - p3 = mxUtils.getRotatedPoint(p3, cos, sin, cx); - p4 = mxUtils.getRotatedPoint(p4, cos, sin, cx); - - result = new mxRectangle(p1.x, p1.y, 0, 0); - result.add(new mxRectangle(p2.x, p2.y, 0, 0)); - result.add(new mxRectangle(p3.x, p3.y, 0, 0)); - result.add(new mxRectangle(p4.x, p4.y, 0, 0)); - } - - return result; - }, - - /** - * Function: getRotatedPoint - * - * Rotates the given point by the given cos and sin. - */ - getRotatedPoint: function(pt, cos, sin, c) - { - c = (c != null) ? c : new mxPoint(); - var x = pt.x - c.x; - var y = pt.y - c.y; - - var x1 = x * cos - y * sin; - var y1 = y * cos + x * sin; - - return new mxPoint(x1 + c.x, y1 + c.y); - }, - - /** - * Returns an integer mask of the port constraints of the given map - * @param dict the style map to determine the port constraints for - * @param defaultValue Default value to return if the key is undefined. - * @return the mask of port constraint directions - * - * Parameters: - * - * terminal - that represents the terminal. - * edge - that represents the edge. - * source - Boolean that specifies if the terminal is the source terminal. - * defaultValue - Default value to be returned. - */ - getPortConstraints: function(terminal, edge, source, defaultValue) - { - var value = mxUtils.getValue(terminal.style, mxConstants.STYLE_PORT_CONSTRAINT, - mxUtils.getValue(edge.style, (source) ? mxConstants.STYLE_SOURCE_PORT_CONSTRAINT : - mxConstants.STYLE_TARGET_PORT_CONSTRAINT, null)); - - if (value == null) - { - return defaultValue; - } - else - { - var directions = value.toString(); - var returnValue = mxConstants.DIRECTION_MASK_NONE; - var constraintRotationEnabled = mxUtils.getValue(terminal.style, mxConstants.STYLE_PORT_CONSTRAINT_ROTATION, 0); - var rotation = 0; - - if (constraintRotationEnabled == 1) - { - rotation = mxUtils.getValue(terminal.style, mxConstants.STYLE_ROTATION, 0); - } - - var quad = 0; - - if (rotation > 45) - { - quad = 1; - - if (rotation >= 135) - { - quad = 2; - } - } - else if (rotation < -45) - { - quad = 3; - - if (rotation <= -135) - { - quad = 2; - } - } - - if (directions.indexOf(mxConstants.DIRECTION_NORTH) >= 0) - { - switch (quad) - { - case 0: - returnValue |= mxConstants.DIRECTION_MASK_NORTH; - break; - case 1: - returnValue |= mxConstants.DIRECTION_MASK_EAST; - break; - case 2: - returnValue |= mxConstants.DIRECTION_MASK_SOUTH; - break; - case 3: - returnValue |= mxConstants.DIRECTION_MASK_WEST; - break; - } - } - if (directions.indexOf(mxConstants.DIRECTION_WEST) >= 0) - { - switch (quad) - { - case 0: - returnValue |= mxConstants.DIRECTION_MASK_WEST; - break; - case 1: - returnValue |= mxConstants.DIRECTION_MASK_NORTH; - break; - case 2: - returnValue |= mxConstants.DIRECTION_MASK_EAST; - break; - case 3: - returnValue |= mxConstants.DIRECTION_MASK_SOUTH; - break; - } - } - if (directions.indexOf(mxConstants.DIRECTION_SOUTH) >= 0) - { - switch (quad) - { - case 0: - returnValue |= mxConstants.DIRECTION_MASK_SOUTH; - break; - case 1: - returnValue |= mxConstants.DIRECTION_MASK_WEST; - break; - case 2: - returnValue |= mxConstants.DIRECTION_MASK_NORTH; - break; - case 3: - returnValue |= mxConstants.DIRECTION_MASK_EAST; - break; - } - } - if (directions.indexOf(mxConstants.DIRECTION_EAST) >= 0) - { - switch (quad) - { - case 0: - returnValue |= mxConstants.DIRECTION_MASK_EAST; - break; - case 1: - returnValue |= mxConstants.DIRECTION_MASK_SOUTH; - break; - case 2: - returnValue |= mxConstants.DIRECTION_MASK_WEST; - break; - case 3: - returnValue |= mxConstants.DIRECTION_MASK_NORTH; - break; - } - } - - return returnValue; - } - }, - - /** - * Function: reversePortConstraints - * - * Reverse the port constraint bitmask. For example, north | east - * becomes south | west - */ - reversePortConstraints: function(constraint) - { - var result = 0; - - result = (constraint & mxConstants.DIRECTION_MASK_WEST) << 3; - result |= (constraint & mxConstants.DIRECTION_MASK_NORTH) << 1; - result |= (constraint & mxConstants.DIRECTION_MASK_SOUTH) >> 1; - result |= (constraint & mxConstants.DIRECTION_MASK_EAST) >> 3; - - return result; - }, - - /** - * Function: findNearestSegment - * - * Finds the index of the nearest segment on the given cell state for - * the specified coordinate pair. - */ - findNearestSegment: function(state, x, y) - { - var index = -1; - - if (state.absolutePoints.length > 0) - { - var last = state.absolutePoints[0]; - var min = null; - - for (var i = 1; i < state.absolutePoints.length; i++) - { - var current = state.absolutePoints[i]; - var dist = mxUtils.ptSegDistSq(last.x, last.y, - current.x, current.y, x, y); - - if (min == null || dist < min) - { - min = dist; - index = i - 1; - } - - last = current; - } - } - - return index; - }, - - /** - * Function: getDirectedBounds - * - * Adds the given margins to the given rectangle and rotates and flips the - * rectangle according to the respective styles in style. - */ - getDirectedBounds: function (rect, m, style, flipH, flipV) - { - var d = mxUtils.getValue(style, mxConstants.STYLE_DIRECTION, mxConstants.DIRECTION_EAST); - flipH = (flipH != null) ? flipH : mxUtils.getValue(style, mxConstants.STYLE_FLIPH, false); - flipV = (flipV != null) ? flipV : mxUtils.getValue(style, mxConstants.STYLE_FLIPV, false); - - m.x = Math.round(Math.max(0, Math.min(rect.width, m.x))); - m.y = Math.round(Math.max(0, Math.min(rect.height, m.y))); - m.width = Math.round(Math.max(0, Math.min(rect.width, m.width))); - m.height = Math.round(Math.max(0, Math.min(rect.height, m.height))); - - if ((flipV && (d == mxConstants.DIRECTION_SOUTH || d == mxConstants.DIRECTION_NORTH)) || - (flipH && (d == mxConstants.DIRECTION_EAST || d == mxConstants.DIRECTION_WEST))) - { - var tmp = m.x; - m.x = m.width; - m.width = tmp; - } - - if ((flipH && (d == mxConstants.DIRECTION_SOUTH || d == mxConstants.DIRECTION_NORTH)) || - (flipV && (d == mxConstants.DIRECTION_EAST || d == mxConstants.DIRECTION_WEST))) - { - var tmp = m.y; - m.y = m.height; - m.height = tmp; - } - - var m2 = mxRectangle.fromRectangle(m); - - if (d == mxConstants.DIRECTION_SOUTH) - { - m2.y = m.x; - m2.x = m.height; - m2.width = m.y; - m2.height = m.width; - } - else if (d == mxConstants.DIRECTION_WEST) - { - m2.y = m.height; - m2.x = m.width; - m2.width = m.x; - m2.height = m.y; - } - else if (d == mxConstants.DIRECTION_NORTH) - { - m2.y = m.width; - m2.x = m.y; - m2.width = m.height; - m2.height = m.x; - } - - return new mxRectangle(rect.x + m2.x, rect.y + m2.y, rect.width - m2.width - m2.x, rect.height - m2.height - m2.y); - }, - - /** - * Function: getPerimeterPoint - * - * Returns the intersection between the polygon defined by the array of - * points and the line between center and point. - */ - getPerimeterPoint: function (pts, center, point) - { - var min = null; - - for (var i = 0; i < pts.length - 1; i++) - { - var pt = mxUtils.intersection(pts[i].x, pts[i].y, pts[i + 1].x, pts[i + 1].y, - center.x, center.y, point.x, point.y); - - if (pt != null) - { - var dx = point.x - pt.x; - var dy = point.y - pt.y; - var ip = {p: pt, distSq: dy * dy + dx * dx}; - - if (ip != null && (min == null || min.distSq > ip.distSq)) - { - min = ip; - } - } - } - - return (min != null) ? min.p : null; - }, - - /** - * Function: rectangleIntersectsSegment - * - * Returns true if the given rectangle intersects the given segment. - * - * Parameters: - * - * bounds - that represents the rectangle. - * p1 - that represents the first point of the segment. - * p2 - that represents the second point of the segment. - */ - rectangleIntersectsSegment: function(bounds, p1, p2) - { - var top = bounds.y; - var left = bounds.x; - var bottom = top + bounds.height; - var right = left + bounds.width; - - // Find min and max X for the segment - var minX = p1.x; - var maxX = p2.x; - - if (p1.x > p2.x) - { - minX = p2.x; - maxX = p1.x; - } - - // Find the intersection of the segment's and rectangle's x-projections - if (maxX > right) - { - maxX = right; - } - - if (minX < left) - { - minX = left; - } - - if (minX > maxX) // If their projections do not intersect return false - { - return false; - } - - // Find corresponding min and max Y for min and max X we found before - var minY = p1.y; - var maxY = p2.y; - var dx = p2.x - p1.x; - - if (Math.abs(dx) > 0.0000001) - { - var a = (p2.y - p1.y) / dx; - var b = p1.y - a * p1.x; - minY = a * minX + b; - maxY = a * maxX + b; - } - - if (minY > maxY) - { - var tmp = maxY; - maxY = minY; - minY = tmp; - } - - // Find the intersection of the segment's and rectangle's y-projections - if (maxY > bottom) - { - maxY = bottom; - } - - if (minY < top) - { - minY = top; - } - - if (minY > maxY) // If Y-projections do not intersect return false - { - return false; - } - - return true; - }, - - /** - * Function: contains - * - * Returns true if the specified point (x, y) is contained in the given rectangle. - * - * Parameters: - * - * bounds - that represents the area. - * x - X-coordinate of the point. - * y - Y-coordinate of the point. - */ - contains: function(bounds, x, y) - { - return (bounds.x <= x && bounds.x + bounds.width >= x && - bounds.y <= y && bounds.y + bounds.height >= y); - }, - - /** - * Function: intersects - * - * Returns true if the two rectangles intersect. - * - * Parameters: - * - * a - to be checked for intersection. - * b - to be checked for intersection. - */ - intersects: function(a, b) - { - var tw = a.width; - var th = a.height; - var rw = b.width; - var rh = b.height; - - if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) - { - return false; - } - - var tx = a.x; - var ty = a.y; - var rx = b.x; - var ry = b.y; - - rw += rx; - rh += ry; - tw += tx; - th += ty; - - return ((rw < rx || rw > tx) && - (rh < ry || rh > ty) && - (tw < tx || tw > rx) && - (th < ty || th > ry)); - }, - - /** - * Function: intersects - * - * Returns true if the two rectangles intersect. - * - * Parameters: - * - * a - to be checked for intersection. - * b - to be checked for intersection. - */ - intersectsHotspot: function(state, x, y, hotspot, min, max) - { - hotspot = (hotspot != null) ? hotspot : 1; - min = (min != null) ? min : 0; - max = (max != null) ? max : 0; - - if (hotspot > 0) - { - var cx = state.getCenterX(); - var cy = state.getCenterY(); - var w = state.width; - var h = state.height; - - var start = mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE) * state.view.scale; - - if (start > 0) - { - if (mxUtils.getValue(state.style, mxConstants.STYLE_HORIZONTAL, true)) - { - cy = state.y + start / 2; - h = start; - } - else - { - cx = state.x + start / 2; - w = start; - } - } - - w = Math.max(min, w * hotspot); - h = Math.max(min, h * hotspot); - - if (max > 0) - { - w = Math.min(w, max); - h = Math.min(h, max); - } - - var rect = new mxRectangle(cx - w / 2, cy - h / 2, w, h); - var alpha = mxUtils.toRadians(mxUtils.getValue(state.style, mxConstants.STYLE_ROTATION) || 0); - - if (alpha != 0) - { - var cos = Math.cos(-alpha); - var sin = Math.sin(-alpha); - var cx = new mxPoint(state.getCenterX(), state.getCenterY()); - var pt = mxUtils.getRotatedPoint(new mxPoint(x, y), cos, sin, cx); - x = pt.x; - y = pt.y; - } - - return mxUtils.contains(rect, x, y); - } - - return true; - }, - - /** - * Function: getOffset - * - * Returns the offset for the specified container as an . The - * offset is the distance from the top left corner of the container to the - * top left corner of the document. - * - * Parameters: - * - * container - DOM node to return the offset for. - * scollOffset - Optional boolean to add the scroll offset of the document. - * Default is false. - */ - getOffset: function(container, scrollOffset) - { - var offsetLeft = 0; - var offsetTop = 0; - - // Ignores document scroll origin for fixed elements - var fixed = false; - var node = container; - var b = document.body; - var d = document.documentElement; - - while (node != null && node != b && node != d && !fixed) - { - var style = mxUtils.getCurrentStyle(node); - - if (style != null) - { - fixed = fixed || style.position == 'fixed'; - } - - node = node.parentNode; - } - - if (!scrollOffset && !fixed) - { - var offset = mxUtils.getDocumentScrollOrigin(container.ownerDocument); - offsetLeft += offset.x; - offsetTop += offset.y; - } - - var r = container.getBoundingClientRect(); - - if (r != null) - { - offsetLeft += r.left; - offsetTop += r.top; - } - - return new mxPoint(offsetLeft, offsetTop); - }, - - /** - * Function: getDocumentScrollOrigin - * - * Returns the scroll origin of the given document or the current document - * if no document is given. - */ - getDocumentScrollOrigin: function(doc) - { - if (mxClient.IS_QUIRKS) - { - return new mxPoint(doc.body.scrollLeft, doc.body.scrollTop); - } - else - { - var wnd = doc.defaultView || doc.parentWindow; - - var x = (wnd != null && window.pageXOffset !== undefined) ? window.pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft; - var y = (wnd != null && window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop; - - return new mxPoint(x, y); - } - }, - - /** - * Function: getScrollOrigin - * - * Returns the top, left corner of the viewrect as an . - * - * Parameters: - * - * node - DOM node whose scroll origin should be returned. - * includeAncestors - Whether the scroll origin of the ancestors should be - * included. Default is false. - * includeDocument - Whether the scroll origin of the document should be - * included. Default is true. - */ - getScrollOrigin: function(node, includeAncestors, includeDocument) - { - includeAncestors = (includeAncestors != null) ? includeAncestors : false; - includeDocument = (includeDocument != null) ? includeDocument : true; - - var doc = (node != null) ? node.ownerDocument : document; - var b = doc.body; - var d = doc.documentElement; - var result = new mxPoint(); - var fixed = false; - - while (node != null && node != b && node != d) - { - if (!isNaN(node.scrollLeft) && !isNaN(node.scrollTop)) - { - result.x += node.scrollLeft; - result.y += node.scrollTop; - } - - var style = mxUtils.getCurrentStyle(node); - - if (style != null) - { - fixed = fixed || style.position == 'fixed'; - } - - node = (includeAncestors) ? node.parentNode : null; - } - - if (!fixed && includeDocument) - { - var origin = mxUtils.getDocumentScrollOrigin(doc); - - result.x += origin.x; - result.y += origin.y; - } - - return result; - }, - - /** - * Function: convertPoint - * - * Converts the specified point (x, y) using the offset of the specified - * container and returns a new with the result. - * - * (code) - * var pt = mxUtils.convertPoint(graph.container, - * mxEvent.getClientX(evt), mxEvent.getClientY(evt)); - * (end) - * - * Parameters: - * - * container - DOM node to use for the offset. - * x - X-coordinate of the point to be converted. - * y - Y-coordinate of the point to be converted. - */ - convertPoint: function(container, x, y) - { - var origin = mxUtils.getScrollOrigin(container, false); - var offset = mxUtils.getOffset(container); - - offset.x -= origin.x; - offset.y -= origin.y; - - return new mxPoint(x - offset.x, y - offset.y); - }, - - /** - * Function: ltrim - * - * Strips all whitespaces from the beginning of the string. Without the - * second parameter, this will trim these characters: - * - * - " " (ASCII 32 (0x20)), an ordinary space - * - "\t" (ASCII 9 (0x09)), a tab - * - "\n" (ASCII 10 (0x0A)), a new line (line feed) - * - "\r" (ASCII 13 (0x0D)), a carriage return - * - "\0" (ASCII 0 (0x00)), the NUL-byte - * - "\x0B" (ASCII 11 (0x0B)), a vertical tab - */ - ltrim: function(str, chars) - { - chars = chars || "\\s"; - - return (str != null) ? str.replace(new RegExp("^[" + chars + "]+", "g"), "") : null; - }, - - /** - * Function: rtrim - * - * Strips all whitespaces from the end of the string. Without the second - * parameter, this will trim these characters: - * - * - " " (ASCII 32 (0x20)), an ordinary space - * - "\t" (ASCII 9 (0x09)), a tab - * - "\n" (ASCII 10 (0x0A)), a new line (line feed) - * - "\r" (ASCII 13 (0x0D)), a carriage return - * - "\0" (ASCII 0 (0x00)), the NUL-byte - * - "\x0B" (ASCII 11 (0x0B)), a vertical tab - */ - rtrim: function(str, chars) - { - chars = chars || "\\s"; - - return (str != null) ? str.replace(new RegExp("[" + chars + "]+$", "g"), "") : null; - }, - - /** - * Function: trim - * - * Strips all whitespaces from both end of the string. - * Without the second parameter, Javascript function will trim these - * characters: - * - * - " " (ASCII 32 (0x20)), an ordinary space - * - "\t" (ASCII 9 (0x09)), a tab - * - "\n" (ASCII 10 (0x0A)), a new line (line feed) - * - "\r" (ASCII 13 (0x0D)), a carriage return - * - "\0" (ASCII 0 (0x00)), the NUL-byte - * - "\x0B" (ASCII 11 (0x0B)), a vertical tab - */ - trim: function(str, chars) - { - return mxUtils.ltrim(mxUtils.rtrim(str, chars), chars); - }, - - /** - * Function: isNumeric - * - * Returns true if the specified value is numeric, that is, if it is not - * null, not an empty string, not a HEX number and isNaN returns false. - * - * Parameters: - * - * n - String representing the possibly numeric value. - */ - isNumeric: function(n) - { - return !isNaN(parseFloat(n)) && isFinite(n) && (typeof(n) != 'string' || n.toLowerCase().indexOf('0x') < 0); - }, - - /** - * Function: isInteger - * - * Returns true if the given value is an valid integer number. - * - * Parameters: - * - * n - String representing the possibly numeric value. - */ - isInteger: function(n) - { - return String(parseInt(n)) === String(n); - }, - - /** - * Function: mod - * - * Returns the remainder of division of n by m. You should use this instead - * of the built-in operation as the built-in operation does not properly - * handle negative numbers. - */ - mod: function(n, m) - { - return ((n % m) + m) % m; - }, - - /** - * Function: intersection - * - * Returns the intersection of two lines as an . - * - * Parameters: - * - * x0 - X-coordinate of the first line's startpoint. - * y0 - X-coordinate of the first line's startpoint. - * x1 - X-coordinate of the first line's endpoint. - * y1 - Y-coordinate of the first line's endpoint. - * x2 - X-coordinate of the second line's startpoint. - * y2 - Y-coordinate of the second line's startpoint. - * x3 - X-coordinate of the second line's endpoint. - * y3 - Y-coordinate of the second line's endpoint. - */ - intersection: function (x0, y0, x1, y1, x2, y2, x3, y3) - { - var denom = ((y3 - y2) * (x1 - x0)) - ((x3 - x2) * (y1 - y0)); - var nume_a = ((x3 - x2) * (y0 - y2)) - ((y3 - y2) * (x0 - x2)); - var nume_b = ((x1 - x0) * (y0 - y2)) - ((y1 - y0) * (x0 - x2)); - - var ua = nume_a / denom; - var ub = nume_b / denom; - - if(ua >= 0.0 && ua <= 1.0 && ub >= 0.0 && ub <= 1.0) - { - // Get the intersection point - var x = x0 + ua * (x1 - x0); - var y = y0 + ua * (y1 - y0); - - return new mxPoint(x, y); - } - - // No intersection - return null; - }, - - /** - * Function: ptSegDistSq - * - * Returns the square distance between a segment and a point. To get the - * distance between a point and a line (with infinite length) use - * . - * - * Parameters: - * - * x1 - X-coordinate of the startpoint of the segment. - * y1 - Y-coordinate of the startpoint of the segment. - * x2 - X-coordinate of the endpoint of the segment. - * y2 - Y-coordinate of the endpoint of the segment. - * px - X-coordinate of the point. - * py - Y-coordinate of the point. - */ - ptSegDistSq: function(x1, y1, x2, y2, px, py) - { - x2 -= x1; - y2 -= y1; - - px -= x1; - py -= y1; - - var dotprod = px * x2 + py * y2; - var projlenSq; - - if (dotprod <= 0.0) - { - projlenSq = 0.0; - } - else - { - px = x2 - px; - py = y2 - py; - dotprod = px * x2 + py * y2; - - if (dotprod <= 0.0) - { - projlenSq = 0.0; - } - else - { - projlenSq = dotprod * dotprod / (x2 * x2 + y2 * y2); - } - } - - var lenSq = px * px + py * py - projlenSq; - - if (lenSq < 0) - { - lenSq = 0; - } - - return lenSq; - }, - - /** - * Function: ptLineDist - * - * Returns the distance between a line defined by two points and a point. - * To get the distance between a point and a segment (with a specific - * length) use . - * - * Parameters: - * - * x1 - X-coordinate of point 1 of the line. - * y1 - Y-coordinate of point 1 of the line. - * x2 - X-coordinate of point 1 of the line. - * y2 - Y-coordinate of point 1 of the line. - * px - X-coordinate of the point. - * py - Y-coordinate of the point. - */ - ptLineDist: function(x1, y1, x2, y2, px, py) - { - return Math.abs((y2 - y1) * px - (x2 - x1) * py + x2 * y1 - y2 * x1) / - Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)); - }, - - /** - * Function: relativeCcw - * - * Returns 1 if the given point on the right side of the segment, 0 if its - * on the segment, and -1 if the point is on the left side of the segment. - * - * Parameters: - * - * x1 - X-coordinate of the startpoint of the segment. - * y1 - Y-coordinate of the startpoint of the segment. - * x2 - X-coordinate of the endpoint of the segment. - * y2 - Y-coordinate of the endpoint of the segment. - * px - X-coordinate of the point. - * py - Y-coordinate of the point. - */ - relativeCcw: function(x1, y1, x2, y2, px, py) - { - x2 -= x1; - y2 -= y1; - px -= x1; - py -= y1; - var ccw = px * y2 - py * x2; - - if (ccw == 0.0) - { - ccw = px * x2 + py * y2; - - if (ccw > 0.0) - { - px -= x2; - py -= y2; - ccw = px * x2 + py * y2; - - if (ccw < 0.0) - { - ccw = 0.0; - } - } - } - - return (ccw < 0.0) ? -1 : ((ccw > 0.0) ? 1 : 0); - }, - - /** - * Function: animateChanges - * - * See . This is for backwards compatibility and - * will be removed later. - */ - animateChanges: function(graph, changes) - { - // LATER: Deprecated, remove this function - mxEffects.animateChanges.apply(this, arguments); - }, - - /** - * Function: cascadeOpacity - * - * See . This is for backwards compatibility and - * will be removed later. - */ - cascadeOpacity: function(graph, cell, opacity) - { - mxEffects.cascadeOpacity.apply(this, arguments); - }, - - /** - * Function: fadeOut - * - * See . This is for backwards compatibility and - * will be removed later. - */ - fadeOut: function(node, from, remove, step, delay, isEnabled) - { - mxEffects.fadeOut.apply(this, arguments); - }, - - /** - * Function: setOpacity - * - * Sets the opacity of the specified DOM node to the given value in %. - * - * Parameters: - * - * node - DOM node to set the opacity for. - * value - Opacity in %. Possible values are between 0 and 100. - */ - setOpacity: function(node, value) - { - if (mxUtils.isVml(node)) - { - if (value >= 100) - { - node.style.filter = ''; - } - else - { - // TODO: Why is the division by 5 needed in VML? - node.style.filter = 'alpha(opacity=' + (value/5) + ')'; - } - } - else if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' || document.documentMode < 9)) - { - if (value >= 100) - { - node.style.filter = ''; - } - else - { - node.style.filter = 'alpha(opacity=' + value + ')'; - } - } - else - { - node.style.opacity = (value / 100); - } - }, - - /** - * Function: createImage - * - * Creates and returns an image (IMG node) or VML image (v:image) in IE6 in - * quirks mode. - * - * Parameters: - * - * src - URL that points to the image to be displayed. - */ - createImage: function(src) - { - var imageNode = null; - - if (mxClient.IS_IE6 && document.compatMode != 'CSS1Compat') - { - imageNode = document.createElement(mxClient.VML_PREFIX + ':image'); - imageNode.setAttribute('src', src); - imageNode.style.borderStyle = 'none'; - } - else - { - imageNode = document.createElement('img'); - imageNode.setAttribute('src', src); - imageNode.setAttribute('border', '0'); - } - - return imageNode; - }, - - /** - * Function: sortCells - * - * Sorts the given cells according to the order in the cell hierarchy. - * Ascending is optional and defaults to true. - */ - sortCells: function(cells, ascending) - { - ascending = (ascending != null) ? ascending : true; - var lookup = new mxDictionary(); - cells.sort(function(o1, o2) - { - var p1 = lookup.get(o1); - - if (p1 == null) - { - p1 = mxCellPath.create(o1).split(mxCellPath.PATH_SEPARATOR); - lookup.put(o1, p1); - } - - var p2 = lookup.get(o2); - - if (p2 == null) - { - p2 = mxCellPath.create(o2).split(mxCellPath.PATH_SEPARATOR); - lookup.put(o2, p2); - } - - var comp = mxCellPath.compare(p1, p2); - - return (comp == 0) ? 0 : (((comp > 0) == ascending) ? 1 : -1); - }); - - return cells; - }, - - /** - * Function: getStylename - * - * Returns the stylename in a style of the form [(stylename|key=value);] or - * an empty string if the given style does not contain a stylename. - * - * Parameters: - * - * style - String of the form [(stylename|key=value);]. - */ - getStylename: function(style) - { - if (style != null) - { - var pairs = style.split(';'); - var stylename = pairs[0]; - - if (stylename.indexOf('=') < 0) - { - return stylename; - } - } - - return ''; - }, - - /** - * Function: getStylenames - * - * Returns the stylenames in a style of the form [(stylename|key=value);] - * or an empty array if the given style does not contain any stylenames. - * - * Parameters: - * - * style - String of the form [(stylename|key=value);]. - */ - getStylenames: function(style) - { - var result = []; - - if (style != null) - { - var pairs = style.split(';'); - - for (var i = 0; i < pairs.length; i++) - { - if (pairs[i].indexOf('=') < 0) - { - result.push(pairs[i]); - } - } - } - - return result; - }, - - /** - * Function: indexOfStylename - * - * Returns the index of the given stylename in the given style. This - * returns -1 if the given stylename does not occur (as a stylename) in the - * given style, otherwise it returns the index of the first character. - */ - indexOfStylename: function(style, stylename) - { - if (style != null && stylename != null) - { - var tokens = style.split(';'); - var pos = 0; - - for (var i = 0; i < tokens.length; i++) - { - if (tokens[i] == stylename) - { - return pos; - } - - pos += tokens[i].length + 1; - } - } - - return -1; - }, - - /** - * Function: addStylename - * - * Adds the specified stylename to the given style if it does not already - * contain the stylename. - */ - addStylename: function(style, stylename) - { - if (mxUtils.indexOfStylename(style, stylename) < 0) - { - if (style == null) - { - style = ''; - } - else if (style.length > 0 && style.charAt(style.length - 1) != ';') - { - style += ';'; - } - - style += stylename; - } - - return style; - }, - - /** - * Function: removeStylename - * - * Removes all occurrences of the specified stylename in the given style - * and returns the updated style. Trailing semicolons are not preserved. - */ - removeStylename: function(style, stylename) - { - var result = []; - - if (style != null) - { - var tokens = style.split(';'); - - for (var i = 0; i < tokens.length; i++) - { - if (tokens[i] != stylename) - { - result.push(tokens[i]); - } - } - } - - return result.join(';'); - }, - - /** - * Function: removeAllStylenames - * - * Removes all stylenames from the given style and returns the updated - * style. - */ - removeAllStylenames: function(style) - { - var result = []; - - if (style != null) - { - var tokens = style.split(';'); - - for (var i = 0; i < tokens.length; i++) - { - // Keeps the key, value assignments - if (tokens[i].indexOf('=') >= 0) - { - result.push(tokens[i]); - } - } - } - - return result.join(';'); - }, - - /** - * Function: setCellStyles - * - * Assigns the value for the given key in the styles of the given cells, or - * removes the key from the styles if the value is null. - * - * Parameters: - * - * model - to execute the transaction in. - * cells - Array of to be updated. - * key - Key of the style to be changed. - * value - New value for the given key. - */ - setCellStyles: function(model, cells, key, value) - { - if (cells != null && cells.length > 0) - { - model.beginUpdate(); - try - { - for (var i = 0; i < cells.length; i++) - { - if (cells[i] != null) - { - var style = mxUtils.setStyle(model.getStyle(cells[i]), key, value); - model.setStyle(cells[i], style); - } - } - } - finally - { - model.endUpdate(); - } - } - }, - - /** - * Function: setStyle - * - * Adds or removes the given key, value pair to the style and returns the - * new style. If value is null or zero length then the key is removed from - * the style. This is for cell styles, not for CSS styles. - * - * Parameters: - * - * style - String of the form [(stylename|key=value);]. - * key - Key of the style to be changed. - * value - New value for the given key. - */ - setStyle: function(style, key, value) - { - var isValue = value != null && (typeof(value.length) == 'undefined' || value.length > 0); - - if (style == null || style.length == 0) - { - if (isValue) - { - style = key + '=' + value + ';'; - } - } - else - { - if (style.substring(0, key.length + 1) == key + '=') - { - var next = style.indexOf(';'); - - if (isValue) - { - style = key + '=' + value + ((next < 0) ? ';' : style.substring(next)); - } - else - { - style = (next < 0 || next == style.length - 1) ? '' : style.substring(next + 1); - } - } - else - { - var index = style.indexOf(';' + key + '='); - - if (index < 0) - { - if (isValue) - { - var sep = (style.charAt(style.length - 1) == ';') ? '' : ';'; - style = style + sep + key + '=' + value + ';'; - } - } - else - { - var next = style.indexOf(';', index + 1); - - if (isValue) - { - style = style.substring(0, index + 1) + key + '=' + value + ((next < 0) ? ';' : style.substring(next)); - } - else - { - style = style.substring(0, index) + ((next < 0) ? ';' : style.substring(next)); - } - } - } - } - - return style; - }, - - /** - * Function: setCellStyleFlags - * - * Sets or toggles the flag bit for the given key in the cell's styles. - * If value is null then the flag is toggled. - * - * Example: - * - * (code) - * var cells = graph.getSelectionCells(); - * mxUtils.setCellStyleFlags(graph.model, - * cells, - * mxConstants.STYLE_FONTSTYLE, - * mxConstants.FONT_BOLD); - * (end) - * - * Toggles the bold font style. - * - * Parameters: - * - * model - that contains the cells. - * cells - Array of to change the style for. - * key - Key of the style to be changed. - * flag - Integer for the bit to be changed. - * value - Optional boolean value for the flag. - */ - setCellStyleFlags: function(model, cells, key, flag, value) - { - if (cells != null && cells.length > 0) - { - model.beginUpdate(); - try - { - for (var i = 0; i < cells.length; i++) - { - if (cells[i] != null) - { - var style = mxUtils.setStyleFlag( - model.getStyle(cells[i]), - key, flag, value); - model.setStyle(cells[i], style); - } - } - } - finally - { - model.endUpdate(); - } - } - }, - - /** - * Function: setStyleFlag - * - * Sets or removes the given key from the specified style and returns the - * new style. If value is null then the flag is toggled. - * - * Parameters: - * - * style - String of the form [(stylename|key=value);]. - * key - Key of the style to be changed. - * flag - Integer for the bit to be changed. - * value - Optional boolean value for the given flag. - */ - setStyleFlag: function(style, key, flag, value) - { - if (style == null || style.length == 0) - { - if (value || value == null) - { - style = key+'='+flag; - } - else - { - style = key+'=0'; - } - } - else - { - var index = style.indexOf(key+'='); - - if (index < 0) - { - var sep = (style.charAt(style.length-1) == ';') ? '' : ';'; - - if (value || value == null) - { - style = style + sep + key + '=' + flag; - } - else - { - style = style + sep + key + '=0'; - } - } - else - { - var cont = style.indexOf(';', index); - var tmp = ''; - - if (cont < 0) - { - tmp = style.substring(index+key.length+1); - } - else - { - tmp = style.substring(index+key.length+1, cont); - } - - if (value == null) - { - tmp = parseInt(tmp) ^ flag; - } - else if (value) - { - tmp = parseInt(tmp) | flag; - } - else - { - tmp = parseInt(tmp) & ~flag; - } - - style = style.substring(0, index) + key + '=' + tmp + - ((cont >= 0) ? style.substring(cont) : ''); - } - } - - return style; - }, - - /** - * Function: getAlignmentAsPoint - * - * Returns an that represents the horizontal and vertical alignment - * for numeric computations. X is -0.5 for center, -1 for right and 0 for - * left alignment. Y is -0.5 for middle, -1 for bottom and 0 for top - * alignment. Default values for missing arguments is top, left. - */ - getAlignmentAsPoint: function(align, valign) - { - var dx = 0; - var dy = 0; - - // Horizontal alignment - if (align == mxConstants.ALIGN_CENTER) - { - dx = -0.5; - } - else if (align == mxConstants.ALIGN_RIGHT) - { - dx = -1; - } - - // Vertical alignment - if (valign == mxConstants.ALIGN_MIDDLE) - { - dy = -0.5; - } - else if (valign == mxConstants.ALIGN_BOTTOM) - { - dy = -1; - } - - return new mxPoint(dx, dy); - }, - - /** - * Function: getSizeForString - * - * Returns an with the size (width and height in pixels) of - * the given string. The string may contain HTML markup. Newlines should be - * converted to
                        before calling this method. The caller is responsible - * for sanitizing the HTML markup. - * - * Example: - * - * (code) - * var label = graph.getLabel(cell).replace(/\n/g, "
                        "); - * var size = graph.getSizeForString(label); - * (end) - * - * Parameters: - * - * text - String whose size should be returned. - * fontSize - Integer that specifies the font size in pixels. Default is - * . - * fontFamily - String that specifies the name of the font family. Default - * is . - * textWidth - Optional width for text wrapping. - */ - getSizeForString: function(text, fontSize, fontFamily, textWidth) - { - fontSize = (fontSize != null) ? fontSize : mxConstants.DEFAULT_FONTSIZE; - fontFamily = (fontFamily != null) ? fontFamily : mxConstants.DEFAULT_FONTFAMILY; - var div = document.createElement('div'); - - // Sets the font size and family - div.style.fontFamily = fontFamily; - div.style.fontSize = Math.round(fontSize) + 'px'; - div.style.lineHeight = Math.round(fontSize * mxConstants.LINE_HEIGHT) + 'px'; - - // Disables block layout and outside wrapping and hides the div - div.style.position = 'absolute'; - div.style.visibility = 'hidden'; - div.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - div.style.zoom = '1'; - - if (textWidth != null) - { - div.style.width = textWidth + 'px'; - div.style.whiteSpace = 'normal'; - } - else - { - div.style.whiteSpace = 'nowrap'; - } - - // Adds the text and inserts into DOM for updating of size - div.innerHTML = text; - document.body.appendChild(div); - - // Gets the size and removes from DOM - var size = new mxRectangle(0, 0, div.offsetWidth, div.offsetHeight); - document.body.removeChild(div); - - return size; - }, - - /** - * Function: getViewXml - */ - getViewXml: function(graph, scale, cells, x0, y0) - { - x0 = (x0 != null) ? x0 : 0; - y0 = (y0 != null) ? y0 : 0; - scale = (scale != null) ? scale : 1; - - if (cells == null) - { - var model = graph.getModel(); - cells = [model.getRoot()]; - } - - var view = graph.getView(); - var result = null; - - // Disables events on the view - var eventsEnabled = view.isEventsEnabled(); - view.setEventsEnabled(false); - - // Workaround for label bounds not taken into account for image export. - // Creates a temporary draw pane which is used for rendering the text. - // Text rendering is required for finding the bounds of the labels. - var drawPane = view.drawPane; - var overlayPane = view.overlayPane; - - if (graph.dialect == mxConstants.DIALECT_SVG) - { - view.drawPane = document.createElementNS(mxConstants.NS_SVG, 'g'); - view.canvas.appendChild(view.drawPane); - - // Redirects cell overlays into temporary container - view.overlayPane = document.createElementNS(mxConstants.NS_SVG, 'g'); - view.canvas.appendChild(view.overlayPane); - } - else - { - view.drawPane = view.drawPane.cloneNode(false); - view.canvas.appendChild(view.drawPane); - - // Redirects cell overlays into temporary container - view.overlayPane = view.overlayPane.cloneNode(false); - view.canvas.appendChild(view.overlayPane); - } - - // Resets the translation - var translate = view.getTranslate(); - view.translate = new mxPoint(x0, y0); - - // Creates the temporary cell states in the view - var temp = new mxTemporaryCellStates(graph.getView(), scale, cells); - - try - { - var enc = new mxCodec(); - result = enc.encode(graph.getView()); - } - finally - { - temp.destroy(); - view.translate = translate; - view.canvas.removeChild(view.drawPane); - view.canvas.removeChild(view.overlayPane); - view.drawPane = drawPane; - view.overlayPane = overlayPane; - view.setEventsEnabled(eventsEnabled); - } - - return result; - }, - - /** - * Function: getScaleForPageCount - * - * Returns the scale to be used for printing the graph with the given - * bounds across the specifies number of pages with the given format. The - * scale is always computed such that it given the given amount or fewer - * pages in the print output. See for an example. - * - * Parameters: - * - * pageCount - Specifies the number of pages in the print output. - * graph - that should be printed. - * pageFormat - Optional that specifies the page format. - * Default is . - * border - The border along each side of every page. - */ - getScaleForPageCount: function(pageCount, graph, pageFormat, border) - { - if (pageCount < 1) - { - // We can't work with less than 1 page, return no scale - // change - return 1; - } - - pageFormat = (pageFormat != null) ? pageFormat : mxConstants.PAGE_FORMAT_A4_PORTRAIT; - border = (border != null) ? border : 0; - - var availablePageWidth = pageFormat.width - (border * 2); - var availablePageHeight = pageFormat.height - (border * 2); - - // Work out the number of pages required if the - // graph is not scaled. - var graphBounds = graph.getGraphBounds().clone(); - var sc = graph.getView().getScale(); - graphBounds.width /= sc; - graphBounds.height /= sc; - var graphWidth = graphBounds.width; - var graphHeight = graphBounds.height; - - var scale = 1; - - // The ratio of the width/height for each printer page - var pageFormatAspectRatio = availablePageWidth / availablePageHeight; - // The ratio of the width/height for the graph to be printer - var graphAspectRatio = graphWidth / graphHeight; - - // The ratio of horizontal pages / vertical pages for this - // graph to maintain its aspect ratio on this page format - var pagesAspectRatio = graphAspectRatio / pageFormatAspectRatio; - - // Factor the square root of the page count up and down - // by the pages aspect ratio to obtain a horizontal and - // vertical page count that adds up to the page count - // and has the correct aspect ratio - var pageRoot = Math.sqrt(pageCount); - var pagesAspectRatioSqrt = Math.sqrt(pagesAspectRatio); - var numRowPages = pageRoot * pagesAspectRatioSqrt; - var numColumnPages = pageRoot / pagesAspectRatioSqrt; - - // These value are rarely more than 2 rounding downs away from - // a total that meets the page count. In cases of one being less - // than 1 page, the other value can be too high and take more iterations - // In this case, just change that value to be the page count, since - // we know the other value is 1 - if (numRowPages < 1 && numColumnPages > pageCount) - { - var scaleChange = numColumnPages / pageCount; - numColumnPages = pageCount; - numRowPages /= scaleChange; - } - - if (numColumnPages < 1 && numRowPages > pageCount) - { - var scaleChange = numRowPages / pageCount; - numRowPages = pageCount; - numColumnPages /= scaleChange; - } - - var currentTotalPages = Math.ceil(numRowPages) * Math.ceil(numColumnPages); - - var numLoops = 0; - - // Iterate through while the rounded up number of pages comes to - // a total greater than the required number - while (currentTotalPages > pageCount) - { - // Round down the page count (rows or columns) that is - // closest to its next integer down in percentage terms. - // i.e. Reduce the page total by reducing the total - // page area by the least possible amount - - var roundRowDownProportion = Math.floor(numRowPages) / numRowPages; - var roundColumnDownProportion = Math.floor(numColumnPages) / numColumnPages; - - // If the round down proportion is, work out the proportion to - // round down to 1 page less - if (roundRowDownProportion == 1) - { - roundRowDownProportion = Math.floor(numRowPages-1) / numRowPages; - } - if (roundColumnDownProportion == 1) - { - roundColumnDownProportion = Math.floor(numColumnPages-1) / numColumnPages; - } - - // Check which rounding down is smaller, but in the case of very small roundings - // try the other dimension instead - var scaleChange = 1; - - // Use the higher of the two values - if (roundRowDownProportion > roundColumnDownProportion) - { - scaleChange = roundRowDownProportion; - } - else - { - scaleChange = roundColumnDownProportion; - } - - numRowPages = numRowPages * scaleChange; - numColumnPages = numColumnPages * scaleChange; - currentTotalPages = Math.ceil(numRowPages) * Math.ceil(numColumnPages); - - numLoops++; - - if (numLoops > 10) - { - break; - } - } - - // Work out the scale from the number of row pages required - // The column pages will give the same value - var posterWidth = availablePageWidth * numRowPages; - scale = posterWidth / graphWidth; - - // Allow for rounding errors - return scale * 0.99999; - }, - - /** - * Function: show - * - * Copies the styles and the markup from the graph's container into the - * given document and removes all cursor styles. The document is returned. - * - * This function should be called from within the document with the graph. - * If you experience problems with missing stylesheets in IE then try adding - * the domain to the trusted sites. - * - * Parameters: - * - * graph - to be copied. - * doc - Document where the new graph is created. - * x0 - X-coordinate of the graph view origin. Default is 0. - * y0 - Y-coordinate of the graph view origin. Default is 0. - * w - Optional width of the graph view. - * h - Optional height of the graph view. - */ - show: function(graph, doc, x0, y0, w, h) - { - x0 = (x0 != null) ? x0 : 0; - y0 = (y0 != null) ? y0 : 0; - - if (doc == null) - { - var wnd = window.open(); - doc = wnd.document; - } - else - { - doc.open(); - } - - // Workaround for missing print output in IE9 standards - if (document.documentMode == 9) - { - doc.writeln(''); - } - - var bounds = graph.getGraphBounds(); - var dx = Math.ceil(x0 - bounds.x); - var dy = Math.ceil(y0 - bounds.y); - - if (w == null) - { - w = Math.ceil(bounds.width + x0) + Math.ceil(Math.ceil(bounds.x) - bounds.x); - } - - if (h == null) - { - h = Math.ceil(bounds.height + y0) + Math.ceil(Math.ceil(bounds.y) - bounds.y); - } - - // Needs a special way of creating the page so that no click is required - // to refresh the contents after the external CSS styles have been loaded. - // To avoid a click or programmatic refresh, the styleSheets[].cssText - // property is copied over from the original document. - if (mxClient.IS_IE || document.documentMode == 11) - { - var html = ''; - - var base = document.getElementsByTagName('base'); - - for (var i = 0; i < base.length; i++) - { - html += base[i].outerHTML; - } - - html += ''; - - // Copies the contents of the graph container - html += '
                        '; - html += graph.container.innerHTML; - html += '
                        '; - - doc.writeln(html); - doc.close(); - } - else - { - doc.writeln(''); - - var base = document.getElementsByTagName('base'); - - for (var i = 0; i < base.length; i++) - { - doc.writeln(mxUtils.getOuterHtml(base[i])); - } - - var links = document.getElementsByTagName('link'); - - for (var i = 0; i < links.length; i++) - { - doc.writeln(mxUtils.getOuterHtml(links[i])); - } - - var styles = document.getElementsByTagName('style'); - - for (var i = 0; i < styles.length; i++) - { - doc.writeln(mxUtils.getOuterHtml(styles[i])); - } - - doc.writeln(''); - doc.close(); - - var outer = doc.createElement('div'); - outer.position = 'absolute'; - outer.overflow = 'hidden'; - outer.style.width = w + 'px'; - outer.style.height = h + 'px'; - - // Required for HTML labels if foreignObjects are disabled - var div = doc.createElement('div'); - div.style.position = 'absolute'; - div.style.left = dx + 'px'; - div.style.top = dy + 'px'; - - var node = graph.container.firstChild; - var svg = null; - - while (node != null) - { - var clone = node.cloneNode(true); - - if (node == graph.view.drawPane.ownerSVGElement) - { - outer.appendChild(clone); - svg = clone; - } - else - { - div.appendChild(clone); - } - - node = node.nextSibling; - } - - doc.body.appendChild(outer); - - if (div.firstChild != null) - { - doc.body.appendChild(div); - } - - if (svg != null) - { - svg.style.minWidth = ''; - svg.style.minHeight = ''; - svg.firstChild.setAttribute('transform', 'translate(' + dx + ',' + dy + ')'); - } - } - - mxUtils.removeCursors(doc.body); - - return doc; - }, - - /** - * Function: printScreen - * - * Prints the specified graph using a new window and the built-in print - * dialog. - * - * This function should be called from within the document with the graph. - * - * Parameters: - * - * graph - to be printed. - */ - printScreen: function(graph) - { - var wnd = window.open(); - var bounds = graph.getGraphBounds(); - mxUtils.show(graph, wnd.document); - - var print = function() - { - wnd.focus(); - wnd.print(); - wnd.close(); - }; - - // Workaround for Google Chrome which needs a bit of a - // delay in order to render the SVG contents - if (mxClient.IS_GC) - { - wnd.setTimeout(print, 500); - } - else - { - print(); - } - }, - - /** - * Function: popup - * - * Shows the specified text content in a new or a new browser - * window if isInternalWindow is false. - * - * Parameters: - * - * content - String that specifies the text to be displayed. - * isInternalWindow - Optional boolean indicating if an mxWindow should be - * used instead of a new browser window. Default is false. - */ - popup: function(content, isInternalWindow) - { - if (isInternalWindow) - { - var div = document.createElement('div'); - - div.style.overflow = 'scroll'; - div.style.width = '636px'; - div.style.height = '460px'; - - var pre = document.createElement('pre'); - pre.innerHTML = mxUtils.htmlEntities(content, false). - replace(/\n/g,'
                        ').replace(/ /g, ' '); - - div.appendChild(pre); - - var w = document.body.clientWidth; - var h = Math.max(document.body.clientHeight || 0, document.documentElement.clientHeight) - var wnd = new mxWindow('Popup Window', div, - w/2-320, h/2-240, 640, 480, false, true); - - wnd.setClosable(true); - wnd.setVisible(true); - } - else - { - // Wraps up the XML content in a textarea - if (mxClient.IS_NS) - { - var wnd = window.open(); - wnd.document.writeln('
                        '+mxUtils.htmlEntities(content)+'').replace(/ /g, ' ');
                        -			   	wnd.document.body.appendChild(pre);
                        -			}
                        -	   	}
                        -	},
                        -	
                        -	/**
                        -	 * Function: alert
                        -	 * 
                        -	 * Displayss the given alert in a new dialog. This implementation uses the
                        -	 * built-in alert function. This is used to display validation errors when
                        -	 * connections cannot be changed or created.
                        -	 * 
                        -	 * Parameters:
                        -	 * 
                        -	 * message - String specifying the message to be displayed.
                        -	 */
                        -	alert: function(message)
                        -	{
                        -		alert(message);
                        -	},
                        -	
                        -	/**
                        -	 * Function: prompt
                        -	 * 
                        -	 * Displays the given message in a prompt dialog. This implementation uses
                        -	 * the built-in prompt function.
                        -	 * 
                        -	 * Parameters:
                        -	 * 
                        -	 * message - String specifying the message to be displayed.
                        -	 * defaultValue - Optional string specifying the default value.
                        -	 */
                        -	prompt: function(message, defaultValue)
                        -	{
                        -		return prompt(message, (defaultValue != null) ? defaultValue : '');
                        -	},
                        -	
                        -	/**
                        -	 * Function: confirm
                        -	 * 
                        -	 * Displays the given message in a confirm dialog. This implementation uses
                        -	 * the built-in confirm function.
                        -	 * 
                        -	 * Parameters:
                        -	 * 
                        -	 * message - String specifying the message to be displayed.
                        -	 */
                        -	confirm: function(message)
                        -	{
                        -		return confirm(message);
                        -	},
                        -
                        -	/**
                        -	 * Function: error
                        -	 * 
                        -	 * Displays the given error message in a new  of the given width.
                        -	 * If close is true then an additional close button is added to the window.
                        -	 * The optional icon specifies the icon to be used for the window. Default
                        -	 * is .
                        -	 * 
                        -	 * Parameters:
                        -	 * 
                        -	 * message - String specifying the message to be displayed.
                        -	 * width - Integer specifying the width of the window.
                        -	 * close - Optional boolean indicating whether to add a close button.
                        -	 * icon - Optional icon for the window decoration.
                        -	 */
                        -	error: function(message, width, close, icon)
                        -	{
                        -		var div = document.createElement('div');
                        -		div.style.padding = '20px';
                        -
                        -		var img = document.createElement('img');
                        -		img.setAttribute('src', icon || mxUtils.errorImage);
                        -		img.setAttribute('valign', 'bottom');
                        -		img.style.verticalAlign = 'middle';
                        -		div.appendChild(img);
                        -
                        -		div.appendChild(document.createTextNode('\u00a0')); //  
                        -		div.appendChild(document.createTextNode('\u00a0')); //  
                        -		div.appendChild(document.createTextNode('\u00a0')); //  
                        -		mxUtils.write(div, message);
                        -
                        -		var w = document.body.clientWidth;
                        -		var h = (document.body.clientHeight || document.documentElement.clientHeight);
                        -		var warn = new mxWindow(mxResources.get(mxUtils.errorResource) ||
                        -			mxUtils.errorResource, div, (w-width)/2, h/4, width, null,
                        -			false, true);
                        -
                        -		if (close)
                        -		{
                        -			mxUtils.br(div);
                        -			
                        -			var tmp = document.createElement('p');
                        -			var button = document.createElement('button');
                        -
                        -			if (mxClient.IS_IE)
                        -			{
                        -				button.style.cssText = 'float:right';
                        -			}
                        -			else
                        -			{
                        -				button.setAttribute('style', 'float:right');
                        -			}
                        -
                        -			mxEvent.addListener(button, 'click', function(evt)
                        -			{
                        -				warn.destroy();
                        -			});
                        -
                        -			mxUtils.write(button, mxResources.get(mxUtils.closeResource) ||
                        -				mxUtils.closeResource);
                        -			
                        -			tmp.appendChild(button);
                        -			div.appendChild(tmp);
                        -			
                        -			mxUtils.br(div);
                        -			
                        -			warn.setClosable(true);
                        -		}
                        -		
                        -		warn.setVisible(true);
                        -		
                        -		return warn;
                        -	},
                        -
                        -	/**
                        -	 * Function: makeDraggable
                        -	 * 
                        -	 * Configures the given DOM element to act as a drag source for the
                        -	 * specified graph. Returns a a new . If
                        -	 *  is enabled then the x and y arguments must
                        -	 * be used in funct to match the preview location.
                        -	 * 
                        -	 * Example:
                        -	 * 
                        -	 * (code)
                        -	 * var funct = function(graph, evt, cell, x, y)
                        -	 * {
                        -	 *   if (graph.canImportCell(cell))
                        -	 *   {
                        -	 *     var parent = graph.getDefaultParent();
                        -	 *     var vertex = null;
                        -	 *     
                        -	 *     graph.getModel().beginUpdate();
                        -	 *     try
                        -	 *     {
                        -	 * 	     vertex = graph.insertVertex(parent, null, 'Hello', x, y, 80, 30);
                        -	 *     }
                        -	 *     finally
                        -	 *     {
                        -	 *       graph.getModel().endUpdate();
                        -	 *     }
                        -	 *
                        -	 *     graph.setSelectionCell(vertex);
                        -	 *   }
                        -	 * }
                        -	 * 
                        -	 * var img = document.createElement('img');
                        -	 * img.setAttribute('src', 'editors/images/rectangle.gif');
                        -	 * img.style.position = 'absolute';
                        -	 * img.style.left = '0px';
                        -	 * img.style.top = '0px';
                        -	 * img.style.width = '16px';
                        -	 * img.style.height = '16px';
                        -	 * 
                        -	 * var dragImage = img.cloneNode(true);
                        -	 * dragImage.style.width = '32px';
                        -	 * dragImage.style.height = '32px';
                        -	 * mxUtils.makeDraggable(img, graph, funct, dragImage);
                        -	 * document.body.appendChild(img);
                        -	 * (end)
                        -	 * 
                        -	 * Parameters:
                        -	 * 
                        -	 * element - DOM element to make draggable.
                        -	 * graphF -  that acts as the drop target or a function that takes a
                        -	 * mouse event and returns the current .
                        -	 * funct - Function to execute on a successful drop.
                        -	 * dragElement - Optional DOM node to be used for the drag preview.
                        -	 * dx - Optional horizontal offset between the cursor and the drag
                        -	 * preview.
                        -	 * dy - Optional vertical offset between the cursor and the drag
                        -	 * preview.
                        -	 * autoscroll - Optional boolean that specifies if autoscroll should be
                        -	 * used. Default is mxGraph.autoscroll.
                        -	 * scalePreview - Optional boolean that specifies if the preview element
                        -	 * should be scaled according to the graph scale. If this is true, then
                        -	 * the offsets will also be scaled. Default is false.
                        -	 * highlightDropTargets - Optional boolean that specifies if dropTargets
                        -	 * should be highlighted. Default is true.
                        -	 * getDropTarget - Optional function to return the drop target for a given
                        -	 * location (x, y). Default is mxGraph.getCellAt.
                        -	 */
                        -	makeDraggable: function(element, graphF, funct, dragElement, dx, dy, autoscroll,
                        -			scalePreview, highlightDropTargets, getDropTarget)
                        -	{
                        -		var dragSource = new mxDragSource(element, funct);
                        -		dragSource.dragOffset = new mxPoint((dx != null) ? dx : 0,
                        -			(dy != null) ? dy : mxConstants.TOOLTIP_VERTICAL_OFFSET);
                        -		dragSource.autoscroll = autoscroll;
                        -		
                        -		// Cannot enable this by default. This needs to be enabled in the caller
                        -		// if the funct argument uses the new x- and y-arguments.
                        -		dragSource.setGuidesEnabled(false);
                        -		
                        -		if (highlightDropTargets != null)
                        -		{
                        -			dragSource.highlightDropTargets = highlightDropTargets;
                        -		}
                        -		
                        -		// Overrides function to find drop target cell
                        -		if (getDropTarget != null)
                        -		{
                        -			dragSource.getDropTarget = getDropTarget;
                        -		}
                        -		
                        -		// Overrides function to get current graph
                        -		dragSource.getGraphForEvent = function(evt)
                        -		{
                        -			return (typeof(graphF) == 'function') ? graphF(evt) : graphF;
                        -		};
                        -		
                        -		// Translates switches into dragSource customizations
                        -		if (dragElement != null)
                        -		{
                        -			dragSource.createDragElement = function()
                        -			{
                        -				return dragElement.cloneNode(true);
                        -			};
                        -			
                        -			if (scalePreview)
                        -			{
                        -				dragSource.createPreviewElement = function(graph)
                        -				{
                        -					var elt = dragElement.cloneNode(true);
                        -
                        -					var w = parseInt(elt.style.width);
                        -					var h = parseInt(elt.style.height);
                        -					elt.style.width = Math.round(w * graph.view.scale) + 'px';
                        -					elt.style.height = Math.round(h * graph.view.scale) + 'px';
                        -					
                        -					return elt;
                        -				};
                        -			}
                        -		}
                        -		
                        -		return dragSource;
                        -	}
                        -
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        - var mxConstants =
                        - {
                        -	/**
                        -	 * Class: mxConstants
                        -	 * 
                        -	 * Defines various global constants.
                        -	 * 
                        -	 * Variable: DEFAULT_HOTSPOT
                        -	 * 
                        -	 * Defines the portion of the cell which is to be used as a connectable
                        -	 * region. Default is 0.3. Possible values are 0 < x <= 1. 
                        -	 */
                        -	DEFAULT_HOTSPOT: 0.3,
                        -
                        -	/**
                        -	 * Variable: MIN_HOTSPOT_SIZE
                        -	 * 
                        -	 * Defines the minimum size in pixels of the portion of the cell which is
                        -	 * to be used as a connectable region. Default is 8.
                        -	 */
                        -	MIN_HOTSPOT_SIZE: 8,
                        -
                        -	/**
                        -	 * Variable: MAX_HOTSPOT_SIZE
                        -	 * 
                        -	 * Defines the maximum size in pixels of the portion of the cell which is
                        -	 * to be used as a connectable region. Use 0 for no maximum. Default is 0.
                        -	 */
                        -	MAX_HOTSPOT_SIZE: 0,
                        -
                        -	/**
                        -	 * Variable: RENDERING_HINT_EXACT
                        -	 * 
                        -	 * Defines the exact rendering hint.
                        -	 */
                        -	RENDERING_HINT_EXACT: 'exact',
                        -
                        -	/**
                        -	 * Variable: RENDERING_HINT_FASTER
                        -	 * 
                        -	 * Defines the faster rendering hint.
                        -	 */
                        -	RENDERING_HINT_FASTER: 'faster',
                        -
                        -	/**
                        -	 * Variable: RENDERING_HINT_FASTEST
                        -	 * 
                        -	 * Defines the fastest rendering hint.
                        -	 */
                        -	RENDERING_HINT_FASTEST: 'fastest',
                        -
                        -	/**
                        -	 * Variable: DIALECT_SVG
                        -	 * 
                        -	 * Defines the SVG display dialect name.
                        -	 */
                        -	DIALECT_SVG: 'svg',
                        -
                        -	/**
                        -	 * Variable: DIALECT_VML
                        -	 * 
                        -	 * Defines the VML display dialect name.
                        -	 */
                        -	DIALECT_VML: 'vml',
                        -
                        -	/**
                        -	 * Variable: DIALECT_MIXEDHTML
                        -	 * 
                        -	 * Defines the mixed HTML display dialect name.
                        -	 */
                        -	DIALECT_MIXEDHTML: 'mixedHtml',
                        -
                        -	/**
                        -	 * Variable: DIALECT_PREFERHTML
                        -	 * 
                        -	 * Defines the preferred HTML display dialect name.
                        -	 */
                        -	DIALECT_PREFERHTML: 'preferHtml',
                        -
                        -	/**
                        -	 * Variable: DIALECT_STRICTHTML
                        -	 * 
                        -	 * Defines the strict HTML display dialect.
                        -	 */
                        -	DIALECT_STRICTHTML: 'strictHtml',
                        -
                        -	/**
                        -	 * Variable: NS_SVG
                        -	 * 
                        -	 * Defines the SVG namespace.
                        -	 */
                        -	NS_SVG: 'http://www.w3.org/2000/svg',
                        -
                        -	/**
                        -	 * Variable: NS_XHTML
                        -	 * 
                        -	 * Defines the XHTML namespace.
                        -	 */
                        -	NS_XHTML: 'http://www.w3.org/1999/xhtml',
                        -
                        -	/**
                        -	 * Variable: NS_XLINK
                        -	 * 
                        -	 * Defines the XLink namespace.
                        -	 */
                        -	NS_XLINK: 'http://www.w3.org/1999/xlink',
                        -
                        -	/**
                        -	 * Variable: SHADOWCOLOR
                        -	 * 
                        -	 * Defines the color to be used to draw shadows in shapes and windows.
                        -	 * Default is gray.
                        -	 */
                        -	SHADOWCOLOR: 'gray',
                        -
                        -	/**
                        -	 * Variable: VML_SHADOWCOLOR
                        -	 * 
                        -	 * Used for shadow color in filters where transparency is not supported
                        -	 * (Microsoft Internet Explorer). Default is gray.
                        -	 */
                        -	VML_SHADOWCOLOR: 'gray',
                        -
                        -	/**
                        -	 * Variable: SHADOW_OFFSET_X
                        -	 * 
                        -	 * Specifies the x-offset of the shadow. Default is 2.
                        -	 */
                        -	SHADOW_OFFSET_X: 2,
                        -
                        -	/**
                        -	 * Variable: SHADOW_OFFSET_Y
                        -	 * 
                        -	 * Specifies the y-offset of the shadow. Default is 3.
                        -	 */
                        -	SHADOW_OFFSET_Y: 3,
                        -	
                        -	/**
                        -	 * Variable: SHADOW_OPACITY
                        -	 * 
                        -	 * Defines the opacity for shadows. Default is 1.
                        -	 */
                        -	SHADOW_OPACITY: 1,
                        - 
                        -	/**
                        -	 * Variable: NODETYPE_ELEMENT
                        -	 * 
                        -	 * DOM node of type ELEMENT.
                        -	 */
                        -	NODETYPE_ELEMENT: 1,
                        -
                        -	/**
                        -	 * Variable: NODETYPE_ATTRIBUTE
                        -	 * 
                        -	 * DOM node of type ATTRIBUTE.
                        -	 */
                        -	NODETYPE_ATTRIBUTE: 2,
                        -
                        -	/**
                        -	 * Variable: NODETYPE_TEXT
                        -	 * 
                        -	 * DOM node of type TEXT.
                        -	 */
                        -	NODETYPE_TEXT: 3,
                        -
                        -	/**
                        -	 * Variable: NODETYPE_CDATA
                        -	 * 
                        -	 * DOM node of type CDATA.
                        -	 */
                        -	NODETYPE_CDATA: 4,
                        -	
                        -	/**
                        -	 * Variable: NODETYPE_ENTITY_REFERENCE
                        -	 * 
                        -	 * DOM node of type ENTITY_REFERENCE.
                        -	 */
                        -	NODETYPE_ENTITY_REFERENCE: 5,
                        -
                        -	/**
                        -	 * Variable: NODETYPE_ENTITY
                        -	 * 
                        -	 * DOM node of type ENTITY.
                        -	 */
                        -	NODETYPE_ENTITY: 6,
                        -
                        -	/**
                        -	 * Variable: NODETYPE_PROCESSING_INSTRUCTION
                        -	 * 
                        -	 * DOM node of type PROCESSING_INSTRUCTION.
                        -	 */
                        -	NODETYPE_PROCESSING_INSTRUCTION: 7,
                        -
                        -	/**
                        -	 * Variable: NODETYPE_COMMENT
                        -	 * 
                        -	 * DOM node of type COMMENT.
                        -	 */
                        -	NODETYPE_COMMENT: 8,
                        -		
                        -	/**
                        -	 * Variable: NODETYPE_DOCUMENT
                        -	 * 
                        -	 * DOM node of type DOCUMENT.
                        -	 */
                        -	NODETYPE_DOCUMENT: 9,
                        -
                        -	/**
                        -	 * Variable: NODETYPE_DOCUMENTTYPE
                        -	 * 
                        -	 * DOM node of type DOCUMENTTYPE.
                        -	 */
                        -	NODETYPE_DOCUMENTTYPE: 10,
                        -
                        -	/**
                        -	 * Variable: NODETYPE_DOCUMENT_FRAGMENT
                        -	 * 
                        -	 * DOM node of type DOCUMENT_FRAGMENT.
                        -	 */
                        -	NODETYPE_DOCUMENT_FRAGMENT: 11,
                        -
                        -	/**
                        -	 * Variable: NODETYPE_NOTATION
                        -	 * 
                        -	 * DOM node of type NOTATION.
                        -	 */
                        -	NODETYPE_NOTATION: 12,
                        -	
                        -	/**
                        -	 * Variable: TOOLTIP_VERTICAL_OFFSET
                        -	 * 
                        -	 * Defines the vertical offset for the tooltip.
                        -	 * Default is 16.
                        -	 */
                        -	TOOLTIP_VERTICAL_OFFSET: 16,
                        -
                        -	/**
                        -	 * Variable: DEFAULT_VALID_COLOR
                        -	 * 
                        -	 * Specifies the default valid color. Default is #0000FF.
                        -	 */
                        -	DEFAULT_VALID_COLOR: '#00FF00',
                        -
                        -	/**
                        -	 * Variable: DEFAULT_INVALID_COLOR
                        -	 * 
                        -	 * Specifies the default invalid color. Default is #FF0000.
                        -	 */
                        -	DEFAULT_INVALID_COLOR: '#FF0000',
                        -
                        -	/**
                        -	 * Variable: OUTLINE_HIGHLIGHT_COLOR
                        -	 * 
                        -	 * Specifies the default highlight color for shape outlines.
                        -	 * Default is #0000FF. This is used in .
                        -	 */
                        -	OUTLINE_HIGHLIGHT_COLOR: '#00FF00',
                        -
                        -	/**
                        -	 * Variable: OUTLINE_HIGHLIGHT_COLOR
                        -	 * 
                        -	 * Defines the strokewidth to be used for shape outlines.
                        -	 * Default is 5. This is used in .
                        -	 */
                        -	OUTLINE_HIGHLIGHT_STROKEWIDTH: 5,
                        -
                        -	/**
                        -	 * Variable: HIGHLIGHT_STROKEWIDTH
                        -	 * 
                        -	 * Defines the strokewidth to be used for the highlights.
                        -	 * Default is 3.
                        -	 */
                        -	HIGHLIGHT_STROKEWIDTH: 3,
                        -
                        -	/**
                        -	 * Variable: CONSTRAINT_HIGHLIGHT_SIZE
                        -	 * 
                        -	 * Size of the constraint highlight (in px). Default is 2.
                        -	 */
                        -	HIGHLIGHT_SIZE: 2,
                        -	
                        -	/**
                        -	 * Variable: HIGHLIGHT_OPACITY
                        -	 * 
                        -	 * Opacity (in %) used for the highlights (including outline).
                        -	 * Default is 100.
                        -	 */
                        -	HIGHLIGHT_OPACITY: 100,
                        -	
                        -	/**
                        -	 * Variable: CURSOR_MOVABLE_VERTEX
                        -	 * 
                        -	 * Defines the cursor for a movable vertex. Default is 'move'.
                        -	 */
                        -	CURSOR_MOVABLE_VERTEX: 'move',
                        -	
                        -	/**
                        -	 * Variable: CURSOR_MOVABLE_EDGE
                        -	 * 
                        -	 * Defines the cursor for a movable edge. Default is 'move'.
                        -	 */
                        -	CURSOR_MOVABLE_EDGE: 'move',
                        -	
                        -	/**
                        -	 * Variable: CURSOR_LABEL_HANDLE
                        -	 * 
                        -	 * Defines the cursor for a movable label. Default is 'default'.
                        -	 */
                        -	CURSOR_LABEL_HANDLE: 'default',
                        -	
                        -	/**
                        -	 * Variable: CURSOR_TERMINAL_HANDLE
                        -	 * 
                        -	 * Defines the cursor for a terminal handle. Default is 'pointer'.
                        -	 */
                        -	CURSOR_TERMINAL_HANDLE: 'pointer',
                        -	
                        -	/**
                        -	 * Variable: CURSOR_BEND_HANDLE
                        -	 * 
                        -	 * Defines the cursor for a movable bend. Default is 'crosshair'.
                        -	 */
                        -	CURSOR_BEND_HANDLE: 'crosshair',
                        -
                        -	/**
                        -	 * Variable: CURSOR_VIRTUAL_BEND_HANDLE
                        -	 * 
                        -	 * Defines the cursor for a movable bend. Default is 'crosshair'.
                        -	 */
                        -	CURSOR_VIRTUAL_BEND_HANDLE: 'crosshair',
                        -	
                        -	/**
                        -	 * Variable: CURSOR_CONNECT
                        -	 * 
                        -	 * Defines the cursor for a connectable state. Default is 'pointer'.
                        -	 */
                        -	CURSOR_CONNECT: 'pointer',
                        -
                        -	/**
                        -	 * Variable: HIGHLIGHT_COLOR
                        -	 * 
                        -	 * Defines the color to be used for the cell highlighting.
                        -	 * Use 'none' for no color. Default is #00FF00.
                        -	 */
                        -	HIGHLIGHT_COLOR: '#00FF00',
                        -
                        -	/**
                        -	 * Variable: TARGET_HIGHLIGHT_COLOR
                        -	 * 
                        -	 * Defines the color to be used for highlighting a target cell for a new
                        -	 * or changed connection. Note that this may be either a source or
                        -	 * target terminal in the graph. Use 'none' for no color.
                        -	 * Default is #0000FF.
                        -	 */
                        -	CONNECT_TARGET_COLOR: '#0000FF',
                        -
                        -	/**
                        -	 * Variable: INVALID_CONNECT_TARGET_COLOR
                        -	 * 
                        -	 * Defines the color to be used for highlighting a invalid target cells
                        -	 * for a new or changed connections. Note that this may be either a source
                        -	 * or target terminal in the graph. Use 'none' for no color. Default is
                        -	 * #FF0000.
                        -	 */
                        -	INVALID_CONNECT_TARGET_COLOR: '#FF0000',
                        -
                        -	/**
                        -	 * Variable: DROP_TARGET_COLOR
                        -	 * 
                        -	 * Defines the color to be used for the highlighting target parent cells
                        -	 * (for drag and drop). Use 'none' for no color. Default is #0000FF.
                        -	 */
                        -	DROP_TARGET_COLOR: '#0000FF',
                        -
                        -	/**
                        -	 * Variable: VALID_COLOR
                        -	 * 
                        -	 * Defines the color to be used for the coloring valid connection
                        -	 * previews. Use 'none' for no color. Default is #FF0000.
                        -	 */
                        -	VALID_COLOR: '#00FF00',
                        -
                        -	/**
                        -	 * Variable: INVALID_COLOR
                        -	 * 
                        -	 * Defines the color to be used for the coloring invalid connection
                        -	 * previews. Use 'none' for no color. Default is #FF0000.
                        -	 */
                        -	INVALID_COLOR: '#FF0000',
                        -
                        -	/**
                        -	 * Variable: EDGE_SELECTION_COLOR
                        -	 * 
                        -	 * Defines the color to be used for the selection border of edges. Use
                        -	 * 'none' for no color. Default is #00FF00.
                        -	 */
                        -	EDGE_SELECTION_COLOR: '#00FF00',
                        -
                        -	/**
                        -	 * Variable: VERTEX_SELECTION_COLOR
                        -	 * 
                        -	 * Defines the color to be used for the selection border of vertices. Use
                        -	 * 'none' for no color. Default is #00FF00.
                        -	 */
                        -	VERTEX_SELECTION_COLOR: '#00FF00',
                        -
                        -	/**
                        -	 * Variable: VERTEX_SELECTION_STROKEWIDTH
                        -	 * 
                        -	 * Defines the strokewidth to be used for vertex selections.
                        -	 * Default is 1.
                        -	 */
                        -	VERTEX_SELECTION_STROKEWIDTH: 1,
                        -
                        -	/**
                        -	 * Variable: EDGE_SELECTION_STROKEWIDTH
                        -	 * 
                        -	 * Defines the strokewidth to be used for edge selections.
                        -	 * Default is 1.
                        -	 */
                        -	EDGE_SELECTION_STROKEWIDTH: 1,
                        -
                        -	/**
                        -	 * Variable: SELECTION_DASHED
                        -	 * 
                        -	 * Defines the dashed state to be used for the vertex selection
                        -	 * border. Default is true.
                        -	 */
                        -	VERTEX_SELECTION_DASHED: true,
                        -
                        -	/**
                        -	 * Variable: SELECTION_DASHED
                        -	 * 
                        -	 * Defines the dashed state to be used for the edge selection
                        -	 * border. Default is true.
                        -	 */
                        -	EDGE_SELECTION_DASHED: true,
                        -
                        -	/**
                        -	 * Variable: GUIDE_COLOR
                        -	 * 
                        -	 * Defines the color to be used for the guidelines in mxGraphHandler.
                        -	 * Default is #FF0000.
                        -	 */
                        -	GUIDE_COLOR: '#FF0000',
                        -
                        -	/**
                        -	 * Variable: GUIDE_STROKEWIDTH
                        -	 * 
                        -	 * Defines the strokewidth to be used for the guidelines in mxGraphHandler.
                        -	 * Default is 1.
                        -	 */
                        -	GUIDE_STROKEWIDTH: 1,
                        -
                        -	/**
                        -	 * Variable: OUTLINE_COLOR
                        -	 * 
                        -	 * Defines the color to be used for the outline rectangle
                        -	 * border.  Use 'none' for no color. Default is #0099FF.
                        -	 */
                        -	OUTLINE_COLOR: '#0099FF',
                        -
                        -	/**
                        -	 * Variable: OUTLINE_STROKEWIDTH
                        -	 * 
                        -	 * Defines the strokewidth to be used for the outline rectangle
                        -	 * stroke width. Default is 3.
                        -	 */
                        -	OUTLINE_STROKEWIDTH: (mxClient.IS_IE) ? 2 : 3,
                        -
                        -	/**
                        -	 * Variable: HANDLE_SIZE
                        -	 * 
                        -	 * Defines the default size for handles. Default is 6.
                        -	 */
                        -	HANDLE_SIZE: 6,
                        -
                        -	/**
                        -	 * Variable: LABEL_HANDLE_SIZE
                        -	 * 
                        -	 * Defines the default size for label handles. Default is 4.
                        -	 */
                        -	LABEL_HANDLE_SIZE: 4,
                        -
                        -	/**
                        -	 * Variable: HANDLE_FILLCOLOR
                        -	 * 
                        -	 * Defines the color to be used for the handle fill color. Use 'none' for
                        -	 * no color. Default is #00FF00 (green).
                        -	 */
                        -	HANDLE_FILLCOLOR: '#00FF00',
                        -
                        -	/**
                        -	 * Variable: HANDLE_STROKECOLOR
                        -	 * 
                        -	 * Defines the color to be used for the handle stroke color. Use 'none' for
                        -	 * no color. Default is black.
                        -	 */
                        -	HANDLE_STROKECOLOR: 'black',
                        -
                        -	/**
                        -	 * Variable: LABEL_HANDLE_FILLCOLOR
                        -	 * 
                        -	 * Defines the color to be used for the label handle fill color. Use 'none'
                        -	 * for no color. Default is yellow.
                        -	 */
                        -	LABEL_HANDLE_FILLCOLOR: 'yellow',
                        -
                        -	/**
                        -	 * Variable: CONNECT_HANDLE_FILLCOLOR
                        -	 * 
                        -	 * Defines the color to be used for the connect handle fill color. Use
                        -	 * 'none' for no color. Default is #0000FF (blue).
                        -	 */
                        -	CONNECT_HANDLE_FILLCOLOR: '#0000FF',
                        -
                        -	/**
                        -	 * Variable: LOCKED_HANDLE_FILLCOLOR
                        -	 * 
                        -	 * Defines the color to be used for the locked handle fill color. Use
                        -	 * 'none' for no color. Default is #FF0000 (red).
                        -	 */
                        -	LOCKED_HANDLE_FILLCOLOR: '#FF0000',
                        -
                        -	/**
                        -	 * Variable: OUTLINE_HANDLE_FILLCOLOR
                        -	 * 
                        -	 * Defines the color to be used for the outline sizer fill color. Use
                        -	 * 'none' for no color. Default is #00FFFF.
                        -	 */
                        -	OUTLINE_HANDLE_FILLCOLOR: '#00FFFF',
                        -
                        -	/**
                        -	 * Variable: OUTLINE_HANDLE_STROKECOLOR
                        -	 * 
                        -	 * Defines the color to be used for the outline sizer stroke color. Use
                        -	 * 'none' for no color. Default is #0033FF.
                        -	 */
                        -	OUTLINE_HANDLE_STROKECOLOR: '#0033FF',
                        -
                        -	/**
                        -	 * Variable: DEFAULT_FONTFAMILY
                        -	 * 
                        -	 * Defines the default family for all fonts. Default is Arial,Helvetica.
                        -	 */
                        -	DEFAULT_FONTFAMILY: 'Arial,Helvetica',
                        -
                        -	/**
                        -	 * Variable: DEFAULT_FONTSIZE
                        -	 * 
                        -	 * Defines the default size (in px). Default is 11.
                        -	 */
                        -	DEFAULT_FONTSIZE: 11,
                        -
                        -	/**
                        -	 * Variable: DEFAULT_TEXT_DIRECTION
                        -	 * 
                        -	 * Defines the default value for the  if no value is
                        -	 * defined for it in the style. Default value is an empty string which means
                        -	 * the default system setting is used and no direction is set.
                        -	 */
                        -	DEFAULT_TEXT_DIRECTION: '',
                        -
                        -	/**
                        -	 * Variable: LINE_HEIGHT
                        -	 * 
                        -	 * Defines the default line height for text labels. Default is 1.2.
                        -	 */
                        -	LINE_HEIGHT: 1.2,
                        -
                        -	/**
                        -	 * Variable: WORD_WRAP
                        -	 * 
                        -	 * Defines the CSS value for the word-wrap property. Default is "normal".
                        -	 * Change this to "break-word" to allow long words to be able to be broken
                        -	 * and wrap onto the next line.
                        -	 */
                        -	WORD_WRAP: 'normal',
                        -
                        -	/**
                        -	 * Variable: ABSOLUTE_LINE_HEIGHT
                        -	 * 
                        -	 * Specifies if absolute line heights should be used (px) in CSS. Default
                        -	 * is false. Set this to true for backwards compatibility.
                        -	 */
                        -	ABSOLUTE_LINE_HEIGHT: false,
                        -
                        -	/**
                        -	 * Variable: DEFAULT_FONTSTYLE
                        -	 * 
                        -	 * Defines the default style for all fonts. Default is 0. This can be set
                        -	 * to any combination of font styles as follows.
                        -	 * 
                        -	 * (code)
                        -	 * mxConstants.DEFAULT_FONTSTYLE = mxConstants.FONT_BOLD | mxConstants.FONT_ITALIC;
                        -	 * (end)
                        -	 */
                        -	DEFAULT_FONTSTYLE: 0,
                        -
                        -	/**
                        -	 * Variable: DEFAULT_STARTSIZE
                        -	 * 
                        -	 * Defines the default start size for swimlanes. Default is 40.
                        -	 */
                        -	DEFAULT_STARTSIZE: 40,
                        -
                        -	/**
                        -	 * Variable: DEFAULT_MARKERSIZE
                        -	 * 
                        -	 * Defines the default size for all markers. Default is 6.
                        -	 */
                        -	DEFAULT_MARKERSIZE: 6,
                        -
                        -	/**
                        -	 * Variable: DEFAULT_IMAGESIZE
                        -	 * 
                        -	 * Defines the default width and height for images used in the
                        -	 * label shape. Default is 24.
                        -	 */
                        -	DEFAULT_IMAGESIZE: 24,
                        -
                        -	/**
                        -	 * Variable: ENTITY_SEGMENT
                        -	 * 
                        -	 * Defines the length of the horizontal segment of an Entity Relation.
                        -	 * This can be overridden using  style.
                        -	 * Default is 30.
                        -	 */
                        -	ENTITY_SEGMENT: 30,
                        -
                        -	/**
                        -	 * Variable: RECTANGLE_ROUNDING_FACTOR
                        -	 * 
                        -	 * Defines the rounding factor for rounded rectangles in percent between
                        -	 * 0 and 1. Values should be smaller than 0.5. Default is 0.15.
                        -	 */
                        -	RECTANGLE_ROUNDING_FACTOR: 0.15,
                        -
                        -	/**
                        -	 * Variable: LINE_ARCSIZE
                        -	 * 
                        -	 * Defines the size of the arcs for rounded edges. Default is 20.
                        -	 */
                        -	LINE_ARCSIZE: 20,
                        -
                        -	/**
                        -	 * Variable: ARROW_SPACING
                        -	 * 
                        -	 * Defines the spacing between the arrow shape and its terminals. Default is 0.
                        -	 */
                        -	ARROW_SPACING: 0,
                        -
                        -	/**
                        -	 * Variable: ARROW_WIDTH
                        -	 * 
                        -	 * Defines the width of the arrow shape. Default is 30.
                        -	 */
                        -	ARROW_WIDTH: 30,
                        -
                        -	/**
                        -	 * Variable: ARROW_SIZE
                        -	 * 
                        -	 * Defines the size of the arrowhead in the arrow shape. Default is 30.
                        -	 */
                        -	ARROW_SIZE: 30,
                        -
                        -	/**
                        -	 * Variable: PAGE_FORMAT_A4_PORTRAIT
                        -	 * 
                        -	 * Defines the rectangle for the A4 portrait page format. The dimensions
                        -	 * of this page format are 826x1169 pixels.
                        -	 */
                        -	PAGE_FORMAT_A4_PORTRAIT: new mxRectangle(0, 0, 827, 1169),
                        -
                        -	/**
                        -	 * Variable: PAGE_FORMAT_A4_PORTRAIT
                        -	 * 
                        -	 * Defines the rectangle for the A4 portrait page format. The dimensions
                        -	 * of this page format are 826x1169 pixels.
                        -	 */
                        -	PAGE_FORMAT_A4_LANDSCAPE: new mxRectangle(0, 0, 1169, 827),
                        -
                        -	/**
                        -	 * Variable: PAGE_FORMAT_LETTER_PORTRAIT
                        -	 * 
                        -	 * Defines the rectangle for the Letter portrait page format. The
                        -	 * dimensions of this page format are 850x1100 pixels.
                        -	 */
                        -	PAGE_FORMAT_LETTER_PORTRAIT: new mxRectangle(0, 0, 850, 1100),
                        -
                        -	/**
                        -	 * Variable: PAGE_FORMAT_LETTER_PORTRAIT
                        -	 * 
                        -	 * Defines the rectangle for the Letter portrait page format. The dimensions
                        -	 * of this page format are 850x1100 pixels.
                        -	 */
                        -	PAGE_FORMAT_LETTER_LANDSCAPE: new mxRectangle(0, 0, 1100, 850),
                        -
                        -	/**
                        -	 * Variable: NONE
                        -	 * 
                        -	 * Defines the value for none. Default is "none".
                        -	 */
                        -	NONE: 'none',
                        -
                        -	/**
                        -	 * Variable: STYLE_PERIMETER
                        -	 * 
                        -	 * Defines the key for the perimeter style. This is a function that defines
                        -	 * the perimeter around a particular shape. Possible values are the
                        -	 * functions defined in . Alternatively, the constants in this
                        -	 * class that start with "PERIMETER_" may be used to access
                        -	 * perimeter styles in . Value is "perimeter".
                        -	 */
                        -	STYLE_PERIMETER: 'perimeter',
                        -	
                        -	/**
                        -	 * Variable: STYLE_SOURCE_PORT
                        -	 * 
                        -	 * Defines the ID of the cell that should be used for computing the
                        -	 * perimeter point of the source for an edge. This allows for graphically
                        -	 * connecting to a cell while keeping the actual terminal of the edge.
                        -	 * Value is "sourcePort".
                        -	 */
                        -	STYLE_SOURCE_PORT: 'sourcePort',
                        -	
                        -	/**
                        -	 * Variable: STYLE_TARGET_PORT
                        -	 * 
                        -	 * Defines the ID of the cell that should be used for computing the
                        -	 * perimeter point of the target for an edge. This allows for graphically
                        -	 * connecting to a cell while keeping the actual terminal of the edge.
                        -	 * Value is "targetPort".
                        -	 */
                        -	STYLE_TARGET_PORT: 'targetPort',
                        -
                        -	/**
                        -	 * Variable: STYLE_PORT_CONSTRAINT
                        -	 * 
                        -	 * Defines the direction(s) that edges are allowed to connect to cells in.
                        -	 * Possible values are "DIRECTION_NORTH, DIRECTION_SOUTH, 
                        -	 * DIRECTION_EAST" and "DIRECTION_WEST". Value is
                        -	 * "portConstraint".
                        -	 */
                        -	STYLE_PORT_CONSTRAINT: 'portConstraint',
                        -
                        -	/**
                        -	 * Variable: STYLE_PORT_CONSTRAINT_ROTATION
                        -	 * 
                        -	 * Define whether port constraint directions are rotated with vertex
                        -	 * rotation. 0 (default) causes port constraints to remain absolute, 
                        -	 * relative to the graph, 1 causes the constraints to rotate with
                        -	 * the vertex. Value is "portConstraintRotation".
                        -	 */
                        -	STYLE_PORT_CONSTRAINT_ROTATION: 'portConstraintRotation',
                        -
                        -	/**
                        -	 * Variable: STYLE_SOURCE_PORT_CONSTRAINT
                        -	 * 
                        -	 * Defines the direction(s) that edges are allowed to connect to sources in.
                        -	 * Possible values are "DIRECTION_NORTH, DIRECTION_SOUTH, DIRECTION_EAST"
                        -	 * and "DIRECTION_WEST". Value is "sourcePortConstraint".
                        -	 */
                        -	STYLE_SOURCE_PORT_CONSTRAINT: 'sourcePortConstraint',
                        -
                        -	/**
                        -	 * Variable: STYLE_TARGET_PORT_CONSTRAINT
                        -	 * 
                        -	 * Defines the direction(s) that edges are allowed to connect to targets in.
                        -	 * Possible values are "DIRECTION_NORTH, DIRECTION_SOUTH, DIRECTION_EAST"
                        -	 * and "DIRECTION_WEST". Value is "targetPortConstraint".
                        -	 */
                        -	STYLE_TARGET_PORT_CONSTRAINT: 'targetPortConstraint',
                        -
                        -	/**
                        -	 * Variable: STYLE_OPACITY
                        -	 * 
                        -	 * Defines the key for the opacity style. The type of the value is 
                        -	 * numeric and the possible range is 0-100. Value is "opacity".
                        -	 */
                        -	STYLE_OPACITY: 'opacity',
                        -
                        -	/**
                        -	 * Variable: STYLE_FILL_OPACITY
                        -	 * 
                        -	 * Defines the key for the fill opacity style. The type of the value is 
                        -	 * numeric and the possible range is 0-100. Value is "fillOpacity".
                        -	 */
                        -	STYLE_FILL_OPACITY: 'fillOpacity',
                        -
                        -	/**
                        -	 * Variable: STYLE_STROKE_OPACITY
                        -	 * 
                        -	 * Defines the key for the stroke opacity style. The type of the value is 
                        -	 * numeric and the possible range is 0-100. Value is "strokeOpacity".
                        -	 */
                        -	STYLE_STROKE_OPACITY: 'strokeOpacity',
                        -
                        -	/**
                        -	 * Variable: STYLE_TEXT_OPACITY
                        -	 * 
                        -	 * Defines the key for the text opacity style. The type of the value is 
                        -	 * numeric and the possible range is 0-100. Value is "textOpacity".
                        -	 */
                        -	STYLE_TEXT_OPACITY: 'textOpacity',
                        -
                        -	/**
                        -	 * Variable: STYLE_TEXT_DIRECTION
                        -	 * 
                        -	 * Defines the key for the text direction style. Possible values are
                        -	 * "TEXT_DIRECTION_DEFAULT, TEXT_DIRECTION_AUTO, TEXT_DIRECTION_LTR"
                        -	 * and "TEXT_DIRECTION_RTL". Value is "textDirection".
                        -	 * The default value for the style is defined in .
                        -	 * It is used is no value is defined for this key in a given style. This is
                        -	 * an experimental style that is currently ignored in the backends.
                        -	 */
                        -	STYLE_TEXT_DIRECTION: 'textDirection',
                        -
                        -	/**
                        -	 * Variable: STYLE_OVERFLOW
                        -	 * 
                        -	 * Defines the key for the overflow style. Possible values are 'visible',
                        -	 * 'hidden', 'fill' and 'width'. The default value is 'visible'. This value
                        -	 * specifies how overlapping vertex labels are handled. A value of
                        -	 * 'visible' will show the complete label. A value of 'hidden' will clip
                        -	 * the label so that it does not overlap the vertex bounds. A value of
                        -	 * 'fill' will use the vertex bounds and a value of 'width' will use the
                        -	 * the vertex width for the label. See . Note that
                        -	 * the vertical alignment is ignored for overflow fill and for horizontal
                        -	 * alignment, left should be used to avoid pixel offsets in Internet Explorer
                        -	 * 11 and earlier or if foreignObjects are disabled. Value is "overflow".
                        -	 */
                        -	STYLE_OVERFLOW: 'overflow',
                        -
                        -	/**
                        -	 * Variable: STYLE_ORTHOGONAL
                        -	 * 
                        -	 * Defines if the connection points on either end of the edge should be
                        -	 * computed so that the edge is vertical or horizontal if possible and
                        -	 * if the point is not at a fixed location. Default is false. This is
                        -	 * used in , which also returns true if the edgeStyle
                        -	 * of the edge is an elbow or entity. Value is "orthogonal".
                        -	 */
                        -	STYLE_ORTHOGONAL: 'orthogonal',
                        -
                        -	/**
                        -	 * Variable: STYLE_EXIT_X
                        -	 * 
                        -	 * Defines the key for the horizontal relative coordinate connection point
                        -	 * of an edge with its source terminal. Value is "exitX".
                        -	 */
                        -	STYLE_EXIT_X: 'exitX',
                        -
                        -	/**
                        -	 * Variable: STYLE_EXIT_Y
                        -	 * 
                        -	 * Defines the key for the vertical relative coordinate connection point
                        -	 * of an edge with its source terminal. Value is "exitY".
                        -	 */
                        -	STYLE_EXIT_Y: 'exitY',
                        -
                        -	
                        -	/**
                        -	* Variable: STYLE_EXIT_DX
                        -	* 
                        -	* Defines the key for the horizontal offset of the connection point
                        -	* of an edge with its source terminal. Value is "exitDx".
                        -	*/
                        -	STYLE_EXIT_DX: 'exitDx',
                        -
                        -	/**
                        -	* Variable: STYLE_EXIT_DY
                        -	* 
                        -	* Defines the key for the vertical offset of the connection point
                        -	* of an edge with its source terminal. Value is "exitDy".
                        -	*/
                        -	STYLE_EXIT_DY: 'exitDy',
                        -	
                        -	/**
                        -	 * Variable: STYLE_EXIT_PERIMETER
                        -	 * 
                        -	 * Defines if the perimeter should be used to find the exact entry point
                        -	 * along the perimeter of the source. Possible values are 0 (false) and
                        -	 * 1 (true). Default is 1 (true). Value is "exitPerimeter".
                        -	 */
                        -	STYLE_EXIT_PERIMETER: 'exitPerimeter',
                        -
                        -	/**
                        -	 * Variable: STYLE_ENTRY_X
                        -	 * 
                        -	 * Defines the key for the horizontal relative coordinate connection point
                        -	 * of an edge with its target terminal. Value is "entryX".
                        -	 */
                        -	STYLE_ENTRY_X: 'entryX',
                        -
                        -	/**
                        -	 * Variable: STYLE_ENTRY_Y
                        -	 * 
                        -	 * Defines the key for the vertical relative coordinate connection point
                        -	 * of an edge with its target terminal. Value is "entryY".
                        -	 */
                        -	STYLE_ENTRY_Y: 'entryY',
                        -
                        -	/**
                        -	 * Variable: STYLE_ENTRY_DX
                        -	 * 
                        -	* Defines the key for the horizontal offset of the connection point
                        -	* of an edge with its target terminal. Value is "entryDx".
                        -	*/
                        -	STYLE_ENTRY_DX: 'entryDx',
                        -
                        -	/**
                        -	 * Variable: STYLE_ENTRY_DY
                        -	 * 
                        -	* Defines the key for the vertical offset of the connection point
                        -	* of an edge with its target terminal. Value is "entryDy".
                        -	*/
                        -	STYLE_ENTRY_DY: 'entryDy',
                        -
                        -	/**
                        -	 * Variable: STYLE_ENTRY_PERIMETER
                        -	 * 
                        -	 * Defines if the perimeter should be used to find the exact entry point
                        -	 * along the perimeter of the target. Possible values are 0 (false) and
                        -	 * 1 (true). Default is 1 (true). Value is "entryPerimeter".
                        -	 */
                        -	STYLE_ENTRY_PERIMETER: 'entryPerimeter',
                        -
                        -	/**
                        -	 * Variable: STYLE_WHITE_SPACE
                        -	 * 
                        -	 * Defines the key for the white-space style. Possible values are 'nowrap'
                        -	 * and 'wrap'. The default value is 'nowrap'. This value specifies how
                        -	 * white-space inside a HTML vertex label should be handled. A value of
                        -	 * 'nowrap' means the text will never wrap to the next line until a
                        -	 * linefeed is encountered. A value of 'wrap' means text will wrap when
                        -	 * necessary. This style is only used for HTML labels.
                        -	 * See . Value is "whiteSpace".
                        -	 */
                        -	STYLE_WHITE_SPACE: 'whiteSpace',
                        -
                        -	/**
                        -	 * Variable: STYLE_ROTATION
                        -	 * 
                        -	 * Defines the key for the rotation style. The type of the value is 
                        -	 * numeric and the possible range is 0-360. Value is "rotation".
                        -	 */
                        -	STYLE_ROTATION: 'rotation',
                        -
                        -	/**
                        -	 * Variable: STYLE_FILLCOLOR
                        -	 * 
                        -	 * Defines the key for the fill color. Possible values are all HTML color
                        -	 * names or HEX codes, as well as special keywords such as 'swimlane,
                        -	 * 'inherit' or 'indicated' to use the color code of a related cell or the
                        -	 * indicator shape. Value is "fillColor".
                        -	 */
                        -	STYLE_FILLCOLOR: 'fillColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_POINTER_EVENTS
                        -	 * 
                        -	 * Specifies if pointer events should be fired on transparent backgrounds.
                        -	 * This style is currently only supported in . Default
                        -	 * is true. Value is "pointerEvents". This is typically set to
                        -	 * false in groups where the transparent part should allow any underlying
                        -	 * cells to be clickable.
                        -	 */
                        -	STYLE_POINTER_EVENTS: 'pointerEvents',
                        -
                        -	/**
                        -	 * Variable: STYLE_SWIMLANE_FILLCOLOR
                        -	 * 
                        -	 * Defines the key for the fill color of the swimlane background. Possible
                        -	 * values are all HTML color names or HEX codes. Default is no background.
                        -	 * Value is "swimlaneFillColor".
                        -	 */
                        -	STYLE_SWIMLANE_FILLCOLOR: 'swimlaneFillColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_MARGIN
                        -	 * 
                        -	 * Defines the key for the margin between the ellipses in the double ellipse shape.
                        -	 * Possible values are all positive numbers. Value is "margin".
                        -	 */
                        -	STYLE_MARGIN: 'margin',
                        -
                        -	/**
                        -	 * Variable: STYLE_GRADIENTCOLOR
                        -	 * 
                        -	 * Defines the key for the gradient color. Possible values are all HTML color
                        -	 * names or HEX codes, as well as special keywords such as 'swimlane,
                        -	 * 'inherit' or 'indicated' to use the color code of a related cell or the
                        -	 * indicator shape. This is ignored if no fill color is defined. Value is
                        -	 * "gradientColor".
                        -	 */
                        -	STYLE_GRADIENTCOLOR: 'gradientColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_GRADIENT_DIRECTION
                        -	 * 
                        -	 * Defines the key for the gradient direction. Possible values are
                        -	 * , ,  and
                        -	 * . Default is . Generally, and by
                        -	 * default in mxGraph, gradient painting is done from the value of
                        -	 *  to the value of . Taking the
                        -	 * example of , this means  color at the 
                        -	 * bottom of paint pattern and  at top, with a
                        -	 * gradient in-between. Value is "gradientDirection".
                        -	 */
                        -	STYLE_GRADIENT_DIRECTION: 'gradientDirection',
                        -
                        -	/**
                        -	 * Variable: STYLE_STROKECOLOR
                        -	 * 
                        -	 * Defines the key for the strokeColor style. Possible values are all HTML
                        -	 * color names or HEX codes, as well as special keywords such as 'swimlane,
                        -	 * 'inherit', 'indicated' to use the color code of a related cell or the
                        -	 * indicator shape or 'none' for no color. Value is "strokeColor".
                        -	 */
                        -	STYLE_STROKECOLOR: 'strokeColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_SEPARATORCOLOR
                        -	 * 
                        -	 * Defines the key for the separatorColor style. Possible values are all
                        -	 * HTML color names or HEX codes. This style is only used for
                        -	 *  shapes. Value is "separatorColor".
                        -	 */
                        -	STYLE_SEPARATORCOLOR: 'separatorColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_STROKEWIDTH
                        -	 * 
                        -	 * Defines the key for the strokeWidth style. The type of the value is 
                        -	 * numeric and the possible range is any non-negative value larger or equal
                        -	 * to 1. The value defines the stroke width in pixels. Note: To hide a
                        -	 * stroke use strokeColor none. Value is "strokeWidth".
                        -	 */
                        -	STYLE_STROKEWIDTH: 'strokeWidth',
                        -
                        -	/**
                        -	 * Variable: STYLE_ALIGN
                        -	 * 
                        -	 * Defines the key for the align style. Possible values are ,
                        -	 *  and . This value defines how the lines of
                        -	 * the label are horizontally aligned.  mean label text lines
                        -	 * are aligned to left of the label bounds,  to the right of
                        -	 * the label bounds and  means the center of the text lines
                        -	 * are aligned in the center of the label bounds. Note this value doesn't
                        -	 * affect the positioning of the overall label bounds relative to the
                        -	 * vertex, to move the label bounds horizontally, use
                        -	 * . Value is "align".
                        -	 */
                        -	STYLE_ALIGN: 'align',
                        -
                        -	/**
                        -	 * Variable: STYLE_VERTICAL_ALIGN
                        -	 * 
                        -	 * Defines the key for the verticalAlign style. Possible values are
                        -	 * ,  and . This value defines how
                        -	 * the lines of the label are vertically aligned.  means the
                        -	 * topmost label text line is aligned against the top of the label bounds,
                        -	 *  means the bottom-most label text line is aligned against
                        -	 * the bottom of the label bounds and  means there is equal
                        -	 * spacing between the topmost text label line and the top of the label
                        -	 * bounds and the bottom-most text label line and the bottom of the label
                        -	 * bounds. Note this value doesn't affect the positioning of the overall
                        -	 * label bounds relative to the vertex, to move the label bounds
                        -	 * vertically, use . Value is "verticalAlign".
                        -	 */
                        -	STYLE_VERTICAL_ALIGN: 'verticalAlign',
                        -
                        -	/**
                        -	 * Variable: STYLE_LABEL_WIDTH
                        -	 * 
                        -	 * Defines the key for the width of the label if the label position is not
                        -	 * center. Value is "labelWidth".
                        -	 */
                        -	STYLE_LABEL_WIDTH: 'labelWidth',
                        -
                        -	/**
                        -	 * Variable: STYLE_LABEL_POSITION
                        -	 * 
                        -	 * Defines the key for the horizontal label position of vertices. Possible
                        -	 * values are ,  and . Default is
                        -	 * . The label align defines the position of the label
                        -	 * relative to the cell.  means the entire label bounds is
                        -	 * placed completely just to the left of the vertex,  means
                        -	 * adjust to the right and  means the label bounds are
                        -	 * vertically aligned with the bounds of the vertex. Note this value
                        -	 * doesn't affect the positioning of label within the label bounds, to move
                        -	 * the label horizontally within the label bounds, use .
                        -	 * Value is "labelPosition".
                        -	 */
                        -	STYLE_LABEL_POSITION: 'labelPosition',
                        -
                        -	/**
                        -	 * Variable: STYLE_VERTICAL_LABEL_POSITION
                        -	 * 
                        -	 * Defines the key for the vertical label position of vertices. Possible
                        -	 * values are ,  and . Default is
                        -	 * . The label align defines the position of the label
                        -	 * relative to the cell.  means the entire label bounds is
                        -	 * placed completely just on the top of the vertex,  means
                        -	 * adjust on the bottom and  means the label bounds are
                        -	 * horizontally aligned with the bounds of the vertex. Note this value
                        -	 * doesn't affect the positioning of label within the label bounds, to move
                        -	 * the label vertically within the label bounds, use
                        -	 * . Value is "verticalLabelPosition".
                        -	 */
                        -	STYLE_VERTICAL_LABEL_POSITION: 'verticalLabelPosition',
                        -	
                        -	/**
                        -	 * Variable: STYLE_IMAGE_ASPECT
                        -	 * 
                        -	 * Defines the key for the image aspect style. Possible values are 0 (do
                        -	 * not preserve aspect) or 1 (keep aspect). This is only used in
                        -	 * . Default is 1. Value is "imageAspect".
                        -	 */
                        -	STYLE_IMAGE_ASPECT: 'imageAspect',
                        -
                        -	/**
                        -	 * Variable: STYLE_IMAGE_ALIGN
                        -	 * 
                        -	 * Defines the key for the align style. Possible values are ,
                        -	 *  and . The value defines how any image in the
                        -	 * vertex label is aligned horizontally within the label bounds of a
                        -	 *  shape. Value is "imageAlign".
                        -	 */
                        -	STYLE_IMAGE_ALIGN: 'imageAlign',
                        -
                        -	/**
                        -	 * Variable: STYLE_IMAGE_VERTICAL_ALIGN
                        -	 * 
                        -	 * Defines the key for the verticalAlign style. Possible values are
                        -	 * ,  and . The value defines how
                        -	 * any image in the vertex label is aligned vertically within the label
                        -	 * bounds of a  shape. Value is "imageVerticalAlign".
                        -	 */
                        -	STYLE_IMAGE_VERTICAL_ALIGN: 'imageVerticalAlign',
                        -
                        -	/**
                        -	 * Variable: STYLE_GLASS
                        -	 * 
                        -	 * Defines the key for the glass style. Possible values are 0 (disabled) and
                        -	 * 1(enabled). The default value is 0. This is used in . Value is
                        -	 * "glass".
                        -	 */
                        -	STYLE_GLASS: 'glass',
                        -
                        -	/**
                        -	 * Variable: STYLE_IMAGE
                        -	 * 
                        -	 * Defines the key for the image style. Possible values are any image URL,
                        -	 * the type of the value is String. This is the path to the image that is
                        -	 * to be displayed within the label of a vertex. Data URLs should use the
                        -	 * following format: data:image/png,xyz where xyz is the base64 encoded
                        -	 * data (without the "base64"-prefix). Note that Data URLs are only
                        -	 * supported in modern browsers. Value is "image".
                        -	 */
                        -	STYLE_IMAGE: 'image',
                        -
                        -	/**
                        -	 * Variable: STYLE_IMAGE_WIDTH
                        -	 * 
                        -	 * Defines the key for the imageWidth style. The type of this value is
                        -	 * int, the value is the image width in pixels and must be greater than 0.
                        -	 * Value is "imageWidth".
                        -	 */
                        -	STYLE_IMAGE_WIDTH: 'imageWidth',
                        -
                        -	/**
                        -	 * Variable: STYLE_IMAGE_HEIGHT
                        -	 * 
                        -	 * Defines the key for the imageHeight style. The type of this value is
                        -	 * int, the value is the image height in pixels and must be greater than 0.
                        -	 * Value is "imageHeight".
                        -	 */
                        -	STYLE_IMAGE_HEIGHT: 'imageHeight',
                        -
                        -	/**
                        -	 * Variable: STYLE_IMAGE_BACKGROUND
                        -	 * 
                        -	 * Defines the key for the image background color. This style is only used
                        -	 * in . Possible values are all HTML color names or HEX
                        -	 * codes. Value is "imageBackground".
                        -	 */
                        -	STYLE_IMAGE_BACKGROUND: 'imageBackground',
                        -
                        -	/**
                        -	 * Variable: STYLE_IMAGE_BORDER
                        -	 * 
                        -	 * Defines the key for the image border color. This style is only used in
                        -	 * . Possible values are all HTML color names or HEX codes.
                        -	 * Value is "imageBorder".
                        -	 */
                        -	STYLE_IMAGE_BORDER: 'imageBorder',
                        -
                        -	/**
                        -	 * Variable: STYLE_FLIPH
                        -	 * 
                        -	 * Defines the key for the horizontal image flip. This style is only used
                        -	 * in . Possible values are 0 and 1. Default is 0. Value is
                        -	 * "flipH".
                        -	 */
                        -	STYLE_FLIPH: 'flipH',
                        -
                        -	/**
                        -	 * Variable: STYLE_FLIPV
                        -	 * 
                        -	 * Defines the key for the vertical flip. Possible values are 0 and 1.
                        -	 * Default is 0. Value is "flipV".
                        -	 */
                        -	STYLE_FLIPV: 'flipV',
                        -
                        -	/**
                        -	 * Variable: STYLE_NOLABEL
                        -	 * 
                        -	 * Defines the key for the noLabel style. If this is true then no label is
                        -	 * visible for a given cell. Possible values are true or false (1 or 0).
                        -	 * Default is false. Value is "noLabel".
                        -	 */
                        -	STYLE_NOLABEL: 'noLabel',
                        -
                        -	/**
                        -	 * Variable: STYLE_NOEDGESTYLE
                        -	 * 
                        -	 * Defines the key for the noEdgeStyle style. If this is true then no edge
                        -	 * style is applied for a given edge. Possible values are true or false
                        -	 * (1 or 0). Default is false. Value is "noEdgeStyle".
                        -	 */
                        -	STYLE_NOEDGESTYLE: 'noEdgeStyle',
                        -
                        -	/**
                        -	 * Variable: STYLE_LABEL_BACKGROUNDCOLOR
                        -	 * 
                        -	 * Defines the key for the label background color. Possible values are all
                        -	 * HTML color names or HEX codes. Value is "labelBackgroundColor".
                        -	 */
                        -	STYLE_LABEL_BACKGROUNDCOLOR: 'labelBackgroundColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_LABEL_BORDERCOLOR
                        -	 * 
                        -	 * Defines the key for the label border color. Possible values are all
                        -	 * HTML color names or HEX codes. Value is "labelBorderColor".
                        -	 */
                        -	STYLE_LABEL_BORDERCOLOR: 'labelBorderColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_LABEL_PADDING
                        -	 * 
                        -	 * Defines the key for the label padding, ie. the space between the label
                        -	 * border and the label. Value is "labelPadding".
                        -	 */
                        -	STYLE_LABEL_PADDING: 'labelPadding',
                        -
                        -	/**
                        -	 * Variable: STYLE_INDICATOR_SHAPE
                        -	 * 
                        -	 * Defines the key for the indicator shape used within an .
                        -	 * Possible values are all SHAPE_* constants or the names of any new
                        -	 * shapes. The indicatorShape has precedence over the indicatorImage.
                        -	 * Value is "indicatorShape".
                        -	 */
                        -	STYLE_INDICATOR_SHAPE: 'indicatorShape',
                        -
                        -	/**
                        -	 * Variable: STYLE_INDICATOR_IMAGE
                        -	 * 
                        -	 * Defines the key for the indicator image used within an .
                        -	 * Possible values are all image URLs. The indicatorShape has
                        -	 * precedence over the indicatorImage. Value is "indicatorImage".
                        -	 */
                        -	STYLE_INDICATOR_IMAGE: 'indicatorImage',
                        -
                        -	/**
                        -	 * Variable: STYLE_INDICATOR_COLOR
                        -	 * 
                        -	 * Defines the key for the indicatorColor style. Possible values are all
                        -	 * HTML color names or HEX codes, as well as the special 'swimlane' keyword
                        -	 * to refer to the color of the parent swimlane if one exists. Value is
                        -	 * "indicatorColor".
                        -	 */
                        -	STYLE_INDICATOR_COLOR: 'indicatorColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_INDICATOR_STROKECOLOR
                        -	 * 
                        -	 * Defines the key for the indicator stroke color in .
                        -	 * Possible values are all color codes. Value is "indicatorStrokeColor".
                        -	 */
                        -	STYLE_INDICATOR_STROKECOLOR: 'indicatorStrokeColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_INDICATOR_GRADIENTCOLOR
                        -	 * 
                        -	 * Defines the key for the indicatorGradientColor style. Possible values
                        -	 * are all HTML color names or HEX codes. This style is only supported in
                        -	 *  shapes. Value is "indicatorGradientColor".
                        -	 */
                        -	STYLE_INDICATOR_GRADIENTCOLOR: 'indicatorGradientColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_INDICATOR_SPACING
                        -	 * 
                        -	 * The defines the key for the spacing between the label and the
                        -	 * indicator in . Possible values are in pixels. Value is
                        -	 * "indicatorSpacing".
                        -	 */
                        -	STYLE_INDICATOR_SPACING: 'indicatorSpacing',
                        -
                        -	/**
                        -	 * Variable: STYLE_INDICATOR_WIDTH
                        -	 * 
                        -	 * Defines the key for the indicator width. Possible values start at 0 (in
                        -	 * pixels). Value is "indicatorWidth".
                        -	 */
                        -	STYLE_INDICATOR_WIDTH: 'indicatorWidth',
                        -
                        -	/**
                        -	 * Variable: STYLE_INDICATOR_HEIGHT
                        -	 * 
                        -	 * Defines the key for the indicator height. Possible values start at 0 (in
                        -	 * pixels). Value is "indicatorHeight".
                        -	 */
                        -	STYLE_INDICATOR_HEIGHT: 'indicatorHeight',
                        -
                        -	/**
                        -	 * Variable: STYLE_INDICATOR_DIRECTION
                        -	 * 
                        -	 * Defines the key for the indicatorDirection style. The direction style is
                        -	 * used to specify the direction of certain shapes (eg. ).
                        -	 * Possible values are  (default), ,
                        -	 *  and . Value is "indicatorDirection".
                        -	 */
                        -	STYLE_INDICATOR_DIRECTION: 'indicatorDirection',
                        -
                        -	/**
                        -	 * Variable: STYLE_SHADOW
                        -	 * 
                        -	 * Defines the key for the shadow style. The type of the value is Boolean.
                        -	 * Value is "shadow".
                        -	 */
                        -	STYLE_SHADOW: 'shadow',
                        -	
                        -	/**
                        -	 * Variable: STYLE_SEGMENT
                        -	 * 
                        -	 * Defines the key for the segment style. The type of this value is float
                        -	 * and the value represents the size of the horizontal segment of the
                        -	 * entity relation style. Default is ENTITY_SEGMENT. Value is "segment".
                        -	 */
                        -	STYLE_SEGMENT: 'segment',
                        -	
                        -	/**
                        -	 * Variable: STYLE_ENDARROW
                        -	 *
                        -	 * Defines the key for the end arrow marker. Possible values are all
                        -	 * constants with an ARROW-prefix. This is only used in .
                        -	 * Value is "endArrow".
                        -	 *
                        -	 * Example:
                        -	 * (code)
                        -	 * style[mxConstants.STYLE_ENDARROW] = mxConstants.ARROW_CLASSIC;
                        -	 * (end)
                        -	 */
                        -	STYLE_ENDARROW: 'endArrow',
                        -
                        -	/**
                        -	 * Variable: STYLE_STARTARROW
                        -	 * 
                        -	 * Defines the key for the start arrow marker. Possible values are all
                        -	 * constants with an ARROW-prefix. This is only used in .
                        -	 * See . Value is "startArrow".
                        -	 */
                        -	STYLE_STARTARROW: 'startArrow',
                        -
                        -	/**
                        -	 * Variable: STYLE_ENDSIZE
                        -	 * 
                        -	 * Defines the key for the endSize style. The type of this value is numeric
                        -	 * and the value represents the size of the end marker in pixels. Value is
                        -	 * "endSize".
                        -	 */
                        -	STYLE_ENDSIZE: 'endSize',
                        -
                        -	/**
                        -	 * Variable: STYLE_STARTSIZE
                        -	 * 
                        -	 * Defines the key for the startSize style. The type of this value is
                        -	 * numeric and the value represents the size of the start marker or the
                        -	 * size of the swimlane title region depending on the shape it is used for.
                        -	 * Value is "startSize".
                        -	 */
                        -	STYLE_STARTSIZE: 'startSize',
                        -
                        -	/**
                        -	 * Variable: STYLE_SWIMLANE_LINE
                        -	 * 
                        -	 * Defines the key for the swimlaneLine style. This style specifies whether
                        -	 * the line between the title regio of a swimlane should be visible. Use 0
                        -	 * for hidden or 1 (default) for visible. Value is "swimlaneLine".
                        -	 */
                        -	STYLE_SWIMLANE_LINE: 'swimlaneLine',
                        -
                        -	/**
                        -	 * Variable: STYLE_ENDFILL
                        -	 * 
                        -	 * Defines the key for the endFill style. Use 0 for no fill or 1 (default)
                        -	 * for fill. (This style is only exported via .) Value is
                        -	 * "endFill".
                        -	 */
                        -	STYLE_ENDFILL: 'endFill',
                        -
                        -	/**
                        -	 * Variable: STYLE_STARTFILL
                        -	 * 
                        -	 * Defines the key for the startFill style. Use 0 for no fill or 1 (default)
                        -	 * for fill. (This style is only exported via .) Value is
                        -	 * "startFill".
                        -	 */
                        -	STYLE_STARTFILL: 'startFill',
                        -
                        -	/**
                        -	 * Variable: STYLE_DASHED
                        -	 * 
                        -	 * Defines the key for the dashed style. Use 0 (default) for non-dashed or 1
                        -	 * for dashed. Value is "dashed".
                        -	 */
                        -	STYLE_DASHED: 'dashed',
                        -
                        -	/**
                        -	 * Defines the key for the dashed pattern style in SVG and image exports.
                        -	 * The type of this value is a space separated list of numbers that specify
                        -	 * a custom-defined dash pattern. Dash styles are defined in terms of the
                        -	 * length of the dash (the drawn part of the stroke) and the length of the
                        -	 * space between the dashes. The lengths are relative to the line width: a
                        -	 * length of "1" is equal to the line width. VML ignores this style and
                        -	 * uses dashStyle instead as defined in the VML specification. This style
                        -	 * is only used in the  shape. Value is "dashPattern".
                        -	 */
                        -	STYLE_DASH_PATTERN: 'dashPattern',
                        -
                        -	/**
                        -	 * Variable: STYLE_FIX_DASH
                        -	 * 
                        -	 * Defines the key for the fixDash style. Use 0 (default) for dash patterns
                        -	 * that depend on the linewidth and 1 for dash patterns that ignore the
                        -	 * line width. Value is "fixDash".
                        -	 */
                        -	STYLE_FIX_DASH: 'fixDash',
                        -
                        -	/**
                        -	 * Variable: STYLE_ROUNDED
                        -	 * 
                        -	 * Defines the key for the rounded style. The type of this value is
                        -	 * Boolean. For edges this determines whether or not joins between edges
                        -	 * segments are smoothed to a rounded finish. For vertices that have the
                        -	 * rectangle shape, this determines whether or not the rectangle is
                        -	 * rounded. Use 0 (default) for non-rounded or 1 for rounded. Value is
                        -	 * "rounded".
                        -	 */
                        -	STYLE_ROUNDED: 'rounded',
                        -
                        -	/**
                        -	 * Variable: STYLE_CURVED
                        -	 * 
                        -	 * Defines the key for the curved style. The type of this value is
                        -	 * Boolean. It is only applicable for connector shapes. Use 0 (default)
                        -	 * for non-curved or 1 for curved. Value is "curved".
                        -	 */
                        -	STYLE_CURVED: 'curved',
                        -
                        -	/**
                        -	 * Variable: STYLE_ARCSIZE
                        -	 * 
                        -	 * Defines the rounding factor for a rounded rectangle in percent (without
                        -	 * the percent sign). Possible values are between 0 and 100. If this value
                        -	 * is not specified then RECTANGLE_ROUNDING_FACTOR * 100 is used. For
                        -	 * edges, this defines the absolute size of rounded corners in pixels. If
                        -	 * this values is not specified then LINE_ARCSIZE is used.
                        -	 * (This style is only exported via .) Value is "arcSize".
                        -	 */
                        -	STYLE_ARCSIZE: 'arcSize',
                        -
                        -	/**
                        -	 * Variable: STYLE_ABSOLUTE_ARCSIZE
                        -	 * 
                        -	 * Defines the key for the absolute arc size style. This specifies if
                        -	 * arcSize for rectangles is abolute or relative. Possible values are 1
                        -	 * and 0 (default). Value is "absoluteArcSize".
                        -	 */
                        -	STYLE_ABSOLUTE_ARCSIZE: 'absoluteArcSize',
                        -
                        -	/**
                        -	 * Variable: STYLE_SOURCE_PERIMETER_SPACING
                        -	 * 
                        -	 * Defines the key for the source perimeter spacing. The type of this value
                        -	 * is numeric. This is the distance between the source connection point of
                        -	 * an edge and the perimeter of the source vertex in pixels. This style
                        -	 * only applies to edges. Value is "sourcePerimeterSpacing".
                        -	 */
                        -	STYLE_SOURCE_PERIMETER_SPACING: 'sourcePerimeterSpacing',
                        -
                        -	/**
                        -	 * Variable: STYLE_TARGET_PERIMETER_SPACING
                        -	 * 
                        -	 * Defines the key for the target perimeter spacing. The type of this value
                        -	 * is numeric. This is the distance between the target connection point of
                        -	 * an edge and the perimeter of the target vertex in pixels. This style
                        -	 * only applies to edges. Value is "targetPerimeterSpacing".
                        -	 */
                        -	STYLE_TARGET_PERIMETER_SPACING: 'targetPerimeterSpacing',
                        -
                        -	/**
                        -	 * Variable: STYLE_PERIMETER_SPACING
                        -	 * 
                        -	 * Defines the key for the perimeter spacing. This is the distance between
                        -	 * the connection point and the perimeter in pixels. When used in a vertex
                        -	 * style, this applies to all incoming edges to floating ports (edges that
                        -	 * terminate on the perimeter of the vertex). When used in an edge style,
                        -	 * this spacing applies to the source and target separately, if they
                        -	 * terminate in floating ports (on the perimeter of the vertex). Value is
                        -	 * "perimeterSpacing".
                        -	 */
                        -	STYLE_PERIMETER_SPACING: 'perimeterSpacing',
                        -
                        -	/**
                        -	 * Variable: STYLE_SPACING
                        -	 * 
                        -	 * Defines the key for the spacing. The value represents the spacing, in
                        -	 * pixels, added to each side of a label in a vertex (style applies to
                        -	 * vertices only). Value is "spacing".
                        -	 */
                        -	STYLE_SPACING: 'spacing',
                        -
                        -	/**
                        -	 * Variable: STYLE_SPACING_TOP
                        -	 * 
                        -	 * Defines the key for the spacingTop style. The value represents the
                        -	 * spacing, in pixels, added to the top side of a label in a vertex (style
                        -	 * applies to vertices only). Value is "spacingTop".
                        -	 */
                        -	STYLE_SPACING_TOP: 'spacingTop',
                        -
                        -	/**
                        -	 * Variable: STYLE_SPACING_LEFT
                        -	 * 
                        -	 * Defines the key for the spacingLeft style. The value represents the
                        -	 * spacing, in pixels, added to the left side of a label in a vertex (style
                        -	 * applies to vertices only). Value is "spacingLeft".
                        -	 */
                        -	STYLE_SPACING_LEFT: 'spacingLeft',
                        -
                        -	/**
                        -	 * Variable: STYLE_SPACING_BOTTOM
                        -	 * 
                        -	 * Defines the key for the spacingBottom style The value represents the
                        -	 * spacing, in pixels, added to the bottom side of a label in a vertex
                        -	 * (style applies to vertices only). Value is "spacingBottom".
                        -	 */
                        -	STYLE_SPACING_BOTTOM: 'spacingBottom',
                        -
                        -	/**
                        -	 * Variable: STYLE_SPACING_RIGHT
                        -	 * 
                        -	 * Defines the key for the spacingRight style The value represents the
                        -	 * spacing, in pixels, added to the right side of a label in a vertex (style
                        -	 * applies to vertices only). Value is "spacingRight".
                        -	 */
                        -	STYLE_SPACING_RIGHT: 'spacingRight',
                        -
                        -	/**
                        -	 * Variable: STYLE_HORIZONTAL
                        -	 * 
                        -	 * Defines the key for the horizontal style. Possible values are
                        -	 * true or false. This value only applies to vertices. If the 
                        -	 * is "SHAPE_SWIMLANE" a value of false indicates that the
                        -	 * swimlane should be drawn vertically, true indicates to draw it
                        -	 * horizontally. If the shape style does not indicate that this vertex is a
                        -	 * swimlane, this value affects only whether the label is drawn
                        -	 * horizontally or vertically. Value is "horizontal".
                        -	 */
                        -	STYLE_HORIZONTAL: 'horizontal',
                        -
                        -	/**
                        -	 * Variable: STYLE_DIRECTION
                        -	 * 
                        -	 * Defines the key for the direction style. The direction style is used
                        -	 * to specify the direction of certain shapes (eg. ).
                        -	 * Possible values are  (default), ,
                        -	 *  and . Value is "direction".
                        -	 */
                        -	STYLE_DIRECTION: 'direction',
                        -
                        -	/**
                        -	 * Variable: STYLE_ANCHOR_POINT_DIRECTION
                        -	 * 
                        -	 * Defines the key for the anchorPointDirection style. The defines if the
                        -	 * direction style should be taken into account when computing the fixed
                        -	 * point location for connected edges. Default is 1 (yes). Set this to 0
                        -	 * to ignore the direction style for fixed connection points. Value is
                        -	 * "anchorPointDirection".
                        -	 */
                        -	STYLE_ANCHOR_POINT_DIRECTION: 'anchorPointDirection',
                        -
                        -	/**
                        -	 * Variable: STYLE_ELBOW
                        -	 * 
                        -	 * Defines the key for the elbow style. Possible values are
                        -	 *  and . Default is .
                        -	 * This defines how the three segment orthogonal edge style leaves its
                        -	 * terminal vertices. The vertical style leaves the terminal vertices at
                        -	 * the top and bottom sides. Value is "elbow".
                        -	 */
                        -	STYLE_ELBOW: 'elbow',
                        -
                        -	/**
                        -	 * Variable: STYLE_FONTCOLOR
                        -	 * 
                        -	 * Defines the key for the fontColor style. Possible values are all HTML
                        -	 * color names or HEX codes. Value is "fontColor".
                        -	 */
                        -	STYLE_FONTCOLOR: 'fontColor',
                        -
                        -	/**
                        -	 * Variable: STYLE_FONTFAMILY
                        -	 * 
                        -	 * Defines the key for the fontFamily style. Possible values are names such
                        -	 * as Arial; Dialog; Verdana; Times New Roman. The value is of type String.
                        -	 * Value is fontFamily.
                        -	 */
                        -	STYLE_FONTFAMILY: 'fontFamily',
                        -
                        -	/**
                        -	 * Variable: STYLE_FONTSIZE
                        -	 * 
                        -	 * Defines the key for the fontSize style (in px). The type of the value
                        -	 * is int. Value is "fontSize".
                        -	 */
                        -	STYLE_FONTSIZE: 'fontSize',
                        -
                        -	/**
                        -	 * Variable: STYLE_FONTSTYLE
                        -	 * 
                        -	 * Defines the key for the fontStyle style. Values may be any logical AND
                        -	 * (sum) of ,  and .
                        -	 * The type of the value is int. Value is "fontStyle".
                        -	 */
                        -	STYLE_FONTSTYLE: 'fontStyle',
                        -	
                        -	/**
                        -	 * Variable: STYLE_ASPECT
                        -	 * 
                        -	 * Defines the key for the aspect style. Possible values are empty or fixed.
                        -	 * If fixed is used then the aspect ratio of the cell will be maintained
                        -	 * when resizing. Default is empty. Value is "aspect".
                        -	 */
                        -	STYLE_ASPECT: 'aspect',
                        -
                        -	/**
                        -	 * Variable: STYLE_AUTOSIZE
                        -	 * 
                        -	 * Defines the key for the autosize style. This specifies if a cell should be
                        -	 * resized automatically if the value has changed. Possible values are 0 or 1.
                        -	 * Default is 0. See . This is normally combined with
                        -	 *  to disable manual sizing. Value is "autosize".
                        -	 */
                        -	STYLE_AUTOSIZE: 'autosize',
                        -
                        -	/**
                        -	 * Variable: STYLE_FOLDABLE
                        -	 * 
                        -	 * Defines the key for the foldable style. This specifies if a cell is foldable
                        -	 * using a folding icon. Possible values are 0 or 1. Default is 1. See
                        -	 * . Value is "foldable".
                        -	 */
                        -	STYLE_FOLDABLE: 'foldable',
                        -
                        -	/**
                        -	 * Variable: STYLE_EDITABLE
                        -	 * 
                        -	 * Defines the key for the editable style. This specifies if the value of
                        -	 * a cell can be edited using the in-place editor. Possible values are 0 or
                        -	 * 1. Default is 1. See . Value is "editable".
                        -	 */
                        -	STYLE_EDITABLE: 'editable',
                        -
                        -	/**
                        -	 * Variable: STYLE_BACKGROUND_OUTLINE
                        -	 * 
                        -	 * Defines the key for the backgroundOutline style. This specifies if a
                        -	 * only the background of a cell should be painted when it is highlighted.
                        -	 * Possible values are 0 or 1. Default is 0. Value is "backgroundOutline".
                        -	 */
                        -	STYLE_BACKGROUND_OUTLINE: 'backgroundOutline',
                        -
                        -	/**
                        -	 * Variable: STYLE_BENDABLE
                        -	 * 
                        -	 * Defines the key for the bendable style. This specifies if the control
                        -	 * points of an edge can be moved. Possible values are 0 or 1. Default is
                        -	 * 1. See . Value is "bendable".
                        -	 */
                        -	STYLE_BENDABLE: 'bendable',
                        -
                        -	/**
                        -	 * Variable: STYLE_MOVABLE
                        -	 * 
                        -	 * Defines the key for the movable style. This specifies if a cell can
                        -	 * be moved. Possible values are 0 or 1. Default is 1. See
                        -	 * . Value is "movable".
                        -	 */
                        -	STYLE_MOVABLE: 'movable',
                        -
                        -	/**
                        -	 * Variable: STYLE_RESIZABLE
                        -	 * 
                        -	 * Defines the key for the resizable style. This specifies if a cell can
                        -	 * be resized. Possible values are 0 or 1. Default is 1. See
                        -	 * . Value is "resizable".
                        -	 */
                        -	STYLE_RESIZABLE: 'resizable',
                        -
                        -	/**
                        -	 * Variable: STYLE_RESIZE_WIDTH
                        -	 * 
                        -	 * Defines the key for the resizeWidth style. This specifies if a cell's
                        -	 * width is resized if the parent is resized. If this is 1 then the width
                        -	 * will be resized even if the cell's geometry is relative. If this is 0
                        -	 * then the cell's width will not be resized. Default is not defined. Value
                        -	 * is "resizeWidth".
                        -	 */
                        -	STYLE_RESIZE_WIDTH: 'resizeWidth',
                        -
                        -	/**
                        -	 * Variable: STYLE_RESIZE_WIDTH
                        -	 * 
                        -	 * Defines the key for the resizeHeight style. This specifies if a cell's
                        -	 * height if resize if the parent is resized. If this is 1 then the height
                        -	 * will be resized even if the cell's geometry is relative. If this is 0
                        -	 * then the cell's height will not be resized. Default is not defined. Value
                        -	 * is "resizeHeight".
                        -	 */
                        -	STYLE_RESIZE_HEIGHT: 'resizeHeight',
                        -
                        -	/**
                        -	 * Variable: STYLE_ROTATABLE
                        -	 * 
                        -	 * Defines the key for the rotatable style. This specifies if a cell can
                        -	 * be rotated. Possible values are 0 or 1. Default is 1. See
                        -	 * . Value is "rotatable".
                        -	 */
                        -	STYLE_ROTATABLE: 'rotatable',
                        -
                        -	/**
                        -	 * Variable: STYLE_CLONEABLE
                        -	 * 
                        -	 * Defines the key for the cloneable style. This specifies if a cell can
                        -	 * be cloned. Possible values are 0 or 1. Default is 1. See
                        -	 * . Value is "cloneable".
                        -	 */
                        -	STYLE_CLONEABLE: 'cloneable',
                        -
                        -	/**
                        -	 * Variable: STYLE_DELETABLE
                        -	 * 
                        -	 * Defines the key for the deletable style. This specifies if a cell can be
                        -	 * deleted. Possible values are 0 or 1. Default is 1. See
                        -	 * . Value is "deletable".
                        -	 */
                        -	STYLE_DELETABLE: 'deletable',
                        -
                        -	/**
                        -	 * Variable: STYLE_SHAPE
                        -	 * 
                        -	 * Defines the key for the shape. Possible values are all constants with
                        -	 * a SHAPE-prefix or any newly defined shape names. Value is "shape".
                        -	 */
                        -	STYLE_SHAPE: 'shape',
                        -
                        -	/**
                        -	 * Variable: STYLE_EDGE
                        -	 * 
                        -	 * Defines the key for the edge style. Possible values are the functions
                        -	 * defined in . Value is "edgeStyle".
                        -	 */
                        -	STYLE_EDGE: 'edgeStyle',
                        -
                        -	/**
                        -	 * Variable: STYLE_JETTY_SIZE
                        -	 * 
                        -	 * Defines the key for the jetty size in .
                        -	 * Default is 10. Possible values are all numeric values or "auto".
                        -	 * Jetty size is the minimum length of the orthogonal segment before
                        -	 * it attaches to a shape.
                        -	 * Value is "jettySize".
                        -	 */
                        -	STYLE_JETTY_SIZE: 'jettySize',
                        -
                        -	/**
                        -	 * Variable: STYLE_SOURCE_JETTY_SIZE
                        -	 * 
                        -	 * Defines the key for the jetty size in .
                        -	 * Default is 10. Possible values are numeric values or "auto". This has
                        -	 * precedence over . Value is "sourceJettySize".
                        -	 */
                        -	STYLE_SOURCE_JETTY_SIZE: 'sourceJettySize',
                        -
                        -	/**
                        -	 * Variable: targetJettySize
                        -	 * 
                        -	 * Defines the key for the jetty size in .
                        -	 * Default is 10. Possible values are numeric values or "auto". This has
                        -	 * precedence over . Value is "targetJettySize".
                        -	 */
                        -	STYLE_TARGET_JETTY_SIZE: 'targetJettySize',
                        -
                        -	/**
                        -	 * Variable: STYLE_LOOP
                        -	 * 
                        -	 * Defines the key for the loop style. Possible values are the functions
                        -	 * defined in . Value is "loopStyle". Default is
                        -	 * .
                        -	 */
                        -	STYLE_LOOP: 'loopStyle',
                        -
                        -	/**
                        -	 * Variable: STYLE_ORTHOGONAL_LOOP
                        -	 * 
                        -	 * Defines the key for the orthogonal loop style. Possible values are 0 and
                        -	 * 1. Default is 0. Value is "orthogonalLoop". Use this style to specify
                        -	 * if loops with no waypoints and defined anchor points should be routed
                        -	 * using  or not routed.
                        -	 */
                        -	STYLE_ORTHOGONAL_LOOP: 'orthogonalLoop',
                        -
                        -	/**
                        -	 * Variable: STYLE_ROUTING_CENTER_X
                        -	 * 
                        -	 * Defines the key for the horizontal routing center. Possible values are
                        -	 * between -0.5 and 0.5. This is the relative offset from the center used
                        -	 * for connecting edges. The type of this value is numeric. Value is
                        -	 * "routingCenterX".
                        -	 */
                        -	STYLE_ROUTING_CENTER_X: 'routingCenterX',
                        -
                        -	/**
                        -	 * Variable: STYLE_ROUTING_CENTER_Y
                        -	 * 
                        -	 * Defines the key for the vertical routing center. Possible values are
                        -	 * between -0.5 and 0.5. This is the relative offset from the center used
                        -	 * for connecting edges. The type of this value is numeric. Value is
                        -	 * "routingCenterY".
                        -	 */
                        -	STYLE_ROUTING_CENTER_Y: 'routingCenterY',
                        -
                        -	/**
                        -	 * Variable: FONT_BOLD
                        -	 * 
                        -	 * Constant for bold fonts. Default is 1.
                        -	 */
                        -	FONT_BOLD: 1,
                        -
                        -	/**
                        -	 * Variable: FONT_ITALIC
                        -	 * 
                        -	 * Constant for italic fonts. Default is 2.
                        -	 */
                        -	FONT_ITALIC: 2,
                        -
                        -	/**
                        -	 * Variable: FONT_UNDERLINE
                        -	 * 
                        -	 * Constant for underlined fonts. Default is 4.
                        -	 */
                        -	FONT_UNDERLINE: 4,
                        -
                        -	/**
                        -	 * Variable: SHAPE_RECTANGLE
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is rectangle.
                        -	 */
                        -	SHAPE_RECTANGLE: 'rectangle',
                        -
                        -	/**
                        -	 * Variable: SHAPE_ELLIPSE
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is ellipse.
                        -	 */
                        -	SHAPE_ELLIPSE: 'ellipse',
                        -
                        -	/**
                        -	 * Variable: SHAPE_DOUBLE_ELLIPSE
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is doubleEllipse.
                        -	 */
                        -	SHAPE_DOUBLE_ELLIPSE: 'doubleEllipse',
                        -
                        -	/**
                        -	 * Variable: SHAPE_RHOMBUS
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is rhombus.
                        -	 */
                        -	SHAPE_RHOMBUS: 'rhombus',
                        -
                        -	/**
                        -	 * Variable: SHAPE_LINE
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is line.
                        -	 */
                        -	SHAPE_LINE: 'line',
                        -
                        -	/**
                        -	 * Variable: SHAPE_IMAGE
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is image.
                        -	 */
                        -	SHAPE_IMAGE: 'image',
                        -	
                        -	/**
                        -	 * Variable: SHAPE_ARROW
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is arrow.
                        -	 */
                        -	SHAPE_ARROW: 'arrow',
                        -	
                        -	/**
                        -	 * Variable: SHAPE_ARROW_CONNECTOR
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is arrowConnector.
                        -	 */
                        -	SHAPE_ARROW_CONNECTOR: 'arrowConnector',
                        -	
                        -	/**
                        -	 * Variable: SHAPE_LABEL
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is label.
                        -	 */
                        -	SHAPE_LABEL: 'label',
                        -	
                        -	/**
                        -	 * Variable: SHAPE_CYLINDER
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is cylinder.
                        -	 */
                        -	SHAPE_CYLINDER: 'cylinder',
                        -	
                        -	/**
                        -	 * Variable: SHAPE_SWIMLANE
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is swimlane.
                        -	 */
                        -	SHAPE_SWIMLANE: 'swimlane',
                        -		
                        -	/**
                        -	 * Variable: SHAPE_CONNECTOR
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is connector.
                        -	 */
                        -	SHAPE_CONNECTOR: 'connector',
                        -
                        -	/**
                        -	 * Variable: SHAPE_ACTOR
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is actor.
                        -	 */
                        -	SHAPE_ACTOR: 'actor',
                        -		
                        -	/**
                        -	 * Variable: SHAPE_CLOUD
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is cloud.
                        -	 */
                        -	SHAPE_CLOUD: 'cloud',
                        -		
                        -	/**
                        -	 * Variable: SHAPE_TRIANGLE
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is triangle.
                        -	 */
                        -	SHAPE_TRIANGLE: 'triangle',
                        -		
                        -	/**
                        -	 * Variable: SHAPE_HEXAGON
                        -	 * 
                        -	 * Name under which  is registered in .
                        -	 * Default is hexagon.
                        -	 */
                        -	SHAPE_HEXAGON: 'hexagon',
                        -
                        -	/**
                        -	 * Variable: ARROW_CLASSIC
                        -	 * 
                        -	 * Constant for classic arrow markers.
                        -	 */
                        -	ARROW_CLASSIC: 'classic',
                        -
                        -	/**
                        -	 * Variable: ARROW_CLASSIC_THIN
                        -	 * 
                        -	 * Constant for thin classic arrow markers.
                        -	 */
                        -	ARROW_CLASSIC_THIN: 'classicThin',
                        -
                        -	/**
                        -	 * Variable: ARROW_BLOCK
                        -	 * 
                        -	 * Constant for block arrow markers.
                        -	 */
                        -	ARROW_BLOCK: 'block',
                        -
                        -	/**
                        -	 * Variable: ARROW_BLOCK_THIN
                        -	 * 
                        -	 * Constant for thin block arrow markers.
                        -	 */
                        -	ARROW_BLOCK_THIN: 'blockThin',
                        -
                        -	/**
                        -	 * Variable: ARROW_OPEN
                        -	 * 
                        -	 * Constant for open arrow markers.
                        -	 */
                        -	ARROW_OPEN: 'open',
                        -
                        -	/**
                        -	 * Variable: ARROW_OPEN_THIN
                        -	 * 
                        -	 * Constant for thin open arrow markers.
                        -	 */
                        -	ARROW_OPEN_THIN: 'openThin',
                        -
                        -	/**
                        -	 * Variable: ARROW_OVAL
                        -	 * 
                        -	 * Constant for oval arrow markers.
                        -	 */
                        -	ARROW_OVAL: 'oval',
                        -
                        -	/**
                        -	 * Variable: ARROW_DIAMOND
                        -	 * 
                        -	 * Constant for diamond arrow markers.
                        -	 */
                        -	ARROW_DIAMOND: 'diamond',
                        -
                        -	/**
                        -	 * Variable: ARROW_DIAMOND_THIN
                        -	 * 
                        -	 * Constant for thin diamond arrow markers.
                        -	 */
                        -	ARROW_DIAMOND_THIN: 'diamondThin',
                        -
                        -	/**
                        -	 * Variable: ALIGN_LEFT
                        -	 * 
                        -	 * Constant for left horizontal alignment. Default is left.
                        -	 */
                        -	ALIGN_LEFT: 'left',
                        -
                        -	/**
                        -	 * Variable: ALIGN_CENTER
                        -	 * 
                        -	 * Constant for center horizontal alignment. Default is center.
                        -	 */
                        -	ALIGN_CENTER: 'center',
                        -
                        -	/**
                        -	 * Variable: ALIGN_RIGHT
                        -	 * 
                        -	 * Constant for right horizontal alignment. Default is right.
                        -	 */
                        -	ALIGN_RIGHT: 'right',
                        -
                        -	/**
                        -	 * Variable: ALIGN_TOP
                        -	 * 
                        -	 * Constant for top vertical alignment. Default is top.
                        -	 */
                        -	ALIGN_TOP: 'top',
                        -
                        -	/**
                        -	 * Variable: ALIGN_MIDDLE
                        -	 * 
                        -	 * Constant for middle vertical alignment. Default is middle.
                        -	 */
                        -	ALIGN_MIDDLE: 'middle',
                        -
                        -	/**
                        -	 * Variable: ALIGN_BOTTOM
                        -	 * 
                        -	 * Constant for bottom vertical alignment. Default is bottom.
                        -	 */
                        -	ALIGN_BOTTOM: 'bottom',
                        -
                        -	/**
                        -	 * Variable: DIRECTION_NORTH
                        -	 * 
                        -	 * Constant for direction north. Default is north.
                        -	 */
                        -	DIRECTION_NORTH: 'north',
                        -
                        -	/**
                        -	 * Variable: DIRECTION_SOUTH
                        -	 * 
                        -	 * Constant for direction south. Default is south.
                        -	 */
                        -	DIRECTION_SOUTH: 'south',
                        -
                        -	/**
                        -	 * Variable: DIRECTION_EAST
                        -	 * 
                        -	 * Constant for direction east. Default is east.
                        -	 */
                        -	DIRECTION_EAST: 'east',
                        -
                        -	/**
                        -	 * Variable: DIRECTION_WEST
                        -	 * 
                        -	 * Constant for direction west. Default is west.
                        -	 */
                        -	DIRECTION_WEST: 'west',
                        -
                        -	/**
                        -	 * Variable: TEXT_DIRECTION_DEFAULT
                        -	 * 
                        -	 * Constant for text direction default. Default is an empty string. Use
                        -	 * this value to use the default text direction of the operating system. 
                        -	 */
                        -	TEXT_DIRECTION_DEFAULT: '',
                        -
                        -	/**
                        -	 * Variable: TEXT_DIRECTION_AUTO
                        -	 * 
                        -	 * Constant for text direction automatic. Default is auto. Use this value
                        -	 * to find the direction for a given text with . 
                        -	 */
                        -	TEXT_DIRECTION_AUTO: 'auto',
                        -
                        -	/**
                        -	 * Variable: TEXT_DIRECTION_LTR
                        -	 * 
                        -	 * Constant for text direction left to right. Default is ltr. Use this
                        -	 * value for left to right text direction.
                        -	 */
                        -	TEXT_DIRECTION_LTR: 'ltr',
                        -
                        -	/**
                        -	 * Variable: TEXT_DIRECTION_RTL
                        -	 * 
                        -	 * Constant for text direction right to left. Default is rtl. Use this
                        -	 * value for right to left text direction.
                        -	 */
                        -	TEXT_DIRECTION_RTL: 'rtl',
                        -
                        -	/**
                        -	 * Variable: DIRECTION_MASK_NONE
                        -	 * 
                        -	 * Constant for no direction.
                        -	 */
                        -	DIRECTION_MASK_NONE: 0,
                        -
                        -	/**
                        -	 * Variable: DIRECTION_MASK_WEST
                        -	 * 
                        -	 * Bitwise mask for west direction.
                        -	 */
                        -	DIRECTION_MASK_WEST: 1,
                        -	
                        -	/**
                        -	 * Variable: DIRECTION_MASK_NORTH
                        -	 * 
                        -	 * Bitwise mask for north direction.
                        -	 */
                        -	DIRECTION_MASK_NORTH: 2,
                        -
                        -	/**
                        -	 * Variable: DIRECTION_MASK_SOUTH
                        -	 * 
                        -	 * Bitwise mask for south direction.
                        -	 */
                        -	DIRECTION_MASK_SOUTH: 4,
                        -
                        -	/**
                        -	 * Variable: DIRECTION_MASK_EAST
                        -	 * 
                        -	 * Bitwise mask for east direction.
                        -	 */
                        -	DIRECTION_MASK_EAST: 8,
                        -	
                        -	/**
                        -	 * Variable: DIRECTION_MASK_ALL
                        -	 * 
                        -	 * Bitwise mask for all directions.
                        -	 */
                        -	DIRECTION_MASK_ALL: 15,
                        -
                        -	/**
                        -	 * Variable: ELBOW_VERTICAL
                        -	 * 
                        -	 * Constant for elbow vertical. Default is horizontal.
                        -	 */
                        -	ELBOW_VERTICAL: 'vertical',
                        -
                        -	/**
                        -	 * Variable: ELBOW_HORIZONTAL
                        -	 * 
                        -	 * Constant for elbow horizontal. Default is horizontal.
                        -	 */
                        -	ELBOW_HORIZONTAL: 'horizontal',
                        -
                        -	/**
                        -	 * Variable: EDGESTYLE_ELBOW
                        -	 * 
                        -	 * Name of the elbow edge style. Can be used as a string value
                        -	 * for the STYLE_EDGE style.
                        -	 */
                        -	EDGESTYLE_ELBOW: 'elbowEdgeStyle',
                        -
                        -	/**
                        -	 * Variable: EDGESTYLE_ENTITY_RELATION
                        -	 * 
                        -	 * Name of the entity relation edge style. Can be used as a string value
                        -	 * for the STYLE_EDGE style.
                        -	 */
                        -	EDGESTYLE_ENTITY_RELATION: 'entityRelationEdgeStyle',
                        -
                        -	/**
                        -	 * Variable: EDGESTYLE_LOOP
                        -	 * 
                        -	 * Name of the loop edge style. Can be used as a string value
                        -	 * for the STYLE_EDGE style.
                        -	 */
                        -	EDGESTYLE_LOOP: 'loopEdgeStyle',
                        -
                        -	/**
                        -	 * Variable: EDGESTYLE_SIDETOSIDE
                        -	 * 
                        -	 * Name of the side to side edge style. Can be used as a string value
                        -	 * for the STYLE_EDGE style.
                        -	 */
                        -	EDGESTYLE_SIDETOSIDE: 'sideToSideEdgeStyle',
                        -
                        -	/**
                        -	 * Variable: EDGESTYLE_TOPTOBOTTOM
                        -	 * 
                        -	 * Name of the top to bottom edge style. Can be used as a string value
                        -	 * for the STYLE_EDGE style.
                        -	 */
                        -	EDGESTYLE_TOPTOBOTTOM: 'topToBottomEdgeStyle',
                        -
                        -	/**
                        -	 * Variable: EDGESTYLE_ORTHOGONAL
                        -	 * 
                        -	 * Name of the generic orthogonal edge style. Can be used as a string value
                        -	 * for the STYLE_EDGE style.
                        -	 */
                        -	EDGESTYLE_ORTHOGONAL: 'orthogonalEdgeStyle',
                        -
                        -	/**
                        -	 * Variable: EDGESTYLE_SEGMENT
                        -	 * 
                        -	 * Name of the generic segment edge style. Can be used as a string value
                        -	 * for the STYLE_EDGE style.
                        -	 */
                        -	EDGESTYLE_SEGMENT: 'segmentEdgeStyle',
                        - 
                        -	/**
                        -	 * Variable: PERIMETER_ELLIPSE
                        -	 * 
                        -	 * Name of the ellipse perimeter. Can be used as a string value
                        -	 * for the STYLE_PERIMETER style.
                        -	 */
                        -	PERIMETER_ELLIPSE: 'ellipsePerimeter',
                        -
                        -	/**
                        -	 * Variable: PERIMETER_RECTANGLE
                        -	 *
                        -	 * Name of the rectangle perimeter. Can be used as a string value
                        -	 * for the STYLE_PERIMETER style.
                        -	 */
                        -	PERIMETER_RECTANGLE: 'rectanglePerimeter',
                        -
                        -	/**
                        -	 * Variable: PERIMETER_RHOMBUS
                        -	 * 
                        -	 * Name of the rhombus perimeter. Can be used as a string value
                        -	 * for the STYLE_PERIMETER style.
                        -	 */
                        -	PERIMETER_RHOMBUS: 'rhombusPerimeter',
                        -
                        -	/**
                        -	 * Variable: PERIMETER_HEXAGON
                        -	 * 
                        -	 * Name of the hexagon perimeter. Can be used as a string value 
                        -	 * for the STYLE_PERIMETER style.
                        -	 */
                        -	PERIMETER_HEXAGON: 'hexagonPerimeter',
                        -
                        -	/**
                        -	 * Variable: PERIMETER_TRIANGLE
                        -	 * 
                        -	 * Name of the triangle perimeter. Can be used as a string value
                        -	 * for the STYLE_PERIMETER style.
                        -	 */
                        -	PERIMETER_TRIANGLE: 'trianglePerimeter'
                        -
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxEventObject
                        - * 
                        - * The mxEventObject is a wrapper for all properties of a single event.
                        - * Additionally, it also offers functions to consume the event and check if it
                        - * was consumed as follows:
                        - * 
                        - * (code)
                        - * evt.consume();
                        - * INV: evt.isConsumed() == true
                        - * (end)
                        - * 
                        - * Constructor: mxEventObject
                        - *
                        - * Constructs a new event object with the specified name. An optional
                        - * sequence of key, value pairs can be appended to define properties.
                        - * 
                        - * Example:
                        - *
                        - * (code)
                        - * new mxEventObject("eventName", key1, val1, .., keyN, valN)
                        - * (end)
                        - */
                        -function mxEventObject(name)
                        -{
                        -	this.name = name;
                        -	this.properties = [];
                        -	
                        -	for (var i = 1; i < arguments.length; i += 2)
                        -	{
                        -		if (arguments[i + 1] != null)
                        -		{
                        -			this.properties[arguments[i]] = arguments[i + 1];
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Variable: name
                        - *
                        - * Holds the name.
                        - */
                        -mxEventObject.prototype.name = null;
                        -
                        -/**
                        - * Variable: properties
                        - *
                        - * Holds the properties as an associative array.
                        - */
                        -mxEventObject.prototype.properties = null;
                        -
                        -/**
                        - * Variable: consumed
                        - *
                        - * Holds the consumed state. Default is false.
                        - */
                        -mxEventObject.prototype.consumed = false;
                        -
                        -/**
                        - * Function: getName
                        - * 
                        - * Returns .
                        - */
                        -mxEventObject.prototype.getName = function()
                        -{
                        -	return this.name;
                        -};
                        -
                        -/**
                        - * Function: getProperties
                        - * 
                        - * Returns .
                        - */
                        -mxEventObject.prototype.getProperties = function()
                        -{
                        -	return this.properties;
                        -};
                        -
                        -/**
                        - * Function: getProperty
                        - * 
                        - * Returns the property for the given key.
                        - */
                        -mxEventObject.prototype.getProperty = function(key)
                        -{
                        -	return this.properties[key];
                        -};
                        -
                        -/**
                        - * Function: isConsumed
                        - *
                        - * Returns true if the event has been consumed.
                        - */
                        -mxEventObject.prototype.isConsumed = function()
                        -{
                        -	return this.consumed;
                        -};
                        -
                        -/**
                        - * Function: consume
                        - *
                        - * Consumes the event.
                        - */
                        -mxEventObject.prototype.consume = function()
                        -{
                        -	this.consumed = true;
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxMouseEvent
                        - * 
                        - * Base class for all mouse events in mxGraph. A listener for this event should
                        - * implement the following methods:
                        - * 
                        - * (code)
                        - * graph.addMouseListener(
                        - * {
                        - *   mouseDown: function(sender, evt)
                        - *   {
                        - *     mxLog.debug('mouseDown');
                        - *   },
                        - *   mouseMove: function(sender, evt)
                        - *   {
                        - *     mxLog.debug('mouseMove');
                        - *   },
                        - *   mouseUp: function(sender, evt)
                        - *   {
                        - *     mxLog.debug('mouseUp');
                        - *   }
                        - * });
                        - * (end)
                        - * 
                        - * Constructor: mxMouseEvent
                        - *
                        - * Constructs a new event object for the given arguments.
                        - * 
                        - * Parameters:
                        - * 
                        - * evt - Native mouse event.
                        - * state - Optional  under the mouse.
                        - * 
                        - */
                        -function mxMouseEvent(evt, state)
                        -{
                        -	this.evt = evt;
                        -	this.state = state;
                        -	this.sourceState = state;
                        -};
                        -
                        -/**
                        - * Variable: consumed
                        - *
                        - * Holds the consumed state of this event.
                        - */
                        -mxMouseEvent.prototype.consumed = false;
                        -
                        -/**
                        - * Variable: evt
                        - *
                        - * Holds the inner event object.
                        - */
                        -mxMouseEvent.prototype.evt = null;
                        -
                        -/**
                        - * Variable: graphX
                        - *
                        - * Holds the x-coordinate of the event in the graph. This value is set in
                        - * .
                        - */
                        -mxMouseEvent.prototype.graphX = null;
                        -
                        -/**
                        - * Variable: graphY
                        - *
                        - * Holds the y-coordinate of the event in the graph. This value is set in
                        - * .
                        - */
                        -mxMouseEvent.prototype.graphY = null;
                        -
                        -/**
                        - * Variable: state
                        - *
                        - * Holds the optional  associated with this event.
                        - */
                        -mxMouseEvent.prototype.state = null;
                        -
                        -/**
                        - * Variable: sourceState
                        - * 
                        - * Holds the  that was passed to the constructor. This can be
                        - * different from  depending on the result of .
                        - */
                        -mxMouseEvent.prototype.sourceState = null;
                        -
                        -/**
                        - * Function: getEvent
                        - * 
                        - * Returns .
                        - */
                        -mxMouseEvent.prototype.getEvent = function()
                        -{
                        -	return this.evt;
                        -};
                        -
                        -/**
                        - * Function: getSource
                        - * 
                        - * Returns the target DOM element using  for .
                        - */
                        -mxMouseEvent.prototype.getSource = function()
                        -{
                        -	return mxEvent.getSource(this.evt);
                        -};
                        -
                        -/**
                        - * Function: isSource
                        - * 
                        - * Returns true if the given  is the source of .
                        - */
                        -mxMouseEvent.prototype.isSource = function(shape)
                        -{
                        -	if (shape != null)
                        -	{
                        -		return mxUtils.isAncestorNode(shape.node, this.getSource());
                        -	}
                        -	
                        -	return false;
                        -};
                        -
                        -/**
                        - * Function: getX
                        - * 
                        - * Returns .
                        - */
                        -mxMouseEvent.prototype.getX = function()
                        -{
                        -	return mxEvent.getClientX(this.getEvent());
                        -};
                        -
                        -/**
                        - * Function: getY
                        - * 
                        - * Returns .
                        - */
                        -mxMouseEvent.prototype.getY = function()
                        -{
                        -	return mxEvent.getClientY(this.getEvent());
                        -};
                        -
                        -/**
                        - * Function: getGraphX
                        - * 
                        - * Returns .
                        - */
                        -mxMouseEvent.prototype.getGraphX = function()
                        -{
                        -	return this.graphX;
                        -};
                        -
                        -/**
                        - * Function: getGraphY
                        - * 
                        - * Returns .
                        - */
                        -mxMouseEvent.prototype.getGraphY = function()
                        -{
                        -	return this.graphY;
                        -};
                        -
                        -/**
                        - * Function: getState
                        - * 
                        - * Returns .
                        - */
                        -mxMouseEvent.prototype.getState = function()
                        -{
                        -	return this.state;
                        -};
                        -
                        -/**
                        - * Function: getCell
                        - * 
                        - * Returns the  in  is not null.
                        - */
                        -mxMouseEvent.prototype.getCell = function()
                        -{
                        -	var state = this.getState();
                        -	
                        -	if (state != null)
                        -	{
                        -		return state.cell;
                        -	}
                        -	
                        -	return null;
                        -};
                        -
                        -/**
                        - * Function: isPopupTrigger
                        - *
                        - * Returns true if the event is a popup trigger.
                        - */
                        -mxMouseEvent.prototype.isPopupTrigger = function()
                        -{
                        -	return mxEvent.isPopupTrigger(this.getEvent());
                        -};
                        -
                        -/**
                        - * Function: isConsumed
                        - *
                        - * Returns .
                        - */
                        -mxMouseEvent.prototype.isConsumed = function()
                        -{
                        -	return this.consumed;
                        -};
                        -
                        -/**
                        - * Function: consume
                        - *
                        - * Sets  to true and invokes preventDefault on the native event
                        - * if such a method is defined. This is used mainly to avoid the cursor from
                        - * being changed to a text cursor in Webkit. You can use the preventDefault
                        - * flag to disable this functionality.
                        - * 
                        - * Parameters:
                        - * 
                        - * preventDefault - Specifies if the native event should be canceled. Default
                        - * is true.
                        - */
                        -mxMouseEvent.prototype.consume = function(preventDefault)
                        -{
                        -	preventDefault = (preventDefault != null) ? preventDefault : mxEvent.isMouseEvent(this.evt);
                        -	
                        -	if (preventDefault && this.evt.preventDefault)
                        -	{
                        -		this.evt.preventDefault();
                        -	}
                        -
                        -	// Workaround for images being dragged in IE
                        -	// Does not change returnValue in Opera
                        -	if (mxClient.IS_IE)
                        -	{
                        -		this.evt.returnValue = true;
                        -	}
                        -
                        -	// Sets local consumed state
                        -	this.consumed = true;
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxEventSource
                        - *
                        - * Base class for objects that dispatch named events. To create a subclass that
                        - * inherits from mxEventSource, the following code is used.
                        - *
                        - * (code)
                        - * function MyClass() { };
                        - *
                        - * MyClass.prototype = new mxEventSource();
                        - * MyClass.prototype.constructor = MyClass;
                        - * (end)
                        - *
                        - * Known Subclasses:
                        - *
                        - * , , , , ,
                        - * , 
                        - * 
                        - * Constructor: mxEventSource
                        - *
                        - * Constructs a new event source.
                        - */
                        -function mxEventSource(eventSource)
                        -{
                        -	this.setEventSource(eventSource);
                        -};
                        -
                        -/**
                        - * Variable: eventListeners
                        - *
                        - * Holds the event names and associated listeners in an array. The array
                        - * contains the event name followed by the respective listener for each
                        - * registered listener.
                        - */
                        -mxEventSource.prototype.eventListeners = null;
                        -
                        -/**
                        - * Variable: eventsEnabled
                        - *
                        - * Specifies if events can be fired. Default is true.
                        - */
                        -mxEventSource.prototype.eventsEnabled = true;
                        -
                        -/**
                        - * Variable: eventSource
                        - *
                        - * Optional source for events. Default is null.
                        - */
                        -mxEventSource.prototype.eventSource = null;
                        -
                        -/**
                        - * Function: isEventsEnabled
                        - * 
                        - * Returns .
                        - */
                        -mxEventSource.prototype.isEventsEnabled = function()
                        -{
                        -	return this.eventsEnabled;
                        -};
                        -
                        -/**
                        - * Function: setEventsEnabled
                        - * 
                        - * Sets .
                        - */
                        -mxEventSource.prototype.setEventsEnabled = function(value)
                        -{
                        -	this.eventsEnabled = value;
                        -};
                        -
                        -/**
                        - * Function: getEventSource
                        - * 
                        - * Returns .
                        - */
                        -mxEventSource.prototype.getEventSource = function()
                        -{
                        -	return this.eventSource;
                        -};
                        -
                        -/**
                        - * Function: setEventSource
                        - * 
                        - * Sets .
                        - */
                        -mxEventSource.prototype.setEventSource = function(value)
                        -{
                        -	this.eventSource = value;
                        -};
                        -
                        -/**
                        - * Function: addListener
                        - *
                        - * Binds the specified function to the given event name. If no event name
                        - * is given, then the listener is registered for all events.
                        - * 
                        - * The parameters of the listener are the sender and an .
                        - */
                        -mxEventSource.prototype.addListener = function(name, funct)
                        -{
                        -	if (this.eventListeners == null)
                        -	{
                        -		this.eventListeners = [];
                        -	}
                        -	
                        -	this.eventListeners.push(name);
                        -	this.eventListeners.push(funct);
                        -};
                        -
                        -/**
                        - * Function: removeListener
                        - *
                        - * Removes all occurrences of the given listener from .
                        - */
                        -mxEventSource.prototype.removeListener = function(funct)
                        -{
                        -	if (this.eventListeners != null)
                        -	{
                        -		var i = 0;
                        -		
                        -		while (i < this.eventListeners.length)
                        -		{
                        -			if (this.eventListeners[i+1] == funct)
                        -			{
                        -				this.eventListeners.splice(i, 2);
                        -			}
                        -			else
                        -			{
                        -				i += 2;
                        -			}
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: fireEvent
                        - *
                        - * Dispatches the given event to the listeners which are registered for
                        - * the event. The sender argument is optional. The current execution scope
                        - * ("this") is used for the listener invocation (see ).
                        - *
                        - * Example:
                        - *
                        - * (code)
                        - * fireEvent(new mxEventObject("eventName", key1, val1, .., keyN, valN))
                        - * (end)
                        - * 
                        - * Parameters:
                        - *
                        - * evt -  that represents the event.
                        - * sender - Optional sender to be passed to the listener. Default value is
                        - * the return value of .
                        - */
                        -mxEventSource.prototype.fireEvent = function(evt, sender)
                        -{
                        -	if (this.eventListeners != null && this.isEventsEnabled())
                        -	{
                        -		if (evt == null)
                        -		{
                        -			evt = new mxEventObject();
                        -		}
                        -		
                        -		if (sender == null)
                        -		{
                        -			sender = this.getEventSource();
                        -		}
                        -
                        -		if (sender == null)
                        -		{
                        -			sender = this;
                        -		}
                        -
                        -		var args = [sender, evt];
                        -		
                        -		for (var i = 0; i < this.eventListeners.length; i += 2)
                        -		{
                        -			var listen = this.eventListeners[i];
                        -			
                        -			if (listen == null || listen == evt.getName())
                        -			{
                        -				this.eventListeners[i+1].apply(this, args);
                        -			}
                        -		}
                        -	}
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -var mxEvent =
                        -{
                        -
                        -	/**
                        -	 * Class: mxEvent
                        -	 * 
                        -	 * Cross-browser DOM event support. For internal event handling,
                        -	 *  and the graph event dispatch loop in  are used.
                        -	 * 
                        -	 * Memory Leaks:
                        -	 * 
                        -	 * Use this class for adding and removing listeners to/from DOM nodes. The
                        -	 *  function is provided to remove all listeners that
                        -	 * have been added using . The function should be invoked when
                        -	 * the last reference is removed in the JavaScript code, typically when the
                        -	 * referenced DOM node is removed from the DOM.
                        -	 *
                        -	 * Function: addListener
                        -	 * 
                        -	 * Binds the function to the specified event on the given element. Use
                        -	 *  in order to bind the "this" keyword inside the function
                        -	 * to a given execution scope.
                        -	 */
                        -	addListener: function()
                        -	{
                        -		var updateListenerList = function(element, eventName, funct)
                        -		{
                        -			if (element.mxListenerList == null)
                        -			{
                        -				element.mxListenerList = [];
                        -			}
                        -			
                        -			var entry = {name: eventName, f: funct};
                        -			element.mxListenerList.push(entry);
                        -		};
                        -		
                        -		if (window.addEventListener)
                        -		{
                        -			return function(element, eventName, funct)
                        -			{
                        -				element.addEventListener(eventName, funct, false);
                        -				updateListenerList(element, eventName, funct);
                        -			};
                        -		}
                        -		else
                        -		{
                        -			return function(element, eventName, funct)
                        -			{
                        -				element.attachEvent('on' + eventName, funct);
                        -				updateListenerList(element, eventName, funct);				
                        -			};
                        -		}
                        -	}(),
                        -
                        -	/**
                        -	 * Function: removeListener
                        -	 *
                        -	 * Removes the specified listener from the given element.
                        -	 */
                        -	removeListener: function()
                        -	{
                        -		var updateListener = function(element, eventName, funct)
                        -		{
                        -			if (element.mxListenerList != null)
                        -			{
                        -				var listenerCount = element.mxListenerList.length;
                        -				
                        -				for (var i = 0; i < listenerCount; i++)
                        -				{
                        -					var entry = element.mxListenerList[i];
                        -					
                        -					if (entry.f == funct)
                        -					{
                        -						element.mxListenerList.splice(i, 1);
                        -						break;
                        -					}
                        -				}
                        -				
                        -				if (element.mxListenerList.length == 0)
                        -				{
                        -					element.mxListenerList = null;
                        -				}
                        -			}
                        -		};
                        -		
                        -		if (window.removeEventListener)
                        -		{
                        -			return function(element, eventName, funct)
                        -			{
                        -				element.removeEventListener(eventName, funct, false);
                        -				updateListener(element, eventName, funct);
                        -			};
                        -		}
                        -		else
                        -		{
                        -			return function(element, eventName, funct)
                        -			{
                        -				element.detachEvent('on' + eventName, funct);
                        -				updateListener(element, eventName, funct);
                        -			};
                        -		}
                        -	}(),
                        -
                        -	/**
                        -	 * Function: removeAllListeners
                        -	 * 
                        -	 * Removes all listeners from the given element.
                        -	 */
                        -	removeAllListeners: function(element)
                        -	{
                        -		var list = element.mxListenerList;
                        -
                        -		if (list != null)
                        -		{
                        -			while (list.length > 0)
                        -			{
                        -				var entry = list[0];
                        -				mxEvent.removeListener(element, entry.name, entry.f);
                        -			}
                        -		}
                        -	},
                        -	
                        -	/**
                        -	 * Function: addGestureListeners
                        -	 * 
                        -	 * Adds the given listeners for touch, mouse and/or pointer events. If
                        -	 *  is true then pointer events will be registered,
                        -	 * else the respective mouse events will be registered. If 
                        -	 * is false and  is true then the respective touch events
                        -	 * will be registered as well as the mouse events.
                        -	 */
                        -	addGestureListeners: function(node, startListener, moveListener, endListener)
                        -	{
                        -		if (startListener != null)
                        -		{
                        -			mxEvent.addListener(node, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown', startListener);
                        -		}
                        -		
                        -		if (moveListener != null)
                        -		{
                        -			mxEvent.addListener(node, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', moveListener);
                        -		}
                        -		
                        -		if (endListener != null)
                        -		{
                        -			mxEvent.addListener(node, (mxClient.IS_POINTER) ? 'pointerup' : 'mouseup', endListener);
                        -		}
                        -		
                        -		if (!mxClient.IS_POINTER && mxClient.IS_TOUCH)
                        -		{
                        -			if (startListener != null)
                        -			{
                        -				mxEvent.addListener(node, 'touchstart', startListener);
                        -			}
                        -			
                        -			if (moveListener != null)
                        -			{
                        -				mxEvent.addListener(node, 'touchmove', moveListener);
                        -			}
                        -			
                        -			if (endListener != null)
                        -			{
                        -				mxEvent.addListener(node, 'touchend', endListener);
                        -			}
                        -		}
                        -	},
                        -	
                        -	/**
                        -	 * Function: removeGestureListeners
                        -	 * 
                        -	 * Removes the given listeners from mousedown, mousemove, mouseup and the
                        -	 * respective touch events if  is true.
                        -	 */
                        -	removeGestureListeners: function(node, startListener, moveListener, endListener)
                        -	{
                        -		if (startListener != null)
                        -		{
                        -			mxEvent.removeListener(node, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown', startListener);
                        -		}
                        -		
                        -		if (moveListener != null)
                        -		{
                        -			mxEvent.removeListener(node, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', moveListener);
                        -		}
                        -		
                        -		if (endListener != null)
                        -		{
                        -			mxEvent.removeListener(node, (mxClient.IS_POINTER) ? 'pointerup' : 'mouseup', endListener);
                        -		}
                        -		
                        -		if (!mxClient.IS_POINTER && mxClient.IS_TOUCH)
                        -		{
                        -			if (startListener != null)
                        -			{
                        -				mxEvent.removeListener(node, 'touchstart', startListener);
                        -			}
                        -			
                        -			if (moveListener != null)
                        -			{
                        -				mxEvent.removeListener(node, 'touchmove', moveListener);
                        -			}
                        -			
                        -			if (endListener != null)
                        -			{
                        -				mxEvent.removeListener(node, 'touchend', endListener);
                        -			}
                        -		}
                        -	},
                        -	
                        -	/**
                        -	 * Function: redirectMouseEvents
                        -	 *
                        -	 * Redirects the mouse events from the given DOM node to the graph dispatch
                        -	 * loop using the event and given state as event arguments. State can
                        -	 * either be an instance of  or a function that returns an
                        -	 * . The down, move, up and dblClick arguments are optional
                        -	 * functions that take the trigger event as arguments and replace the
                        -	 * default behaviour.
                        -	 */
                        -	redirectMouseEvents: function(node, graph, state, down, move, up, dblClick)
                        -	{
                        -		var getState = function(evt)
                        -		{
                        -			return (typeof(state) == 'function') ? state(evt) : state;
                        -		};
                        -		
                        -		mxEvent.addGestureListeners(node, function (evt)
                        -		{
                        -			if (down != null)
                        -			{
                        -				down(evt);
                        -			}
                        -			else if (!mxEvent.isConsumed(evt))
                        -			{
                        -				graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(evt, getState(evt)));
                        -			}
                        -		},
                        -		function (evt)
                        -		{
                        -			if (move != null)
                        -			{
                        -				move(evt);
                        -			}
                        -			else if (!mxEvent.isConsumed(evt))
                        -			{
                        -				graph.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(evt, getState(evt)));
                        -			}
                        -		},
                        -		function (evt)
                        -		{
                        -			if (up != null)
                        -			{
                        -				up(evt);
                        -			}
                        -			else if (!mxEvent.isConsumed(evt))
                        -			{
                        -				graph.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(evt, getState(evt)));
                        -			}
                        -		});
                        -
                        -		mxEvent.addListener(node, 'dblclick', function (evt)
                        -		{
                        -			if (dblClick != null)
                        -			{
                        -				dblClick(evt);
                        -			}
                        -			else if (!mxEvent.isConsumed(evt))
                        -			{
                        -				var tmp = getState(evt);
                        -				graph.dblClick(evt, (tmp != null) ? tmp.cell : null);
                        -			}
                        -		});
                        -	},
                        -
                        -	/**
                        -	 * Function: release
                        -	 * 
                        -	 * Removes the known listeners from the given DOM node and its descendants.
                        -	 * 
                        -	 * Parameters:
                        -	 * 
                        -	 * element - DOM node to remove the listeners from.
                        -	 */
                        -	release: function(element)
                        -	{
                        -		try
                        -		{
                        -			if (element != null)
                        -			{
                        -				mxEvent.removeAllListeners(element);
                        -				
                        -				var children = element.childNodes;
                        -				
                        -				if (children != null)
                        -				{
                        -			        var childCount = children.length;
                        -			        
                        -			        for (var i = 0; i < childCount; i += 1)
                        -			        {
                        -			        	mxEvent.release(children[i]);
                        -			        }
                        -			    }
                        -			}
                        -		}
                        -		catch (e)
                        -		{
                        -			// ignores errors as this is typically called in cleanup code
                        -		}
                        -	},
                        -
                        -	/**
                        -	 * Function: addMouseWheelListener
                        -	 * 
                        -	 * Installs the given function as a handler for mouse wheel events. The
                        -	 * function has two arguments: the mouse event and a boolean that specifies
                        -	 * if the wheel was moved up or down.
                        -	 * 
                        -	 * This has been tested with IE 6 and 7, Firefox (all versions), Opera and
                        -	 * Safari. It does currently not work on Safari for Mac.
                        -	 * 
                        -	 * Example:
                        -	 * 
                        -	 * (code)
                        -	 * mxEvent.addMouseWheelListener(function (evt, up)
                        -	 * {
                        -	 *   mxLog.show();
                        -	 *   mxLog.debug('mouseWheel: up='+up);
                        -	 * });
                        -	 *(end)
                        -	 * 
                        -	 * Parameters:
                        -	 * 
                        -	 * funct - Handler function that takes the event argument and a boolean up
                        -	 * argument for the mousewheel direction.
                        -	 * target - Target for installing the listener in Google Chrome. See 
                        -	 * https://www.chromestatus.com/features/6662647093133312.
                        -	 */
                        -	addMouseWheelListener: function(funct, target)
                        -	{
                        -		if (funct != null)
                        -		{
                        -			var wheelHandler = function(evt)
                        -			{
                        -				// IE does not give an event object but the
                        -				// global event object is the mousewheel event
                        -				// at this point in time.
                        -				if (evt == null)
                        -				{
                        -					evt = window.event;
                        -				}
                        -			
                        -				var delta = 0;
                        -				
                        -				if (mxClient.IS_FF)
                        -				{
                        -					delta = -evt.detail / 2;
                        -				}
                        -				else
                        -				{
                        -					delta = evt.wheelDelta / 120;
                        -				}
                        -				
                        -				// Handles the event using the given function
                        -				if (delta != 0)
                        -				{
                        -					funct(evt, delta > 0);
                        -				}
                        -			};
                        -	
                        -			// Webkit has NS event API, but IE event name and details 
                        -			if (mxClient.IS_NS && document.documentMode == null)
                        -			{
                        -				var eventName = (mxClient.IS_SF || mxClient.IS_GC) ? 'mousewheel' : 'DOMMouseScroll';
                        -				mxEvent.addListener((mxClient.IS_GC && target != null) ? target : window,
                        -					eventName, wheelHandler);
                        -			}
                        -			else
                        -			{
                        -				mxEvent.addListener(document, 'mousewheel', wheelHandler);
                        -			}
                        -		}
                        -	},
                        -	
                        -	/**
                        -	 * Function: disableContextMenu
                        -	 *
                        -	 * Disables the context menu for the given element.
                        -	 */
                        -	disableContextMenu: function(element)
                        -	{
                        -		mxEvent.addListener(element, 'contextmenu', function(evt)
                        -		{
                        -			if (evt.preventDefault)
                        -			{
                        -				evt.preventDefault();
                        -			}
                        -			
                        -			return false;
                        -		});
                        -	},
                        -	
                        -	/**
                        -	 * Function: getSource
                        -	 * 
                        -	 * Returns the event's target or srcElement depending on the browser.
                        -	 */
                        -	getSource: function(evt)
                        -	{
                        -		return (evt.srcElement != null) ? evt.srcElement : evt.target;
                        -	},
                        -
                        -	/**
                        -	 * Function: isConsumed
                        -	 * 
                        -	 * Returns true if the event has been consumed using .
                        -	 */
                        -	isConsumed: function(evt)
                        -	{
                        -		return evt.isConsumed != null && evt.isConsumed;
                        -	},
                        -
                        -	/**
                        -	 * Function: isTouchEvent
                        -	 * 
                        -	 * Returns true if the event was generated using a touch device (not a pen or mouse).
                        -	 */
                        -	isTouchEvent: function(evt)
                        -	{
                        -		return (evt.pointerType != null) ? (evt.pointerType == 'touch' || evt.pointerType ===
                        -			evt.MSPOINTER_TYPE_TOUCH) : ((evt.mozInputSource != null) ?
                        -					evt.mozInputSource == 5 : evt.type.indexOf('touch') == 0);
                        -	},
                        -
                        -	/**
                        -	 * Function: isPenEvent
                        -	 * 
                        -	 * Returns true if the event was generated using a pen (not a touch device or mouse).
                        -	 */
                        -	isPenEvent: function(evt)
                        -	{
                        -		return (evt.pointerType != null) ? (evt.pointerType == 'pen' || evt.pointerType ===
                        -			evt.MSPOINTER_TYPE_PEN) : ((evt.mozInputSource != null) ?
                        -					evt.mozInputSource == 2 : evt.type.indexOf('pen') == 0);
                        -	},
                        -
                        -	/**
                        -	 * Function: isMultiTouchEvent
                        -	 * 
                        -	 * Returns true if the event was generated using a touch device (not a pen or mouse).
                        -	 */
                        -	isMultiTouchEvent: function(evt)
                        -	{
                        -		return (evt.type != null && evt.type.indexOf('touch') == 0 && evt.touches != null && evt.touches.length > 1);
                        -	},
                        -
                        -	/**
                        -	 * Function: isMouseEvent
                        -	 * 
                        -	 * Returns true if the event was generated using a mouse (not a pen or touch device).
                        -	 */
                        -	isMouseEvent: function(evt)
                        -	{
                        -		return (evt.pointerType != null) ? (evt.pointerType == 'mouse' || evt.pointerType ===
                        -			evt.MSPOINTER_TYPE_MOUSE) : ((evt.mozInputSource != null) ?
                        -				evt.mozInputSource == 1 : evt.type.indexOf('mouse') == 0);
                        -	},
                        -	
                        -	/**
                        -	 * Function: isLeftMouseButton
                        -	 * 
                        -	 * Returns true if the left mouse button is pressed for the given event.
                        -	 * To check if a button is pressed during a mouseMove you should use the
                        -	 *  property. Note that this returns true in Firefox
                        -	 * for control+left-click on the Mac.
                        -	 */
                        -	isLeftMouseButton: function(evt)
                        -	{
                        -		// Special case for mousemove and mousedown we check the buttons
                        -		// if it exists because which is 0 even if no button is pressed
                        -		if ('buttons' in evt && (evt.type == 'mousedown' || evt.type == 'mousemove'))
                        -		{
                        -			return evt.buttons == 1;
                        -		}
                        -		else if ('which' in evt)
                        -		{
                        -	        return evt.which === 1;
                        -	    }
                        -		else
                        -		{
                        -	        return evt.button === 1;
                        -	    }
                        -	},
                        -	
                        -	/**
                        -	 * Function: isMiddleMouseButton
                        -	 * 
                        -	 * Returns true if the middle mouse button is pressed for the given event.
                        -	 * To check if a button is pressed during a mouseMove you should use the
                        -	 *  property.
                        -	 */
                        -	isMiddleMouseButton: function(evt)
                        -	{
                        -		if ('which' in evt)
                        -		{
                        -	        return evt.which === 2;
                        -	    }
                        -		else
                        -		{
                        -	        return evt.button === 4;
                        -	    }
                        -	},
                        -	
                        -	/**
                        -	 * Function: isRightMouseButton
                        -	 * 
                        -	 * Returns true if the right mouse button was pressed. Note that this
                        -	 * button might not be available on some systems. For handling a popup
                        -	 * trigger  should be used.
                        -	 */
                        -	isRightMouseButton: function(evt)
                        -	{
                        -		if ('which' in evt)
                        -		{
                        -	        return evt.which === 3;
                        -	    }
                        -		else
                        -		{
                        -	        return evt.button === 2;
                        -	    }
                        -	},
                        -
                        -	/**
                        -	 * Function: isPopupTrigger
                        -	 * 
                        -	 * Returns true if the event is a popup trigger. This implementation
                        -	 * returns true if the right button or the left button and control was
                        -	 * pressed on a Mac.
                        -	 */
                        -	isPopupTrigger: function(evt)
                        -	{
                        -		return mxEvent.isRightMouseButton(evt) || (mxClient.IS_MAC && mxEvent.isControlDown(evt) &&
                        -			!mxEvent.isShiftDown(evt) && !mxEvent.isMetaDown(evt) && !mxEvent.isAltDown(evt));
                        -	},
                        -
                        -	/**
                        -	 * Function: isShiftDown
                        -	 * 
                        -	 * Returns true if the shift key is pressed for the given event.
                        -	 */
                        -	isShiftDown: function(evt)
                        -	{
                        -		return (evt != null) ? evt.shiftKey : false;
                        -	},
                        -
                        -	/**
                        -	 * Function: isAltDown
                        -	 * 
                        -	 * Returns true if the alt key is pressed for the given event.
                        -	 */
                        -	isAltDown: function(evt)
                        -	{
                        -		return (evt != null) ? evt.altKey : false;
                        -	},
                        -
                        -	/**
                        -	 * Function: isControlDown
                        -	 * 
                        -	 * Returns true if the control key is pressed for the given event.
                        -	 */
                        -	isControlDown: function(evt)
                        -	{
                        -		return (evt != null) ? evt.ctrlKey : false;
                        -	},
                        -
                        -	/**
                        -	 * Function: isMetaDown
                        -	 * 
                        -	 * Returns true if the meta key is pressed for the given event.
                        -	 */
                        -	isMetaDown: function(evt)
                        -	{
                        -		return (evt != null) ? evt.metaKey : false;
                        -	},
                        -
                        -	/**
                        -	 * Function: getMainEvent
                        -	 * 
                        -	 * Returns the touch or mouse event that contains the mouse coordinates.
                        -	 */
                        -	getMainEvent: function(e)
                        -	{
                        -		if ((e.type == 'touchstart' || e.type == 'touchmove') && e.touches != null && e.touches[0] != null)
                        -		{
                        -			e = e.touches[0];
                        -		}
                        -		else if (e.type == 'touchend' && e.changedTouches != null && e.changedTouches[0] != null)
                        -		{
                        -			e = e.changedTouches[0];
                        -		}
                        -		
                        -		return e;
                        -	},
                        -	
                        -	/**
                        -	 * Function: getClientX
                        -	 * 
                        -	 * Returns true if the meta key is pressed for the given event.
                        -	 */
                        -	getClientX: function(e)
                        -	{
                        -		return mxEvent.getMainEvent(e).clientX;
                        -	},
                        -
                        -	/**
                        -	 * Function: getClientY
                        -	 * 
                        -	 * Returns true if the meta key is pressed for the given event.
                        -	 */
                        -	getClientY: function(e)
                        -	{
                        -		return mxEvent.getMainEvent(e).clientY;
                        -	},
                        -
                        -	/**
                        -	 * Function: consume
                        -	 * 
                        -	 * Consumes the given event.
                        -	 * 
                        -	 * Parameters:
                        -	 * 
                        -	 * evt - Native event to be consumed.
                        -	 * preventDefault - Optional boolean to prevent the default for the event.
                        -	 * Default is true.
                        -	 * stopPropagation - Option boolean to stop event propagation. Default is
                        -	 * true.
                        -	 */
                        -	consume: function(evt, preventDefault, stopPropagation)
                        -	{
                        -		preventDefault = (preventDefault != null) ? preventDefault : true;
                        -		stopPropagation = (stopPropagation != null) ? stopPropagation : true;
                        -		
                        -		if (preventDefault)
                        -		{
                        -			if (evt.preventDefault)
                        -			{
                        -				if (stopPropagation)
                        -				{
                        -					evt.stopPropagation();
                        -				}
                        -				
                        -				evt.preventDefault();
                        -			}
                        -			else if (stopPropagation)
                        -			{
                        -				evt.cancelBubble = true;
                        -			}
                        -		}
                        -
                        -		// Opera
                        -		evt.isConsumed = true;
                        -
                        -		// Other browsers
                        -		if (!evt.preventDefault)
                        -		{
                        -			evt.returnValue = false;
                        -		}
                        -	},
                        -	
                        -	//
                        -	// Special handles in mouse events
                        -	//
                        -	
                        -	/**
                        -	 * Variable: LABEL_HANDLE
                        -	 * 
                        -	 * Index for the label handle in an mxMouseEvent. This should be a negative
                        -	 * value that does not interfere with any possible handle indices. Default
                        -	 * is -1.
                        -	 */
                        -	LABEL_HANDLE: -1,
                        -	
                        -	/**
                        -	 * Variable: ROTATION_HANDLE
                        -	 * 
                        -	 * Index for the rotation handle in an mxMouseEvent. This should be a
                        -	 * negative value that does not interfere with any possible handle indices.
                        -	 * Default is -2.
                        -	 */
                        -	ROTATION_HANDLE: -2,
                        -	
                        -	/**
                        -	 * Variable: CUSTOM_HANDLE
                        -	 * 
                        -	 * Start index for the custom handles in an mxMouseEvent. This should be a
                        -	 * negative value and is the start index which is decremented for each
                        -	 * custom handle. Default is -100.
                        -	 */
                        -	CUSTOM_HANDLE: -100,
                        -	
                        -	/**
                        -	 * Variable: VIRTUAL_HANDLE
                        -	 * 
                        -	 * Start index for the virtual handles in an mxMouseEvent. This should be a
                        -	 * negative value and is the start index which is decremented for each
                        -	 * virtual handle. Default is -100000. This assumes that there are no more
                        -	 * than VIRTUAL_HANDLE - CUSTOM_HANDLE custom handles.
                        -	 * 
                        -	 */
                        -	VIRTUAL_HANDLE: -100000,
                        -	
                        -	//
                        -	// Event names
                        -	//
                        -	
                        -	/**
                        -	 * Variable: MOUSE_DOWN
                        -	 *
                        -	 * Specifies the event name for mouseDown.
                        -	 */
                        -	MOUSE_DOWN: 'mouseDown',
                        -	
                        -	/**
                        -	 * Variable: MOUSE_MOVE
                        -	 *
                        -	 * Specifies the event name for mouseMove. 
                        -	 */
                        -	MOUSE_MOVE: 'mouseMove',
                        -	
                        -	/**
                        -	 * Variable: MOUSE_UP
                        -	 *
                        -	 * Specifies the event name for mouseUp. 
                        -	 */
                        -	MOUSE_UP: 'mouseUp',
                        -
                        -	/**
                        -	 * Variable: ACTIVATE
                        -	 *
                        -	 * Specifies the event name for activate.
                        -	 */
                        -	ACTIVATE: 'activate',
                        -
                        -	/**
                        -	 * Variable: RESIZE_START
                        -	 *
                        -	 * Specifies the event name for resizeStart.
                        -	 */
                        -	RESIZE_START: 'resizeStart',
                        -
                        -	/**
                        -	 * Variable: RESIZE
                        -	 *
                        -	 * Specifies the event name for resize.
                        -	 */
                        -	RESIZE: 'resize',
                        -
                        -	/**
                        -	 * Variable: RESIZE_END
                        -	 *
                        -	 * Specifies the event name for resizeEnd.
                        -	 */
                        -	RESIZE_END: 'resizeEnd',
                        -
                        -	/**
                        -	 * Variable: MOVE_START
                        -	 *
                        -	 * Specifies the event name for moveStart.
                        -	 */
                        -	MOVE_START: 'moveStart',
                        -
                        -	/**
                        -	 * Variable: MOVE
                        -	 *
                        -	 * Specifies the event name for move.
                        -	 */
                        -	MOVE: 'move',
                        -
                        -	/**
                        -	 * Variable: MOVE_END
                        -	 *
                        -	 * Specifies the event name for moveEnd.
                        -	 */
                        -	MOVE_END: 'moveEnd',
                        -
                        -	/**
                        -	 * Variable: PAN_START
                        -	 *
                        -	 * Specifies the event name for panStart.
                        -	 */
                        -	PAN_START: 'panStart',
                        -
                        -	/**
                        -	 * Variable: PAN
                        -	 *
                        -	 * Specifies the event name for pan.
                        -	 */
                        -	PAN: 'pan',
                        -
                        -	/**
                        -	 * Variable: PAN_END
                        -	 *
                        -	 * Specifies the event name for panEnd.
                        -	 */
                        -	PAN_END: 'panEnd',
                        -
                        -	/**
                        -	 * Variable: MINIMIZE
                        -	 *
                        -	 * Specifies the event name for minimize.
                        -	 */
                        -	MINIMIZE: 'minimize',
                        -
                        -	/**
                        -	 * Variable: NORMALIZE
                        -	 *
                        -	 * Specifies the event name for normalize.
                        -	 */
                        -	NORMALIZE: 'normalize',
                        -
                        -	/**
                        -	 * Variable: MAXIMIZE
                        -	 *
                        -	 * Specifies the event name for maximize.
                        -	 */
                        -	MAXIMIZE: 'maximize',
                        -
                        -	/**
                        -	 * Variable: HIDE
                        -	 *
                        -	 * Specifies the event name for hide.
                        -	 */
                        -	HIDE: 'hide',
                        -
                        -	/**
                        -	 * Variable: SHOW
                        -	 *
                        -	 * Specifies the event name for show.
                        -	 */
                        -	SHOW: 'show',
                        -
                        -	/**
                        -	 * Variable: CLOSE
                        -	 *
                        -	 * Specifies the event name for close.
                        -	 */
                        -	CLOSE: 'close',
                        -
                        -	/**
                        -	 * Variable: DESTROY
                        -	 *
                        -	 * Specifies the event name for destroy.
                        -	 */
                        -	DESTROY: 'destroy',
                        -
                        -	/**
                        -	 * Variable: REFRESH
                        -	 *
                        -	 * Specifies the event name for refresh.
                        -	 */
                        -	REFRESH: 'refresh',
                        -
                        -	/**
                        -	 * Variable: SIZE
                        -	 *
                        -	 * Specifies the event name for size.
                        -	 */
                        -	SIZE: 'size',
                        -	
                        -	/**
                        -	 * Variable: SELECT
                        -	 *
                        -	 * Specifies the event name for select.
                        -	 */
                        -	SELECT: 'select',
                        -
                        -	/**
                        -	 * Variable: FIRED
                        -	 *
                        -	 * Specifies the event name for fired.
                        -	 */
                        -	FIRED: 'fired',
                        -
                        -	/**
                        -	 * Variable: FIRE_MOUSE_EVENT
                        -	 *
                        -	 * Specifies the event name for fireMouseEvent.
                        -	 */
                        -	FIRE_MOUSE_EVENT: 'fireMouseEvent',
                        -
                        -	/**
                        -	 * Variable: GESTURE
                        -	 *
                        -	 * Specifies the event name for gesture.
                        -	 */
                        -	GESTURE: 'gesture',
                        -
                        -	/**
                        -	 * Variable: TAP_AND_HOLD
                        -	 *
                        -	 * Specifies the event name for tapAndHold.
                        -	 */
                        -	TAP_AND_HOLD: 'tapAndHold',
                        -
                        -	/**
                        -	 * Variable: GET
                        -	 *
                        -	 * Specifies the event name for get.
                        -	 */
                        -	GET: 'get',
                        -
                        -	/**
                        -	 * Variable: RECEIVE
                        -	 *
                        -	 * Specifies the event name for receive.
                        -	 */
                        -	RECEIVE: 'receive',
                        -
                        -	/**
                        -	 * Variable: CONNECT
                        -	 *
                        -	 * Specifies the event name for connect.
                        -	 */
                        -	CONNECT: 'connect',
                        -
                        -	/**
                        -	 * Variable: DISCONNECT
                        -	 *
                        -	 * Specifies the event name for disconnect.
                        -	 */
                        -	DISCONNECT: 'disconnect',
                        -
                        -	/**
                        -	 * Variable: SUSPEND
                        -	 *
                        -	 * Specifies the event name for suspend.
                        -	 */
                        -	SUSPEND: 'suspend',
                        -
                        -	/**
                        -	 * Variable: RESUME
                        -	 *
                        -	 * Specifies the event name for suspend.
                        -	 */
                        -	RESUME: 'resume',
                        -
                        -	/**
                        -	 * Variable: MARK
                        -	 *
                        -	 * Specifies the event name for mark.
                        -	 */
                        -	MARK: 'mark',
                        -
                        -	/**
                        -	 * Variable: ROOT
                        -	 *
                        -	 * Specifies the event name for root.
                        -	 */
                        -	ROOT: 'root',
                        -
                        -	/**
                        -	 * Variable: POST
                        -	 *
                        -	 * Specifies the event name for post.
                        -	 */
                        -	POST: 'post',
                        -
                        -	/**
                        -	 * Variable: OPEN
                        -	 *
                        -	 * Specifies the event name for open.
                        -	 */
                        -	OPEN: 'open',
                        -
                        -	/**
                        -	 * Variable: SAVE
                        -	 *
                        -	 * Specifies the event name for open.
                        -	 */
                        -	SAVE: 'save',
                        -
                        -	/**
                        -	 * Variable: BEFORE_ADD_VERTEX
                        -	 *
                        -	 * Specifies the event name for beforeAddVertex.
                        -	 */
                        -	BEFORE_ADD_VERTEX: 'beforeAddVertex',
                        -
                        -	/**
                        -	 * Variable: ADD_VERTEX
                        -	 *
                        -	 * Specifies the event name for addVertex.
                        -	 */
                        -	ADD_VERTEX: 'addVertex',
                        -
                        -	/**
                        -	 * Variable: AFTER_ADD_VERTEX
                        -	 *
                        -	 * Specifies the event name for afterAddVertex.
                        -	 */
                        -	AFTER_ADD_VERTEX: 'afterAddVertex',
                        -
                        -	/**
                        -	 * Variable: DONE
                        -	 *
                        -	 * Specifies the event name for done.
                        -	 */
                        -	DONE: 'done',
                        -
                        -	/**
                        -	 * Variable: EXECUTE
                        -	 *
                        -	 * Specifies the event name for execute.
                        -	 */
                        -	EXECUTE: 'execute',
                        -
                        -	/**
                        -	 * Variable: EXECUTED
                        -	 *
                        -	 * Specifies the event name for executed.
                        -	 */
                        -	EXECUTED: 'executed',
                        -
                        -	/**
                        -	 * Variable: BEGIN_UPDATE
                        -	 *
                        -	 * Specifies the event name for beginUpdate.
                        -	 */
                        -	BEGIN_UPDATE: 'beginUpdate',
                        -
                        -	/**
                        -	 * Variable: START_EDIT
                        -	 *
                        -	 * Specifies the event name for startEdit.
                        -	 */
                        -	START_EDIT: 'startEdit',
                        -
                        -	/**
                        -	 * Variable: END_UPDATE
                        -	 *
                        -	 * Specifies the event name for endUpdate.
                        -	 */
                        -	END_UPDATE: 'endUpdate',
                        -
                        -	/**
                        -	 * Variable: END_EDIT
                        -	 *
                        -	 * Specifies the event name for endEdit.
                        -	 */
                        -	END_EDIT: 'endEdit',
                        -
                        -	/**
                        -	 * Variable: BEFORE_UNDO
                        -	 *
                        -	 * Specifies the event name for beforeUndo.
                        -	 */
                        -	BEFORE_UNDO: 'beforeUndo',
                        -
                        -	/**
                        -	 * Variable: UNDO
                        -	 *
                        -	 * Specifies the event name for undo.
                        -	 */
                        -	UNDO: 'undo',
                        -
                        -	/**
                        -	 * Variable: REDO
                        -	 *
                        -	 * Specifies the event name for redo.
                        -	 */
                        -	REDO: 'redo',
                        -
                        -	/**
                        -	 * Variable: CHANGE
                        -	 *
                        -	 * Specifies the event name for change.
                        -	 */
                        -	CHANGE: 'change',
                        -
                        -	/**
                        -	 * Variable: NOTIFY
                        -	 *
                        -	 * Specifies the event name for notify.
                        -	 */
                        -	NOTIFY: 'notify',
                        -
                        -	/**
                        -	 * Variable: LAYOUT_CELLS
                        -	 *
                        -	 * Specifies the event name for layoutCells.
                        -	 */
                        -	LAYOUT_CELLS: 'layoutCells',
                        -
                        -	/**
                        -	 * Variable: CLICK
                        -	 *
                        -	 * Specifies the event name for click.
                        -	 */
                        -	CLICK: 'click',
                        -
                        -	/**
                        -	 * Variable: SCALE
                        -	 *
                        -	 * Specifies the event name for scale.
                        -	 */
                        -	SCALE: 'scale',
                        -
                        -	/**
                        -	 * Variable: TRANSLATE
                        -	 *
                        -	 * Specifies the event name for translate.
                        -	 */
                        -	TRANSLATE: 'translate',
                        -
                        -	/**
                        -	 * Variable: SCALE_AND_TRANSLATE
                        -	 *
                        -	 * Specifies the event name for scaleAndTranslate.
                        -	 */
                        -	SCALE_AND_TRANSLATE: 'scaleAndTranslate',
                        -
                        -	/**
                        -	 * Variable: UP
                        -	 *
                        -	 * Specifies the event name for up.
                        -	 */
                        -	UP: 'up',
                        -
                        -	/**
                        -	 * Variable: DOWN
                        -	 *
                        -	 * Specifies the event name for down.
                        -	 */
                        -	DOWN: 'down',
                        -
                        -	/**
                        -	 * Variable: ADD
                        -	 *
                        -	 * Specifies the event name for add.
                        -	 */
                        -	ADD: 'add',
                        -
                        -	/**
                        -	 * Variable: REMOVE
                        -	 *
                        -	 * Specifies the event name for remove.
                        -	 */
                        -	REMOVE: 'remove',
                        -	
                        -	/**
                        -	 * Variable: CLEAR
                        -	 *
                        -	 * Specifies the event name for clear.
                        -	 */
                        -	CLEAR: 'clear',
                        -
                        -	/**
                        -	 * Variable: ADD_CELLS
                        -	 *
                        -	 * Specifies the event name for addCells.
                        -	 */
                        -	ADD_CELLS: 'addCells',
                        -
                        -	/**
                        -	 * Variable: CELLS_ADDED
                        -	 *
                        -	 * Specifies the event name for cellsAdded.
                        -	 */
                        -	CELLS_ADDED: 'cellsAdded',
                        -
                        -	/**
                        -	 * Variable: MOVE_CELLS
                        -	 *
                        -	 * Specifies the event name for moveCells.
                        -	 */
                        -	MOVE_CELLS: 'moveCells',
                        -
                        -	/**
                        -	 * Variable: CELLS_MOVED
                        -	 *
                        -	 * Specifies the event name for cellsMoved.
                        -	 */
                        -	CELLS_MOVED: 'cellsMoved',
                        -
                        -	/**
                        -	 * Variable: RESIZE_CELLS
                        -	 *
                        -	 * Specifies the event name for resizeCells.
                        -	 */
                        -	RESIZE_CELLS: 'resizeCells',
                        -
                        -	/**
                        -	 * Variable: CELLS_RESIZED
                        -	 *
                        -	 * Specifies the event name for cellsResized.
                        -	 */
                        -	CELLS_RESIZED: 'cellsResized',
                        -
                        -	/**
                        -	 * Variable: TOGGLE_CELLS
                        -	 *
                        -	 * Specifies the event name for toggleCells.
                        -	 */
                        -	TOGGLE_CELLS: 'toggleCells',
                        -
                        -	/**
                        -	 * Variable: CELLS_TOGGLED
                        -	 *
                        -	 * Specifies the event name for cellsToggled.
                        -	 */
                        -	CELLS_TOGGLED: 'cellsToggled',
                        -
                        -	/**
                        -	 * Variable: ORDER_CELLS
                        -	 *
                        -	 * Specifies the event name for orderCells.
                        -	 */
                        -	ORDER_CELLS: 'orderCells',
                        -
                        -	/**
                        -	 * Variable: CELLS_ORDERED
                        -	 *
                        -	 * Specifies the event name for cellsOrdered.
                        -	 */
                        -	CELLS_ORDERED: 'cellsOrdered',
                        -
                        -	/**
                        -	 * Variable: REMOVE_CELLS
                        -	 *
                        -	 * Specifies the event name for removeCells.
                        -	 */
                        -	REMOVE_CELLS: 'removeCells',
                        -
                        -	/**
                        -	 * Variable: CELLS_REMOVED
                        -	 *
                        -	 * Specifies the event name for cellsRemoved.
                        -	 */
                        -	CELLS_REMOVED: 'cellsRemoved',
                        -
                        -	/**
                        -	 * Variable: GROUP_CELLS
                        -	 *
                        -	 * Specifies the event name for groupCells.
                        -	 */
                        -	GROUP_CELLS: 'groupCells',
                        -
                        -	/**
                        -	 * Variable: UNGROUP_CELLS
                        -	 *
                        -	 * Specifies the event name for ungroupCells.
                        -	 */
                        -	UNGROUP_CELLS: 'ungroupCells',
                        -
                        -	/**
                        -	 * Variable: REMOVE_CELLS_FROM_PARENT
                        -	 *
                        -	 * Specifies the event name for removeCellsFromParent.
                        -	 */
                        -	REMOVE_CELLS_FROM_PARENT: 'removeCellsFromParent',
                        -
                        -	/**
                        -	 * Variable: FOLD_CELLS
                        -	 *
                        -	 * Specifies the event name for foldCells.
                        -	 */
                        -	FOLD_CELLS: 'foldCells',
                        -
                        -	/**
                        -	 * Variable: CELLS_FOLDED
                        -	 *
                        -	 * Specifies the event name for cellsFolded.
                        -	 */
                        -	CELLS_FOLDED: 'cellsFolded',
                        -
                        -	/**
                        -	 * Variable: ALIGN_CELLS
                        -	 *
                        -	 * Specifies the event name for alignCells.
                        -	 */
                        -	ALIGN_CELLS: 'alignCells',
                        -
                        -	/**
                        -	 * Variable: LABEL_CHANGED
                        -	 *
                        -	 * Specifies the event name for labelChanged.
                        -	 */
                        -	LABEL_CHANGED: 'labelChanged',
                        -
                        -	/**
                        -	 * Variable: CONNECT_CELL
                        -	 *
                        -	 * Specifies the event name for connectCell.
                        -	 */
                        -	CONNECT_CELL: 'connectCell',
                        -
                        -	/**
                        -	 * Variable: CELL_CONNECTED
                        -	 *
                        -	 * Specifies the event name for cellConnected.
                        -	 */
                        -	CELL_CONNECTED: 'cellConnected',
                        -
                        -	/**
                        -	 * Variable: SPLIT_EDGE
                        -	 *
                        -	 * Specifies the event name for splitEdge.
                        -	 */
                        -	SPLIT_EDGE: 'splitEdge',
                        -
                        -	/**
                        -	 * Variable: FLIP_EDGE
                        -	 *
                        -	 * Specifies the event name for flipEdge.
                        -	 */
                        -	FLIP_EDGE: 'flipEdge',
                        -
                        -	/**
                        -	 * Variable: START_EDITING
                        -	 *
                        -	 * Specifies the event name for startEditing.
                        -	 */
                        -	START_EDITING: 'startEditing',
                        -
                        -	/**
                        -	 * Variable: EDITING_STARTED
                        -	 *
                        -	 * Specifies the event name for editingStarted.
                        -	 */
                        -	EDITING_STARTED: 'editingStarted',
                        -
                        -	/**
                        -	 * Variable: EDITING_STOPPED
                        -	 *
                        -	 * Specifies the event name for editingStopped.
                        -	 */
                        -	EDITING_STOPPED: 'editingStopped',
                        -
                        -	/**
                        -	 * Variable: ADD_OVERLAY
                        -	 *
                        -	 * Specifies the event name for addOverlay.
                        -	 */
                        -	ADD_OVERLAY: 'addOverlay',
                        -
                        -	/**
                        -	 * Variable: REMOVE_OVERLAY
                        -	 *
                        -	 * Specifies the event name for removeOverlay.
                        -	 */
                        -	REMOVE_OVERLAY: 'removeOverlay',
                        -
                        -	/**
                        -	 * Variable: UPDATE_CELL_SIZE
                        -	 *
                        -	 * Specifies the event name for updateCellSize.
                        -	 */
                        -	UPDATE_CELL_SIZE: 'updateCellSize',
                        -
                        -	/**
                        -	 * Variable: ESCAPE
                        -	 *
                        -	 * Specifies the event name for escape.
                        -	 */
                        -	ESCAPE: 'escape',
                        -
                        -	/**
                        -	 * Variable: DOUBLE_CLICK
                        -	 *
                        -	 * Specifies the event name for doubleClick.
                        -	 */
                        -	DOUBLE_CLICK: 'doubleClick',
                        -
                        -	/**
                        -	 * Variable: START
                        -	 *
                        -	 * Specifies the event name for start.
                        -	 */
                        -	START: 'start',
                        -
                        -	/**
                        -	 * Variable: RESET
                        -	 *
                        -	 * Specifies the event name for reset.
                        -	 */
                        -	RESET: 'reset'
                        -
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxXmlRequest
                        - * 
                        - * XML HTTP request wrapper. See also: ,  and
                        - * . This class provides a cross-browser abstraction for Ajax
                        - * requests.
                        - * 
                        - * Encoding:
                        - * 
                        - * For encoding parameter values, the built-in encodeURIComponent JavaScript
                        - * method must be used. For automatic encoding of post data in  the
                        - *  switch can be set to true (default). The encoding
                        - * will be carried out using the conte type of the page. That is, the page
                        - * containting the editor should contain a meta tag in the header, eg.
                        - * 
                        - * 
                        - * Example:
                        - * 
                        - * (code)
                        - * var onload = function(req)
                        - * {
                        - *   mxUtils.alert(req.getDocumentElement());
                        - * }
                        - * 
                        - * var onerror = function(req)
                        - * {
                        - *   mxUtils.alert('Error');
                        - * }
                        - * new mxXmlRequest(url, 'key=value').send(onload, onerror);
                        - * (end)
                        - * 
                        - * Sends an asynchronous POST request to the specified URL.
                        - * 
                        - * Example:
                        - * 
                        - * (code)
                        - * var req = new mxXmlRequest(url, 'key=value', 'POST', false);
                        - * req.send();
                        - * mxUtils.alert(req.getDocumentElement());
                        - * (end)
                        - * 
                        - * Sends a synchronous POST request to the specified URL.
                        - * 
                        - * Example:
                        - * 
                        - * (code)
                        - * var encoder = new mxCodec();
                        - * var result = encoder.encode(graph.getModel());
                        - * var xml = encodeURIComponent(mxUtils.getXml(result));
                        - * new mxXmlRequest(url, 'xml='+xml).send();
                        - * (end)
                        - * 
                        - * Sends an encoded graph model to the specified URL using xml as the
                        - * parameter name. The parameter can then be retrieved in C# as follows:
                        - * 
                        - * (code)
                        - * string xml = HttpUtility.UrlDecode(context.Request.Params["xml"]);
                        - * (end)
                        - * 
                        - * Or in Java as follows:
                        - * 
                        - * (code)
                        - * String xml = URLDecoder.decode(request.getParameter("xml"), "UTF-8").replace("\n", "
                        ");
                        - * (end)
                        - *
                        - * Note that the linefeeds should only be replaced if the XML is
                        - * processed in Java, for example when creating an image.
                        - * 
                        - * Constructor: mxXmlRequest
                        - * 
                        - * Constructs an XML HTTP request.
                        - * 
                        - * Parameters:
                        - * 
                        - * url - Target URL of the request.
                        - * params - Form encoded parameters to send with a POST request.
                        - * method - String that specifies the request method. Possible values are
                        - * POST and GET. Default is POST.
                        - * async - Boolean specifying if an asynchronous request should be used.
                        - * Default is true.
                        - * username - String specifying the username to be used for the request.
                        - * password - String specifying the password to be used for the request.
                        - */
                        -function mxXmlRequest(url, params, method, async, username, password)
                        -{
                        -	this.url = url;
                        -	this.params = params;
                        -	this.method = method || 'POST';
                        -	this.async = (async != null) ? async : true;
                        -	this.username = username;
                        -	this.password = password;
                        -};
                        -
                        -/**
                        - * Variable: url
                        - * 
                        - * Holds the target URL of the request.
                        - */
                        -mxXmlRequest.prototype.url = null;
                        -
                        -/**
                        - * Variable: params
                        - * 
                        - * Holds the form encoded data for the POST request.
                        - */
                        -mxXmlRequest.prototype.params = null;
                        -
                        -/**
                        - * Variable: method
                        - * 
                        - * Specifies the request method. Possible values are POST and GET. Default
                        - * is POST.
                        - */
                        -mxXmlRequest.prototype.method = null;
                        -
                        -/**
                        - * Variable: async
                        - * 
                        - * Boolean indicating if the request is asynchronous.
                        - */
                        -mxXmlRequest.prototype.async = null;
                        -
                        -/**
                        - * Variable: binary
                        - * 
                        - * Boolean indicating if the request is binary. This option is ignored in IE.
                        - * In all other browsers the requested mime type is set to
                        - * text/plain; charset=x-user-defined. Default is false.
                        - */
                        -mxXmlRequest.prototype.binary = false;
                        -
                        -/**
                        - * Variable: withCredentials
                        - * 
                        - * Specifies if withCredentials should be used in HTML5-compliant browsers. Default is
                        - * false.
                        - */
                        -mxXmlRequest.prototype.withCredentials = false;
                        -
                        -/**
                        - * Variable: username
                        - * 
                        - * Specifies the username to be used for authentication.
                        - */
                        -mxXmlRequest.prototype.username = null;
                        -
                        -/**
                        - * Variable: password
                        - * 
                        - * Specifies the password to be used for authentication.
                        - */
                        -mxXmlRequest.prototype.password = null;
                        -
                        -/**
                        - * Variable: request
                        - * 
                        - * Holds the inner, browser-specific request object.
                        - */
                        -mxXmlRequest.prototype.request = null;
                        -
                        -/**
                        - * Variable: decodeSimulateValues
                        - * 
                        - * Specifies if request values should be decoded as URIs before setting the
                        - * textarea value in . Defaults to false for backwards compatibility,
                        - * to avoid another decode on the server this should be set to true.
                        - */
                        -mxXmlRequest.prototype.decodeSimulateValues = false;
                        -
                        -/**
                        - * Function: isBinary
                        - * 
                        - * Returns .
                        - */
                        -mxXmlRequest.prototype.isBinary = function()
                        -{
                        -	return this.binary;
                        -};
                        -
                        -/**
                        - * Function: setBinary
                        - * 
                        - * Sets .
                        - */
                        -mxXmlRequest.prototype.setBinary = function(value)
                        -{
                        -	this.binary = value;
                        -};
                        -
                        -/**
                        - * Function: getText
                        - * 
                        - * Returns the response as a string.
                        - */
                        -mxXmlRequest.prototype.getText = function()
                        -{
                        -	return this.request.responseText;
                        -};
                        -
                        -/**
                        - * Function: isReady
                        - * 
                        - * Returns true if the response is ready.
                        - */
                        -mxXmlRequest.prototype.isReady = function()
                        -{
                        -	return this.request.readyState == 4;
                        -};
                        -
                        -/**
                        - * Function: getDocumentElement
                        - * 
                        - * Returns the document element of the response XML document.
                        - */
                        -mxXmlRequest.prototype.getDocumentElement = function()
                        -{
                        -	var doc = this.getXml();
                        -	
                        -	if (doc != null)
                        -	{
                        -		return doc.documentElement;
                        -	}
                        -	
                        -	return null;
                        -};
                        -
                        -/**
                        - * Function: getXml
                        - * 
                        - * Returns the response as an XML document. Use  to get
                        - * the document element of the XML document.
                        - */
                        -mxXmlRequest.prototype.getXml = function()
                        -{
                        -	var xml = this.request.responseXML;
                        -	
                        -	// Handles missing response headers in IE, the first condition handles
                        -	// the case where responseXML is there, but using its nodes leads to
                        -	// type errors in the mxCellCodec when putting the nodes into a new
                        -	// document. This happens in IE9 standards mode and with XML user
                        -	// objects only, as they are used directly as values in cells.
                        -	if (document.documentMode >= 9 || xml == null || xml.documentElement == null)
                        -	{
                        -		xml = mxUtils.parseXml(this.request.responseText);
                        -	}
                        -	
                        -	return xml;
                        -};
                        -
                        -/**
                        - * Function: getText
                        - * 
                        - * Returns the response as a string.
                        - */
                        -mxXmlRequest.prototype.getText = function()
                        -{
                        -	return this.request.responseText;
                        -};
                        -
                        -/**
                        - * Function: getStatus
                        - * 
                        - * Returns the status as a number, eg. 404 for "Not found" or 200 for "OK".
                        - * Note: The NS_ERROR_NOT_AVAILABLE for invalid responses cannot be cought.
                        - */
                        -mxXmlRequest.prototype.getStatus = function()
                        -{
                        -	return this.request.status;
                        -};
                        -
                        -/**
                        - * Function: create
                        - * 
                        - * Creates and returns the inner  object.
                        - */
                        -mxXmlRequest.prototype.create = function()
                        -{
                        -	if (window.XMLHttpRequest)
                        -	{
                        -		return function()
                        -		{
                        -			var req = new XMLHttpRequest();
                        -			
                        -			// TODO: Check for overrideMimeType required here?
                        -			if (this.isBinary() && req.overrideMimeType)
                        -			{
                        -				req.overrideMimeType('text/plain; charset=x-user-defined');
                        -			}
                        -
                        -			return req;
                        -		};
                        -	}
                        -	else if (typeof(ActiveXObject) != 'undefined')
                        -	{
                        -		return function()
                        -		{
                        -			// TODO: Implement binary option
                        -			return new ActiveXObject('Microsoft.XMLHTTP');
                        -		};
                        -	}
                        -}();
                        -
                        -/**
                        - * Function: send
                        - * 
                        - * Send the  to the target URL using the specified functions to
                        - * process the response asychronously.
                        - * 
                        - * Note: Due to technical limitations, onerror is currently ignored.
                        - * 
                        - * Parameters:
                        - * 
                        - * onload - Function to be invoked if a successful response was received.
                        - * onerror - Function to be called on any error.
                        - * timeout - Optional timeout in ms before calling ontimeout.
                        - * ontimeout - Optional function to execute on timeout.
                        - */
                        -mxXmlRequest.prototype.send = function(onload, onerror, timeout, ontimeout)
                        -{
                        -	this.request = this.create();
                        -	
                        -	if (this.request != null)
                        -	{
                        -		if (onload != null)
                        -		{
                        -			this.request.onreadystatechange = mxUtils.bind(this, function()
                        -			{
                        -				if (this.isReady())
                        -				{
                        -					onload(this);
                        -					this.request.onreadystatechaange = null;
                        -				}
                        -			});
                        -		}
                        -
                        -		this.request.open(this.method, this.url, this.async,
                        -			this.username, this.password);
                        -		this.setRequestHeaders(this.request, this.params);
                        -		
                        -		if (window.XMLHttpRequest && this.withCredentials)
                        -		{
                        -			this.request.withCredentials = 'true';
                        -		}
                        -		
                        -		if (!mxClient.IS_QUIRKS && (document.documentMode == null || document.documentMode > 9) &&
                        -			window.XMLHttpRequest && timeout != null && ontimeout != null)
                        -		{
                        -			this.request.timeout = timeout;
                        -			this.request.ontimeout = ontimeout;
                        -		}
                        -				
                        -		this.request.send(this.params);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setRequestHeaders
                        - * 
                        - * Sets the headers for the given request and parameters. This sets the
                        - * content-type to application/x-www-form-urlencoded if any params exist.
                        - * 
                        - * Example:
                        - * 
                        - * (code)
                        - * request.setRequestHeaders = function(request, params)
                        - * {
                        - *   if (params != null)
                        - *   {
                        - *     request.setRequestHeader('Content-Type',
                        - *             'multipart/form-data');
                        - *     request.setRequestHeader('Content-Length',
                        - *             params.length);
                        - *   }
                        - * };
                        - * (end)
                        - * 
                        - * Use the code above before calling  if you require a
                        - * multipart/form-data request.   
                        - */
                        -mxXmlRequest.prototype.setRequestHeaders = function(request, params)
                        -{
                        -	if (params != null)
                        -	{
                        -		request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                        -	}
                        -};
                        -
                        -/**
                        - * Function: simulate
                        - * 
                        - * Creates and posts a request to the given target URL using a dynamically
                        - * created form inside the given document.
                        - * 
                        - * Parameters:
                        - * 
                        - * docs - Document that contains the form element.
                        - * target - Target to send the form result to.
                        - */
                        -mxXmlRequest.prototype.simulate = function(doc, target)
                        -{
                        -	doc = doc || document;
                        -	var old = null;
                        -
                        -	if (doc == document)
                        -	{
                        -		old = window.onbeforeunload;		
                        -		window.onbeforeunload = null;
                        -	}
                        -			
                        -	var form = doc.createElement('form');
                        -	form.setAttribute('method', this.method);
                        -	form.setAttribute('action', this.url);
                        -
                        -	if (target != null)
                        -	{
                        -		form.setAttribute('target', target);
                        -	}
                        -
                        -	form.style.display = 'none';
                        -	form.style.visibility = 'hidden';
                        -	
                        -	var pars = (this.params.indexOf('&') > 0) ?
                        -		this.params.split('&') :
                        -		this.params.split();
                        -
                        -	// Adds the parameters as textareas to the form
                        -	for (var i=0; i 0)
                        -		{
                        -			var name = pars[i].substring(0, pos);
                        -			var value = pars[i].substring(pos+1);
                        -			
                        -			if (this.decodeSimulateValues)
                        -			{
                        -				value = decodeURIComponent(value);
                        -			}
                        -			
                        -			var textarea = doc.createElement('textarea');
                        -			textarea.setAttribute('wrap', 'off');
                        -			textarea.setAttribute('name', name);
                        -			mxUtils.write(textarea, value);
                        -			form.appendChild(textarea);
                        -		}
                        -	}
                        -	
                        -	doc.body.appendChild(form);
                        -	form.submit();
                        -	
                        -	if (form.parentNode != null)
                        -	{
                        -		form.parentNode.removeChild(form);
                        -	}
                        -
                        -	if (old != null)
                        -	{		
                        -		window.onbeforeunload = old;
                        -	}
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -var mxClipboard =
                        -{
                        -	/**
                        -	 * Class: mxClipboard
                        -	 * 
                        -	 * Singleton that implements a clipboard for graph cells.
                        -	 *
                        -	 * Example:
                        -	 * 
                        -	 * (code)
                        -	 * mxClipboard.copy(graph);
                        -	 * mxClipboard.paste(graph2);
                        -	 * (end)
                        -	 *
                        -	 * This copies the selection cells from the graph to the clipboard and
                        -	 * pastes them into graph2.
                        -	 * 
                        -	 * For fine-grained control of the clipboard data the 
                        -	 * and  functions can be overridden.
                        -	 * 
                        -	 * To restore previous parents for pasted cells, the implementation for
                        -	 *  and  can be changed as follows.
                        -	 * 
                        -	 * (code)
                        -	 * mxClipboard.copy = function(graph, cells)
                        -	 * {
                        -	 *   cells = cells || graph.getSelectionCells();
                        -	 *   var result = graph.getExportableCells(cells);
                        -	 *   
                        -	 *   mxClipboard.parents = new Object();
                        -	 *   
                        -	 *   for (var i = 0; i < result.length; i++)
                        -	 *   {
                        -	 *     mxClipboard.parents[i] = graph.model.getParent(cells[i]);
                        -	 *   }
                        -	 *   
                        -	 *   mxClipboard.insertCount = 1;
                        -	 *   mxClipboard.setCells(graph.cloneCells(result));
                        -	 *   
                        -	 *   return result;
                        -	 * };
                        -	 * 
                        -	 * mxClipboard.paste = function(graph)
                        -	 * {
                        -	 *   if (!mxClipboard.isEmpty())
                        -	 *   {
                        -	 *     var cells = graph.getImportableCells(mxClipboard.getCells());
                        -	 *     var delta = mxClipboard.insertCount * mxClipboard.STEPSIZE;
                        -	 *     var parent = graph.getDefaultParent();
                        -	 *     
                        -	 *     graph.model.beginUpdate();
                        -	 *     try
                        -	 *     {
                        -	 *       for (var i = 0; i < cells.length; i++)
                        -	 *       {
                        -	 *         var tmp = (mxClipboard.parents != null && graph.model.contains(mxClipboard.parents[i])) ?
                        -	 *              mxClipboard.parents[i] : parent;
                        -	 *         cells[i] = graph.importCells([cells[i]], delta, delta, tmp)[0];
                        -	 *       }
                        -	 *     }
                        -	 *     finally
                        -	 *     {
                        -	 *       graph.model.endUpdate();
                        -	 *     }
                        -	 *     
                        -	 *     // Increments the counter and selects the inserted cells
                        -	 *     mxClipboard.insertCount++;
                        -	 *     graph.setSelectionCells(cells);
                        -	 *   }
                        -	 * };
                        -	 * (end)
                        -	 * 
                        -	 * Variable: STEPSIZE
                        -	 * 
                        -	 * Defines the step size to offset the cells after each paste operation.
                        -	 * Default is 10.
                        -	 */
                        -	STEPSIZE: 10,
                        -
                        -	/**
                        -	 * Variable: insertCount
                        -	 * 
                        -	 * Counts the number of times the clipboard data has been inserted.
                        -	 */
                        -	insertCount: 1,
                        -
                        -	/**
                        -	 * Variable: cells
                        -	 * 
                        -	 * Holds the array of  currently in the clipboard.
                        -	 */
                        -	cells: null,
                        -
                        -	/**
                        -	 * Function: setCells
                        -	 * 
                        -	 * Sets the cells in the clipboard. Fires a  event.
                        -	 */
                        -	setCells: function(cells)
                        -	{
                        -		mxClipboard.cells = cells;
                        -	},
                        -
                        -	/**
                        -	 * Function: getCells
                        -	 * 
                        -	 * Returns  the cells in the clipboard.
                        -	 */
                        -	getCells: function()
                        -	{
                        -		return mxClipboard.cells;
                        -	},
                        -	
                        -	/**
                        -	 * Function: isEmpty
                        -	 * 
                        -	 * Returns true if the clipboard currently has not data stored.
                        -	 */
                        -	isEmpty: function()
                        -	{
                        -		return mxClipboard.getCells() == null;
                        -	},
                        -	
                        -	/**
                        -	 * Function: cut
                        -	 * 
                        -	 * Cuts the given array of  from the specified graph.
                        -	 * If cells is null then the selection cells of the graph will
                        -	 * be used. Returns the cells that have been cut from the graph.
                        -	 *
                        -	 * Parameters:
                        -	 * 
                        -	 * graph -  that contains the cells to be cut.
                        -	 * cells - Optional array of  to be cut.
                        -	 */
                        -	cut: function(graph, cells)
                        -	{
                        -		cells = mxClipboard.copy(graph, cells);
                        -		mxClipboard.insertCount = 0;
                        -		mxClipboard.removeCells(graph, cells);
                        -		
                        -		return cells;
                        -	},
                        -
                        -	/**
                        -	 * Function: removeCells
                        -	 * 
                        -	 * Hook to remove the given cells from the given graph after
                        -	 * a cut operation.
                        -	 *
                        -	 * Parameters:
                        -	 * 
                        -	 * graph -  that contains the cells to be cut.
                        -	 * cells - Array of  to be cut.
                        -	 */
                        -	removeCells: function(graph, cells)
                        -	{
                        -		graph.removeCells(cells);
                        -	},
                        -
                        -	/**
                        -	 * Function: copy
                        -	 * 
                        -	 * Copies the given array of  from the specified
                        -	 * graph to . Returns the original array of cells that has
                        -	 * been cloned. Descendants of cells in the array are ignored.
                        -	 * 
                        -	 * Parameters:
                        -	 * 
                        -	 * graph -  that contains the cells to be copied.
                        -	 * cells - Optional array of  to be copied.
                        -	 */
                        -	copy: function(graph, cells)
                        -	{
                        -		cells = cells || graph.getSelectionCells();
                        -		var result = graph.getExportableCells(graph.model.getTopmostCells(cells));
                        -		mxClipboard.insertCount = 1;
                        -		mxClipboard.setCells(graph.cloneCells(result));
                        -
                        -		return result;
                        -	},
                        -
                        -	/**
                        -	 * Function: paste
                        -	 * 
                        -	 * Pastes the  into the specified graph restoring
                        -	 * the relation to , if possible. If the parents
                        -	 * are no longer in the graph or invisible then the
                        -	 * cells are added to the graph's default or into the
                        -	 * swimlane under the cell's new location if one exists.
                        -	 * The cells are added to the graph using 
                        -	 * and returned.
                        -	 * 
                        -	 * Parameters:
                        -	 * 
                        -	 * graph -  to paste the  into.
                        -	 */
                        -	paste: function(graph)
                        -	{
                        -		var cells = null;
                        -		
                        -		if (!mxClipboard.isEmpty())
                        -		{
                        -			cells = graph.getImportableCells(mxClipboard.getCells());
                        -			var delta = mxClipboard.insertCount * mxClipboard.STEPSIZE;
                        -			var parent = graph.getDefaultParent();
                        -			cells = graph.importCells(cells, delta, delta, parent);
                        -			
                        -			// Increments the counter and selects the inserted cells
                        -			mxClipboard.insertCount++;
                        -			graph.setSelectionCells(cells);
                        -		}
                        -		
                        -		return cells;
                        -	}
                        -
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxWindow
                        - * 
                        - * Basic window inside a document.
                        - * 
                        - * Examples:
                        - * 
                        - * Creating a simple window.
                        - *
                        - * (code)
                        - * var tb = document.createElement('div');
                        - * var wnd = new mxWindow('Title', tb, 100, 100, 200, 200, true, true);
                        - * wnd.setVisible(true); 
                        - * (end)
                        - *
                        - * Creating a window that contains an iframe. 
                        - * 
                        - * (code)
                        - * var frame = document.createElement('iframe');
                        - * frame.setAttribute('width', '192px');
                        - * frame.setAttribute('height', '172px');
                        - * frame.setAttribute('src', 'http://www.example.com/');
                        - * frame.style.backgroundColor = 'white';
                        - * 
                        - * var w = document.body.clientWidth;
                        - * var h = (document.body.clientHeight || document.documentElement.clientHeight);
                        - * var wnd = new mxWindow('Title', frame, (w-200)/2, (h-200)/3, 200, 200);
                        - * wnd.setVisible(true);
                        - * (end)
                        - * 
                        - * To limit the movement of a window, eg. to keep it from being moved beyond
                        - * the top, left corner the following method can be overridden (recommended):
                        - * 
                        - * (code)
                        - * wnd.setLocation = function(x, y)
                        - * {
                        - *   x = Math.max(0, x);
                        - *   y = Math.max(0, y);
                        - *   mxWindow.prototype.setLocation.apply(this, arguments);
                        - * };
                        - * (end)
                        - * 
                        - * Or the following event handler can be used:
                        - * 
                        - * (code)
                        - * wnd.addListener(mxEvent.MOVE, function(e)
                        - * {
                        - *   wnd.setLocation(Math.max(0, wnd.getX()), Math.max(0, wnd.getY()));
                        - * });
                        - * (end)
                        - * 
                        - * To keep a window inside the current window:
                        - * 
                        - * (code)
                        - * mxEvent.addListener(window, 'resize', mxUtils.bind(this, function()
                        - * {
                        - *   var iw = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
                        - *   var ih = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
                        - *   
                        - *   var x = this.window.getX();
                        - *   var y = this.window.getY();
                        - *   
                        - *   if (x + this.window.table.clientWidth > iw)
                        - *   {
                        - *     x = Math.max(0, iw - this.window.table.clientWidth);
                        - *   }
                        - *   
                        - *   if (y + this.window.table.clientHeight > ih)
                        - *   {
                        - *     y = Math.max(0, ih - this.window.table.clientHeight);
                        - *   }
                        - *   
                        - *   if (this.window.getX() != x || this.window.getY() != y)
                        - *   {
                        - *     this.window.setLocation(x, y);
                        - *   }
                        - * }));
                        - * (end)
                        - *
                        - * Event: mxEvent.MOVE_START
                        - *
                        - * Fires before the window is moved. The event property contains
                        - * the corresponding mouse event.
                        - *
                        - * Event: mxEvent.MOVE
                        - *
                        - * Fires while the window is being moved. The event property
                        - * contains the corresponding mouse event.
                        - *
                        - * Event: mxEvent.MOVE_END
                        - *
                        - * Fires after the window is moved. The event property contains
                        - * the corresponding mouse event.
                        - *
                        - * Event: mxEvent.RESIZE_START
                        - *
                        - * Fires before the window is resized. The event property contains
                        - * the corresponding mouse event.
                        - *
                        - * Event: mxEvent.RESIZE
                        - *
                        - * Fires while the window is being resized. The event property
                        - * contains the corresponding mouse event.
                        - *
                        - * Event: mxEvent.RESIZE_END
                        - *
                        - * Fires after the window is resized. The event property contains
                        - * the corresponding mouse event.
                        - *
                        - * Event: mxEvent.MAXIMIZE
                        - * 
                        - * Fires after the window is maximized. The event property
                        - * contains the corresponding mouse event.
                        - * 
                        - * Event: mxEvent.MINIMIZE
                        - * 
                        - * Fires after the window is minimized. The event property
                        - * contains the corresponding mouse event.
                        - * 
                        - * Event: mxEvent.NORMALIZE
                        - * 
                        - * Fires after the window is normalized, that is, it returned from
                        - * maximized or minimized state. The event property contains the
                        - * corresponding mouse event.
                        - *  
                        - * Event: mxEvent.ACTIVATE
                        - * 
                        - * Fires after a window is activated. The previousWindow property
                        - * contains the previous window. The event sender is the active window.
                        - * 
                        - * Event: mxEvent.SHOW
                        - * 
                        - * Fires after the window is shown. This event has no properties.
                        - * 
                        - * Event: mxEvent.HIDE
                        - * 
                        - * Fires after the window is hidden. This event has no properties.
                        - * 
                        - * Event: mxEvent.CLOSE
                        - * 
                        - * Fires before the window is closed. The event property contains
                        - * the corresponding mouse event.
                        - * 
                        - * Event: mxEvent.DESTROY
                        - * 
                        - * Fires before the window is destroyed. This event has no properties.
                        - * 
                        - * Constructor: mxWindow
                        - * 
                        - * Constructs a new window with the given dimension and title to display
                        - * the specified content. The window elements use the given style as a
                        - * prefix for the classnames of the respective window elements, namely,
                        - * the window title and window pane. The respective postfixes are appended
                        - * to the given stylename as follows:
                        - * 
                        - *   style - Base style for the window.
                        - *   style+Title - Style for the window title.
                        - *   style+Pane - Style for the window pane.
                        - * 
                        - * The default value for style is mxWindow, resulting in the following
                        - * classnames for the window elements: mxWindow, mxWindowTitle and
                        - * mxWindowPane.
                        - * 
                        - * If replaceNode is given then the window replaces the given DOM node in
                        - * the document.
                        - * 
                        - * Parameters:
                        - * 
                        - * title - String that represents the title of the new window.
                        - * content - DOM node that is used as the window content.
                        - * x - X-coordinate of the window location.
                        - * y - Y-coordinate of the window location.
                        - * width - Width of the window.
                        - * height - Optional height of the window. Default is to match the height
                        - * of the content at the specified width.
                        - * minimizable - Optional boolean indicating if the window is minimizable.
                        - * Default is true.
                        - * movable - Optional boolean indicating if the window is movable. Default
                        - * is true.
                        - * replaceNode - Optional DOM node that the window should replace.
                        - * style - Optional base classname for the window elements. Default is
                        - * mxWindow.
                        - */
                        -function mxWindow(title, content, x, y, width, height, minimizable, movable, replaceNode, style)
                        -{
                        -	if (content != null)
                        -	{
                        -		minimizable = (minimizable != null) ? minimizable : true;
                        -		this.content = content;
                        -		this.init(x, y, width, height, style);
                        -		
                        -		this.installMaximizeHandler();
                        -		this.installMinimizeHandler();
                        -		this.installCloseHandler();
                        -		this.setMinimizable(minimizable);
                        -		this.setTitle(title);
                        -		
                        -		if (movable == null || movable)
                        -		{
                        -			this.installMoveHandler();
                        -		}
                        -
                        -		if (replaceNode != null && replaceNode.parentNode != null)
                        -		{
                        -			replaceNode.parentNode.replaceChild(this.div, replaceNode);
                        -		}
                        -		else
                        -		{
                        -			document.body.appendChild(this.div);
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Extends mxEventSource.
                        - */
                        -mxWindow.prototype = new mxEventSource();
                        -mxWindow.prototype.constructor = mxWindow;
                        -
                        -/**
                        - * Variable: closeImage
                        - * 
                        - * URL of the image to be used for the close icon in the titlebar.
                        - */
                        -mxWindow.prototype.closeImage = mxClient.imageBasePath + '/close.gif';
                        -
                        -/**
                        - * Variable: minimizeImage
                        - * 
                        - * URL of the image to be used for the minimize icon in the titlebar.
                        - */
                        -mxWindow.prototype.minimizeImage = mxClient.imageBasePath + '/minimize.gif';
                        -	
                        -/**
                        - * Variable: normalizeImage
                        - * 
                        - * URL of the image to be used for the normalize icon in the titlebar.
                        - */
                        -mxWindow.prototype.normalizeImage = mxClient.imageBasePath + '/normalize.gif';
                        -	
                        -/**
                        - * Variable: maximizeImage
                        - * 
                        - * URL of the image to be used for the maximize icon in the titlebar.
                        - */
                        -mxWindow.prototype.maximizeImage = mxClient.imageBasePath + '/maximize.gif';
                        -
                        -/**
                        - * Variable: normalizeImage
                        - * 
                        - * URL of the image to be used for the resize icon.
                        - */
                        -mxWindow.prototype.resizeImage = mxClient.imageBasePath + '/resize.gif';
                        -
                        -/**
                        - * Variable: visible
                        - * 
                        - * Boolean flag that represents the visible state of the window.
                        - */
                        -mxWindow.prototype.visible = false;
                        -
                        -/**
                        - * Variable: minimumSize
                        - * 
                        - *  that specifies the minimum width and height of the window.
                        - * Default is (50, 40).
                        - */
                        -mxWindow.prototype.minimumSize = new mxRectangle(0, 0, 50, 40);
                        -
                        -/**
                        - * Variable: destroyOnClose
                        - * 
                        - * Specifies if the window should be destroyed when it is closed. If this
                        - * is false then the window is hidden using . Default is true.
                        - */
                        -mxWindow.prototype.destroyOnClose = true;
                        -
                        -/**
                        - * Variable: contentHeightCorrection
                        - * 
                        - * Defines the correction factor for computing the height of the contentWrapper.
                        - * Default is 6 for IE 7/8 standards mode and 2 for all other browsers and modes.
                        - */
                        -mxWindow.prototype.contentHeightCorrection = (document.documentMode == 8 || document.documentMode == 7) ? 6 : 2;
                        -
                        -/**
                        - * Variable: title
                        - * 
                        - * Reference to the DOM node (TD) that contains the title.
                        - */
                        -mxWindow.prototype.title = null;
                        -
                        -/**
                        - * Variable: content
                        - * 
                        - * Reference to the DOM node that represents the window content.
                        - */
                        -mxWindow.prototype.content = null;
                        -
                        -/**
                        - * Function: init
                        - * 
                        - * Initializes the DOM tree that represents the window.
                        - */
                        -mxWindow.prototype.init = function(x, y, width, height, style)
                        -{
                        -	style = (style != null) ? style : 'mxWindow';
                        -	
                        -	this.div = document.createElement('div');
                        -	this.div.className = style;
                        -
                        -	this.div.style.left = x + 'px';
                        -	this.div.style.top = y + 'px';
                        -	this.table = document.createElement('table');
                        -	this.table.className = style;
                        -
                        -	// Disables built-in pan and zoom in IE10 and later
                        -	if (mxClient.IS_POINTER)
                        -	{
                        -		this.div.style.touchAction = 'none';
                        -	}
                        -	
                        -	// Workaround for table size problems in FF
                        -	if (width != null)
                        -	{
                        -		if (!mxClient.IS_QUIRKS)
                        -		{
                        -			this.div.style.width = width + 'px'; 
                        -		}
                        -		
                        -		this.table.style.width = width + 'px';
                        -	} 
                        -	
                        -	if (height != null)
                        -	{
                        -		if (!mxClient.IS_QUIRKS)
                        -		{
                        -			this.div.style.height = height + 'px';
                        -		}
                        -		
                        -		this.table.style.height = height + 'px';
                        -	}		
                        -	
                        -	// Creates title row
                        -	var tbody = document.createElement('tbody');
                        -	var tr = document.createElement('tr');
                        -	
                        -	this.title = document.createElement('td');
                        -	this.title.className = style + 'Title';
                        -	
                        -	this.buttons = document.createElement('div');
                        -	this.buttons.style.position = 'absolute';
                        -	this.buttons.style.display = 'inline-block';
                        -	this.buttons.style.right = '4px';
                        -	this.buttons.style.top = '5px';
                        -	this.title.appendChild(this.buttons);
                        -	
                        -	tr.appendChild(this.title);
                        -	tbody.appendChild(tr);
                        -	
                        -	// Creates content row and table cell
                        -	tr = document.createElement('tr');
                        -	this.td = document.createElement('td');
                        -	this.td.className = style + 'Pane';
                        -	
                        -	if (document.documentMode == 7)
                        -	{
                        -		this.td.style.height = '100%';
                        -	}
                        -
                        -	this.contentWrapper = document.createElement('div');
                        -	this.contentWrapper.className = style + 'Pane';
                        -	this.contentWrapper.style.width = '100%';
                        -	this.contentWrapper.appendChild(this.content);
                        -
                        -	// Workaround for div around div restricts height
                        -	// of inner div if outerdiv has hidden overflow
                        -	if (mxClient.IS_QUIRKS || this.content.nodeName.toUpperCase() != 'DIV')
                        -	{
                        -		this.contentWrapper.style.height = '100%';
                        -	}
                        -
                        -	// Puts all content into the DOM
                        -	this.td.appendChild(this.contentWrapper);
                        -	tr.appendChild(this.td);
                        -	tbody.appendChild(tr);
                        -	this.table.appendChild(tbody);
                        -	this.div.appendChild(this.table);
                        -	
                        -	// Puts the window on top of other windows when clicked
                        -	var activator = mxUtils.bind(this, function(evt)
                        -	{
                        -		this.activate();
                        -	});
                        -	
                        -	mxEvent.addGestureListeners(this.title, activator);
                        -	mxEvent.addGestureListeners(this.table, activator);
                        -
                        -	this.hide();
                        -};
                        -
                        -/**
                        - * Function: setTitle
                        - * 
                        - * Sets the window title to the given string. HTML markup inside the title
                        - * will be escaped.
                        - */
                        -mxWindow.prototype.setTitle = function(title)
                        -{
                        -	// Removes all text content nodes (normally just one)
                        -	var child = this.title.firstChild;
                        -	
                        -	while (child != null)
                        -	{
                        -		var next = child.nextSibling;
                        -		
                        -		if (child.nodeType == mxConstants.NODETYPE_TEXT)
                        -		{
                        -			child.parentNode.removeChild(child);
                        -		}
                        -		
                        -		child = next;
                        -	}
                        -	
                        -	mxUtils.write(this.title, title || '');
                        -	this.title.appendChild(this.buttons);
                        -};
                        -
                        -/**
                        - * Function: setScrollable
                        - * 
                        - * Sets if the window contents should be scrollable.
                        - */
                        -mxWindow.prototype.setScrollable = function(scrollable)
                        -{
                        -	// Workaround for hang in Presto 2.5.22 (Opera 10.5)
                        -	if (navigator.userAgent.indexOf('Presto/2.5') < 0)
                        -	{
                        -		if (scrollable)
                        -		{
                        -			this.contentWrapper.style.overflow = 'auto';
                        -		}
                        -		else
                        -		{
                        -			this.contentWrapper.style.overflow = 'hidden';
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: activate
                        - * 
                        - * Puts the window on top of all other windows.
                        - */
                        -mxWindow.prototype.activate = function()
                        -{
                        -	if (mxWindow.activeWindow != this)
                        -	{
                        -		var style = mxUtils.getCurrentStyle(this.getElement());
                        -		var index = (style != null) ? style.zIndex : 3;
                        -
                        -		if (mxWindow.activeWindow)
                        -		{
                        -			var elt = mxWindow.activeWindow.getElement();
                        -			
                        -			if (elt != null && elt.style != null)
                        -			{
                        -				elt.style.zIndex = index;
                        -			}
                        -		}
                        -		
                        -		var previousWindow = mxWindow.activeWindow;
                        -		this.getElement().style.zIndex = parseInt(index) + 1;
                        -		mxWindow.activeWindow = this;
                        -		
                        -		this.fireEvent(new mxEventObject(mxEvent.ACTIVATE, 'previousWindow', previousWindow));
                        -	}
                        -};
                        -
                        -/**
                        - * Function: getElement
                        - * 
                        - * Returuns the outermost DOM node that makes up the window.
                        - */
                        -mxWindow.prototype.getElement = function()
                        -{
                        -	return this.div;
                        -};
                        -
                        -/**
                        - * Function: fit
                        - * 
                        - * Makes sure the window is inside the client area of the window.
                        - */
                        -mxWindow.prototype.fit = function()
                        -{
                        -	mxUtils.fit(this.div);
                        -};
                        -
                        -/**
                        - * Function: isResizable
                        - * 
                        - * Returns true if the window is resizable.
                        - */
                        -mxWindow.prototype.isResizable = function()
                        -{
                        -	if (this.resize != null)
                        -	{
                        -		return this.resize.style.display != 'none';
                        -	}
                        -	
                        -	return false;
                        -};
                        -
                        -/**
                        - * Function: setResizable
                        - * 
                        - * Sets if the window should be resizable. To avoid interference with some
                        - * built-in features of IE10 and later, the use of the following code is
                        - * recommended if there are resizable s in the page:
                        - * 
                        - * (code)
                        - * if (mxClient.IS_POINTER)
                        - * {
                        - *   document.body.style.msTouchAction = 'none';
                        - * }
                        - * (end)
                        - */
                        -mxWindow.prototype.setResizable = function(resizable)
                        -{
                        -	if (resizable)
                        -	{
                        -		if (this.resize == null)
                        -		{
                        -			this.resize = document.createElement('img');
                        -			this.resize.style.position = 'absolute';
                        -			this.resize.style.bottom = '2px';
                        -			this.resize.style.right = '2px';
                        -
                        -			this.resize.setAttribute('src', this.resizeImage);
                        -			this.resize.style.cursor = 'nw-resize';
                        -			
                        -			var startX = null;
                        -			var startY = null;
                        -			var width = null;
                        -			var height = null;
                        -			
                        -			var start = mxUtils.bind(this, function(evt)
                        -			{
                        -				// LATER: pointerdown starting on border of resize does start
                        -				// the drag operation but does not fire consecutive events via
                        -				// one of the listeners below (does pan instead).
                        -				// Workaround: document.body.style.msTouchAction = 'none'
                        -				this.activate();
                        -				startX = mxEvent.getClientX(evt);
                        -				startY = mxEvent.getClientY(evt);
                        -				width = this.div.offsetWidth;
                        -				height = this.div.offsetHeight;
                        -				
                        -				mxEvent.addGestureListeners(document, null, dragHandler, dropHandler);
                        -				this.fireEvent(new mxEventObject(mxEvent.RESIZE_START, 'event', evt));
                        -				mxEvent.consume(evt);
                        -			});
                        -
                        -			// Adds a temporary pair of listeners to intercept
                        -			// the gesture event in the document
                        -			var dragHandler = mxUtils.bind(this, function(evt)
                        -			{
                        -				if (startX != null && startY != null)
                        -				{
                        -					var dx = mxEvent.getClientX(evt) - startX;
                        -					var dy = mxEvent.getClientY(evt) - startY;
                        -	
                        -					this.setSize(width + dx, height + dy);
                        -	
                        -					this.fireEvent(new mxEventObject(mxEvent.RESIZE, 'event', evt));
                        -					mxEvent.consume(evt);
                        -				}
                        -			});
                        -			
                        -			var dropHandler = mxUtils.bind(this, function(evt)
                        -			{
                        -				if (startX != null && startY != null)
                        -				{
                        -					startX = null;
                        -					startY = null;
                        -					mxEvent.removeGestureListeners(document, null, dragHandler, dropHandler);
                        -					this.fireEvent(new mxEventObject(mxEvent.RESIZE_END, 'event', evt));
                        -					mxEvent.consume(evt);
                        -				}
                        -			});
                        -			
                        -			mxEvent.addGestureListeners(this.resize, start, dragHandler, dropHandler);
                        -			this.div.appendChild(this.resize);
                        -		}
                        -		else 
                        -		{
                        -			this.resize.style.display = 'inline';
                        -		}
                        -	}
                        -	else if (this.resize != null)
                        -	{
                        -		this.resize.style.display = 'none';
                        -	}
                        -};
                        -	
                        -/**
                        - * Function: setSize
                        - * 
                        - * Sets the size of the window.
                        - */
                        -mxWindow.prototype.setSize = function(width, height)
                        -{
                        -	width = Math.max(this.minimumSize.width, width);
                        -	height = Math.max(this.minimumSize.height, height);
                        -
                        -	// Workaround for table size problems in FF
                        -	if (!mxClient.IS_QUIRKS)
                        -	{
                        -		this.div.style.width =  width + 'px';
                        -		this.div.style.height = height + 'px';
                        -	}
                        -	
                        -	this.table.style.width =  width + 'px';
                        -	this.table.style.height = height + 'px';
                        -
                        -	if (!mxClient.IS_QUIRKS)
                        -	{
                        -		this.contentWrapper.style.height = (this.div.offsetHeight -
                        -			this.title.offsetHeight - this.contentHeightCorrection) + 'px';
                        -	}
                        -};
                        -	
                        -/**
                        - * Function: setMinimizable
                        - * 
                        - * Sets if the window is minimizable.
                        - */
                        -mxWindow.prototype.setMinimizable = function(minimizable)
                        -{
                        -	this.minimize.style.display = (minimizable) ? '' : 'none';
                        -};
                        -
                        -/**
                        - * Function: getMinimumSize
                        - * 
                        - * Returns an  that specifies the size for the minimized window.
                        - * A width or height of 0 means keep the existing width or height. This
                        - * implementation returns the height of the window title and keeps the width.
                        - */
                        -mxWindow.prototype.getMinimumSize = function()
                        -{
                        -	return new mxRectangle(0, 0, 0, this.title.offsetHeight);
                        -};
                        -
                        -/**
                        - * Function: installMinimizeHandler
                        - * 
                        - * Installs the event listeners required for minimizing the window.
                        - */
                        -mxWindow.prototype.installMinimizeHandler = function()
                        -{
                        -	this.minimize = document.createElement('img');
                        -	
                        -	this.minimize.setAttribute('src', this.minimizeImage);
                        -	this.minimize.setAttribute('title', 'Minimize');
                        -	this.minimize.style.cursor = 'pointer';
                        -	this.minimize.style.marginLeft = '2px';
                        -	this.minimize.style.display = 'none';
                        -	
                        -	this.buttons.appendChild(this.minimize);
                        -	
                        -	var minimized = false;
                        -	var maxDisplay = null;
                        -	var height = null;
                        -
                        -	var funct = mxUtils.bind(this, function(evt)
                        -	{
                        -		this.activate();
                        -		
                        -		if (!minimized)
                        -		{
                        -			minimized = true;
                        -			
                        -			this.minimize.setAttribute('src', this.normalizeImage);
                        -			this.minimize.setAttribute('title', 'Normalize');
                        -			this.contentWrapper.style.display = 'none';
                        -			maxDisplay = this.maximize.style.display;
                        -			
                        -			this.maximize.style.display = 'none';
                        -			height = this.table.style.height;
                        -			
                        -			var minSize = this.getMinimumSize();
                        -			
                        -			if (minSize.height > 0)
                        -			{
                        -				if (!mxClient.IS_QUIRKS)
                        -				{
                        -					this.div.style.height = minSize.height + 'px';
                        -				}
                        -				
                        -				this.table.style.height = minSize.height + 'px';
                        -			}
                        -			
                        -			if (minSize.width > 0)
                        -			{
                        -				if (!mxClient.IS_QUIRKS)
                        -				{
                        -					this.div.style.width = minSize.width + 'px';
                        -				}
                        -				
                        -				this.table.style.width = minSize.width + 'px';
                        -			}
                        -			
                        -			if (this.resize != null)
                        -			{
                        -				this.resize.style.visibility = 'hidden';
                        -			}
                        -			
                        -			this.fireEvent(new mxEventObject(mxEvent.MINIMIZE, 'event', evt));
                        -		}
                        -		else
                        -		{
                        -			minimized = false;
                        -			
                        -			this.minimize.setAttribute('src', this.minimizeImage);
                        -			this.minimize.setAttribute('title', 'Minimize');
                        -			this.contentWrapper.style.display = ''; // default
                        -			this.maximize.style.display = maxDisplay;
                        -			
                        -			if (!mxClient.IS_QUIRKS)
                        -			{
                        -				this.div.style.height = height;
                        -			}
                        -			
                        -			this.table.style.height = height;
                        -
                        -			if (this.resize != null)
                        -			{
                        -				this.resize.style.visibility = '';
                        -			}
                        -			
                        -			this.fireEvent(new mxEventObject(mxEvent.NORMALIZE, 'event', evt));
                        -		}
                        -		
                        -		mxEvent.consume(evt);
                        -	});
                        -	
                        -	mxEvent.addGestureListeners(this.minimize, funct);
                        -};
                        -	
                        -/**
                        - * Function: setMaximizable
                        - * 
                        - * Sets if the window is maximizable.
                        - */
                        -mxWindow.prototype.setMaximizable = function(maximizable)
                        -{
                        -	this.maximize.style.display = (maximizable) ? '' : 'none';
                        -};
                        -
                        -/**
                        - * Function: installMaximizeHandler
                        - * 
                        - * Installs the event listeners required for maximizing the window.
                        - */
                        -mxWindow.prototype.installMaximizeHandler = function()
                        -{
                        -	this.maximize = document.createElement('img');
                        -	
                        -	this.maximize.setAttribute('src', this.maximizeImage);
                        -	this.maximize.setAttribute('title', 'Maximize');
                        -	this.maximize.style.cursor = 'default';
                        -	this.maximize.style.marginLeft = '2px';
                        -	this.maximize.style.cursor = 'pointer';
                        -	this.maximize.style.display = 'none';
                        -	
                        -	this.buttons.appendChild(this.maximize);
                        -	
                        -	var maximized = false;
                        -	var x = null;
                        -	var y = null;
                        -	var height = null;
                        -	var width = null;
                        -	var minDisplay = null;
                        -
                        -	var funct = mxUtils.bind(this, function(evt)
                        -	{
                        -		this.activate();
                        -		
                        -		if (this.maximize.style.display != 'none')
                        -		{
                        -			if (!maximized)
                        -			{
                        -				maximized = true;
                        -				
                        -				this.maximize.setAttribute('src', this.normalizeImage);
                        -				this.maximize.setAttribute('title', 'Normalize');
                        -				this.contentWrapper.style.display = '';
                        -				minDisplay = this.minimize.style.display;
                        -				this.minimize.style.display = 'none';
                        -				
                        -				// Saves window state
                        -				x = parseInt(this.div.style.left);
                        -				y = parseInt(this.div.style.top);
                        -				height = this.table.style.height;
                        -				width = this.table.style.width;
                        -
                        -				this.div.style.left = '0px';
                        -				this.div.style.top = '0px';
                        -				var docHeight = Math.max(document.body.clientHeight || 0, document.documentElement.clientHeight || 0);
                        -
                        -				if (!mxClient.IS_QUIRKS)
                        -				{
                        -					this.div.style.width = (document.body.clientWidth - 2) + 'px';
                        -					this.div.style.height = (docHeight - 2) + 'px';
                        -				}
                        -
                        -				this.table.style.width = (document.body.clientWidth - 2) + 'px';
                        -				this.table.style.height = (docHeight - 2) + 'px';
                        -				
                        -				if (this.resize != null)
                        -				{
                        -					this.resize.style.visibility = 'hidden';
                        -				}
                        -
                        -				if (!mxClient.IS_QUIRKS)
                        -				{
                        -					var style = mxUtils.getCurrentStyle(this.contentWrapper);
                        -		
                        -					if (style.overflow == 'auto' || this.resize != null)
                        -					{
                        -						this.contentWrapper.style.height = (this.div.offsetHeight -
                        -							this.title.offsetHeight - this.contentHeightCorrection) + 'px';
                        -					}
                        -				}
                        -
                        -				this.fireEvent(new mxEventObject(mxEvent.MAXIMIZE, 'event', evt));
                        -			}
                        -			else
                        -			{
                        -				maximized = false;
                        -				
                        -				this.maximize.setAttribute('src', this.maximizeImage);
                        -				this.maximize.setAttribute('title', 'Maximize');
                        -				this.contentWrapper.style.display = '';
                        -				this.minimize.style.display = minDisplay;
                        -
                        -				// Restores window state
                        -				this.div.style.left = x+'px';
                        -				this.div.style.top = y+'px';
                        -				
                        -				if (!mxClient.IS_QUIRKS)
                        -				{
                        -					this.div.style.height = height;
                        -					this.div.style.width = width;
                        -
                        -					var style = mxUtils.getCurrentStyle(this.contentWrapper);
                        -		
                        -					if (style.overflow == 'auto' || this.resize != null)
                        -					{
                        -						this.contentWrapper.style.height = (this.div.offsetHeight -
                        -							this.title.offsetHeight - this.contentHeightCorrection) + 'px';
                        -					}
                        -				}
                        -				
                        -				this.table.style.height = height;
                        -				this.table.style.width = width;
                        -
                        -				if (this.resize != null)
                        -				{
                        -					this.resize.style.visibility = '';
                        -				}
                        -				
                        -				this.fireEvent(new mxEventObject(mxEvent.NORMALIZE, 'event', evt));
                        -			}
                        -			
                        -			mxEvent.consume(evt);
                        -		}
                        -	});
                        -	
                        -	mxEvent.addGestureListeners(this.maximize, funct);
                        -	mxEvent.addListener(this.title, 'dblclick', funct);
                        -};
                        -	
                        -/**
                        - * Function: installMoveHandler
                        - * 
                        - * Installs the event listeners required for moving the window.
                        - */
                        -mxWindow.prototype.installMoveHandler = function()
                        -{
                        -	this.title.style.cursor = 'move';
                        -	
                        -	mxEvent.addGestureListeners(this.title,
                        -		mxUtils.bind(this, function(evt)
                        -		{
                        -			var startX = mxEvent.getClientX(evt);
                        -			var startY = mxEvent.getClientY(evt);
                        -			var x = this.getX();
                        -			var y = this.getY();
                        -						
                        -			// Adds a temporary pair of listeners to intercept
                        -			// the gesture event in the document
                        -			var dragHandler = mxUtils.bind(this, function(evt)
                        -			{
                        -				var dx = mxEvent.getClientX(evt) - startX;
                        -				var dy = mxEvent.getClientY(evt) - startY;
                        -				this.setLocation(x + dx, y + dy);
                        -				this.fireEvent(new mxEventObject(mxEvent.MOVE, 'event', evt));
                        -				mxEvent.consume(evt);
                        -			});
                        -			
                        -			var dropHandler = mxUtils.bind(this, function(evt)
                        -			{
                        -				mxEvent.removeGestureListeners(document, null, dragHandler, dropHandler);
                        -				this.fireEvent(new mxEventObject(mxEvent.MOVE_END, 'event', evt));
                        -				mxEvent.consume(evt);
                        -			});
                        -			
                        -			mxEvent.addGestureListeners(document, null, dragHandler, dropHandler);
                        -			this.fireEvent(new mxEventObject(mxEvent.MOVE_START, 'event', evt));
                        -			mxEvent.consume(evt);
                        -		}));
                        -	
                        -	// Disables built-in pan and zoom in IE10 and later
                        -	if (mxClient.IS_POINTER)
                        -	{
                        -		this.title.style.touchAction = 'none';
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setLocation
                        - * 
                        - * Sets the upper, left corner of the window.
                        - */
                        - mxWindow.prototype.setLocation = function(x, y)
                        - {
                        -	this.div.style.left = x + 'px';
                        -	this.div.style.top = y + 'px';
                        - };
                        -
                        -/**
                        - * Function: getX
                        - *
                        - * Returns the current position on the x-axis.
                        - */
                        -mxWindow.prototype.getX = function()
                        -{
                        -	return parseInt(this.div.style.left);
                        -};
                        -
                        -/**
                        - * Function: getY
                        - *
                        - * Returns the current position on the y-axis.
                        - */
                        -mxWindow.prototype.getY = function()
                        -{
                        -	return parseInt(this.div.style.top);
                        -};
                        -
                        -/**
                        - * Function: installCloseHandler
                        - *
                        - * Adds the  as a new image node in  and installs the
                        - *  event.
                        - */
                        -mxWindow.prototype.installCloseHandler = function()
                        -{
                        -	this.closeImg = document.createElement('img');
                        -	
                        -	this.closeImg.setAttribute('src', this.closeImage);
                        -	this.closeImg.setAttribute('title', 'Close');
                        -	this.closeImg.style.marginLeft = '2px';
                        -	this.closeImg.style.cursor = 'pointer';
                        -	this.closeImg.style.display = 'none';
                        -	
                        -	this.buttons.appendChild(this.closeImg);
                        -
                        -	mxEvent.addGestureListeners(this.closeImg,
                        -		mxUtils.bind(this, function(evt)
                        -		{
                        -			this.fireEvent(new mxEventObject(mxEvent.CLOSE, 'event', evt));
                        -			
                        -			if (this.destroyOnClose)
                        -			{
                        -				this.destroy();
                        -			}
                        -			else
                        -			{
                        -				this.setVisible(false);
                        -			}
                        -			
                        -			mxEvent.consume(evt);
                        -		}));
                        -};
                        -
                        -/**
                        - * Function: setImage
                        - * 
                        - * Sets the image associated with the window.
                        - * 
                        - * Parameters:
                        - * 
                        - * image - URL of the image to be used.
                        - */
                        -mxWindow.prototype.setImage = function(image)
                        -{
                        -	this.image = document.createElement('img');
                        -	this.image.setAttribute('src', image);
                        -	this.image.setAttribute('align', 'left');
                        -	this.image.style.marginRight = '4px';
                        -	this.image.style.marginLeft = '0px';
                        -	this.image.style.marginTop = '-2px';
                        -	
                        -	this.title.insertBefore(this.image, this.title.firstChild);
                        -};
                        -
                        -/**
                        - * Function: setClosable
                        - * 
                        - * Sets the image associated with the window.
                        - * 
                        - * Parameters:
                        - * 
                        - * closable - Boolean specifying if the window should be closable.
                        - */
                        -mxWindow.prototype.setClosable = function(closable)
                        -{
                        -	this.closeImg.style.display = (closable) ? '' : 'none';
                        -};
                        -
                        -/**
                        - * Function: isVisible
                        - * 
                        - * Returns true if the window is visible.
                        - */
                        -mxWindow.prototype.isVisible = function()
                        -{
                        -	if (this.div != null)
                        -	{
                        -		return this.div.style.display != 'none';
                        -	}
                        -	
                        -	return false;
                        -};
                        -
                        -/**
                        - * Function: setVisible
                        - *
                        - * Shows or hides the window depending on the given flag.
                        - * 
                        - * Parameters:
                        - * 
                        - * visible - Boolean indicating if the window should be made visible.
                        - */
                        -mxWindow.prototype.setVisible = function(visible)
                        -{
                        -	if (this.div != null && this.isVisible() != visible)
                        -	{
                        -		if (visible)
                        -		{
                        -			this.show();
                        -		}
                        -		else
                        -		{
                        -			this.hide();
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: show
                        - *
                        - * Shows the window.
                        - */
                        -mxWindow.prototype.show = function()
                        -{
                        -	this.div.style.display = '';
                        -	this.activate();
                        -	
                        -	var style = mxUtils.getCurrentStyle(this.contentWrapper);
                        -	
                        -	if (!mxClient.IS_QUIRKS && (style.overflow == 'auto' || this.resize != null) &&
                        -		this.contentWrapper.style.display != 'none')
                        -	{
                        -		this.contentWrapper.style.height = (this.div.offsetHeight -
                        -				this.title.offsetHeight - this.contentHeightCorrection) + 'px';
                        -	}
                        -	
                        -	this.fireEvent(new mxEventObject(mxEvent.SHOW));
                        -};
                        -
                        -/**
                        - * Function: hide
                        - *
                        - * Hides the window.
                        - */
                        -mxWindow.prototype.hide = function()
                        -{
                        -	this.div.style.display = 'none';
                        -	this.fireEvent(new mxEventObject(mxEvent.HIDE));
                        -};
                        -
                        -/**
                        - * Function: destroy
                        - *
                        - * Destroys the window and removes all associated resources. Fires a
                        - *  event prior to destroying the window.
                        - */
                        -mxWindow.prototype.destroy = function()
                        -{
                        -	this.fireEvent(new mxEventObject(mxEvent.DESTROY));
                        -	
                        -	if (this.div != null)
                        -	{
                        -		mxEvent.release(this.div);
                        -		this.div.parentNode.removeChild(this.div);
                        -		this.div = null;
                        -	}
                        -	
                        -	this.title = null;
                        -	this.content = null;
                        -	this.contentWrapper = null;
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxForm
                        - * 
                        - * A simple class for creating HTML forms.
                        - * 
                        - * Constructor: mxForm
                        - * 
                        - * Creates a HTML table using the specified classname.
                        - */
                        -function mxForm(className)
                        -{
                        -	this.table = document.createElement('table');
                        -	this.table.className = className;
                        -	this.body = document.createElement('tbody');
                        -	
                        -	this.table.appendChild(this.body);
                        -};
                        -
                        -/**
                        - * Variable: table
                        - * 
                        - * Holds the DOM node that represents the table.
                        - */
                        -mxForm.prototype.table = null;
                        -
                        -/**
                        - * Variable: body
                        - * 
                        - * Holds the DOM node that represents the tbody (table body). New rows
                        - * can be added to this object using DOM API.
                        - */
                        -mxForm.prototype.body = false;
                        -
                        -/**
                        - * Function: getTable
                        - * 
                        - * Returns the table that contains this form.
                        - */
                        -mxForm.prototype.getTable = function()
                        -{
                        -	return this.table;
                        -};
                        -
                        -/**
                        - * Function: addButtons
                        - * 
                        - * Helper method to add an OK and Cancel button using the respective
                        - * functions.
                        - */
                        -mxForm.prototype.addButtons = function(okFunct, cancelFunct)
                        -{
                        -	var tr = document.createElement('tr');
                        -	var td = document.createElement('td');
                        -	tr.appendChild(td);
                        -	td = document.createElement('td');
                        -
                        -	// Adds the ok button
                        -	var button = document.createElement('button');
                        -	mxUtils.write(button, mxResources.get('ok') || 'OK');
                        -	td.appendChild(button);
                        -
                        -	mxEvent.addListener(button, 'click', function()
                        -	{
                        -		okFunct();
                        -	});
                        -	
                        -	// Adds the cancel button
                        -	button = document.createElement('button');
                        -	mxUtils.write(button, mxResources.get('cancel') || 'Cancel');
                        -	td.appendChild(button);
                        -	
                        -	mxEvent.addListener(button, 'click', function()
                        -	{
                        -		cancelFunct();
                        -	});
                        -	
                        -	tr.appendChild(td);
                        -	this.body.appendChild(tr);
                        -};
                        -
                        -/**
                        - * Function: addText
                        - * 
                        - * Adds an input for the given name, type and value and returns it.
                        - */
                        -mxForm.prototype.addText = function(name, value, type)
                        -{
                        -	var input = document.createElement('input');
                        -	
                        -	input.setAttribute('type', type || 'text');
                        -	input.value = value;
                        -	
                        -	return this.addField(name, input);
                        -};
                        -
                        -/**
                        - * Function: addCheckbox
                        - * 
                        - * Adds a checkbox for the given name and value and returns the textfield.
                        - */
                        -mxForm.prototype.addCheckbox = function(name, value)
                        -{
                        -	var input = document.createElement('input');
                        -	
                        -	input.setAttribute('type', 'checkbox');
                        -	this.addField(name, input);
                        -
                        -	// IE can only change the checked value if the input is inside the DOM
                        -	if (value)
                        -	{
                        -		input.checked = true;
                        -	}
                        -
                        -	return input;
                        -};
                        -
                        -/**
                        - * Function: addTextarea
                        - * 
                        - * Adds a textarea for the given name and value and returns the textarea.
                        - */
                        -mxForm.prototype.addTextarea = function(name, value, rows)
                        -{
                        -	var input = document.createElement('textarea');
                        -	
                        -	if (mxClient.IS_NS)
                        -	{
                        -		rows--;
                        -	}
                        -	
                        -	input.setAttribute('rows', rows || 2);
                        -	input.value = value;
                        -	
                        -	return this.addField(name, input);
                        -};
                        -
                        -/**
                        - * Function: addCombo
                        - * 
                        - * Adds a combo for the given name and returns the combo.
                        - */
                        -mxForm.prototype.addCombo = function(name, isMultiSelect, size)
                        -{
                        -	var select = document.createElement('select');
                        -	
                        -	if (size != null)
                        -	{
                        -		select.setAttribute('size', size);
                        -	}
                        -	
                        -	if (isMultiSelect)
                        -	{
                        -		select.setAttribute('multiple', 'true');
                        -	}
                        -	
                        -	return this.addField(name, select);
                        -};
                        -
                        -/**
                        - * Function: addOption
                        - * 
                        - * Adds an option for the given label to the specified combo.
                        - */
                        -mxForm.prototype.addOption = function(combo, label, value, isSelected)
                        -{
                        -	var option = document.createElement('option');
                        -	
                        -	mxUtils.writeln(option, label);
                        -	option.setAttribute('value', value);
                        -	
                        -	if (isSelected)
                        -	{
                        -		option.setAttribute('selected', isSelected);
                        -	}
                        -	
                        -	combo.appendChild(option);
                        -};
                        -
                        -/**
                        - * Function: addField
                        - * 
                        - * Adds a new row with the name and the input field in two columns and
                        - * returns the given input.
                        - */
                        -mxForm.prototype.addField = function(name, input)
                        -{
                        -	var tr = document.createElement('tr');
                        -	var td = document.createElement('td');
                        -	mxUtils.write(td, name);
                        -	tr.appendChild(td);
                        -	
                        -	td = document.createElement('td');
                        -	td.appendChild(input);
                        -	tr.appendChild(td);
                        -	this.body.appendChild(tr);
                        -	
                        -	return input;
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxImage
                        - *
                        - * Encapsulates the URL, width and height of an image.
                        - * 
                        - * Constructor: mxImage
                        - * 
                        - * Constructs a new image.
                        - */
                        -function mxImage(src, width, height)
                        -{
                        -	this.src = src;
                        -	this.width = width;
                        -	this.height = height;
                        -};
                        -
                        -/**
                        - * Variable: src
                        - *
                        - * String that specifies the URL of the image.
                        - */
                        -mxImage.prototype.src = null;
                        -
                        -/**
                        - * Variable: width
                        - *
                        - * Integer that specifies the width of the image.
                        - */
                        -mxImage.prototype.width = null;
                        -
                        -/**
                        - * Variable: height
                        - *
                        - * Integer that specifies the height of the image.
                        - */
                        -mxImage.prototype.height = null;
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxDivResizer
                        - * 
                        - * Maintains the size of a div element in Internet Explorer. This is a
                        - * workaround for the right and bottom style being ignored in IE.
                        - * 
                        - * If you need a div to cover the scrollwidth and -height of a document,
                        - * then you can use this class as follows:
                        - * 
                        - * (code)
                        - * var resizer = new mxDivResizer(background);
                        - * resizer.getDocumentHeight = function()
                        - * {
                        - *   return document.body.scrollHeight;
                        - * }
                        - * resizer.getDocumentWidth = function()
                        - * {
                        - *   return document.body.scrollWidth;
                        - * }
                        - * resizer.resize();
                        - * (end)
                        - * 
                        - * Constructor: mxDivResizer
                        - * 
                        - * Constructs an object that maintains the size of a div
                        - * element when the window is being resized. This is only
                        - * required for Internet Explorer as it ignores the respective
                        - * stylesheet information for DIV elements.
                        - * 
                        - * Parameters:
                        - * 
                        - * div - Reference to the DOM node whose size should be maintained.
                        - * container - Optional Container that contains the div. Default is the
                        - * window.
                        - */
                        -function mxDivResizer(div, container)
                        -{
                        -	if (div.nodeName.toLowerCase() == 'div')
                        -	{
                        -		if (container == null)
                        -		{
                        -			container = window;
                        -		}
                        -
                        -		this.div = div;
                        -		var style = mxUtils.getCurrentStyle(div);
                        -		
                        -		if (style != null)
                        -		{
                        -			this.resizeWidth = style.width == 'auto';
                        -			this.resizeHeight = style.height == 'auto';
                        -		}
                        -		
                        -		mxEvent.addListener(container, 'resize',
                        -			mxUtils.bind(this, function(evt)
                        -			{
                        -				if (!this.handlingResize)
                        -				{
                        -					this.handlingResize = true;
                        -					this.resize();
                        -					this.handlingResize = false;
                        -				}
                        -			})
                        -		);
                        -		
                        -		this.resize();
                        -	}
                        -};
                        -
                        -/**
                        - * Function: resizeWidth
                        - * 
                        - * Boolean specifying if the width should be updated.
                        - */
                        -mxDivResizer.prototype.resizeWidth = true;
                        -
                        -/**
                        - * Function: resizeHeight
                        - * 
                        - * Boolean specifying if the height should be updated.
                        - */
                        -mxDivResizer.prototype.resizeHeight = true;
                        -
                        -/**
                        - * Function: handlingResize
                        - * 
                        - * Boolean specifying if the width should be updated.
                        - */
                        -mxDivResizer.prototype.handlingResize = false;
                        -
                        -/**
                        - * Function: resize
                        - * 
                        - * Updates the style of the DIV after the window has been resized.
                        - */
                        -mxDivResizer.prototype.resize = function()
                        -{
                        -	var w = this.getDocumentWidth();
                        -	var h = this.getDocumentHeight();
                        -
                        -	var l = parseInt(this.div.style.left);
                        -	var r = parseInt(this.div.style.right);
                        -	var t = parseInt(this.div.style.top);
                        -	var b = parseInt(this.div.style.bottom);
                        -	
                        -	if (this.resizeWidth &&
                        -		!isNaN(l) &&
                        -		!isNaN(r) &&
                        -		l >= 0 &&
                        -		r >= 0 &&
                        -		w - r - l > 0)
                        -	{
                        -		this.div.style.width = (w - r - l)+'px';
                        -	}
                        -	
                        -	if (this.resizeHeight &&
                        -		!isNaN(t) &&
                        -		!isNaN(b) &&
                        -		t >= 0 &&
                        -		b >= 0 &&
                        -		h - t - b > 0)
                        -	{
                        -		this.div.style.height = (h - t - b)+'px';
                        -	}
                        -};
                        -
                        -/**
                        - * Function: getDocumentWidth
                        - * 
                        - * Hook for subclassers to return the width of the document (without
                        - * scrollbars).
                        - */
                        -mxDivResizer.prototype.getDocumentWidth = function()
                        -{
                        -	return document.body.clientWidth;
                        -};
                        -
                        -/**
                        - * Function: getDocumentHeight
                        - * 
                        - * Hook for subclassers to return the height of the document (without
                        - * scrollbars).
                        - */
                        -mxDivResizer.prototype.getDocumentHeight = function()
                        -{
                        -	return document.body.clientHeight;
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxDragSource
                        - * 
                        - * Wrapper to create a drag source from a DOM element so that the element can
                        - * be dragged over a graph and dropped into the graph as a new cell.
                        - * 
                        - * Problem is that in the dropHandler the current preview location is not
                        - * available, so the preview and the dropHandler must match.
                        - * 
                        - * Constructor: mxDragSource
                        - * 
                        - * Constructs a new drag source for the given element.
                        - */
                        -function mxDragSource(element, dropHandler)
                        -{
                        -	this.element = element;
                        -	this.dropHandler = dropHandler;
                        -	
                        -	// Handles a drag gesture on the element
                        -	mxEvent.addGestureListeners(element, mxUtils.bind(this, function(evt)
                        -	{
                        -		this.mouseDown(evt);
                        -	}));
                        -	
                        -	// Prevents native drag and drop
                        -	mxEvent.addListener(element, 'dragstart', function(evt)
                        -	{
                        -		mxEvent.consume(evt);
                        -	});
                        -	
                        -	this.eventConsumer = function(sender, evt)
                        -	{
                        -		var evtName = evt.getProperty('eventName');
                        -		var me = evt.getProperty('event');
                        -		
                        -		if (evtName != mxEvent.MOUSE_DOWN)
                        -		{
                        -			me.consume();
                        -		}
                        -	};
                        -};
                        -
                        -/**
                        - * Variable: element
                        - *
                        - * Reference to the DOM node which was made draggable.
                        - */
                        -mxDragSource.prototype.element = null;
                        -
                        -/**
                        - * Variable: dropHandler
                        - *
                        - * Holds the DOM node that is used to represent the drag preview. If this is
                        - * null then the source element will be cloned and used for the drag preview.
                        - */
                        -mxDragSource.prototype.dropHandler = null;
                        -
                        -/**
                        - * Variable: dragOffset
                        - *
                        - *  that specifies the offset of the . Default is null.
                        - */
                        -mxDragSource.prototype.dragOffset = null;
                        -
                        -/**
                        - * Variable: dragElement
                        - *
                        - * Holds the DOM node that is used to represent the drag preview. If this is
                        - * null then the source element will be cloned and used for the drag preview.
                        - */
                        -mxDragSource.prototype.dragElement = null;
                        -
                        -/**
                        - * Variable: previewElement
                        - *
                        - * Optional  that specifies the unscaled size of the preview.
                        - */
                        -mxDragSource.prototype.previewElement = null;
                        -
                        -/**
                        - * Variable: enabled
                        - *
                        - * Specifies if this drag source is enabled. Default is true.
                        - */
                        -mxDragSource.prototype.enabled = true;
                        -
                        -/**
                        - * Variable: currentGraph
                        - *
                        - * Reference to the  that is the current drop target.
                        - */
                        -mxDragSource.prototype.currentGraph = null;
                        -
                        -/**
                        - * Variable: currentDropTarget
                        - *
                        - * Holds the current drop target under the mouse.
                        - */
                        -mxDragSource.prototype.currentDropTarget = null;
                        -
                        -/**
                        - * Variable: currentPoint
                        - *
                        - * Holds the current drop location.
                        - */
                        -mxDragSource.prototype.currentPoint = null;
                        -
                        -/**
                        - * Variable: currentGuide
                        - *
                        - * Holds an  for the  if  is not null.
                        - */
                        -mxDragSource.prototype.currentGuide = null;
                        -
                        -/**
                        - * Variable: currentGuide
                        - *
                        - * Holds an  for the  if  is not null.
                        - */
                        -mxDragSource.prototype.currentHighlight = null;
                        -
                        -/**
                        - * Variable: autoscroll
                        - *
                        - * Specifies if the graph should scroll automatically. Default is true.
                        - */
                        -mxDragSource.prototype.autoscroll = true;
                        -
                        -/**
                        - * Variable: guidesEnabled
                        - *
                        - * Specifies if  should be enabled. Default is true.
                        - */
                        -mxDragSource.prototype.guidesEnabled = true;
                        -
                        -/**
                        - * Variable: gridEnabled
                        - *
                        - * Specifies if the grid should be allowed. Default is true.
                        - */
                        -mxDragSource.prototype.gridEnabled = true;
                        -
                        -/**
                        - * Variable: highlightDropTargets
                        - *
                        - * Specifies if drop targets should be highlighted. Default is true.
                        - */
                        -mxDragSource.prototype.highlightDropTargets = true;
                        -
                        -/**
                        - * Variable: dragElementZIndex
                        - * 
                        - * ZIndex for the drag element. Default is 100.
                        - */
                        -mxDragSource.prototype.dragElementZIndex = 100;
                        -
                        -/**
                        - * Variable: dragElementOpacity
                        - * 
                        - * Opacity of the drag element in %. Default is 70.
                        - */
                        -mxDragSource.prototype.dragElementOpacity = 70;
                        -
                        -/**
                        - * Variable: checkEventSource
                        - * 
                        - * Whether the event source should be checked in . Default
                        - * is true.
                        - */
                        -mxDragSource.prototype.checkEventSource = true;
                        -
                        -/**
                        - * Function: isEnabled
                        - * 
                        - * Returns .
                        - */
                        -mxDragSource.prototype.isEnabled = function()
                        -{
                        -	return this.enabled;
                        -};
                        -
                        -/**
                        - * Function: setEnabled
                        - * 
                        - * Sets .
                        - */
                        -mxDragSource.prototype.setEnabled = function(value)
                        -{
                        -	this.enabled = value;
                        -};
                        -
                        -/**
                        - * Function: isGuidesEnabled
                        - * 
                        - * Returns .
                        - */
                        -mxDragSource.prototype.isGuidesEnabled = function()
                        -{
                        -	return this.guidesEnabled;
                        -};
                        -
                        -/**
                        - * Function: setGuidesEnabled
                        - * 
                        - * Sets .
                        - */
                        -mxDragSource.prototype.setGuidesEnabled = function(value)
                        -{
                        -	this.guidesEnabled = value;
                        -};
                        -
                        -/**
                        - * Function: isGridEnabled
                        - * 
                        - * Returns .
                        - */
                        -mxDragSource.prototype.isGridEnabled = function()
                        -{
                        -	return this.gridEnabled;
                        -};
                        -
                        -/**
                        - * Function: setGridEnabled
                        - * 
                        - * Sets .
                        - */
                        -mxDragSource.prototype.setGridEnabled = function(value)
                        -{
                        -	this.gridEnabled = value;
                        -};
                        -
                        -/**
                        - * Function: getGraphForEvent
                        - * 
                        - * Returns the graph for the given mouse event. This implementation returns
                        - * null.
                        - */
                        -mxDragSource.prototype.getGraphForEvent = function(evt)
                        -{
                        -	return null;
                        -};
                        -
                        -/**
                        - * Function: getDropTarget
                        - * 
                        - * Returns the drop target for the given graph and coordinates. This
                        - * implementation uses .
                        - */
                        -mxDragSource.prototype.getDropTarget = function(graph, x, y, evt)
                        -{
                        -	return graph.getCellAt(x, y);
                        -};
                        -
                        -/**
                        - * Function: createDragElement
                        - * 
                        - * Creates and returns a clone of the  or the 
                        - * if the former is not defined.
                        - */
                        -mxDragSource.prototype.createDragElement = function(evt)
                        -{
                        -	return this.element.cloneNode(true);
                        -};
                        -
                        -/**
                        - * Function: createPreviewElement
                        - * 
                        - * Creates and returns an element which can be used as a preview in the given
                        - * graph.
                        - */
                        -mxDragSource.prototype.createPreviewElement = function(graph)
                        -{
                        -	return null;
                        -};
                        -
                        -/**
                        - * Function: isActive
                        - * 
                        - * Returns true if this drag source is active.
                        - */
                        -mxDragSource.prototype.isActive = function()
                        -{
                        -	return this.mouseMoveHandler != null;
                        -};
                        -
                        -/**
                        - * Function: reset
                        - * 
                        - * Stops and removes everything and restores the state of the object.
                        - */
                        -mxDragSource.prototype.reset = function()
                        -{
                        -	if (this.currentGraph != null)
                        -	{
                        -		this.dragExit(this.currentGraph);
                        -		this.currentGraph = null;
                        -	}
                        -	
                        -	this.removeDragElement();
                        -	this.removeListeners();
                        -	this.stopDrag();
                        -};
                        -
                        -/**
                        - * Function: mouseDown
                        - * 
                        - * Returns the drop target for the given graph and coordinates. This
                        - * implementation uses .
                        - * 
                        - * To ignore popup menu events for a drag source, this function can be
                        - * overridden as follows.
                        - * 
                        - * (code)
                        - * var mouseDown = dragSource.mouseDown;
                        - * 
                        - * dragSource.mouseDown = function(evt)
                        - * {
                        - *   if (!mxEvent.isPopupTrigger(evt))
                        - *   {
                        - *     mouseDown.apply(this, arguments);
                        - *   }
                        - * };
                        - * (end)
                        - */
                        -mxDragSource.prototype.mouseDown = function(evt)
                        -{
                        -	if (this.enabled && !mxEvent.isConsumed(evt) && this.mouseMoveHandler == null)
                        -	{
                        -		this.startDrag(evt);
                        -		this.mouseMoveHandler = mxUtils.bind(this, this.mouseMove);
                        -		this.mouseUpHandler = mxUtils.bind(this, this.mouseUp);		
                        -		mxEvent.addGestureListeners(document, null, this.mouseMoveHandler, this.mouseUpHandler);
                        -		
                        -		if (mxClient.IS_TOUCH && !mxEvent.isMouseEvent(evt))
                        -		{
                        -			this.eventSource = mxEvent.getSource(evt);
                        -			mxEvent.addGestureListeners(this.eventSource, null, this.mouseMoveHandler, this.mouseUpHandler);
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: startDrag
                        - * 
                        - * Creates the  using .
                        - */
                        -mxDragSource.prototype.startDrag = function(evt)
                        -{
                        -	this.dragElement = this.createDragElement(evt);
                        -	this.dragElement.style.position = 'absolute';
                        -	this.dragElement.style.zIndex = this.dragElementZIndex;
                        -	mxUtils.setOpacity(this.dragElement, this.dragElementOpacity);
                        -
                        -	if (this.checkEventSource && mxClient.IS_SVG)
                        -	{
                        -		this.dragElement.style.pointerEvents = 'none';
                        -	}
                        -};
                        -
                        -/**
                        - * Function: stopDrag
                        - * 
                        - * Invokes .
                        - */
                        -mxDragSource.prototype.stopDrag = function()
                        -{
                        -	// LATER: This used to have a mouse event. If that is still needed we need to add another
                        -	// final call to the DnD protocol to add a cleanup step in the case of escape press, which
                        -	// is not associated with a mouse event and which currently calles this method.
                        -	this.removeDragElement();
                        -};
                        -
                        -/**
                        - * Function: removeDragElement
                        - * 
                        - * Removes and destroys the .
                        - */
                        -mxDragSource.prototype.removeDragElement = function()
                        -{
                        -	if (this.dragElement != null)
                        -	{
                        -		if (this.dragElement.parentNode != null)
                        -		{
                        -			this.dragElement.parentNode.removeChild(this.dragElement);
                        -		}
                        -		
                        -		this.dragElement = null;
                        -	}
                        -};
                        -
                        -/**
                        - * Function: getElementForEvent
                        - * 
                        - * Returns the topmost element under the given event.
                        - */
                        -mxDragSource.prototype.getElementForEvent = function(evt)
                        -{
                        -	return ((mxEvent.isTouchEvent(evt) || mxEvent.isPenEvent(evt)) ?
                        -			document.elementFromPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)) :
                        -				mxEvent.getSource(evt));
                        -};
                        -
                        -/**
                        - * Function: graphContainsEvent
                        - * 
                        - * Returns true if the given graph contains the given event.
                        - */
                        -mxDragSource.prototype.graphContainsEvent = function(graph, evt)
                        -{
                        -	var x = mxEvent.getClientX(evt);
                        -	var y = mxEvent.getClientY(evt);
                        -	var offset = mxUtils.getOffset(graph.container);
                        -	var origin = mxUtils.getScrollOrigin();
                        -	var elt = this.getElementForEvent(evt);
                        -	
                        -	if (this.checkEventSource)
                        -	{
                        -		while (elt != null && elt != graph.container)
                        -		{
                        -			elt = elt.parentNode;
                        -		}
                        -	}
                        -
                        -	// Checks if event is inside the bounds of the graph container
                        -	return elt != null && x >= offset.x - origin.x && y >= offset.y - origin.y &&
                        -		x <= offset.x - origin.x + graph.container.offsetWidth &&
                        -		y <= offset.y - origin.y + graph.container.offsetHeight;
                        -};
                        -
                        -/**
                        - * Function: mouseMove
                        - * 
                        - * Gets the graph for the given event using , updates the
                        - * , calling  and  on the new and old graph,
                        - * respectively, and invokes  if  is not null.
                        - */
                        -mxDragSource.prototype.mouseMove = function(evt)
                        -{
                        -	var graph = this.getGraphForEvent(evt);
                        -	
                        -	// Checks if event is inside the bounds of the graph container
                        -	if (graph != null && !this.graphContainsEvent(graph, evt))
                        -	{
                        -		graph = null;
                        -	}
                        -
                        -	if (graph != this.currentGraph)
                        -	{
                        -		if (this.currentGraph != null)
                        -		{
                        -			this.dragExit(this.currentGraph, evt);
                        -		}
                        -		
                        -		this.currentGraph = graph;
                        -		
                        -		if (this.currentGraph != null)
                        -		{
                        -			this.dragEnter(this.currentGraph, evt);
                        -		}
                        -	}
                        -	
                        -	if (this.currentGraph != null)
                        -	{
                        -		this.dragOver(this.currentGraph, evt);
                        -	}
                        -
                        -	if (this.dragElement != null && (this.previewElement == null || this.previewElement.style.visibility != 'visible'))
                        -	{
                        -		var x = mxEvent.getClientX(evt);
                        -		var y = mxEvent.getClientY(evt);
                        -		
                        -		if (this.dragElement.parentNode == null)
                        -		{
                        -			document.body.appendChild(this.dragElement);
                        -		}
                        -
                        -		this.dragElement.style.visibility = 'visible';
                        -		
                        -		if (this.dragOffset != null)
                        -		{
                        -			x += this.dragOffset.x;
                        -			y += this.dragOffset.y;
                        -		}
                        -		
                        -		var offset = mxUtils.getDocumentScrollOrigin(document);
                        -		
                        -		this.dragElement.style.left = (x + offset.x) + 'px';
                        -		this.dragElement.style.top = (y + offset.y) + 'px';
                        -	}
                        -	else if (this.dragElement != null)
                        -	{
                        -		this.dragElement.style.visibility = 'hidden';
                        -	}
                        -	
                        -	mxEvent.consume(evt);
                        -};
                        -
                        -/**
                        - * Function: mouseUp
                        - * 
                        - * Processes the mouse up event and invokes ,  and 
                        - * as required.
                        - */
                        -mxDragSource.prototype.mouseUp = function(evt)
                        -{
                        -	if (this.currentGraph != null)
                        -	{
                        -		if (this.currentPoint != null && (this.previewElement == null ||
                        -			this.previewElement.style.visibility != 'hidden'))
                        -		{
                        -			var scale = this.currentGraph.view.scale;
                        -			var tr = this.currentGraph.view.translate;
                        -			var x = this.currentPoint.x / scale - tr.x;
                        -			var y = this.currentPoint.y / scale - tr.y;
                        -			
                        -			this.drop(this.currentGraph, evt, this.currentDropTarget, x, y);
                        -		}
                        -		
                        -		this.dragExit(this.currentGraph);
                        -		this.currentGraph = null;
                        -	}
                        -
                        -	this.stopDrag();
                        -	this.removeListeners();
                        -	
                        -	mxEvent.consume(evt);
                        -};
                        -
                        -/**
                        - * Function: removeListeners
                        - * 
                        - * Actives the given graph as a drop target.
                        - */
                        -mxDragSource.prototype.removeListeners = function()
                        -{
                        -	if (this.eventSource != null)
                        -	{
                        -		mxEvent.removeGestureListeners(this.eventSource, null, this.mouseMoveHandler, this.mouseUpHandler);
                        -		this.eventSource = null;
                        -	}
                        -	
                        -	mxEvent.removeGestureListeners(document, null, this.mouseMoveHandler, this.mouseUpHandler);
                        -	this.mouseMoveHandler = null;
                        -	this.mouseUpHandler = null;
                        -};
                        -
                        -/**
                        - * Function: dragEnter
                        - * 
                        - * Actives the given graph as a drop target.
                        - */
                        -mxDragSource.prototype.dragEnter = function(graph, evt)
                        -{
                        -	graph.isMouseDown = true;
                        -	graph.isMouseTrigger = mxEvent.isMouseEvent(evt);
                        -	this.previewElement = this.createPreviewElement(graph);
                        -	
                        -	if (this.previewElement != null && this.checkEventSource && mxClient.IS_SVG)
                        -	{
                        -		this.previewElement.style.pointerEvents = 'none';
                        -	}
                        -	
                        -	// Guide is only needed if preview element is used
                        -	if (this.isGuidesEnabled() && this.previewElement != null)
                        -	{
                        -		this.currentGuide = new mxGuide(graph, graph.graphHandler.getGuideStates());
                        -	}
                        -	
                        -	if (this.highlightDropTargets)
                        -	{
                        -		this.currentHighlight = new mxCellHighlight(graph, mxConstants.DROP_TARGET_COLOR);
                        -	}
                        -	
                        -	// Consumes all events in the current graph before they are fired
                        -	graph.addListener(mxEvent.FIRE_MOUSE_EVENT, this.eventConsumer);
                        -};
                        -
                        -/**
                        - * Function: dragExit
                        - * 
                        - * Deactivates the given graph as a drop target.
                        - */
                        -mxDragSource.prototype.dragExit = function(graph, evt)
                        -{
                        -	this.currentDropTarget = null;
                        -	this.currentPoint = null;
                        -	graph.isMouseDown = false;
                        -	
                        -	// Consumes all events in the current graph before they are fired
                        -	graph.removeListener(this.eventConsumer);
                        -	
                        -	if (this.previewElement != null)
                        -	{
                        -		if (this.previewElement.parentNode != null)
                        -		{
                        -			this.previewElement.parentNode.removeChild(this.previewElement);
                        -		}
                        -		
                        -		this.previewElement = null;
                        -	}
                        -	
                        -	if (this.currentGuide != null)
                        -	{
                        -		this.currentGuide.destroy();
                        -		this.currentGuide = null;
                        -	}
                        -	
                        -	if (this.currentHighlight != null)
                        -	{
                        -		this.currentHighlight.destroy();
                        -		this.currentHighlight = null;
                        -	}
                        -};
                        -
                        -/**
                        - * Function: dragOver
                        - * 
                        - * Implements autoscroll, updates the , highlights any drop
                        - * targets and updates the preview.
                        - */
                        -mxDragSource.prototype.dragOver = function(graph, evt)
                        -{
                        -	var offset = mxUtils.getOffset(graph.container);
                        -	var origin = mxUtils.getScrollOrigin(graph.container);
                        -	var x = mxEvent.getClientX(evt) - offset.x + origin.x - graph.panDx;
                        -	var y = mxEvent.getClientY(evt) - offset.y + origin.y - graph.panDy;
                        -
                        -	if (graph.autoScroll && (this.autoscroll == null || this.autoscroll))
                        -	{
                        -		graph.scrollPointToVisible(x, y, graph.autoExtend);
                        -	}
                        -
                        -	// Highlights the drop target under the mouse
                        -	if (this.currentHighlight != null && graph.isDropEnabled())
                        -	{
                        -		this.currentDropTarget = this.getDropTarget(graph, x, y, evt);
                        -		var state = graph.getView().getState(this.currentDropTarget);
                        -		this.currentHighlight.highlight(state);
                        -	}
                        -
                        -	// Updates the location of the preview
                        -	if (this.previewElement != null)
                        -	{
                        -		if (this.previewElement.parentNode == null)
                        -		{
                        -			graph.container.appendChild(this.previewElement);
                        -			
                        -			this.previewElement.style.zIndex = '3';
                        -			this.previewElement.style.position = 'absolute';
                        -		}
                        -		
                        -		var gridEnabled = this.isGridEnabled() && graph.isGridEnabledEvent(evt);
                        -		var hideGuide = true;
                        -
                        -		// Grid and guides
                        -		if (this.currentGuide != null && this.currentGuide.isEnabledForEvent(evt))
                        -		{
                        -			// LATER: HTML preview appears smaller than SVG preview
                        -			var w = parseInt(this.previewElement.style.width);
                        -			var h = parseInt(this.previewElement.style.height);
                        -			var bounds = new mxRectangle(0, 0, w, h);
                        -			var delta = new mxPoint(x, y);
                        -			delta = this.currentGuide.move(bounds, delta, gridEnabled, true);
                        -			hideGuide = false;
                        -			x = delta.x;
                        -			y = delta.y;
                        -		}
                        -		else if (gridEnabled)
                        -		{
                        -			var scale = graph.view.scale;
                        -			var tr = graph.view.translate;
                        -			var off = graph.gridSize / 2;
                        -			x = (graph.snap(x / scale - tr.x - off) + tr.x) * scale;
                        -			y = (graph.snap(y / scale - tr.y - off) + tr.y) * scale;
                        -		}
                        -		
                        -		if (this.currentGuide != null && hideGuide)
                        -		{
                        -			this.currentGuide.hide();
                        -		}
                        -		
                        -		if (this.previewOffset != null)
                        -		{
                        -			x += this.previewOffset.x;
                        -			y += this.previewOffset.y;
                        -		}
                        -
                        -		this.previewElement.style.left = Math.round(x) + 'px';
                        -		this.previewElement.style.top = Math.round(y) + 'px';
                        -		this.previewElement.style.visibility = 'visible';
                        -	}
                        -	
                        -	this.currentPoint = new mxPoint(x, y);
                        -};
                        -
                        -/**
                        - * Function: drop
                        - * 
                        - * Returns the drop target for the given graph and coordinates. This
                        - * implementation uses .
                        - */
                        -mxDragSource.prototype.drop = function(graph, evt, dropTarget, x, y)
                        -{
                        -	this.dropHandler.apply(this, arguments);
                        -	
                        -	// Had to move this to after the insert because it will
                        -	// affect the scrollbars of the window in IE to try and
                        -	// make the complete container visible.
                        -	// LATER: Should be made optional.
                        -	if (graph.container.style.visibility != 'hidden')
                        -	{
                        -		graph.container.focus();
                        -	}
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxToolbar
                        - * 
                        - * Creates a toolbar inside a given DOM node. The toolbar may contain icons,
                        - * buttons and combo boxes.
                        - * 
                        - * Event: mxEvent.SELECT
                        - * 
                        - * Fires when an item was selected in the toolbar. The function
                        - * property contains the function that was selected in .
                        - * 
                        - * Constructor: mxToolbar
                        - * 
                        - * Constructs a toolbar in the specified container.
                        - *
                        - * Parameters:
                        - *
                        - * container - DOM node that contains the toolbar.
                        - */
                        -function mxToolbar(container)
                        -{
                        -	this.container = container;
                        -};
                        -
                        -/**
                        - * Extends mxEventSource.
                        - */
                        -mxToolbar.prototype = new mxEventSource();
                        -mxToolbar.prototype.constructor = mxToolbar;
                        -
                        -/**
                        - * Variable: container
                        - * 
                        - * Reference to the DOM nodes that contains the toolbar.
                        - */
                        -mxToolbar.prototype.container = null;
                        -
                        -/**
                        - * Variable: enabled
                        - * 
                        - * Specifies if events are handled. Default is true.
                        - */
                        -mxToolbar.prototype.enabled = true;
                        -
                        -/**
                        - * Variable: noReset
                        - * 
                        - * Specifies if  requires a forced flag of true for resetting
                        - * the current mode in the toolbar. Default is false. This is set to true
                        - * if the toolbar item is double clicked to avoid a reset after a single
                        - * use of the item.
                        - */
                        -mxToolbar.prototype.noReset = false;
                        -
                        -/**
                        - * Variable: updateDefaultMode
                        - * 
                        - * Boolean indicating if the default mode should be the last selected
                        - * switch mode or the first inserted switch mode. Default is true, that
                        - * is the last selected switch mode is the default mode. The default mode
                        - * is the mode to be selected after a reset of the toolbar. If this is
                        - * false, then the default mode is the first inserted mode item regardless
                        - * of what was last selected. Otherwise, the selected item after a reset is
                        - * the previously selected item.
                        - */
                        -mxToolbar.prototype.updateDefaultMode = true;
                        -
                        -/**
                        - * Function: addItem
                        - * 
                        - * Adds the given function as an image with the specified title and icon
                        - * and returns the new image node.
                        - * 
                        - * Parameters:
                        - * 
                        - * title - Optional string that is used as the tooltip.
                        - * icon - Optional URL of the image to be used. If no URL is given, then a
                        - * button is created.
                        - * funct - Function to execute on a mouse click.
                        - * pressedIcon - Optional URL of the pressed image. Default is a gray
                        - * background.
                        - * style - Optional style classname. Default is mxToolbarItem.
                        - * factoryMethod - Optional factory method for popup menu, eg.
                        - * function(menu, evt, cell) { menu.addItem('Hello, World!'); }
                        - */
                        -mxToolbar.prototype.addItem = function(title, icon, funct, pressedIcon, style, factoryMethod)
                        -{
                        -	var img = document.createElement((icon != null) ? 'img' : 'button');
                        -	var initialClassName = style || ((factoryMethod != null) ?
                        -			'mxToolbarMode' : 'mxToolbarItem');
                        -	img.className = initialClassName;
                        -	img.setAttribute('src', icon);
                        -	
                        -	if (title != null)
                        -	{
                        -		if (icon != null)
                        -		{
                        -			img.setAttribute('title', title);
                        -		}
                        -		else
                        -		{
                        -			mxUtils.write(img, title);
                        -		}
                        -	}
                        -	
                        -	this.container.appendChild(img);
                        -
                        -	// Invokes the function on a click on the toolbar item
                        -	if (funct != null)
                        -	{
                        -		mxEvent.addListener(img, 'click', funct);
                        -		
                        -		if (mxClient.IS_TOUCH)
                        -		{
                        -			mxEvent.addListener(img, 'touchend', funct);
                        -		}
                        -	}
                        -
                        -	var mouseHandler = mxUtils.bind(this, function(evt)
                        -	{
                        -		if (pressedIcon != null)
                        -		{
                        -			img.setAttribute('src', icon);
                        -		}
                        -		else
                        -		{
                        -			img.style.backgroundColor = '';
                        -		}
                        -	});
                        -
                        -	// Highlights the toolbar item with a gray background
                        -	// while it is being clicked with the mouse
                        -	mxEvent.addGestureListeners(img, mxUtils.bind(this, function(evt)
                        -	{
                        -		if (pressedIcon != null)
                        -		{
                        -			img.setAttribute('src', pressedIcon);
                        -		}
                        -		else
                        -		{
                        -			img.style.backgroundColor = 'gray';
                        -		}
                        -		
                        -		// Popup Menu
                        -		if (factoryMethod != null)
                        -		{
                        -			if (this.menu == null)
                        -			{
                        -				this.menu = new mxPopupMenu();
                        -				this.menu.init();
                        -			}
                        -			
                        -			var last = this.currentImg;
                        -			
                        -			if (this.menu.isMenuShowing())
                        -			{
                        -				this.menu.hideMenu();
                        -			}
                        -			
                        -			if (last != img)
                        -			{
                        -				// Redirects factory method to local factory method
                        -				this.currentImg = img;
                        -				this.menu.factoryMethod = factoryMethod;
                        -				
                        -				var point = new mxPoint(
                        -					img.offsetLeft,
                        -					img.offsetTop + img.offsetHeight);
                        -				this.menu.popup(point.x, point.y, null, evt);
                        -
                        -				// Sets and overrides to restore classname
                        -				if (this.menu.isMenuShowing())
                        -				{
                        -					img.className = initialClassName + 'Selected';
                        -					
                        -					this.menu.hideMenu = function()
                        -					{
                        -						mxPopupMenu.prototype.hideMenu.apply(this);
                        -						img.className = initialClassName;
                        -						this.currentImg = null;
                        -					};
                        -				}
                        -			}
                        -		}
                        -	}), null, mouseHandler);
                        -
                        -	mxEvent.addListener(img, 'mouseout', mouseHandler);
                        -	
                        -	return img;
                        -};
                        -
                        -/**
                        - * Function: addCombo
                        - * 
                        - * Adds and returns a new SELECT element using the given style. The element
                        - * is placed inside a DIV with the mxToolbarComboContainer style classname.
                        - * 
                        - * Parameters:
                        - * 
                        - * style - Optional style classname. Default is mxToolbarCombo.
                        - */
                        -mxToolbar.prototype.addCombo = function(style)
                        -{
                        -	var div = document.createElement('div');
                        -	div.style.display = 'inline';
                        -	div.className = 'mxToolbarComboContainer';
                        -	
                        -	var select = document.createElement('select');
                        -	select.className = style || 'mxToolbarCombo';
                        -	div.appendChild(select);
                        -	
                        -	this.container.appendChild(div);
                        -	
                        -	return select;
                        -};
                        -
                        -/**
                        - * Function: addCombo
                        - * 
                        - * Adds and returns a new SELECT element using the given title as the
                        - * default element. The selection is reset to this element after each
                        - * change.
                        - * 
                        - * Parameters:
                        - * 
                        - * title - String that specifies the title of the default element.
                        - * style - Optional style classname. Default is mxToolbarCombo.
                        - */
                        -mxToolbar.prototype.addActionCombo = function(title, style)
                        -{
                        -	var select = document.createElement('select');
                        -	select.className = style || 'mxToolbarCombo';
                        -	this.addOption(select, title, null);
                        -	
                        -	mxEvent.addListener(select, 'change', function(evt)
                        -	{
                        -		var value = select.options[select.selectedIndex];
                        -		select.selectedIndex = 0;
                        -		
                        -		if (value.funct != null)
                        -		{
                        -			value.funct(evt);
                        -		}
                        -	});
                        -	
                        -	this.container.appendChild(select);
                        -	
                        -	return select;
                        -};
                        -
                        -/**
                        - * Function: addOption
                        - * 
                        - * Adds and returns a new OPTION element inside the given SELECT element.
                        - * If the given value is a function then it is stored in the option's funct
                        - * field.
                        - * 
                        - * Parameters:
                        - * 
                        - * combo - SELECT element that will contain the new entry.
                        - * title - String that specifies the title of the option.
                        - * value - Specifies the value associated with this option.
                        - */
                        -mxToolbar.prototype.addOption = function(combo, title, value)
                        -{
                        -	var option = document.createElement('option');
                        -	mxUtils.writeln(option, title);
                        -	
                        -	if (typeof(value) == 'function')
                        -	{
                        -		option.funct = value;
                        -	}
                        -	else
                        -	{
                        -		option.setAttribute('value', value);
                        -	}
                        -	
                        -	combo.appendChild(option);
                        -	
                        -	return option;
                        -};
                        -
                        -/**
                        - * Function: addSwitchMode
                        - * 
                        - * Adds a new selectable item to the toolbar. Only one switch mode item may
                        - * be selected at a time. The currently selected item is the default item
                        - * after a reset of the toolbar.
                        - */
                        -mxToolbar.prototype.addSwitchMode = function(title, icon, funct, pressedIcon, style)
                        -{
                        -	var img = document.createElement('img');
                        -	img.initialClassName = style || 'mxToolbarMode';
                        -	img.className = img.initialClassName;
                        -	img.setAttribute('src', icon);
                        -	img.altIcon = pressedIcon;
                        -	
                        -	if (title != null)
                        -	{
                        -		img.setAttribute('title', title);
                        -	}
                        -	
                        -	mxEvent.addListener(img, 'click', mxUtils.bind(this, function(evt)
                        -	{
                        -		var tmp = this.selectedMode.altIcon;
                        -		
                        -		if (tmp != null)
                        -		{
                        -			this.selectedMode.altIcon = this.selectedMode.getAttribute('src');
                        -			this.selectedMode.setAttribute('src', tmp);
                        -		}
                        -		else
                        -		{
                        -			this.selectedMode.className = this.selectedMode.initialClassName;
                        -		}
                        -		
                        -		if (this.updateDefaultMode)
                        -		{
                        -			this.defaultMode = img;
                        -		}
                        -		
                        -		this.selectedMode = img;
                        -		
                        -		var tmp = img.altIcon;
                        -		
                        -		if (tmp != null)
                        -		{
                        -			img.altIcon = img.getAttribute('src');
                        -			img.setAttribute('src', tmp);
                        -		}
                        -		else
                        -		{
                        -			img.className = img.initialClassName+'Selected';
                        -		}
                        -		
                        -		this.fireEvent(new mxEventObject(mxEvent.SELECT));
                        -		funct();
                        -	}));
                        -	
                        -	this.container.appendChild(img);
                        -	
                        -	if (this.defaultMode == null)
                        -	{
                        -		this.defaultMode = img;
                        -		
                        -		// Function should fire only once so
                        -		// do not pass it with the select event
                        -		this.selectMode(img);
                        -		funct();
                        -	}
                        -	
                        -	return img;
                        -};
                        -
                        -/**
                        - * Function: addMode
                        - * 
                        - * Adds a new item to the toolbar. The selection is typically reset after
                        - * the item has been consumed, for example by adding a new vertex to the
                        - * graph. The reset is not carried out if the item is double clicked.
                        - * 
                        - * The function argument uses the following signature: funct(evt, cell) where
                        - * evt is the native mouse event and cell is the cell under the mouse.
                        - */
                        -mxToolbar.prototype.addMode = function(title, icon, funct, pressedIcon, style, toggle)
                        -{
                        -	toggle = (toggle != null) ? toggle : true;
                        -	var img = document.createElement((icon != null) ? 'img' : 'button');
                        -	
                        -	img.initialClassName = style || 'mxToolbarMode';
                        -	img.className = img.initialClassName;
                        -	img.setAttribute('src', icon);
                        -	img.altIcon = pressedIcon;
                        -
                        -	if (title != null)
                        -	{
                        -		img.setAttribute('title', title);
                        -	}
                        -	
                        -	if (this.enabled && toggle)
                        -	{
                        -		mxEvent.addListener(img, 'click', mxUtils.bind(this, function(evt)
                        -		{
                        -			this.selectMode(img, funct);
                        -			this.noReset = false;
                        -		}));
                        -		
                        -		mxEvent.addListener(img, 'dblclick', mxUtils.bind(this, function(evt)
                        -		{
                        -			this.selectMode(img, funct);
                        -			this.noReset = true;
                        -		}));
                        -		
                        -		if (this.defaultMode == null)
                        -		{
                        -			this.defaultMode = img;
                        -			this.defaultFunction = funct;
                        -			this.selectMode(img, funct);
                        -		}
                        -	}
                        -
                        -	this.container.appendChild(img);					
                        -
                        -	return img;
                        -};
                        -
                        -/**
                        - * Function: selectMode
                        - * 
                        - * Resets the state of the previously selected mode and displays the given
                        - * DOM node as selected. This function fires a select event with the given
                        - * function as a parameter.
                        - */
                        -mxToolbar.prototype.selectMode = function(domNode, funct)
                        -{
                        -	if (this.selectedMode != domNode)
                        -	{
                        -		if (this.selectedMode != null)
                        -		{
                        -			var tmp = this.selectedMode.altIcon;
                        -			
                        -			if (tmp != null)
                        -			{
                        -				this.selectedMode.altIcon = this.selectedMode.getAttribute('src');
                        -				this.selectedMode.setAttribute('src', tmp);
                        -			}
                        -			else
                        -			{
                        -				this.selectedMode.className = this.selectedMode.initialClassName;
                        -			}
                        -		}
                        -		
                        -		this.selectedMode = domNode;
                        -		var tmp = this.selectedMode.altIcon;
                        -		
                        -		if (tmp != null)
                        -		{
                        -			this.selectedMode.altIcon = this.selectedMode.getAttribute('src');
                        -			this.selectedMode.setAttribute('src', tmp);
                        -		}
                        -		else
                        -		{
                        -			this.selectedMode.className = this.selectedMode.initialClassName+'Selected';
                        -		}
                        -		
                        -		this.fireEvent(new mxEventObject(mxEvent.SELECT, "function", funct));
                        -	}
                        -};
                        -
                        -/**
                        - * Function: resetMode
                        - * 
                        - * Selects the default mode and resets the state of the previously selected
                        - * mode.
                        - */
                        -mxToolbar.prototype.resetMode = function(forced)
                        -{
                        -	if ((forced || !this.noReset) && this.selectedMode != this.defaultMode)
                        -	{
                        -		// The last selected switch mode will be activated
                        -		// so the function was already executed and is
                        -		// no longer required here
                        -		this.selectMode(this.defaultMode, this.defaultFunction);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: addSeparator
                        - * 
                        - * Adds the specifies image as a separator.
                        - * 
                        - * Parameters:
                        - * 
                        - * icon - URL of the separator icon.
                        - */
                        -mxToolbar.prototype.addSeparator = function(icon)
                        -{
                        -	return this.addItem(null, icon, null);
                        -};
                        -
                        -/**
                        - * Function: addBreak
                        - * 
                        - * Adds a break to the container.
                        - */
                        -mxToolbar.prototype.addBreak = function()
                        -{
                        -	mxUtils.br(this.container);
                        -};
                        -
                        -/**
                        - * Function: addLine
                        - * 
                        - * Adds a horizontal line to the container.
                        - */
                        -mxToolbar.prototype.addLine = function()
                        -{
                        -	var hr = document.createElement('hr');
                        -	
                        -	hr.style.marginRight = '6px';
                        -	hr.setAttribute('size', '1');
                        -	
                        -	this.container.appendChild(hr);
                        -};
                        -
                        -/**
                        - * Function: destroy
                        - * 
                        - * Removes the toolbar and all its associated resources.
                        - */
                        -mxToolbar.prototype.destroy = function ()
                        -{
                        -	mxEvent.release(this.container);
                        -	this.container = null;
                        -	this.defaultMode = null;
                        -	this.defaultFunction = null;
                        -	this.selectedMode = null;
                        -	
                        -	if (this.menu != null)
                        -	{
                        -		this.menu.destroy();
                        -	}
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxUndoableEdit
                        - * 
                        - * Implements a composite undoable edit. Here is an example for a custom change
                        - * which gets executed via the model:
                        - * 
                        - * (code)
                        - * function CustomChange(model, name)
                        - * {
                        - *   this.model = model;
                        - *   this.name = name;
                        - *   this.previous = name;
                        - * };
                        - * 
                        - * CustomChange.prototype.execute = function()
                        - * {
                        - *   var tmp = this.model.name;
                        - *   this.model.name = this.previous;
                        - *   this.previous = tmp;
                        - * };
                        - * 
                        - * var name = prompt('Enter name');
                        - * graph.model.execute(new CustomChange(graph.model, name));
                        - * (end)
                        - * 
                        - * Event: mxEvent.EXECUTED
                        - * 
                        - * Fires between START_EDIT and END_EDIT after an atomic change was executed.
                        - * The change property contains the change that was executed.
                        - * 
                        - * Event: mxEvent.START_EDIT
                        - * 
                        - * Fires before a set of changes will be executed in  or .
                        - * This event contains no properties.
                        - * 
                        - * Event: mxEvent.END_EDIT
                        - *
                        - * Fires after a set of changeswas executed in  or .
                        - * This event contains no properties.
                        - * 
                        - * Constructor: mxUndoableEdit
                        - * 
                        - * Constructs a new undoable edit for the given source.
                        - */
                        -function mxUndoableEdit(source, significant)
                        -{
                        -	this.source = source;
                        -	this.changes = [];
                        -	this.significant = (significant != null) ? significant : true;
                        -};
                        -
                        -/**
                        - * Variable: source
                        - * 
                        - * Specifies the source of the edit.
                        - */
                        -mxUndoableEdit.prototype.source = null;
                        -
                        -/**
                        - * Variable: changes
                        - * 
                        - * Array that contains the changes that make up this edit. The changes are
                        - * expected to either have an undo and redo function, or an execute
                        - * function. Default is an empty array.
                        - */
                        -mxUndoableEdit.prototype.changes = null;
                        -
                        -/**
                        - * Variable: significant
                        - * 
                        - * Specifies if the undoable change is significant.
                        - * Default is true.
                        - */
                        -mxUndoableEdit.prototype.significant = null;
                        -
                        -/**
                        - * Variable: undone
                        - * 
                        - * Specifies if this edit has been undone. Default is false.
                        - */
                        -mxUndoableEdit.prototype.undone = false;
                        -
                        -/**
                        - * Variable: redone
                        - * 
                        - * Specifies if this edit has been redone. Default is false.
                        - */
                        -mxUndoableEdit.prototype.redone = false;
                        -
                        -/**
                        - * Function: isEmpty
                        - * 
                        - * Returns true if the this edit contains no changes.
                        - */
                        -mxUndoableEdit.prototype.isEmpty = function()
                        -{
                        -	return this.changes.length == 0;
                        -};
                        -
                        -/**
                        - * Function: isSignificant
                        - * 
                        - * Returns .
                        - */
                        -mxUndoableEdit.prototype.isSignificant = function()
                        -{
                        -	return this.significant;
                        -};
                        -
                        -/**
                        - * Function: add
                        - * 
                        - * Adds the specified change to this edit. The change is an object that is
                        - * expected to either have an undo and redo, or an execute function.
                        - */
                        -mxUndoableEdit.prototype.add = function(change)
                        -{
                        -	this.changes.push(change);
                        -};
                        -
                        -/**
                        - * Function: notify
                        - * 
                        - * Hook to notify any listeners of the changes after an  or 
                        - * has been carried out. This implementation is empty.
                        - */
                        -mxUndoableEdit.prototype.notify = function() { };
                        -
                        -/**
                        - * Function: die
                        - * 
                        - * Hook to free resources after the edit has been removed from the command
                        - * history. This implementation is empty.
                        - */
                        -mxUndoableEdit.prototype.die = function() { };
                        -
                        -/**
                        - * Function: undo
                        - * 
                        - * Undoes all changes in this edit.
                        - */
                        -mxUndoableEdit.prototype.undo = function()
                        -{
                        -	if (!this.undone)
                        -	{
                        -		this.source.fireEvent(new mxEventObject(mxEvent.START_EDIT));
                        -		var count = this.changes.length;
                        -		
                        -		for (var i = count - 1; i >= 0; i--)
                        -		{
                        -			var change = this.changes[i];
                        -			
                        -			if (change.execute != null)
                        -			{
                        -				change.execute();
                        -			}
                        -			else if (change.undo != null)
                        -			{
                        -				change.undo();
                        -			}
                        -			
                        -			// New global executed event
                        -			this.source.fireEvent(new mxEventObject(mxEvent.EXECUTED, 'change', change));
                        -		}
                        -		
                        -		this.undone = true;
                        -		this.redone = false;
                        -		this.source.fireEvent(new mxEventObject(mxEvent.END_EDIT));
                        -	}
                        -	
                        -	this.notify();
                        -};
                        -
                        -/**
                        - * Function: redo
                        - * 
                        - * Redoes all changes in this edit.
                        - */
                        -mxUndoableEdit.prototype.redo = function()
                        -{
                        -	if (!this.redone)
                        -	{
                        -		this.source.fireEvent(new mxEventObject(mxEvent.START_EDIT));
                        -		var count = this.changes.length;
                        -		
                        -		for (var i = 0; i < count; i++)
                        -		{
                        -			var change = this.changes[i];
                        -			
                        -			if (change.execute != null)
                        -			{
                        -				change.execute();
                        -			}
                        -			else if (change.redo != null)
                        -			{
                        -				change.redo();
                        -			}
                        -			
                        -			// New global executed event
                        -			this.source.fireEvent(new mxEventObject(mxEvent.EXECUTED, 'change', change));
                        -		}
                        -		
                        -		this.undone = false;
                        -		this.redone = true;
                        -		this.source.fireEvent(new mxEventObject(mxEvent.END_EDIT));
                        -	}
                        -	
                        -	this.notify();
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxUndoManager
                        - *
                        - * Implements a command history. When changing the graph model, an
                        - *  object is created at the start of the transaction (when
                        - * model.beginUpdate is called). All atomic changes are then added to this
                        - * object until the last model.endUpdate call, at which point the
                        - *  is dispatched in an event, and added to the history inside
                        - * . This is done by an event listener in
                        - * .
                        - * 
                        - * Each atomic change of the model is represented by an object (eg.
                        - * , ,  etc) which contains the
                        - * complete undo information. The  also listens to the
                        - *  and stores it's changes to the current root as insignificant
                        - * undoable changes, so that drilling (step into, step up) is undone.
                        - * 
                        - * This means when you execute an atomic change on the model, then change the
                        - * current root on the view and click undo, the change of the root will be
                        - * undone together with the change of the model so that the display represents
                        - * the state at which the model was changed. However, these changes are not
                        - * transmitted for sharing as they do not represent a state change.
                        - *
                        - * Example:
                        - * 
                        - * When adding an undo manager to a graph, make sure to add it
                        - * to the model and the view as well to maintain a consistent
                        - * display across multiple undo/redo steps.
                        - *
                        - * (code)
                        - * var undoManager = new mxUndoManager();
                        - * var listener = function(sender, evt)
                        - * {
                        - *   undoManager.undoableEditHappened(evt.getProperty('edit'));
                        - * };
                        - * graph.getModel().addListener(mxEvent.UNDO, listener);
                        - * graph.getView().addListener(mxEvent.UNDO, listener);
                        - * (end)
                        - * 
                        - * The code creates a function that informs the undoManager
                        - * of an undoable edit and binds it to the undo event of
                        - *  and  using
                        - * .
                        - * 
                        - * Event: mxEvent.CLEAR
                        - * 
                        - * Fires after  was invoked. This event has no properties.
                        - * 
                        - * Event: mxEvent.UNDO
                        - * 
                        - * Fires afer a significant edit was undone in . The edit
                        - * property contains the  that was undone.
                        - * 
                        - * Event: mxEvent.REDO
                        - * 
                        - * Fires afer a significant edit was redone in . The edit
                        - * property contains the  that was redone.
                        - * 
                        - * Event: mxEvent.ADD
                        - * 
                        - * Fires after an undoable edit was added to the history. The edit
                        - * property contains the  that was added.
                        - * 
                        - * Constructor: mxUndoManager
                        - *
                        - * Constructs a new undo manager with the given history size. If no history
                        - * size is given, then a default size of 100 steps is used.
                        - */
                        -function mxUndoManager(size)
                        -{
                        -	this.size = (size != null) ? size : 100;
                        -	this.clear();
                        -};
                        -
                        -/**
                        - * Extends mxEventSource.
                        - */
                        -mxUndoManager.prototype = new mxEventSource();
                        -mxUndoManager.prototype.constructor = mxUndoManager;
                        -
                        -/**
                        - * Variable: size
                        - * 
                        - * Maximum command history size. 0 means unlimited history. Default is
                        - * 100.
                        - */
                        -mxUndoManager.prototype.size = null;
                        -
                        -/**
                        - * Variable: history
                        - * 
                        - * Array that contains the steps of the command history.
                        - */
                        -mxUndoManager.prototype.history = null;
                        -
                        -/**
                        - * Variable: indexOfNextAdd
                        - * 
                        - * Index of the element to be added next.
                        - */
                        -mxUndoManager.prototype.indexOfNextAdd = 0;
                        -
                        -/**
                        - * Function: isEmpty
                        - * 
                        - * Returns true if the history is empty.
                        - */
                        -mxUndoManager.prototype.isEmpty = function()
                        -{
                        -	return this.history.length == 0;
                        -};
                        -
                        -/**
                        - * Function: clear
                        - * 
                        - * Clears the command history.
                        - */
                        -mxUndoManager.prototype.clear = function()
                        -{
                        -	this.history = [];
                        -	this.indexOfNextAdd = 0;
                        -	this.fireEvent(new mxEventObject(mxEvent.CLEAR));
                        -};
                        -
                        -/**
                        - * Function: canUndo
                        - * 
                        - * Returns true if an undo is possible.
                        - */
                        -mxUndoManager.prototype.canUndo = function()
                        -{
                        -	return this.indexOfNextAdd > 0;
                        -};
                        -
                        -/**
                        - * Function: undo
                        - * 
                        - * Undoes the last change.
                        - */
                        -mxUndoManager.prototype.undo = function()
                        -{
                        -    while (this.indexOfNextAdd > 0)
                        -    {
                        -        var edit = this.history[--this.indexOfNextAdd];
                        -        edit.undo();
                        -
                        -		if (edit.isSignificant())
                        -        {
                        -        	this.fireEvent(new mxEventObject(mxEvent.UNDO, 'edit', edit));
                        -            break;
                        -        }
                        -    }
                        -};
                        -
                        -/**
                        - * Function: canRedo
                        - * 
                        - * Returns true if a redo is possible.
                        - */
                        -mxUndoManager.prototype.canRedo = function()
                        -{
                        -	return this.indexOfNextAdd < this.history.length;
                        -};
                        -
                        -/**
                        - * Function: redo
                        - * 
                        - * Redoes the last change.
                        - */
                        -mxUndoManager.prototype.redo = function()
                        -{
                        -    var n = this.history.length;
                        -    
                        -    while (this.indexOfNextAdd < n)
                        -    {
                        -        var edit =  this.history[this.indexOfNextAdd++];
                        -        edit.redo();
                        -        
                        -        if (edit.isSignificant())
                        -        {
                        -        	this.fireEvent(new mxEventObject(mxEvent.REDO, 'edit', edit));
                        -            break;
                        -        }
                        -    }
                        -};
                        -
                        -/**
                        - * Function: undoableEditHappened
                        - * 
                        - * Method to be called to add new undoable edits to the .
                        - */
                        -mxUndoManager.prototype.undoableEditHappened = function(undoableEdit)
                        -{
                        -	this.trim();
                        -	
                        -	if (this.size > 0 &&
                        -		this.size == this.history.length)
                        -	{
                        -		this.history.shift();
                        -	}
                        -	
                        -	this.history.push(undoableEdit);
                        -	this.indexOfNextAdd = this.history.length;
                        -	this.fireEvent(new mxEventObject(mxEvent.ADD, 'edit', undoableEdit));
                        -};
                        -
                        -/**
                        - * Function: trim
                        - * 
                        - * Removes all pending steps after  from the history,
                        - * invoking die on each edit. This is called from .
                        - */
                        -mxUndoManager.prototype.trim = function()
                        -{
                        -	if (this.history.length > this.indexOfNextAdd)
                        -	{
                        -		var edits = this.history.splice(this.indexOfNextAdd,
                        -			this.history.length - this.indexOfNextAdd);
                        -			
                        -		for (var i = 0; i < edits.length; i++)
                        -		{
                        -			edits[i].die();
                        -		}
                        -	}
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - *
                        - * Class: mxUrlConverter
                        - * 
                        - * Converts relative and absolute URLs to absolute URLs with protocol and domain.
                        - */
                        -var mxUrlConverter = function()
                        -{
                        -	// Empty constructor
                        -};
                        -
                        -/**
                        - * Variable: enabled
                        - * 
                        - * Specifies if the converter is enabled. Default is true.
                        - */
                        -mxUrlConverter.prototype.enabled = true;
                        -
                        -/**
                        - * Variable: baseUrl
                        - * 
                        - * Specifies the base URL to be used as a prefix for relative URLs.
                        - */
                        -mxUrlConverter.prototype.baseUrl = null;
                        -
                        -/**
                        - * Variable: baseDomain
                        - * 
                        - * Specifies the base domain to be used as a prefix for absolute URLs.
                        - */
                        -mxUrlConverter.prototype.baseDomain = null;
                        -
                        -/**
                        - * Function: updateBaseUrl
                        - * 
                        - * Private helper function to update the base URL.
                        - */
                        -mxUrlConverter.prototype.updateBaseUrl = function()
                        -{
                        -	this.baseDomain = location.protocol + '//' + location.host;
                        -	this.baseUrl = this.baseDomain + location.pathname;
                        -	var tmp = this.baseUrl.lastIndexOf('/');
                        -	
                        -	// Strips filename etc
                        -	if (tmp > 0)
                        -	{
                        -		this.baseUrl = this.baseUrl.substring(0, tmp + 1);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: isEnabled
                        - * 
                        - * Returns .
                        - */
                        -mxUrlConverter.prototype.isEnabled = function()
                        -{
                        -	return this.enabled;
                        -};
                        -
                        -/**
                        - * Function: setEnabled
                        - * 
                        - * Sets .
                        - */
                        -mxUrlConverter.prototype.setEnabled = function(value)
                        -{
                        -	this.enabled = value;
                        -};
                        -
                        -/**
                        - * Function: getBaseUrl
                        - * 
                        - * Returns .
                        - */
                        -mxUrlConverter.prototype.getBaseUrl = function()
                        -{
                        -	return this.baseUrl;
                        -};
                        -
                        -/**
                        - * Function: setBaseUrl
                        - * 
                        - * Sets .
                        - */
                        -mxUrlConverter.prototype.setBaseUrl = function(value)
                        -{
                        -	this.baseUrl = value;
                        -};
                        -
                        -/**
                        - * Function: getBaseDomain
                        - * 
                        - * Returns .
                        - */
                        -mxUrlConverter.prototype.getBaseDomain = function()
                        -{
                        -	return this.baseDomain;
                        -},
                        -
                        -/**
                        - * Function: setBaseDomain
                        - * 
                        - * Sets .
                        - */
                        -mxUrlConverter.prototype.setBaseDomain = function(value)
                        -{
                        -	this.baseDomain = value;
                        -},
                        -
                        -/**
                        - * Function: isRelativeUrl
                        - * 
                        - * Returns true if the given URL is relative.
                        - */
                        -mxUrlConverter.prototype.isRelativeUrl = function(url)
                        -{
                        -	return url.substring(0, 2) != '//' && url.substring(0, 7) != 'http://' &&
                        -		url.substring(0, 8) != 'https://' && url.substring(0, 10) != 'data:image' &&
                        -		url.substring(0, 7) != 'file://';
                        -};
                        -
                        -/**
                        - * Function: convert
                        - * 
                        - * Converts the given URL to an absolute URL with protol and domain.
                        - * Relative URLs are first converted to absolute URLs.
                        - */
                        -mxUrlConverter.prototype.convert = function(url)
                        -{
                        -	if (this.isEnabled() && this.isRelativeUrl(url))
                        -	{
                        -		if (this.getBaseUrl() == null)
                        -		{
                        -			this.updateBaseUrl();
                        -		}
                        -		
                        -		if (url.charAt(0) == '/')
                        -		{
                        -			url = this.getBaseDomain() + url;
                        -		}
                        -		else
                        -		{
                        -			url = this.getBaseUrl() + url;
                        -		}
                        -	}
                        -	
                        -	return url;
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxPanningManager
                        - *
                        - * Implements a handler for panning.
                        - */
                        -function mxPanningManager(graph)
                        -{
                        -	this.thread = null;
                        -	this.active = false;
                        -	this.tdx = 0;
                        -	this.tdy = 0;
                        -	this.t0x = 0;
                        -	this.t0y = 0;
                        -	this.dx = 0;
                        -	this.dy = 0;
                        -	this.scrollbars = false;
                        -	this.scrollLeft = 0;
                        -	this.scrollTop = 0;
                        -	
                        -	this.mouseListener =
                        -	{
                        -	    mouseDown: function(sender, me) { },
                        -	    mouseMove: function(sender, me) { },
                        -	    mouseUp: mxUtils.bind(this, function(sender, me)
                        -	    {
                        -	    	if (this.active)
                        -	    	{
                        -	    		this.stop();
                        -	    	}
                        -	    })
                        -	};
                        -	
                        -	graph.addMouseListener(this.mouseListener);
                        -	
                        -	this.mouseUpListener = mxUtils.bind(this, function()
                        -	{
                        -	    	if (this.active)
                        -	    	{
                        -	    		this.stop();
                        -	    	}
                        -	});
                        -	
                        -	// Stops scrolling on every mouseup anywhere in the document
                        -	mxEvent.addListener(document, 'mouseup', this.mouseUpListener);
                        -	
                        -	var createThread = mxUtils.bind(this, function()
                        -	{
                        -	    	this.scrollbars = mxUtils.hasScrollbars(graph.container);
                        -	    	this.scrollLeft = graph.container.scrollLeft;
                        -	    	this.scrollTop = graph.container.scrollTop;
                        -	
                        -	    	return window.setInterval(mxUtils.bind(this, function()
                        -		{
                        -			this.tdx -= this.dx;
                        -			this.tdy -= this.dy;
                        -
                        -			if (this.scrollbars)
                        -			{
                        -				var left = -graph.container.scrollLeft - Math.ceil(this.dx);
                        -				var top = -graph.container.scrollTop - Math.ceil(this.dy);
                        -				graph.panGraph(left, top);
                        -				graph.panDx = this.scrollLeft - graph.container.scrollLeft;
                        -				graph.panDy = this.scrollTop - graph.container.scrollTop;
                        -				graph.fireEvent(new mxEventObject(mxEvent.PAN));
                        -				// TODO: Implement graph.autoExtend
                        -			}
                        -			else
                        -			{
                        -				graph.panGraph(this.getDx(), this.getDy());
                        -			}
                        -		}), this.delay);
                        -	});
                        -	
                        -	this.isActive = function()
                        -	{
                        -		return active;
                        -	};
                        -	
                        -	this.getDx = function()
                        -	{
                        -		return Math.round(this.tdx);
                        -	};
                        -	
                        -	this.getDy = function()
                        -	{
                        -		return Math.round(this.tdy);
                        -	};
                        -	
                        -	this.start = function()
                        -	{
                        -		this.t0x = graph.view.translate.x;
                        -		this.t0y = graph.view.translate.y;
                        -		this.active = true;
                        -	};
                        -	
                        -	this.panTo = function(x, y, w, h)
                        -	{
                        -		if (!this.active)
                        -		{
                        -			this.start();
                        -		}
                        -		
                        -    	this.scrollLeft = graph.container.scrollLeft;
                        -    	this.scrollTop = graph.container.scrollTop;
                        -		
                        -		w = (w != null) ? w : 0;
                        -		h = (h != null) ? h : 0;
                        -		
                        -		var c = graph.container;
                        -		this.dx = x + w - c.scrollLeft - c.clientWidth;
                        -		
                        -		if (this.dx < 0 && Math.abs(this.dx) < this.border)
                        -		{
                        -			this.dx = this.border + this.dx;
                        -		}
                        -		else if (this.handleMouseOut)
                        -		{
                        -			this.dx = Math.max(this.dx, 0);
                        -		}
                        -		else
                        -		{
                        -			this.dx = 0;
                        -		}
                        -		
                        -		if (this.dx == 0)
                        -		{
                        -			this.dx = x - c.scrollLeft;
                        -			
                        -			if (this.dx > 0 && this.dx < this.border)
                        -			{
                        -				this.dx = this.dx - this.border;
                        -			}
                        -			else if (this.handleMouseOut)
                        -			{
                        -				this.dx = Math.min(0, this.dx);
                        -			}
                        -			else
                        -			{
                        -				this.dx = 0;
                        -			}
                        -		}
                        -		
                        -		this.dy = y + h - c.scrollTop - c.clientHeight;
                        -
                        -		if (this.dy < 0 && Math.abs(this.dy) < this.border)
                        -		{
                        -			this.dy = this.border + this.dy;
                        -		}
                        -		else if (this.handleMouseOut)
                        -		{
                        -			this.dy = Math.max(this.dy, 0);
                        -		}
                        -		else
                        -		{
                        -			this.dy = 0;
                        -		}
                        -		
                        -		if (this.dy == 0)
                        -		{
                        -			this.dy = y - c.scrollTop;
                        -			
                        -			if (this.dy > 0 && this.dy < this.border)
                        -			{
                        -				this.dy = this.dy - this.border;
                        -			}
                        -			else if (this.handleMouseOut)
                        -			{
                        -				this.dy = Math.min(0, this.dy);
                        -			} 
                        -			else
                        -			{
                        -				this.dy = 0;
                        -			}
                        -		}
                        -		
                        -		if (this.dx != 0 || this.dy != 0)
                        -		{
                        -			this.dx *= this.damper;
                        -			this.dy *= this.damper;
                        -			
                        -			if (this.thread == null)
                        -			{
                        -				this.thread = createThread();
                        -			}
                        -		}
                        -		else if (this.thread != null)
                        -		{
                        -			window.clearInterval(this.thread);
                        -			this.thread = null;
                        -		}
                        -	};
                        -	
                        -	this.stop = function()
                        -	{
                        -		if (this.active)
                        -		{
                        -			this.active = false;
                        -		
                        -			if (this.thread != null)
                        -	    	{
                        -				window.clearInterval(this.thread);
                        -				this.thread = null;
                        -	    	}
                        -			
                        -			this.tdx = 0;
                        -			this.tdy = 0;
                        -			
                        -			if (!this.scrollbars)
                        -			{
                        -				var px = graph.panDx;
                        -				var py = graph.panDy;
                        -		    	
                        -		    	if (px != 0 || py != 0)
                        -		    	{
                        -		    		graph.panGraph(0, 0);
                        -			    	graph.view.setTranslate(this.t0x + px / graph.view.scale, this.t0y + py / graph.view.scale);
                        -		    	}
                        -			}
                        -			else
                        -			{
                        -				graph.panDx = 0;
                        -				graph.panDy = 0;
                        -				graph.fireEvent(new mxEventObject(mxEvent.PAN));
                        -			}
                        -		}
                        -	};
                        -	
                        -	this.destroy = function()
                        -	{
                        -		graph.removeMouseListener(this.mouseListener);
                        -		mxEvent.removeListener(document, 'mouseup', this.mouseUpListener);
                        -	};
                        -};
                        -
                        -/**
                        - * Variable: damper
                        - * 
                        - * Damper value for the panning. Default is 1/6.
                        - */
                        -mxPanningManager.prototype.damper = 1/6;
                        -
                        -/**
                        - * Variable: delay
                        - * 
                        - * Delay in milliseconds for the panning. Default is 10.
                        - */
                        -mxPanningManager.prototype.delay = 10;
                        -
                        -/**
                        - * Variable: handleMouseOut
                        - * 
                        - * Specifies if mouse events outside of the component should be handled. Default is true. 
                        - */
                        -mxPanningManager.prototype.handleMouseOut = true;
                        -
                        -/**
                        - * Variable: border
                        - * 
                        - * Border to handle automatic panning inside the component. Default is 0 (disabled).
                        - */
                        -mxPanningManager.prototype.border = 0;
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxPopupMenu
                        - * 
                        - * Basic popup menu. To add a vertical scrollbar to a given submenu, the
                        - * following code can be used.
                        - * 
                        - * (code)
                        - * var mxPopupMenuShowMenu = mxPopupMenu.prototype.showMenu;
                        - * mxPopupMenu.prototype.showMenu = function()
                        - * {
                        - *   mxPopupMenuShowMenu.apply(this, arguments);
                        - *   
                        - *   this.div.style.overflowY = 'auto';
                        - *   this.div.style.overflowX = 'hidden';
                        - *   this.div.style.maxHeight = '160px';
                        - * };
                        - * (end)
                        - * 
                        - * Constructor: mxPopupMenu
                        - * 
                        - * Constructs a popupmenu.
                        - * 
                        - * Event: mxEvent.SHOW
                        - *
                        - * Fires after the menu has been shown in .
                        - */
                        -function mxPopupMenu(factoryMethod)
                        -{
                        -	this.factoryMethod = factoryMethod;
                        -	
                        -	if (factoryMethod != null)
                        -	{
                        -		this.init();
                        -	}
                        -};
                        -
                        -/**
                        - * Extends mxEventSource.
                        - */
                        -mxPopupMenu.prototype = new mxEventSource();
                        -mxPopupMenu.prototype.constructor = mxPopupMenu;
                        -
                        -/**
                        - * Variable: submenuImage
                        - * 
                        - * URL of the image to be used for the submenu icon.
                        - */
                        -mxPopupMenu.prototype.submenuImage = mxClient.imageBasePath + '/submenu.gif';
                        -
                        -/**
                        - * Variable: zIndex
                        - * 
                        - * Specifies the zIndex for the popupmenu and its shadow. Default is 1006.
                        - */
                        -mxPopupMenu.prototype.zIndex = 10006;
                        -
                        -/**
                        - * Variable: factoryMethod
                        - * 
                        - * Function that is used to create the popup menu. The function takes the
                        - * current panning handler, the  under the mouse and the mouse
                        - * event that triggered the call as arguments.
                        - */
                        -mxPopupMenu.prototype.factoryMethod = null;
                        -
                        -/**
                        - * Variable: useLeftButtonForPopup
                        - * 
                        - * Specifies if popupmenus should be activated by clicking the left mouse
                        - * button. Default is false.
                        - */
                        -mxPopupMenu.prototype.useLeftButtonForPopup = false;
                        -
                        -/**
                        - * Variable: enabled
                        - * 
                        - * Specifies if events are handled. Default is true.
                        - */
                        -mxPopupMenu.prototype.enabled = true;
                        -
                        -/**
                        - * Variable: itemCount
                        - * 
                        - * Contains the number of times  has been called for a new menu.
                        - */
                        -mxPopupMenu.prototype.itemCount = 0;
                        -
                        -/**
                        - * Variable: autoExpand
                        - * 
                        - * Specifies if submenus should be expanded on mouseover. Default is false.
                        - */
                        -mxPopupMenu.prototype.autoExpand = false;
                        -
                        -/**
                        - * Variable: smartSeparators
                        - * 
                        - * Specifies if separators should only be added if a menu item follows them.
                        - * Default is false.
                        - */
                        -mxPopupMenu.prototype.smartSeparators = false;
                        -
                        -/**
                        - * Variable: labels
                        - * 
                        - * Specifies if any labels should be visible. Default is true.
                        - */
                        -mxPopupMenu.prototype.labels = true;
                        -
                        -/**
                        - * Function: init
                        - * 
                        - * Initializes the shapes required for this vertex handler.
                        - */
                        -mxPopupMenu.prototype.init = function()
                        -{
                        -	// Adds the inner table
                        -	this.table = document.createElement('table');
                        -	this.table.className = 'mxPopupMenu';
                        -	
                        -	this.tbody = document.createElement('tbody');
                        -	this.table.appendChild(this.tbody);
                        -
                        -	// Adds the outer div
                        -	this.div = document.createElement('div');
                        -	this.div.className = 'mxPopupMenu';
                        -	this.div.style.display = 'inline';
                        -	this.div.style.zIndex = this.zIndex;
                        -	this.div.appendChild(this.table);
                        -
                        -	// Disables the context menu on the outer div
                        -	mxEvent.disableContextMenu(this.div);
                        -};
                        -
                        -/**
                        - * Function: isEnabled
                        - * 
                        - * Returns true if events are handled. This implementation
                        - * returns .
                        - */
                        -mxPopupMenu.prototype.isEnabled = function()
                        -{
                        -	return this.enabled;
                        -};
                        -	
                        -/**
                        - * Function: setEnabled
                        - * 
                        - * Enables or disables event handling. This implementation
                        - * updates .
                        - */
                        -mxPopupMenu.prototype.setEnabled = function(enabled)
                        -{
                        -	this.enabled = enabled;
                        -};
                        -
                        -/**
                        - * Function: isPopupTrigger
                        - * 
                        - * Returns true if the given event is a popupmenu trigger for the optional
                        - * given cell.
                        - * 
                        - * Parameters:
                        - * 
                        - * me -  that represents the mouse event.
                        - */
                        -mxPopupMenu.prototype.isPopupTrigger = function(me)
                        -{
                        -	return me.isPopupTrigger() || (this.useLeftButtonForPopup && mxEvent.isLeftMouseButton(me.getEvent()));
                        -};
                        -
                        -/**
                        - * Function: addItem
                        - * 
                        - * Adds the given item to the given parent item. If no parent item is specified
                        - * then the item is added to the top-level menu. The return value may be used
                        - * as the parent argument, ie. as a submenu item. The return value is the table
                        - * row that represents the item.
                        - * 
                        - * Paramters:
                        - * 
                        - * title - String that represents the title of the menu item.
                        - * image - Optional URL for the image icon.
                        - * funct - Function associated that takes a mouseup or touchend event.
                        - * parent - Optional item returned by .
                        - * iconCls - Optional string that represents the CSS class for the image icon.
                        - * IconsCls is ignored if image is given.
                        - * enabled - Optional boolean indicating if the item is enabled. Default is true.
                        - * active - Optional boolean indicating if the menu should implement any event handling.
                        - * Default is true.
                        - */
                        -mxPopupMenu.prototype.addItem = function(title, image, funct, parent, iconCls, enabled, active)
                        -{
                        -	parent = parent || this;
                        -	this.itemCount++;
                        -	
                        -	// Smart separators only added if element contains items
                        -	if (parent.willAddSeparator)
                        -	{
                        -		if (parent.containsItems)
                        -		{
                        -			this.addSeparator(parent, true);
                        -		}
                        -
                        -		parent.willAddSeparator = false;
                        -	}
                        -
                        -	parent.containsItems = true;
                        -	var tr = document.createElement('tr');
                        -	tr.className = 'mxPopupMenuItem';
                        -	var col1 = document.createElement('td');
                        -	col1.className = 'mxPopupMenuIcon';
                        -
                        -	// Adds the given image into the first column
                        -	if (image != null)
                        -	{
                        -		var img = document.createElement('img');
                        -		img.src = image;
                        -		col1.appendChild(img);
                        -	}
                        -	else if (iconCls != null)
                        -	{
                        -		var div = document.createElement('div');
                        -		div.className = iconCls;
                        -		col1.appendChild(div);
                        -	}
                        -	
                        -	tr.appendChild(col1);
                        -	
                        -	if (this.labels)
                        -	{
                        -		var col2 = document.createElement('td');
                        -		col2.className = 'mxPopupMenuItem' +
                        -			((enabled != null && !enabled) ? ' mxDisabled' : '');
                        -		
                        -		mxUtils.write(col2, title);
                        -		col2.align = 'left';
                        -		tr.appendChild(col2);
                        -	
                        -		var col3 = document.createElement('td');
                        -		col3.className = 'mxPopupMenuItem' +
                        -			((enabled != null && !enabled) ? ' mxDisabled' : '');
                        -		col3.style.paddingRight = '6px';
                        -		col3.style.textAlign = 'right';
                        -		
                        -		tr.appendChild(col3);
                        -		
                        -		if (parent.div == null)
                        -		{
                        -			this.createSubmenu(parent);
                        -		}
                        -	}
                        -	
                        -	parent.tbody.appendChild(tr);
                        -
                        -	if (active != false && enabled != false)
                        -	{
                        -		var currentSelection = null;
                        -		
                        -		mxEvent.addGestureListeners(tr,
                        -			mxUtils.bind(this, function(evt)
                        -			{
                        -				this.eventReceiver = tr;
                        -				
                        -				if (parent.activeRow != tr && parent.activeRow != parent)
                        -				{
                        -					if (parent.activeRow != null && parent.activeRow.div.parentNode != null)
                        -					{
                        -						this.hideSubmenu(parent);
                        -					}
                        -					
                        -					if (tr.div != null)
                        -					{
                        -						this.showSubmenu(parent, tr);
                        -						parent.activeRow = tr;
                        -					}
                        -				}
                        -				
                        -				// Workaround for lost current selection in page because of focus in IE
                        -				if (document.selection != null && (mxClient.IS_QUIRKS || document.documentMode == 8))
                        -				{
                        -					currentSelection = document.selection.createRange();
                        -				}
                        -				
                        -				mxEvent.consume(evt);
                        -			}),
                        -			mxUtils.bind(this, function(evt)
                        -			{
                        -				if (parent.activeRow != tr && parent.activeRow != parent)
                        -				{
                        -					if (parent.activeRow != null && parent.activeRow.div.parentNode != null)
                        -					{
                        -						this.hideSubmenu(parent);
                        -					}
                        -					
                        -					if (this.autoExpand && tr.div != null)
                        -					{
                        -						this.showSubmenu(parent, tr);
                        -						parent.activeRow = tr;
                        -					}
                        -				}
                        -		
                        -				// Sets hover style because TR in IE doesn't have hover
                        -				tr.className = 'mxPopupMenuItemHover';
                        -			}),
                        -			mxUtils.bind(this, function(evt)
                        -			{
                        -				// EventReceiver avoids clicks on a submenu item
                        -				// which has just been shown in the mousedown
                        -				if (this.eventReceiver == tr)
                        -				{
                        -					if (parent.activeRow != tr)
                        -					{
                        -						this.hideMenu();
                        -					}
                        -					
                        -					// Workaround for lost current selection in page because of focus in IE
                        -					if (currentSelection != null)
                        -					{
                        -						// Workaround for "unspecified error" in IE8 standards
                        -						try
                        -						{
                        -							currentSelection.select();
                        -						}
                        -						catch (e)
                        -						{
                        -							// ignore
                        -						}
                        -
                        -						currentSelection = null;
                        -					}
                        -					
                        -					if (funct != null)
                        -					{
                        -						funct(evt);
                        -					}
                        -				}
                        -				
                        -				this.eventReceiver = null;
                        -				mxEvent.consume(evt);
                        -			})
                        -		);
                        -	
                        -		// Resets hover style because TR in IE doesn't have hover
                        -		mxEvent.addListener(tr, 'mouseout',
                        -			mxUtils.bind(this, function(evt)
                        -			{
                        -				tr.className = 'mxPopupMenuItem';
                        -			})
                        -		);
                        -	}
                        -	
                        -	return tr;
                        -};
                        -
                        -/**
                        - * Adds a checkmark to the given menuitem.
                        - */
                        -mxPopupMenu.prototype.addCheckmark = function(item, img)
                        -{
                        -	var td = item.firstChild.nextSibling;
                        -	td.style.backgroundImage = 'url(\'' + img + '\')';
                        -	td.style.backgroundRepeat = 'no-repeat';
                        -	td.style.backgroundPosition = '2px 50%';
                        -};
                        -
                        -/**
                        - * Function: createSubmenu
                        - * 
                        - * Creates the nodes required to add submenu items inside the given parent
                        - * item. This is called in  if a parent item is used for the first
                        - * time. This adds various DOM nodes and a  to the parent.
                        - * 
                        - * Parameters:
                        - * 
                        - * parent - An item returned by .
                        - */
                        -mxPopupMenu.prototype.createSubmenu = function(parent)
                        -{
                        -	parent.table = document.createElement('table');
                        -	parent.table.className = 'mxPopupMenu';
                        -
                        -	parent.tbody = document.createElement('tbody');
                        -	parent.table.appendChild(parent.tbody);
                        -
                        -	parent.div = document.createElement('div');
                        -	parent.div.className = 'mxPopupMenu';
                        -
                        -	parent.div.style.position = 'absolute';
                        -	parent.div.style.display = 'inline';
                        -	parent.div.style.zIndex = this.zIndex;
                        -	
                        -	parent.div.appendChild(parent.table);
                        -	
                        -	var img = document.createElement('img');
                        -	img.setAttribute('src', this.submenuImage);
                        -	
                        -	// Last column of the submenu item in the parent menu
                        -	td = parent.firstChild.nextSibling.nextSibling;
                        -	td.appendChild(img);
                        -};
                        -
                        -/**
                        - * Function: showSubmenu
                        - * 
                        - * Shows the submenu inside the given parent row.
                        - */
                        -mxPopupMenu.prototype.showSubmenu = function(parent, row)
                        -{
                        -	if (row.div != null)
                        -	{
                        -		row.div.style.left = (parent.div.offsetLeft +
                        -			row.offsetLeft+row.offsetWidth - 1) + 'px';
                        -		row.div.style.top = (parent.div.offsetTop+row.offsetTop) + 'px';
                        -		document.body.appendChild(row.div);
                        -		
                        -		// Moves the submenu to the left side if there is no space
                        -		var left = parseInt(row.div.offsetLeft);
                        -		var width = parseInt(row.div.offsetWidth);
                        -		var offset = mxUtils.getDocumentScrollOrigin(document);
                        -		
                        -		var b = document.body;
                        -		var d = document.documentElement;
                        -		
                        -		var right = offset.x + (b.clientWidth || d.clientWidth);
                        -		
                        -		if (left + width > right)
                        -		{
                        -			row.div.style.left = Math.max(0, (parent.div.offsetLeft - width + ((mxClient.IS_IE) ? 6 : -6))) + 'px';
                        -		}
                        -		
                        -		mxUtils.fit(row.div);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: addSeparator
                        - * 
                        - * Adds a horizontal separator in the given parent item or the top-level menu
                        - * if no parent is specified.
                        - * 
                        - * Parameters:
                        - * 
                        - * parent - Optional item returned by .
                        - * force - Optional boolean to ignore . Default is false.
                        - */
                        -mxPopupMenu.prototype.addSeparator = function(parent, force)
                        -{
                        -	parent = parent || this;
                        -	
                        -	if (this.smartSeparators && !force)
                        -	{
                        -		parent.willAddSeparator = true;
                        -	}
                        -	else if (parent.tbody != null)
                        -	{
                        -		parent.willAddSeparator = false;
                        -		var tr = document.createElement('tr');
                        -		
                        -		var col1 = document.createElement('td');
                        -		col1.className = 'mxPopupMenuIcon';
                        -		col1.style.padding = '0 0 0 0px';
                        -		
                        -		tr.appendChild(col1);
                        -		
                        -		var col2 = document.createElement('td');
                        -		col2.style.padding = '0 0 0 0px';
                        -		col2.setAttribute('colSpan', '2');
                        -	
                        -		var hr = document.createElement('hr');
                        -		hr.setAttribute('size', '1');
                        -		col2.appendChild(hr);
                        -		
                        -		tr.appendChild(col2);
                        -		
                        -		parent.tbody.appendChild(tr);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: popup
                        - * 
                        - * Shows the popup menu for the given event and cell.
                        - * 
                        - * Example:
                        - * 
                        - * (code)
                        - * graph.panningHandler.popup = function(x, y, cell, evt)
                        - * {
                        - *   mxUtils.alert('Hello, World!');
                        - * }
                        - * (end)
                        - */
                        -mxPopupMenu.prototype.popup = function(x, y, cell, evt)
                        -{
                        -	if (this.div != null && this.tbody != null && this.factoryMethod != null)
                        -	{
                        -		this.div.style.left = x + 'px';
                        -		this.div.style.top = y + 'px';
                        -		
                        -		// Removes all child nodes from the existing menu
                        -		while (this.tbody.firstChild != null)
                        -		{
                        -			mxEvent.release(this.tbody.firstChild);
                        -			this.tbody.removeChild(this.tbody.firstChild);
                        -		}
                        -		
                        -		this.itemCount = 0;
                        -		this.factoryMethod(this, cell, evt);
                        -		
                        -		if (this.itemCount > 0)
                        -		{
                        -			this.showMenu();
                        -			this.fireEvent(new mxEventObject(mxEvent.SHOW));
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: isMenuShowing
                        - * 
                        - * Returns true if the menu is showing.
                        - */
                        -mxPopupMenu.prototype.isMenuShowing = function()
                        -{
                        -	return this.div != null && this.div.parentNode == document.body;
                        -};
                        -
                        -/**
                        - * Function: showMenu
                        - * 
                        - * Shows the menu.
                        - */
                        -mxPopupMenu.prototype.showMenu = function()
                        -{
                        -	// Disables filter-based shadow in IE9 standards mode
                        -	if (document.documentMode >= 9)
                        -	{
                        -		this.div.style.filter = 'none';
                        -	}
                        -	
                        -	// Fits the div inside the viewport
                        -	document.body.appendChild(this.div);
                        -	mxUtils.fit(this.div);
                        -};
                        -
                        -/**
                        - * Function: hideMenu
                        - * 
                        - * Removes the menu and all submenus.
                        - */
                        -mxPopupMenu.prototype.hideMenu = function()
                        -{
                        -	if (this.div != null)
                        -	{
                        -		if (this.div.parentNode != null)
                        -		{
                        -			this.div.parentNode.removeChild(this.div);
                        -		}
                        -		
                        -		this.hideSubmenu(this);
                        -		this.containsItems = false;
                        -		this.fireEvent(new mxEventObject(mxEvent.HIDE));
                        -	}
                        -};
                        -
                        -/**
                        - * Function: hideSubmenu
                        - * 
                        - * Removes all submenus inside the given parent.
                        - * 
                        - * Parameters:
                        - * 
                        - * parent - An item returned by .
                        - */
                        -mxPopupMenu.prototype.hideSubmenu = function(parent)
                        -{
                        -	if (parent.activeRow != null)
                        -	{
                        -		this.hideSubmenu(parent.activeRow);
                        -		
                        -		if (parent.activeRow.div.parentNode != null)
                        -		{
                        -			parent.activeRow.div.parentNode.removeChild(parent.activeRow.div);
                        -		}
                        -		
                        -		parent.activeRow = null;
                        -	}
                        -};
                        -
                        -/**
                        - * Function: destroy
                        - * 
                        - * Destroys the handler and all its resources and DOM nodes.
                        - */
                        -mxPopupMenu.prototype.destroy = function()
                        -{
                        -	if (this.div != null)
                        -	{
                        -		mxEvent.release(this.div);
                        -		
                        -		if (this.div.parentNode != null)
                        -		{
                        -			this.div.parentNode.removeChild(this.div);
                        -		}
                        -		
                        -		this.div = null;
                        -	}
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxAutoSaveManager
                        - * 
                        - * Manager for automatically saving diagrams. The  hook must be
                        - * implemented.
                        - * 
                        - * Example:
                        - * 
                        - * (code)
                        - * var mgr = new mxAutoSaveManager(editor.graph);
                        - * mgr.save = function()
                        - * {
                        - *   mxLog.show();
                        - *   mxLog.debug('save');
                        - * };
                        - * (end)
                        - * 
                        - * Constructor: mxAutoSaveManager
                        - *
                        - * Constructs a new automatic layout for the given graph.
                        - *
                        - * Arguments:
                        - * 
                        - * graph - Reference to the enclosing graph. 
                        - */
                        -function mxAutoSaveManager(graph)
                        -{
                        -	// Notifies the manager of a change
                        -	this.changeHandler = mxUtils.bind(this, function(sender, evt)
                        -	{
                        -		if (this.isEnabled())
                        -		{
                        -			this.graphModelChanged(evt.getProperty('edit').changes);
                        -		}
                        -	});
                        -
                        -	this.setGraph(graph);
                        -};
                        -
                        -/**
                        - * Extends mxEventSource.
                        - */
                        -mxAutoSaveManager.prototype = new mxEventSource();
                        -mxAutoSaveManager.prototype.constructor = mxAutoSaveManager;
                        -
                        -/**
                        - * Variable: graph
                        - * 
                        - * Reference to the enclosing .
                        - */
                        -mxAutoSaveManager.prototype.graph = null;
                        -
                        -/**
                        - * Variable: autoSaveDelay
                        - * 
                        - * Minimum amount of seconds between two consecutive autosaves. Eg. a
                        - * value of 1 (s) means the graph is not stored more than once per second.
                        - * Default is 10.
                        - */
                        -mxAutoSaveManager.prototype.autoSaveDelay = 10;
                        -
                        -/**
                        - * Variable: autoSaveThrottle
                        - * 
                        - * Minimum amount of seconds between two consecutive autosaves triggered by
                        - * more than  changes within a timespan of less than
                        - *  seconds. Eg. a value of 1 (s) means the graph is not
                        - * stored more than once per second even if there are more than
                        - *  changes within that timespan. Default is 2.
                        - */
                        -mxAutoSaveManager.prototype.autoSaveThrottle = 2;
                        -
                        -/**
                        - * Variable: autoSaveThreshold
                        - * 
                        - * Minimum amount of ignored changes before an autosave. Eg. a value of 2
                        - * means after 2 change of the graph model the autosave will trigger if the
                        - * condition below is true. Default is 5.
                        - */
                        -mxAutoSaveManager.prototype.autoSaveThreshold = 5;
                        -
                        -/**
                        - * Variable: ignoredChanges
                        - * 
                        - * Counter for ignored changes in autosave.
                        - */
                        -mxAutoSaveManager.prototype.ignoredChanges = 0;
                        -
                        -/**
                        - * Variable: lastSnapshot
                        - * 
                        - * Used for autosaving. See .
                        - */
                        -mxAutoSaveManager.prototype.lastSnapshot = 0;
                        -
                        -/**
                        - * Variable: enabled
                        - * 
                        - * Specifies if event handling is enabled. Default is true.
                        - */
                        -mxAutoSaveManager.prototype.enabled = true;
                        -
                        -/**
                        - * Variable: changeHandler
                        - * 
                        - * Holds the function that handles graph model changes.
                        - */
                        -mxAutoSaveManager.prototype.changeHandler = null;
                        -
                        -/**
                        - * Function: isEnabled
                        - * 
                        - * Returns true if events are handled. This implementation
                        - * returns .
                        - */
                        -mxAutoSaveManager.prototype.isEnabled = function()
                        -{
                        -	return this.enabled;
                        -};
                        -
                        -/**
                        - * Function: setEnabled
                        - * 
                        - * Enables or disables event handling. This implementation
                        - * updates .
                        - * 
                        - * Parameters:
                        - * 
                        - * enabled - Boolean that specifies the new enabled state.
                        - */
                        -mxAutoSaveManager.prototype.setEnabled = function(value)
                        -{
                        -	this.enabled = value;
                        -};
                        -
                        -/**
                        - * Function: setGraph
                        - * 
                        - * Sets the graph that the layouts operate on.
                        - */
                        -mxAutoSaveManager.prototype.setGraph = function(graph)
                        -{
                        -	if (this.graph != null)
                        -	{
                        -		this.graph.getModel().removeListener(this.changeHandler);
                        -	}
                        -	
                        -	this.graph = graph;
                        -	
                        -	if (this.graph != null)
                        -	{
                        -		this.graph.getModel().addListener(mxEvent.CHANGE, this.changeHandler);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: save
                        - * 
                        - * Empty hook that is called if the graph should be saved.
                        - */
                        -mxAutoSaveManager.prototype.save = function()
                        -{
                        -	// empty
                        -};
                        -
                        -/**
                        - * Function: graphModelChanged
                        - * 
                        - * Invoked when the graph model has changed.
                        - */
                        -mxAutoSaveManager.prototype.graphModelChanged = function(changes)
                        -{
                        -	var now = new Date().getTime();
                        -	var dt = (now - this.lastSnapshot) / 1000;
                        -	
                        -	if (dt > this.autoSaveDelay ||
                        -		(this.ignoredChanges >= this.autoSaveThreshold &&
                        -		 dt > this.autoSaveThrottle))
                        -	{
                        -		this.save();
                        -		this.reset();
                        -	}
                        -	else
                        -	{
                        -		// Increments the number of ignored changes
                        -		this.ignoredChanges++;
                        -	}
                        -};
                        -
                        -/**
                        - * Function: reset
                        - * 
                        - * Resets all counters.
                        - */
                        -mxAutoSaveManager.prototype.reset = function()
                        -{
                        -	this.lastSnapshot = new Date().getTime();
                        -	this.ignoredChanges = 0;
                        -};
                        -
                        -/**
                        - * Function: destroy
                        - * 
                        - * Removes all handlers from the  and deletes the reference to it.
                        - */
                        -mxAutoSaveManager.prototype.destroy = function()
                        -{
                        -	this.setGraph(null);
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - *
                        - * Class: mxAnimation
                        - * 
                        - * Implements a basic animation in JavaScript.
                        - * 
                        - * Constructor: mxAnimation
                        - * 
                        - * Constructs an animation.
                        - * 
                        - * Parameters:
                        - * 
                        - * graph - Reference to the enclosing .
                        - */
                        -function mxAnimation(delay)
                        -{
                        -	this.delay = (delay != null) ? delay : 20;
                        -};
                        -
                        -/**
                        - * Extends mxEventSource.
                        - */
                        -mxAnimation.prototype = new mxEventSource();
                        -mxAnimation.prototype.constructor = mxAnimation;
                        -
                        -/**
                        - * Variable: delay
                        - * 
                        - * Specifies the delay between the animation steps. Defaul is 30ms.
                        - */
                        -mxAnimation.prototype.delay = null;
                        -
                        -/**
                        - * Variable: thread
                        - * 
                        - * Reference to the thread while the animation is running.
                        - */
                        -mxAnimation.prototype.thread = null;
                        -
                        -/**
                        - * Function: isRunning
                        - * 
                        - * Returns true if the animation is running.
                        - */
                        -mxAnimation.prototype.isRunning = function()
                        -{
                        -	return this.thread != null;
                        -};
                        -
                        -/**
                        - * Function: startAnimation
                        - *
                        - * Starts the animation by repeatedly invoking updateAnimation.
                        - */
                        -mxAnimation.prototype.startAnimation = function()
                        -{
                        -	if (this.thread == null)
                        -	{
                        -		this.thread = window.setInterval(mxUtils.bind(this, this.updateAnimation), this.delay);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: updateAnimation
                        - *
                        - * Hook for subclassers to implement the animation. Invoke stopAnimation
                        - * when finished, startAnimation to resume. This is called whenever the
                        - * timer fires and fires an mxEvent.EXECUTE event with no properties.
                        - */
                        -mxAnimation.prototype.updateAnimation = function()
                        -{
                        -	this.fireEvent(new mxEventObject(mxEvent.EXECUTE));
                        -};
                        -
                        -/**
                        - * Function: stopAnimation
                        - *
                        - * Stops the animation by deleting the timer and fires an .
                        - */
                        -mxAnimation.prototype.stopAnimation = function()
                        -{
                        -	if (this.thread != null)
                        -	{
                        -		window.clearInterval(this.thread);
                        -		this.thread = null;
                        -		this.fireEvent(new mxEventObject(mxEvent.DONE));
                        -	}
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - *
                        - * Class: mxMorphing
                        - * 
                        - * Implements animation for morphing cells. Here is an example of
                        - * using this class for animating the result of a layout algorithm:
                        - * 
                        - * (code)
                        - * graph.getModel().beginUpdate();
                        - * try
                        - * {
                        - *   var circleLayout = new mxCircleLayout(graph);
                        - *   circleLayout.execute(graph.getDefaultParent());
                        - * }
                        - * finally
                        - * {
                        - *   var morph = new mxMorphing(graph);
                        - *   morph.addListener(mxEvent.DONE, function()
                        - *   {
                        - *     graph.getModel().endUpdate();
                        - *   });
                        - *   
                        - *   morph.startAnimation();
                        - * }
                        - * (end)
                        - * 
                        - * Constructor: mxMorphing
                        - * 
                        - * Constructs an animation.
                        - * 
                        - * Parameters:
                        - * 
                        - * graph - Reference to the enclosing .
                        - * steps - Optional number of steps in the morphing animation. Default is 6.
                        - * ease - Optional easing constant for the animation. Default is 1.5.
                        - * delay - Optional delay between the animation steps. Passed to .
                        - */
                        -function mxMorphing(graph, steps, ease, delay)
                        -{
                        -	mxAnimation.call(this, delay);
                        -	this.graph = graph;
                        -	this.steps = (steps != null) ? steps : 6;
                        -	this.ease = (ease != null) ? ease : 1.5;
                        -};
                        -
                        -/**
                        - * Extends mxEventSource.
                        - */
                        -mxMorphing.prototype = new mxAnimation();
                        -mxMorphing.prototype.constructor = mxMorphing;
                        -
                        -/**
                        - * Variable: graph
                        - * 
                        - * Specifies the delay between the animation steps. Defaul is 30ms.
                        - */
                        -mxMorphing.prototype.graph = null;
                        -
                        -/**
                        - * Variable: steps
                        - * 
                        - * Specifies the maximum number of steps for the morphing.
                        - */
                        -mxMorphing.prototype.steps = null;
                        -
                        -/**
                        - * Variable: step
                        - * 
                        - * Contains the current step.
                        - */
                        -mxMorphing.prototype.step = 0;
                        -
                        -/**
                        - * Variable: ease
                        - * 
                        - * Ease-off for movement towards the given vector. Larger values are
                        - * slower and smoother. Default is 4.
                        - */
                        -mxMorphing.prototype.ease = null;
                        -
                        -/**
                        - * Variable: cells
                        - * 
                        - * Optional array of cells to be animated. If this is not specified
                        - * then all cells are checked and animated if they have been moved
                        - * in the current transaction.
                        - */
                        -mxMorphing.prototype.cells = null;
                        -
                        -/**
                        - * Function: updateAnimation
                        - *
                        - * Animation step.
                        - */
                        -mxMorphing.prototype.updateAnimation = function()
                        -{
                        -	mxAnimation.prototype.updateAnimation.apply(this, arguments);
                        -	var move = new mxCellStatePreview(this.graph);
                        -
                        -	if (this.cells != null)
                        -	{
                        -		// Animates the given cells individually without recursion
                        -		for (var i = 0; i < this.cells.length; i++)
                        -		{
                        -			this.animateCell(this.cells[i], move, false);
                        -		}
                        -	}
                        -	else
                        -	{
                        -		// Animates all changed cells by using recursion to find
                        -		// the changed cells but not for the animation itself
                        -		this.animateCell(this.graph.getModel().getRoot(), move, true);
                        -	}
                        -	
                        -	this.show(move);
                        -	
                        -	if (move.isEmpty() || this.step++ >= this.steps)
                        -	{
                        -		this.stopAnimation();
                        -	}
                        -};
                        -
                        -/**
                        - * Function: show
                        - *
                        - * Shows the changes in the given .
                        - */
                        -mxMorphing.prototype.show = function(move)
                        -{
                        -	move.show();
                        -};
                        -
                        -/**
                        - * Function: animateCell
                        - *
                        - * Animates the given cell state using .
                        - */
                        -mxMorphing.prototype.animateCell = function(cell, move, recurse)
                        -{
                        -	var state = this.graph.getView().getState(cell);
                        -	var delta = null;
                        -
                        -	if (state != null)
                        -	{
                        -		// Moves the animated state from where it will be after the model
                        -		// change by subtracting the given delta vector from that location
                        -		delta = this.getDelta(state);
                        -
                        -		if (this.graph.getModel().isVertex(cell) && (delta.x != 0 || delta.y != 0))
                        -		{
                        -			var translate = this.graph.view.getTranslate();
                        -			var scale = this.graph.view.getScale();
                        -			
                        -			delta.x += translate.x * scale;
                        -			delta.y += translate.y * scale;
                        -			
                        -			move.moveState(state, -delta.x / this.ease, -delta.y / this.ease);
                        -		}
                        -	}
                        -	
                        -	if (recurse && !this.stopRecursion(state, delta))
                        -	{
                        -		var childCount = this.graph.getModel().getChildCount(cell);
                        -
                        -		for (var i = 0; i < childCount; i++)
                        -		{
                        -			this.animateCell(this.graph.getModel().getChildAt(cell, i), move, recurse);
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: stopRecursion
                        - *
                        - * Returns true if the animation should not recursively find more
                        - * deltas for children if the given parent state has been animated.
                        - */
                        -mxMorphing.prototype.stopRecursion = function(state, delta)
                        -{
                        -	return delta != null && (delta.x != 0 || delta.y != 0);
                        -};
                        -
                        -/**
                        - * Function: getDelta
                        - *
                        - * Returns the vector between the current rendered state and the future
                        - * location of the state after the display will be updated.
                        - */
                        -mxMorphing.prototype.getDelta = function(state)
                        -{
                        -	var origin = this.getOriginForCell(state.cell);
                        -	var translate = this.graph.getView().getTranslate();
                        -	var scale = this.graph.getView().getScale();
                        -	var x = state.x / scale - translate.x;
                        -	var y = state.y / scale - translate.y;
                        -
                        -	return new mxPoint((origin.x - x) * scale, (origin.y - y) * scale);
                        -};
                        -
                        -/**
                        - * Function: getOriginForCell
                        - *
                        - * Returns the top, left corner of the given cell. TODO: Improve performance
                        - * by using caching inside this method as the result per cell never changes
                        - * during the lifecycle of this object.
                        - */
                        -mxMorphing.prototype.getOriginForCell = function(cell)
                        -{
                        -	var result = null;
                        -	
                        -	if (cell != null)
                        -	{
                        -		var parent = this.graph.getModel().getParent(cell);
                        -		var geo = this.graph.getCellGeometry(cell);
                        -		result = this.getOriginForCell(parent);
                        -		
                        -		// TODO: Handle offsets
                        -		if (geo != null)
                        -		{
                        -			if (geo.relative)
                        -			{
                        -				var pgeo = this.graph.getCellGeometry(parent);
                        -				
                        -				if (pgeo != null)
                        -				{
                        -					result.x += geo.x * pgeo.width;
                        -					result.y += geo.y * pgeo.height;
                        -				}
                        -			}
                        -			else
                        -			{
                        -				result.x += geo.x;
                        -				result.y += geo.y;
                        -			}
                        -		}
                        -	}
                        -	
                        -	if (result == null)
                        -	{
                        -		var t = this.graph.view.getTranslate();
                        -		result = new mxPoint(-t.x, -t.y);
                        -	}
                        -	
                        -	return result;
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxImageBundle
                        - *
                        - * Maps from keys to base64 encoded images or file locations. All values must
                        - * be URLs or use the format data:image/format followed by a comma and the base64
                        - * encoded image data, eg. "data:image/gif,XYZ", where XYZ is the base64 encoded
                        - * image data.
                        - * 
                        - * To add a new image bundle to an existing graph, the following code is used:
                        - * 
                        - * (code)
                        - * var bundle = new mxImageBundle(alt);
                        - * bundle.putImage('myImage', 'data:image/gif,R0lGODlhEAAQAMIGAAAAAICAAICAgP' +
                        - *   '//AOzp2O3r2////////yH+FUNyZWF0ZWQgd2l0aCBUaGUgR0lNUAAh+QQBCgAHACwAAAAA' +
                        - *   'EAAQAAADTXi63AowynnAMDfjPUDlnAAJhmeBFxAEloliKltWmiYCQvfVr6lBPB1ggxN1hi' +
                        - *   'laSSASFQpIV5HJBDyHpqK2ejVRm2AAgZCdmCGO9CIBADs=', fallback);
                        - * bundle.putImage('mySvgImage', 'data:image/svg+xml,' + encodeURIComponent(
                        - *   '' +
                        - *   '' +
                        - *   '' +
                        - *   ''), fallback);
                        - * graph.addImageBundle(bundle);
                        - * (end);
                        - * 
                        - * Alt is an optional boolean (default is false) that specifies if the value
                        - * or the fallback should be returned in .
                        - * 
                        - * The image can then be referenced in any cell style using image=myImage.
                        - * If you are using mxOutline, you should use the same image bundles in the
                        - * graph that renders the outline.
                        - * 
                        - * The keys for images are resolved in  and
                        - * turned into a data URI if the returned value has a short data URI format
                        - * as specified above.
                        - * 
                        - * A typical value for the fallback is a MTHML link as defined in RFC 2557.
                        - * Note that this format requires a file to be dynamically created on the
                        - * server-side, or the page that contains the graph to be modified to contain
                        - * the resources, this can be done by adding a comment that contains the
                        - * resource in the HEAD section of the page after the title tag.
                        - * 
                        - * This type of fallback mechanism should be used in IE6 and IE7. IE8 does
                        - * support data URIs, but the maximum size is limited to 32 KB, which means
                        - * all data URIs should be limited to 32 KB.
                        - */
                        -function mxImageBundle(alt)
                        -{
                        -	this.images = [];
                        -	this.alt = (alt != null) ? alt : false;
                        -};
                        -
                        -/**
                        - * Variable: images
                        - * 
                        - * Maps from keys to images.
                        - */
                        -mxImageBundle.prototype.images = null;
                        -
                        -/**
                        - * Variable: alt
                        - * 
                        - * Specifies if the fallback representation should be returned.
                        - */
                        -mxImageBundle.prototype.images = null;
                        -
                        -/**
                        - * Function: putImage
                        - * 
                        - * Adds the specified entry to the map. The entry is an object with a value and
                        - * fallback property as specified in the arguments.
                        - */
                        -mxImageBundle.prototype.putImage = function(key, value, fallback)
                        -{
                        -	this.images[key] = {value: value, fallback: fallback};
                        -};
                        -
                        -/**
                        - * Function: getImage
                        - * 
                        - * Returns the value for the given key. This returns the value
                        - * or fallback, depending on . The fallback is returned if
                        - *  is true, the value is returned otherwise.
                        - */
                        -mxImageBundle.prototype.getImage = function(key)
                        -{
                        -	var result = null;
                        -	
                        -	if (key != null)
                        -	{
                        -		var img = this.images[key];
                        -		
                        -		if (img != null)
                        -		{
                        -			result = (this.alt) ? img.fallback : img.value;
                        -		}
                        -	}
                        -	
                        -	return result;
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxImageExport
                        - * 
                        - * Creates a new image export instance to be used with an export canvas. Here
                        - * is an example that uses this class to create an image via a backend using
                        - * .
                        - * 
                        - * (code)
                        - * var xmlDoc = mxUtils.createXmlDocument();
                        - * var root = xmlDoc.createElement('output');
                        - * xmlDoc.appendChild(root);
                        - * 
                        - * var xmlCanvas = new mxXmlCanvas2D(root);
                        - * var imgExport = new mxImageExport();
                        - * imgExport.drawState(graph.getView().getState(graph.model.root), xmlCanvas);
                        - * 
                        - * var bounds = graph.getGraphBounds();
                        - * var w = Math.ceil(bounds.x + bounds.width);
                        - * var h = Math.ceil(bounds.y + bounds.height);
                        - * 
                        - * var xml = mxUtils.getXml(root);
                        - * new mxXmlRequest('export', 'format=png&w=' + w +
                        - * 		'&h=' + h + '&bg=#F9F7ED&xml=' + encodeURIComponent(xml))
                        - * 		.simulate(document, '_blank');
                        - * (end)
                        - * 
                        - * Constructor: mxImageExport
                        - * 
                        - * Constructs a new image export.
                        - */
                        -function mxImageExport() { };
                        -
                        -/**
                        - * Variable: includeOverlays
                        - * 
                        - * Specifies if overlays should be included in the export. Default is false.
                        - */
                        -mxImageExport.prototype.includeOverlays = false;
                        -
                        -/**
                        - * Function: drawState
                        - * 
                        - * Draws the given state and all its descendants to the given canvas.
                        - */
                        -mxImageExport.prototype.drawState = function(state, canvas)
                        -{
                        -	if (state != null)
                        -	{
                        -		this.visitStatesRecursive(state, canvas, mxUtils.bind(this, function()
                        -		{
                        -			this.drawCellState.apply(this, arguments);
                        -		}));
                        -				
                        -		// Paints the overlays
                        -		if (this.includeOverlays)
                        -		{
                        -			this.visitStatesRecursive(state, canvas, mxUtils.bind(this, function()
                        -			{
                        -				this.drawOverlays.apply(this, arguments);
                        -			}));
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: drawState
                        - * 
                        - * Draws the given state and all its descendants to the given canvas.
                        - */
                        -mxImageExport.prototype.visitStatesRecursive = function(state, canvas, visitor)
                        -{
                        -	if (state != null)
                        -	{
                        -		visitor(state, canvas);
                        -		
                        -		var graph = state.view.graph;
                        -		var childCount = graph.model.getChildCount(state.cell);
                        -		
                        -		for (var i = 0; i < childCount; i++)
                        -		{
                        -			var childState = graph.view.getState(graph.model.getChildAt(state.cell, i));
                        -			this.visitStatesRecursive(childState, canvas, visitor);
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: getLinkForCellState
                        - * 
                        - * Returns the link for the given cell state and canvas. This returns null.
                        - */
                        -mxImageExport.prototype.getLinkForCellState = function(state, canvas)
                        -{
                        -	return null;
                        -};
                        -
                        -/**
                        - * Function: drawCellState
                        - * 
                        - * Draws the given state to the given canvas.
                        - */
                        -mxImageExport.prototype.drawCellState = function(state, canvas)
                        -{
                        -	// Experimental feature
                        -	var link = this.getLinkForCellState(state, canvas);
                        -	
                        -	if (link != null)
                        -	{
                        -		canvas.setLink(link);
                        -	}
                        -	
                        -	// Paints the shape and text
                        -	this.drawShape(state, canvas);
                        -	this.drawText(state, canvas);
                        -
                        -	if (link != null)
                        -	{
                        -		canvas.setLink(null);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: drawShape
                        - * 
                        - * Draws the shape of the given state.
                        - */
                        -mxImageExport.prototype.drawShape = function(state, canvas)
                        -{
                        -	if (state.shape instanceof mxShape && state.shape.checkBounds())
                        -	{
                        -		canvas.save();
                        -		state.shape.paint(canvas);
                        -		canvas.restore();
                        -	}
                        -};
                        -
                        -/**
                        - * Function: drawText
                        - * 
                        - * Draws the text of the given state.
                        - */
                        -mxImageExport.prototype.drawText = function(state, canvas)
                        -{
                        -	if (state.text != null && state.text.checkBounds())
                        -	{
                        -		canvas.save();
                        -		state.text.paint(canvas);
                        -		canvas.restore();
                        -	}
                        -};
                        -
                        -/**
                        - * Function: drawOverlays
                        - * 
                        - * Draws the overlays for the given state. This is called if 
                        - * is true.
                        - */
                        -mxImageExport.prototype.drawOverlays = function(state, canvas)
                        -{
                        -	if (state.overlays != null)
                        -	{
                        -		state.overlays.visit(function(id, shape)
                        -		{
                        -			if (shape instanceof mxShape)
                        -			{
                        -				shape.paint(canvas);
                        -			}
                        -		});
                        -	}
                        -};
                        -
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxAbstractCanvas2D
                        - *
                        - * Base class for all canvases. A description of the public API is available in .
                        - * All color values of  will be converted to null in the state.
                        - * 
                        - * Constructor: mxAbstractCanvas2D
                        - *
                        - * Constructs a new abstract canvas.
                        - */
                        -function mxAbstractCanvas2D()
                        -{
                        -	/**
                        -	 * Variable: converter
                        -	 * 
                        -	 * Holds the  to convert image URLs.
                        -	 */
                        -	this.converter = this.createUrlConverter();
                        -	
                        -	this.reset();
                        -};
                        -
                        -/**
                        - * Variable: state
                        - * 
                        - * Holds the current state.
                        - */
                        -mxAbstractCanvas2D.prototype.state = null;
                        -
                        -/**
                        - * Variable: states
                        - * 
                        - * Stack of states.
                        - */
                        -mxAbstractCanvas2D.prototype.states = null;
                        -
                        -/**
                        - * Variable: path
                        - * 
                        - * Holds the current path as an array.
                        - */
                        -mxAbstractCanvas2D.prototype.path = null;
                        -
                        -/**
                        - * Variable: rotateHtml
                        - * 
                        - * Switch for rotation of HTML. Default is false.
                        - */
                        -mxAbstractCanvas2D.prototype.rotateHtml = true;
                        -
                        -/**
                        - * Variable: lastX
                        - * 
                        - * Holds the last x coordinate.
                        - */
                        -mxAbstractCanvas2D.prototype.lastX = 0;
                        -
                        -/**
                        - * Variable: lastY
                        - * 
                        - * Holds the last y coordinate.
                        - */
                        -mxAbstractCanvas2D.prototype.lastY = 0;
                        -
                        -/**
                        - * Variable: moveOp
                        - * 
                        - * Contains the string used for moving in paths. Default is 'M'.
                        - */
                        -mxAbstractCanvas2D.prototype.moveOp = 'M';
                        -
                        -/**
                        - * Variable: lineOp
                        - * 
                        - * Contains the string used for moving in paths. Default is 'L'.
                        - */
                        -mxAbstractCanvas2D.prototype.lineOp = 'L';
                        -
                        -/**
                        - * Variable: quadOp
                        - * 
                        - * Contains the string used for quadratic paths. Default is 'Q'.
                        - */
                        -mxAbstractCanvas2D.prototype.quadOp = 'Q';
                        -
                        -/**
                        - * Variable: curveOp
                        - * 
                        - * Contains the string used for bezier curves. Default is 'C'.
                        - */
                        -mxAbstractCanvas2D.prototype.curveOp = 'C';
                        -
                        -/**
                        - * Variable: closeOp
                        - * 
                        - * Holds the operator for closing curves. Default is 'Z'.
                        - */
                        -mxAbstractCanvas2D.prototype.closeOp = 'Z';
                        -
                        -/**
                        - * Variable: pointerEvents
                        - * 
                        - * Boolean value that specifies if events should be handled. Default is false.
                        - */
                        -mxAbstractCanvas2D.prototype.pointerEvents = false;
                        -
                        -/**
                        - * Function: createUrlConverter
                        - * 
                        - * Create a new  and returns it.
                        - */
                        -mxAbstractCanvas2D.prototype.createUrlConverter = function()
                        -{
                        -	return new mxUrlConverter();
                        -};
                        -
                        -/**
                        - * Function: reset
                        - * 
                        - * Resets the state of this canvas.
                        - */
                        -mxAbstractCanvas2D.prototype.reset = function()
                        -{
                        -	this.state = this.createState();
                        -	this.states = [];
                        -};
                        -
                        -/**
                        - * Function: createState
                        - * 
                        - * Creates the state of the this canvas.
                        - */
                        -mxAbstractCanvas2D.prototype.createState = function()
                        -{
                        -	return {
                        -		dx: 0,
                        -		dy: 0,
                        -		scale: 1,
                        -		alpha: 1,
                        -		fillAlpha: 1,
                        -		strokeAlpha: 1,
                        -		fillColor: null,
                        -		gradientFillAlpha: 1,
                        -		gradientColor: null,
                        -		gradientAlpha: 1,
                        -		gradientDirection: null,
                        -		strokeColor: null,
                        -		strokeWidth: 1,
                        -		dashed: false,
                        -		dashPattern: '3 3',
                        -		fixDash: false,
                        -		lineCap: 'flat',
                        -		lineJoin: 'miter',
                        -		miterLimit: 10,
                        -		fontColor: '#000000',
                        -		fontBackgroundColor: null,
                        -		fontBorderColor: null,
                        -		fontSize: mxConstants.DEFAULT_FONTSIZE,
                        -		fontFamily: mxConstants.DEFAULT_FONTFAMILY,
                        -		fontStyle: 0,
                        -		shadow: false,
                        -		shadowColor: mxConstants.SHADOWCOLOR,
                        -		shadowAlpha: mxConstants.SHADOW_OPACITY,
                        -		shadowDx: mxConstants.SHADOW_OFFSET_X,
                        -		shadowDy: mxConstants.SHADOW_OFFSET_Y,
                        -		rotation: 0,
                        -		rotationCx: 0,
                        -		rotationCy: 0
                        -	};
                        -};
                        -
                        -/**
                        - * Function: format
                        - * 
                        - * Rounds all numbers to integers.
                        - */
                        -mxAbstractCanvas2D.prototype.format = function(value)
                        -{
                        -	return Math.round(parseFloat(value));
                        -};
                        -
                        -/**
                        - * Function: addOp
                        - * 
                        - * Adds the given operation to the path.
                        - */
                        -mxAbstractCanvas2D.prototype.addOp = function()
                        -{
                        -	if (this.path != null)
                        -	{
                        -		this.path.push(arguments[0]);
                        -		
                        -		if (arguments.length > 2)
                        -		{
                        -			var s = this.state;
                        -
                        -			for (var i = 2; i < arguments.length; i += 2)
                        -			{
                        -				this.lastX = arguments[i - 1];
                        -				this.lastY = arguments[i];
                        -				
                        -				this.path.push(this.format((this.lastX + s.dx) * s.scale));
                        -				this.path.push(this.format((this.lastY + s.dy) * s.scale));
                        -			}
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: rotatePoint
                        - * 
                        - * Rotates the given point and returns the result as an .
                        - */
                        -mxAbstractCanvas2D.prototype.rotatePoint = function(x, y, theta, cx, cy)
                        -{
                        -	var rad = theta * (Math.PI / 180);
                        -	
                        -	return mxUtils.getRotatedPoint(new mxPoint(x, y), Math.cos(rad),
                        -		Math.sin(rad), new mxPoint(cx, cy));
                        -};
                        -
                        -/**
                        - * Function: save
                        - * 
                        - * Saves the current state.
                        - */
                        -mxAbstractCanvas2D.prototype.save = function()
                        -{
                        -	this.states.push(this.state);
                        -	this.state = mxUtils.clone(this.state);
                        -};
                        -
                        -/**
                        - * Function: restore
                        - * 
                        - * Restores the current state.
                        - */
                        -mxAbstractCanvas2D.prototype.restore = function()
                        -{
                        -	if (this.states.length > 0)
                        -	{
                        -		this.state = this.states.pop();
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setLink
                        - * 
                        - * Sets the current link. Hook for subclassers.
                        - */
                        -mxAbstractCanvas2D.prototype.setLink = function(link)
                        -{
                        -	// nop
                        -};
                        -
                        -/**
                        - * Function: scale
                        - * 
                        - * Scales the current state.
                        - */
                        -mxAbstractCanvas2D.prototype.scale = function(value)
                        -{
                        -	this.state.scale *= value;
                        -	this.state.strokeWidth *= value;
                        -};
                        -
                        -/**
                        - * Function: translate
                        - * 
                        - * Translates the current state.
                        - */
                        -mxAbstractCanvas2D.prototype.translate = function(dx, dy)
                        -{
                        -	this.state.dx += dx;
                        -	this.state.dy += dy;
                        -};
                        -
                        -/**
                        - * Function: rotate
                        - * 
                        - * Rotates the current state.
                        - */
                        -mxAbstractCanvas2D.prototype.rotate = function(theta, flipH, flipV, cx, cy)
                        -{
                        -	// nop
                        -};
                        -
                        -/**
                        - * Function: setAlpha
                        - * 
                        - * Sets the current alpha.
                        - */
                        -mxAbstractCanvas2D.prototype.setAlpha = function(value)
                        -{
                        -	this.state.alpha = value;
                        -};
                        -
                        -/**
                        - * Function: setFillAlpha
                        - * 
                        - * Sets the current solid fill alpha.
                        - */
                        -mxAbstractCanvas2D.prototype.setFillAlpha = function(value)
                        -{
                        -	this.state.fillAlpha = value;
                        -};
                        -
                        -/**
                        - * Function: setStrokeAlpha
                        - * 
                        - * Sets the current stroke alpha.
                        - */
                        -mxAbstractCanvas2D.prototype.setStrokeAlpha = function(value)
                        -{
                        -	this.state.strokeAlpha = value;
                        -};
                        -
                        -/**
                        - * Function: setFillColor
                        - * 
                        - * Sets the current fill color.
                        - */
                        -mxAbstractCanvas2D.prototype.setFillColor = function(value)
                        -{
                        -	if (value == mxConstants.NONE)
                        -	{
                        -		value = null;
                        -	}
                        -	
                        -	this.state.fillColor = value;
                        -	this.state.gradientColor = null;
                        -};
                        -
                        -/**
                        - * Function: setGradient
                        - * 
                        - * Sets the current gradient.
                        - */
                        -mxAbstractCanvas2D.prototype.setGradient = function(color1, color2, x, y, w, h, direction, alpha1, alpha2)
                        -{
                        -	var s = this.state;
                        -	s.fillColor = color1;
                        -	s.gradientFillAlpha = (alpha1 != null) ? alpha1 : 1;
                        -	s.gradientColor = color2;
                        -	s.gradientAlpha = (alpha2 != null) ? alpha2 : 1;
                        -	s.gradientDirection = direction;
                        -};
                        -
                        -/**
                        - * Function: setStrokeColor
                        - * 
                        - * Sets the current stroke color.
                        - */
                        -mxAbstractCanvas2D.prototype.setStrokeColor = function(value)
                        -{
                        -	if (value == mxConstants.NONE)
                        -	{
                        -		value = null;
                        -	}
                        -	
                        -	this.state.strokeColor = value;
                        -};
                        -
                        -/**
                        - * Function: setStrokeWidth
                        - * 
                        - * Sets the current stroke width.
                        - */
                        -mxAbstractCanvas2D.prototype.setStrokeWidth = function(value)
                        -{
                        -	this.state.strokeWidth = value;
                        -};
                        -
                        -/**
                        - * Function: setDashed
                        - * 
                        - * Enables or disables dashed lines.
                        - */
                        -mxAbstractCanvas2D.prototype.setDashed = function(value, fixDash)
                        -{
                        -	this.state.dashed = value;
                        -	this.state.fixDash = fixDash;
                        -};
                        -
                        -/**
                        - * Function: setDashPattern
                        - * 
                        - * Sets the current dash pattern.
                        - */
                        -mxAbstractCanvas2D.prototype.setDashPattern = function(value)
                        -{
                        -	this.state.dashPattern = value;
                        -};
                        -
                        -/**
                        - * Function: setLineCap
                        - * 
                        - * Sets the current line cap.
                        - */
                        -mxAbstractCanvas2D.prototype.setLineCap = function(value)
                        -{
                        -	this.state.lineCap = value;
                        -};
                        -
                        -/**
                        - * Function: setLineJoin
                        - * 
                        - * Sets the current line join.
                        - */
                        -mxAbstractCanvas2D.prototype.setLineJoin = function(value)
                        -{
                        -	this.state.lineJoin = value;
                        -};
                        -
                        -/**
                        - * Function: setMiterLimit
                        - * 
                        - * Sets the current miter limit.
                        - */
                        -mxAbstractCanvas2D.prototype.setMiterLimit = function(value)
                        -{
                        -	this.state.miterLimit = value;
                        -};
                        -
                        -/**
                        - * Function: setFontColor
                        - * 
                        - * Sets the current font color.
                        - */
                        -mxAbstractCanvas2D.prototype.setFontColor = function(value)
                        -{
                        -	if (value == mxConstants.NONE)
                        -	{
                        -		value = null;
                        -	}
                        -	
                        -	this.state.fontColor = value;
                        -};
                        -
                        -/**
                        - * Function: setFontColor
                        - * 
                        - * Sets the current font color.
                        - */
                        -mxAbstractCanvas2D.prototype.setFontBackgroundColor = function(value)
                        -{
                        -	if (value == mxConstants.NONE)
                        -	{
                        -		value = null;
                        -	}
                        -	
                        -	this.state.fontBackgroundColor = value;
                        -};
                        -
                        -/**
                        - * Function: setFontColor
                        - * 
                        - * Sets the current font color.
                        - */
                        -mxAbstractCanvas2D.prototype.setFontBorderColor = function(value)
                        -{
                        -	if (value == mxConstants.NONE)
                        -	{
                        -		value = null;
                        -	}
                        -	
                        -	this.state.fontBorderColor = value;
                        -};
                        -
                        -/**
                        - * Function: setFontSize
                        - * 
                        - * Sets the current font size.
                        - */
                        -mxAbstractCanvas2D.prototype.setFontSize = function(value)
                        -{
                        -	this.state.fontSize = parseFloat(value);
                        -};
                        -
                        -/**
                        - * Function: setFontFamily
                        - * 
                        - * Sets the current font family.
                        - */
                        -mxAbstractCanvas2D.prototype.setFontFamily = function(value)
                        -{
                        -	this.state.fontFamily = value;
                        -};
                        -
                        -/**
                        - * Function: setFontStyle
                        - * 
                        - * Sets the current font style.
                        - */
                        -mxAbstractCanvas2D.prototype.setFontStyle = function(value)
                        -{
                        -	if (value == null)
                        -	{
                        -		value = 0;
                        -	}
                        -	
                        -	this.state.fontStyle = value;
                        -};
                        -
                        -/**
                        - * Function: setShadow
                        - * 
                        - * Enables or disables and configures the current shadow.
                        - */
                        -mxAbstractCanvas2D.prototype.setShadow = function(enabled)
                        -{
                        -	this.state.shadow = enabled;
                        -};
                        -
                        -/**
                        - * Function: setShadowColor
                        - * 
                        - * Enables or disables and configures the current shadow.
                        - */
                        -mxAbstractCanvas2D.prototype.setShadowColor = function(value)
                        -{
                        -	if (value == mxConstants.NONE)
                        -	{
                        -		value = null;
                        -	}
                        -	
                        -	this.state.shadowColor = value;
                        -};
                        -
                        -/**
                        - * Function: setShadowAlpha
                        - * 
                        - * Enables or disables and configures the current shadow.
                        - */
                        -mxAbstractCanvas2D.prototype.setShadowAlpha = function(value)
                        -{
                        -	this.state.shadowAlpha = value;
                        -};
                        -
                        -/**
                        - * Function: setShadowOffset
                        - * 
                        - * Enables or disables and configures the current shadow.
                        - */
                        -mxAbstractCanvas2D.prototype.setShadowOffset = function(dx, dy)
                        -{
                        -	this.state.shadowDx = dx;
                        -	this.state.shadowDy = dy;
                        -};
                        -
                        -/**
                        - * Function: begin
                        - * 
                        - * Starts a new path.
                        - */
                        -mxAbstractCanvas2D.prototype.begin = function()
                        -{
                        -	this.lastX = 0;
                        -	this.lastY = 0;
                        -	this.path = [];
                        -};
                        -
                        -/**
                        - * Function: moveTo
                        - * 
                        - *  Moves the current path the given coordinates.
                        - */
                        -mxAbstractCanvas2D.prototype.moveTo = function(x, y)
                        -{
                        -	this.addOp(this.moveOp, x, y);
                        -};
                        -
                        -/**
                        - * Function: lineTo
                        - * 
                        - * Draws a line to the given coordinates. Uses moveTo with the op argument.
                        - */
                        -mxAbstractCanvas2D.prototype.lineTo = function(x, y)
                        -{
                        -	this.addOp(this.lineOp, x, y);
                        -};
                        -
                        -/**
                        - * Function: quadTo
                        - * 
                        - * Adds a quadratic curve to the current path.
                        - */
                        -mxAbstractCanvas2D.prototype.quadTo = function(x1, y1, x2, y2)
                        -{
                        -	this.addOp(this.quadOp, x1, y1, x2, y2);
                        -};
                        -
                        -/**
                        - * Function: curveTo
                        - * 
                        - * Adds a bezier curve to the current path.
                        - */
                        -mxAbstractCanvas2D.prototype.curveTo = function(x1, y1, x2, y2, x3, y3)
                        -{
                        -	this.addOp(this.curveOp, x1, y1, x2, y2, x3, y3);
                        -};
                        -
                        -/**
                        - * Function: arcTo
                        - * 
                        - * Adds the given arc to the current path. This is a synthetic operation that
                        - * is broken down into curves.
                        - */
                        -mxAbstractCanvas2D.prototype.arcTo = function(rx, ry, angle, largeArcFlag, sweepFlag, x, y)
                        -{
                        -	var curves = mxUtils.arcToCurves(this.lastX, this.lastY, rx, ry, angle, largeArcFlag, sweepFlag, x, y);
                        -	
                        -	if (curves != null)
                        -	{
                        -		for (var i = 0; i < curves.length; i += 6) 
                        -		{
                        -			this.curveTo(curves[i], curves[i + 1], curves[i + 2],
                        -				curves[i + 3], curves[i + 4], curves[i + 5]);
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: close
                        - * 
                        - * Closes the current path.
                        - */
                        -mxAbstractCanvas2D.prototype.close = function(x1, y1, x2, y2, x3, y3)
                        -{
                        -	this.addOp(this.closeOp);
                        -};
                        -
                        -/**
                        - * Function: end
                        - * 
                        - * Empty implementation for backwards compatibility. This will be removed.
                        - */
                        -mxAbstractCanvas2D.prototype.end = function() { };
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxXmlCanvas2D
                        - *
                        - * Base class for all canvases. The following methods make up the public
                        - * interface of the canvas 2D for all painting in mxGraph:
                        - * 
                        - * - , 
                        - * - , , 
                        - * - , , , , ,
                        - *   , , , , , 
                        - *   , 
                        - * - , , , ,
                        - *   , 
                        - * - , , , 
                        - * - , , , , 
                        - * - , , , , 
                        - * - , , 
                        - * 
                        - *  is an additional method for drawing paths. This is
                        - * a synthetic method, meaning that it is turned into a sequence of curves by
                        - * default. Subclassers may add native support for arcs.
                        - * 
                        - * Constructor: mxXmlCanvas2D
                        - *
                        - * Constructs a new abstract canvas.
                        - */
                        -function mxXmlCanvas2D(root)
                        -{
                        -	mxAbstractCanvas2D.call(this);
                        -
                        -	/**
                        -	 * Variable: root
                        -	 * 
                        -	 * Reference to the container for the SVG content.
                        -	 */
                        -	this.root = root;
                        -
                        -	// Writes default settings;
                        -	this.writeDefaults();
                        -};
                        -
                        -/**
                        - * Extends mxAbstractCanvas2D
                        - */
                        -mxUtils.extend(mxXmlCanvas2D, mxAbstractCanvas2D);
                        -
                        -/**
                        - * Variable: textEnabled
                        - * 
                        - * Specifies if text output should be enabled. Default is true.
                        - */
                        -mxXmlCanvas2D.prototype.textEnabled = true;
                        -
                        -/**
                        - * Variable: compressed
                        - * 
                        - * Specifies if the output should be compressed by removing redundant calls.
                        - * Default is true.
                        - */
                        -mxXmlCanvas2D.prototype.compressed = true;
                        -
                        -/**
                        - * Function: writeDefaults
                        - * 
                        - * Writes the rendering defaults to :
                        - */
                        -mxXmlCanvas2D.prototype.writeDefaults = function()
                        -{
                        -	var elem;
                        -	
                        -	// Writes font defaults
                        -	elem = this.createElement('fontfamily');
                        -	elem.setAttribute('family', mxConstants.DEFAULT_FONTFAMILY);
                        -	this.root.appendChild(elem);
                        -	
                        -	elem = this.createElement('fontsize');
                        -	elem.setAttribute('size', mxConstants.DEFAULT_FONTSIZE);
                        -	this.root.appendChild(elem);
                        -	
                        -	// Writes shadow defaults
                        -	elem = this.createElement('shadowcolor');
                        -	elem.setAttribute('color', mxConstants.SHADOWCOLOR);
                        -	this.root.appendChild(elem);
                        -	
                        -	elem = this.createElement('shadowalpha');
                        -	elem.setAttribute('alpha', mxConstants.SHADOW_OPACITY);
                        -	this.root.appendChild(elem);
                        -	
                        -	elem = this.createElement('shadowoffset');
                        -	elem.setAttribute('dx', mxConstants.SHADOW_OFFSET_X);
                        -	elem.setAttribute('dy', mxConstants.SHADOW_OFFSET_Y);
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: format
                        - * 
                        - * Returns a formatted number with 2 decimal places.
                        - */
                        -mxXmlCanvas2D.prototype.format = function(value)
                        -{
                        -	return parseFloat(parseFloat(value).toFixed(2));
                        -};
                        -
                        -/**
                        - * Function: createElement
                        - * 
                        - * Creates the given element using the owner document of .
                        - */
                        -mxXmlCanvas2D.prototype.createElement = function(name)
                        -{
                        -	return this.root.ownerDocument.createElement(name);
                        -};
                        -
                        -/**
                        - * Function: save
                        - * 
                        - * Saves the drawing state.
                        - */
                        -mxXmlCanvas2D.prototype.save = function()
                        -{
                        -	if (this.compressed)
                        -	{
                        -		mxAbstractCanvas2D.prototype.save.apply(this, arguments);
                        -	}
                        -	
                        -	this.root.appendChild(this.createElement('save'));
                        -};
                        -
                        -/**
                        - * Function: restore
                        - * 
                        - * Restores the drawing state.
                        - */
                        -mxXmlCanvas2D.prototype.restore = function()
                        -{
                        -	if (this.compressed)
                        -	{
                        -		mxAbstractCanvas2D.prototype.restore.apply(this, arguments);
                        -	}
                        -	
                        -	this.root.appendChild(this.createElement('restore'));
                        -};
                        -
                        -/**
                        - * Function: scale
                        - * 
                        - * Scales the output.
                        - * 
                        - * Parameters:
                        - * 
                        - * scale - Number that represents the scale where 1 is equal to 100%.
                        - */
                        -mxXmlCanvas2D.prototype.scale = function(value)
                        -{
                        -        var elem = this.createElement('scale');
                        -        elem.setAttribute('scale', value);
                        -        this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: translate
                        - * 
                        - * Translates the output.
                        - * 
                        - * Parameters:
                        - * 
                        - * dx - Number that specifies the horizontal translation.
                        - * dy - Number that specifies the vertical translation.
                        - */
                        -mxXmlCanvas2D.prototype.translate = function(dx, dy)
                        -{
                        -	var elem = this.createElement('translate');
                        -	elem.setAttribute('dx', this.format(dx));
                        -	elem.setAttribute('dy', this.format(dy));
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: rotate
                        - * 
                        - * Rotates and/or flips the output around a given center. (Note: Due to
                        - * limitations in VML, the rotation cannot be concatenated.)
                        - * 
                        - * Parameters:
                        - * 
                        - * theta - Number that represents the angle of the rotation (in degrees).
                        - * flipH - Boolean indicating if the output should be flipped horizontally.
                        - * flipV - Boolean indicating if the output should be flipped vertically.
                        - * cx - Number that represents the x-coordinate of the rotation center.
                        - * cy - Number that represents the y-coordinate of the rotation center.
                        - */
                        -mxXmlCanvas2D.prototype.rotate = function(theta, flipH, flipV, cx, cy)
                        -{
                        -	var elem = this.createElement('rotate');
                        -	
                        -	if (theta != 0 || flipH || flipV)
                        -	{
                        -		elem.setAttribute('theta', this.format(theta));
                        -		elem.setAttribute('flipH', (flipH) ? '1' : '0');
                        -		elem.setAttribute('flipV', (flipV) ? '1' : '0');
                        -		elem.setAttribute('cx', this.format(cx));
                        -		elem.setAttribute('cy', this.format(cy));
                        -		this.root.appendChild(elem);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setAlpha
                        - * 
                        - * Sets the current alpha.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Number that represents the new alpha. Possible values are between
                        - * 1 (opaque) and 0 (transparent).
                        - */
                        -mxXmlCanvas2D.prototype.setAlpha = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.alpha == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setAlpha.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('alpha');
                        -	elem.setAttribute('alpha', this.format(value));
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setFillAlpha
                        - * 
                        - * Sets the current fill alpha.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Number that represents the new fill alpha. Possible values are between
                        - * 1 (opaque) and 0 (transparent).
                        - */
                        -mxXmlCanvas2D.prototype.setFillAlpha = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.fillAlpha == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setFillAlpha.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('fillalpha');
                        -	elem.setAttribute('alpha', this.format(value));
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setStrokeAlpha
                        - * 
                        - * Sets the current stroke alpha.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Number that represents the new stroke alpha. Possible values are between
                        - * 1 (opaque) and 0 (transparent).
                        - */
                        -mxXmlCanvas2D.prototype.setStrokeAlpha = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.strokeAlpha == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setStrokeAlpha.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('strokealpha');
                        -	elem.setAttribute('alpha', this.format(value));
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setFillColor
                        - * 
                        - * Sets the current fill color.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Hexadecimal representation of the color or 'none'.
                        - */
                        -mxXmlCanvas2D.prototype.setFillColor = function(value)
                        -{
                        -	if (value == mxConstants.NONE)
                        -	{
                        -		value = null;
                        -	}
                        -	
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.fillColor == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setFillColor.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('fillcolor');
                        -	elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setGradient
                        - * 
                        - * Sets the gradient. Note that the coordinates may be ignored by some implementations.
                        - * 
                        - * Parameters:
                        - * 
                        - * color1 - Hexadecimal representation of the start color.
                        - * color2 - Hexadecimal representation of the end color.
                        - * x - X-coordinate of the gradient region.
                        - * y - y-coordinate of the gradient region.
                        - * w - Width of the gradient region.
                        - * h - Height of the gradient region.
                        - * direction - One of , ,
                        - *  or .
                        - * alpha1 - Optional alpha of the start color. Default is 1. Possible values
                        - * are between 1 (opaque) and 0 (transparent).
                        - * alpha2 - Optional alpha of the end color. Default is 1. Possible values
                        - * are between 1 (opaque) and 0 (transparent).
                        - */
                        -mxXmlCanvas2D.prototype.setGradient = function(color1, color2, x, y, w, h, direction, alpha1, alpha2)
                        -{
                        -	if (color1 != null && color2 != null)
                        -	{
                        -		mxAbstractCanvas2D.prototype.setGradient.apply(this, arguments);
                        -		
                        -		var elem = this.createElement('gradient');
                        -		elem.setAttribute('c1', color1);
                        -		elem.setAttribute('c2', color2);
                        -		elem.setAttribute('x', this.format(x));
                        -		elem.setAttribute('y', this.format(y));
                        -		elem.setAttribute('w', this.format(w));
                        -		elem.setAttribute('h', this.format(h));
                        -		
                        -		// Default direction is south
                        -		if (direction != null)
                        -		{
                        -			elem.setAttribute('direction', direction);
                        -		}
                        -		
                        -		if (alpha1 != null)
                        -		{
                        -			elem.setAttribute('alpha1', alpha1);
                        -		}
                        -		
                        -		if (alpha2 != null)
                        -		{
                        -			elem.setAttribute('alpha2', alpha2);
                        -		}
                        -		
                        -		this.root.appendChild(elem);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setStrokeColor
                        - * 
                        - * Sets the current stroke color.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Hexadecimal representation of the color or 'none'.
                        - */
                        -mxXmlCanvas2D.prototype.setStrokeColor = function(value)
                        -{
                        -	if (value == mxConstants.NONE)
                        -	{
                        -		value = null;
                        -	}
                        -	
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.strokeColor == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setStrokeColor.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('strokecolor');
                        -	elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setStrokeWidth
                        - * 
                        - * Sets the current stroke width.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Numeric representation of the stroke width.
                        - */
                        -mxXmlCanvas2D.prototype.setStrokeWidth = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.strokeWidth == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setStrokeWidth.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('strokewidth');
                        -	elem.setAttribute('width', this.format(value));
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setDashed
                        - * 
                        - * Enables or disables dashed lines.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Boolean that specifies if dashed lines should be enabled.
                        - * value - Boolean that specifies if the stroke width should be ignored
                        - * for the dash pattern. Default is false.
                        - */
                        -mxXmlCanvas2D.prototype.setDashed = function(value, fixDash)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.dashed == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setDashed.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('dashed');
                        -	elem.setAttribute('dashed', (value) ? '1' : '0');
                        -	
                        -	if (fixDash != null)
                        -	{
                        -		elem.setAttribute('fixDash', (fixDash) ? '1' : '0');
                        -	}
                        -	
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setDashPattern
                        - * 
                        - * Sets the current dash pattern. Default is '3 3'.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - String that represents the dash pattern, which is a sequence of
                        - * numbers defining the length of the dashes and the length of the spaces
                        - * between the dashes. The lengths are relative to the line width - a length
                        - * of 1 is equals to the line width.
                        - */
                        -mxXmlCanvas2D.prototype.setDashPattern = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.dashPattern == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setDashPattern.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('dashpattern');
                        -	elem.setAttribute('pattern', value);
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setLineCap
                        - * 
                        - * Sets the line cap. Default is 'flat' which corresponds to 'butt' in SVG.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - String that represents the line cap. Possible values are flat, round
                        - * and square.
                        - */
                        -mxXmlCanvas2D.prototype.setLineCap = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.lineCap == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setLineCap.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('linecap');
                        -	elem.setAttribute('cap', value);
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setLineJoin
                        - * 
                        - * Sets the line join. Default is 'miter'.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - String that represents the line join. Possible values are miter,
                        - * round and bevel.
                        - */
                        -mxXmlCanvas2D.prototype.setLineJoin = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.lineJoin == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setLineJoin.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('linejoin');
                        -	elem.setAttribute('join', value);
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setMiterLimit
                        - * 
                        - * Sets the miter limit. Default is 10.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Number that represents the miter limit.
                        - */
                        -mxXmlCanvas2D.prototype.setMiterLimit = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.miterLimit == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setMiterLimit.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('miterlimit');
                        -	elem.setAttribute('limit', value);
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setFontColor
                        - * 
                        - * Sets the current font color. Default is '#000000'.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Hexadecimal representation of the color or 'none'.
                        - */
                        -mxXmlCanvas2D.prototype.setFontColor = function(value)
                        -{
                        -	if (this.textEnabled)
                        -	{
                        -		if (value == mxConstants.NONE)
                        -		{
                        -			value = null;
                        -		}
                        -		
                        -		if (this.compressed)
                        -		{
                        -			if (this.state.fontColor == value)
                        -			{
                        -				return;
                        -			}
                        -			
                        -			mxAbstractCanvas2D.prototype.setFontColor.apply(this, arguments);
                        -		}
                        -		
                        -		var elem = this.createElement('fontcolor');
                        -		elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
                        -		this.root.appendChild(elem);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setFontBackgroundColor
                        - * 
                        - * Sets the current font background color.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Hexadecimal representation of the color or 'none'.
                        - */
                        -mxXmlCanvas2D.prototype.setFontBackgroundColor = function(value)
                        -{
                        -	if (this.textEnabled)
                        -	{
                        -		if (value == mxConstants.NONE)
                        -		{
                        -			value = null;
                        -		}
                        -		
                        -		if (this.compressed)
                        -		{
                        -			if (this.state.fontBackgroundColor == value)
                        -			{
                        -				return;
                        -			}
                        -			
                        -			mxAbstractCanvas2D.prototype.setFontBackgroundColor.apply(this, arguments);
                        -		}
                        -
                        -		var elem = this.createElement('fontbackgroundcolor');
                        -		elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
                        -		this.root.appendChild(elem);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setFontBorderColor
                        - * 
                        - * Sets the current font border color.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Hexadecimal representation of the color or 'none'.
                        - */
                        -mxXmlCanvas2D.prototype.setFontBorderColor = function(value)
                        -{
                        -	if (this.textEnabled)
                        -	{
                        -		if (value == mxConstants.NONE)
                        -		{
                        -			value = null;
                        -		}
                        -		
                        -		if (this.compressed)
                        -		{
                        -			if (this.state.fontBorderColor == value)
                        -			{
                        -				return;
                        -			}
                        -			
                        -			mxAbstractCanvas2D.prototype.setFontBorderColor.apply(this, arguments);
                        -		}
                        -		
                        -		var elem = this.createElement('fontbordercolor');
                        -		elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
                        -		this.root.appendChild(elem);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setFontSize
                        - * 
                        - * Sets the current font size. Default is .
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Numeric representation of the font size.
                        - */
                        -mxXmlCanvas2D.prototype.setFontSize = function(value)
                        -{
                        -	if (this.textEnabled)
                        -	{
                        -		if (this.compressed)
                        -		{
                        -			if (this.state.fontSize == value)
                        -			{
                        -				return;
                        -			}
                        -			
                        -			mxAbstractCanvas2D.prototype.setFontSize.apply(this, arguments);
                        -		}
                        -		
                        -		var elem = this.createElement('fontsize');
                        -		elem.setAttribute('size', value);
                        -		this.root.appendChild(elem);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setFontFamily
                        - * 
                        - * Sets the current font family. Default is .
                        - * 
                        - * Parameters:
                        - * 
                        - * value - String representation of the font family. This handles the same
                        - * values as the CSS font-family property.
                        - */
                        -mxXmlCanvas2D.prototype.setFontFamily = function(value)
                        -{
                        -	if (this.textEnabled)
                        -	{
                        -		if (this.compressed)
                        -		{
                        -			if (this.state.fontFamily == value)
                        -			{
                        -				return;
                        -			}
                        -			
                        -			mxAbstractCanvas2D.prototype.setFontFamily.apply(this, arguments);
                        -		}
                        -		
                        -		var elem = this.createElement('fontfamily');
                        -		elem.setAttribute('family', value);
                        -		this.root.appendChild(elem);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setFontStyle
                        - * 
                        - * Sets the current font style.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Numeric representation of the font family. This is the sum of the
                        - * font styles from .
                        - */
                        -mxXmlCanvas2D.prototype.setFontStyle = function(value)
                        -{
                        -	if (this.textEnabled)
                        -	{
                        -		if (value == null)
                        -		{
                        -			value = 0;
                        -		}
                        -		
                        -		if (this.compressed)
                        -		{
                        -			if (this.state.fontStyle == value)
                        -			{
                        -				return;
                        -			}
                        -			
                        -			mxAbstractCanvas2D.prototype.setFontStyle.apply(this, arguments);
                        -		}
                        -		
                        -		var elem = this.createElement('fontstyle');
                        -		elem.setAttribute('style', value);
                        -		this.root.appendChild(elem);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: setShadow
                        - * 
                        - * Enables or disables shadows.
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Boolean that specifies if shadows should be enabled.
                        - */
                        -mxXmlCanvas2D.prototype.setShadow = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.shadow == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setShadow.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('shadow');
                        -	elem.setAttribute('enabled', (value) ? '1' : '0');
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setShadowColor
                        - * 
                        - * Sets the current shadow color. Default is .
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Hexadecimal representation of the color or 'none'.
                        - */
                        -mxXmlCanvas2D.prototype.setShadowColor = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (value == mxConstants.NONE)
                        -		{
                        -			value = null;
                        -		}
                        -		
                        -		if (this.state.shadowColor == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setShadowColor.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('shadowcolor');
                        -	elem.setAttribute('color', (value != null) ? value : mxConstants.NONE);
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: setShadowAlpha
                        - * 
                        - * Sets the current shadows alpha. Default is .
                        - * 
                        - * Parameters:
                        - * 
                        - * value - Number that represents the new alpha. Possible values are between
                        - * 1 (opaque) and 0 (transparent).
                        - */
                        -mxXmlCanvas2D.prototype.setShadowAlpha = function(value)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.shadowAlpha == value)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setShadowAlpha.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('shadowalpha');
                        -	elem.setAttribute('alpha', value);
                        -	this.root.appendChild(elem);
                        -	
                        -};
                        -
                        -/**
                        - * Function: setShadowOffset
                        - * 
                        - * Sets the current shadow offset.
                        - * 
                        - * Parameters:
                        - * 
                        - * dx - Number that represents the horizontal offset of the shadow.
                        - * dy - Number that represents the vertical offset of the shadow.
                        - */
                        -mxXmlCanvas2D.prototype.setShadowOffset = function(dx, dy)
                        -{
                        -	if (this.compressed)
                        -	{
                        -		if (this.state.shadowDx == dx && this.state.shadowDy == dy)
                        -		{
                        -			return;
                        -		}
                        -		
                        -		mxAbstractCanvas2D.prototype.setShadowOffset.apply(this, arguments);
                        -	}
                        -	
                        -	var elem = this.createElement('shadowoffset');
                        -	elem.setAttribute('dx', dx);
                        -	elem.setAttribute('dy', dy);
                        -	this.root.appendChild(elem);
                        -	
                        -};
                        -
                        -/**
                        - * Function: rect
                        - * 
                        - * Puts a rectangle into the drawing buffer.
                        - * 
                        - * Parameters:
                        - * 
                        - * x - Number that represents the x-coordinate of the rectangle.
                        - * y - Number that represents the y-coordinate of the rectangle.
                        - * w - Number that represents the width of the rectangle.
                        - * h - Number that represents the height of the rectangle.
                        - */
                        -mxXmlCanvas2D.prototype.rect = function(x, y, w, h)
                        -{
                        -	var elem = this.createElement('rect');
                        -	elem.setAttribute('x', this.format(x));
                        -	elem.setAttribute('y', this.format(y));
                        -	elem.setAttribute('w', this.format(w));
                        -	elem.setAttribute('h', this.format(h));
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: roundrect
                        - * 
                        - * Puts a rounded rectangle into the drawing buffer.
                        - * 
                        - * Parameters:
                        - * 
                        - * x - Number that represents the x-coordinate of the rectangle.
                        - * y - Number that represents the y-coordinate of the rectangle.
                        - * w - Number that represents the width of the rectangle.
                        - * h - Number that represents the height of the rectangle.
                        - * dx - Number that represents the horizontal rounding.
                        - * dy - Number that represents the vertical rounding.
                        - */
                        -mxXmlCanvas2D.prototype.roundrect = function(x, y, w, h, dx, dy)
                        -{
                        -	var elem = this.createElement('roundrect');
                        -	elem.setAttribute('x', this.format(x));
                        -	elem.setAttribute('y', this.format(y));
                        -	elem.setAttribute('w', this.format(w));
                        -	elem.setAttribute('h', this.format(h));
                        -	elem.setAttribute('dx', this.format(dx));
                        -	elem.setAttribute('dy', this.format(dy));
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: ellipse
                        - * 
                        - * Puts an ellipse into the drawing buffer.
                        - * 
                        - * Parameters:
                        - * 
                        - * x - Number that represents the x-coordinate of the ellipse.
                        - * y - Number that represents the y-coordinate of the ellipse.
                        - * w - Number that represents the width of the ellipse.
                        - * h - Number that represents the height of the ellipse.
                        - */
                        -mxXmlCanvas2D.prototype.ellipse = function(x, y, w, h)
                        -{
                        -	var elem = this.createElement('ellipse');
                        -	elem.setAttribute('x', this.format(x));
                        -	elem.setAttribute('y', this.format(y));
                        -	elem.setAttribute('w', this.format(w));
                        -	elem.setAttribute('h', this.format(h));
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: image
                        - * 
                        - * Paints an image.
                        - * 
                        - * Parameters:
                        - * 
                        - * x - Number that represents the x-coordinate of the image.
                        - * y - Number that represents the y-coordinate of the image.
                        - * w - Number that represents the width of the image.
                        - * h - Number that represents the height of the image.
                        - * src - String that specifies the URL of the image.
                        - * aspect - Boolean indicating if the aspect of the image should be preserved.
                        - * flipH - Boolean indicating if the image should be flipped horizontally.
                        - * flipV - Boolean indicating if the image should be flipped vertically.
                        - */
                        -mxXmlCanvas2D.prototype.image = function(x, y, w, h, src, aspect, flipH, flipV)
                        -{
                        -	src = this.converter.convert(src);
                        -	
                        -	// LATER: Add option for embedding images as base64.
                        -	var elem = this.createElement('image');
                        -	elem.setAttribute('x', this.format(x));
                        -	elem.setAttribute('y', this.format(y));
                        -	elem.setAttribute('w', this.format(w));
                        -	elem.setAttribute('h', this.format(h));
                        -	elem.setAttribute('src', src);
                        -	elem.setAttribute('aspect', (aspect) ? '1' : '0');
                        -	elem.setAttribute('flipH', (flipH) ? '1' : '0');
                        -	elem.setAttribute('flipV', (flipV) ? '1' : '0');
                        -	this.root.appendChild(elem);
                        -};
                        -
                        -/**
                        - * Function: begin
                        - * 
                        - * Starts a new path and puts it into the drawing buffer.
                        - */
                        -mxXmlCanvas2D.prototype.begin = function()
                        -{
                        -	this.root.appendChild(this.createElement('begin'));
                        -	this.lastX = 0;
                        -	this.lastY = 0;
                        -};
                        -
                        -/**
                        - * Function: moveTo
                        - * 
                        - * Moves the current path the given point.
                        - * 
                        - * Parameters:
                        - * 
                        - * x - Number that represents the x-coordinate of the point.
                        - * y - Number that represents the y-coordinate of the point.
                        - */
                        -mxXmlCanvas2D.prototype.moveTo = function(x, y)
                        -{
                        -	var elem = this.createElement('move');
                        -	elem.setAttribute('x', this.format(x));
                        -	elem.setAttribute('y', this.format(y));
                        -	this.root.appendChild(elem);
                        -	this.lastX = x;
                        -	this.lastY = y;
                        -};
                        -
                        -/**
                        - * Function: lineTo
                        - * 
                        - * Draws a line to the given coordinates.
                        - * 
                        - * Parameters:
                        - * 
                        - * x - Number that represents the x-coordinate of the endpoint.
                        - * y - Number that represents the y-coordinate of the endpoint.
                        - */
                        -mxXmlCanvas2D.prototype.lineTo = function(x, y)
                        -{
                        -	var elem = this.createElement('line');
                        -	elem.setAttribute('x', this.format(x));
                        -	elem.setAttribute('y', this.format(y));
                        -	this.root.appendChild(elem);
                        -	this.lastX = x;
                        -	this.lastY = y;
                        -};
                        -
                        -/**
                        - * Function: quadTo
                        - * 
                        - * Adds a quadratic curve to the current path.
                        - * 
                        - * Parameters:
                        - * 
                        - * x1 - Number that represents the x-coordinate of the control point.
                        - * y1 - Number that represents the y-coordinate of the control point.
                        - * x2 - Number that represents the x-coordinate of the endpoint.
                        - * y2 - Number that represents the y-coordinate of the endpoint.
                        - */
                        -mxXmlCanvas2D.prototype.quadTo = function(x1, y1, x2, y2)
                        -{
                        -	var elem = this.createElement('quad');
                        -	elem.setAttribute('x1', this.format(x1));
                        -	elem.setAttribute('y1', this.format(y1));
                        -	elem.setAttribute('x2', this.format(x2));
                        -	elem.setAttribute('y2', this.format(y2));
                        -	this.root.appendChild(elem);
                        -	this.lastX = x2;
                        -	this.lastY = y2;
                        -};
                        -
                        -/**
                        - * Function: curveTo
                        - * 
                        - * Adds a bezier curve to the current path.
                        - * 
                        - * Parameters:
                        - * 
                        - * x1 - Number that represents the x-coordinate of the first control point.
                        - * y1 - Number that represents the y-coordinate of the first control point.
                        - * x2 - Number that represents the x-coordinate of the second control point.
                        - * y2 - Number that represents the y-coordinate of the second control point.
                        - * x3 - Number that represents the x-coordinate of the endpoint.
                        - * y3 - Number that represents the y-coordinate of the endpoint.
                        - */
                        -mxXmlCanvas2D.prototype.curveTo = function(x1, y1, x2, y2, x3, y3)
                        -{
                        -	var elem = this.createElement('curve');
                        -	elem.setAttribute('x1', this.format(x1));
                        -	elem.setAttribute('y1', this.format(y1));
                        -	elem.setAttribute('x2', this.format(x2));
                        -	elem.setAttribute('y2', this.format(y2));
                        -	elem.setAttribute('x3', this.format(x3));
                        -	elem.setAttribute('y3', this.format(y3));
                        -	this.root.appendChild(elem);
                        -	this.lastX = x3;
                        -	this.lastY = y3;
                        -};
                        -
                        -/**
                        - * Function: close
                        - * 
                        - * Closes the current path.
                        - */
                        -mxXmlCanvas2D.prototype.close = function()
                        -{
                        -	this.root.appendChild(this.createElement('close'));
                        -};
                        -
                        -/**
                        - * Function: text
                        - * 
                        - * Paints the given text. Possible values for format are empty string for
                        - * plain text and html for HTML markup. Background and border color as well
                        - * as clipping is not available in plain text labels for VML. HTML labels
                        - * are not available as part of shapes with no foreignObject support in SVG
                        - * (eg. IE9, IE10).
                        - * 
                        - * Parameters:
                        - * 
                        - * x - Number that represents the x-coordinate of the text.
                        - * y - Number that represents the y-coordinate of the text.
                        - * w - Number that represents the available width for the text or 0 for automatic width.
                        - * h - Number that represents the available height for the text or 0 for automatic height.
                        - * str - String that specifies the text to be painted.
                        - * align - String that represents the horizontal alignment.
                        - * valign - String that represents the vertical alignment.
                        - * wrap - Boolean that specifies if word-wrapping is enabled. Requires w > 0.
                        - * format - Empty string for plain text or 'html' for HTML markup.
                        - * overflow - Specifies the overflow behaviour of the label. Requires w > 0 and/or h > 0.
                        - * clip - Boolean that specifies if the label should be clipped. Requires w > 0 and/or h > 0.
                        - * rotation - Number that specifies the angle of the rotation around the anchor point of the text.
                        - * dir - Optional string that specifies the text direction. Possible values are rtl and lrt.
                        - */
                        -mxXmlCanvas2D.prototype.text = function(x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation, dir)
                        -{
                        -	if (this.textEnabled && str != null)
                        -	{
                        -		if (mxUtils.isNode(str))
                        -		{
                        -			str = mxUtils.getOuterHtml(str);
                        -		}
                        -		
                        -		var elem = this.createElement('text');
                        -		elem.setAttribute('x', this.format(x));
                        -		elem.setAttribute('y', this.format(y));
                        -		elem.setAttribute('w', this.format(w));
                        -		elem.setAttribute('h', this.format(h));
                        -		elem.setAttribute('str', str);
                        -		
                        -		if (align != null)
                        -		{
                        -			elem.setAttribute('align', align);
                        -		}
                        -		
                        -		if (valign != null)
                        -		{
                        -			elem.setAttribute('valign', valign);
                        -		}
                        -		
                        -		elem.setAttribute('wrap', (wrap) ? '1' : '0');
                        -		
                        -		if (format == null)
                        -		{
                        -			format = '';
                        -		}
                        -		
                        -		elem.setAttribute('format', format);
                        -		
                        -		if (overflow != null)
                        -		{
                        -			elem.setAttribute('overflow', overflow);
                        -		}
                        -		
                        -		if (clip != null)
                        -		{
                        -			elem.setAttribute('clip', (clip) ? '1' : '0');
                        -		}
                        -		
                        -		if (rotation != null)
                        -		{
                        -			elem.setAttribute('rotation', rotation);
                        -		}
                        -		
                        -		if (dir != null)
                        -		{
                        -			elem.setAttribute('dir', dir);
                        -		}
                        -		
                        -		this.root.appendChild(elem);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: stroke
                        - * 
                        - * Paints the outline of the current drawing buffer.
                        - */
                        -mxXmlCanvas2D.prototype.stroke = function()
                        -{
                        -	this.root.appendChild(this.createElement('stroke'));
                        -};
                        -
                        -/**
                        - * Function: fill
                        - * 
                        - * Fills the current drawing buffer.
                        - */
                        -mxXmlCanvas2D.prototype.fill = function()
                        -{
                        -	this.root.appendChild(this.createElement('fill'));
                        -};
                        -
                        -/**
                        - * Function: fillAndStroke
                        - * 
                        - * Fills the current drawing buffer and its outline.
                        - */
                        -mxXmlCanvas2D.prototype.fillAndStroke = function()
                        -{
                        -	this.root.appendChild(this.createElement('fillstroke'));
                        -};
                        -/**
                        - * Copyright (c) 2006-2015, JGraph Ltd
                        - * Copyright (c) 2006-2015, Gaudenz Alder
                        - */
                        -/**
                        - * Class: mxSvgCanvas2D
                        - *
                        - * Extends  to implement a canvas for SVG. This canvas writes all
                        - * calls as SVG output to the given SVG root node.
                        - * 
                        - * (code)
                        - * var svgDoc = mxUtils.createXmlDocument();
                        - * var root = (svgDoc.createElementNS != null) ?
                        - * 		svgDoc.createElementNS(mxConstants.NS_SVG, 'svg') : svgDoc.createElement('svg');
                        - * 
                        - * if (svgDoc.createElementNS == null)
                        - * {
                        - *   root.setAttribute('xmlns', mxConstants.NS_SVG);
                        - *   root.setAttribute('xmlns:xlink', mxConstants.NS_XLINK);
                        - * }
                        - * else
                        - * {
                        - *   root.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', mxConstants.NS_XLINK);
                        - * }
                        - * 
                        - * var bounds = graph.getGraphBounds();
                        - * root.setAttribute('width', (bounds.x + bounds.width + 4) + 'px');
                        - * root.setAttribute('height', (bounds.y + bounds.height + 4) + 'px');
                        - * root.setAttribute('version', '1.1');
                        - * 
                        - * svgDoc.appendChild(root);
                        - * 
                        - * var svgCanvas = new mxSvgCanvas2D(root);
                        - * (end)
                        - * 
                        - * A description of the public API is available in .
                        - * 
                        - * To disable anti-aliasing in the output, use the following code.
                        - * 
                        - * (code)
                        - * graph.view.canvas.ownerSVGElement.setAttribute('shape-rendering', 'crispEdges');
                        - * (end)
                        - * 
                        - * Or set the respective attribute in the SVG element directly.
                        - * 
                        - * Constructor: mxSvgCanvas2D
                        - *
                        - * Constructs a new SVG canvas.
                        - * 
                        - * Parameters:
                        - * 
                        - * root - SVG container for the output.
                        - * styleEnabled - Optional boolean that specifies if a style section should be
                        - * added. The style section sets the default font-size, font-family and
                        - * stroke-miterlimit globally. Default is false.
                        - */
                        -function mxSvgCanvas2D(root, styleEnabled)
                        -{
                        -	mxAbstractCanvas2D.call(this);
                        -
                        -	/**
                        -	 * Variable: root
                        -	 * 
                        -	 * Reference to the container for the SVG content.
                        -	 */
                        -	this.root = root;
                        -
                        -	/**
                        -	 * Variable: gradients
                        -	 * 
                        -	 * Local cache of gradients for quick lookups.
                        -	 */
                        -	this.gradients = [];
                        -
                        -	/**
                        -	 * Variable: defs
                        -	 * 
                        -	 * Reference to the defs section of the SVG document. Only for export.
                        -	 */
                        -	this.defs = null;
                        -	
                        -	/**
                        -	 * Variable: styleEnabled
                        -	 * 
                        -	 * Stores the value of styleEnabled passed to the constructor.
                        -	 */
                        -	this.styleEnabled = (styleEnabled != null) ? styleEnabled : false;
                        -	
                        -	var svg = null;
                        -	
                        -	// Adds optional defs section for export
                        -	if (root.ownerDocument != document)
                        -	{
                        -		var node = root;
                        -
                        -		// Finds owner SVG element in XML DOM
                        -		while (node != null && node.nodeName != 'svg')
                        -		{
                        -			node = node.parentNode;
                        -		}
                        -		
                        -		svg = node;
                        -	}
                        -
                        -	if (svg != null)
                        -	{
                        -		// Tries to get existing defs section
                        -		var tmp = svg.getElementsByTagName('defs');
                        -		
                        -		if (tmp.length > 0)
                        -		{
                        -			this.defs = svg.getElementsByTagName('defs')[0];
                        -		}
                        -		
                        -		// Adds defs section if none exists
                        -		if (this.defs == null)
                        -		{
                        -			this.defs = this.createElement('defs');
                        -			
                        -			if (svg.firstChild != null)
                        -			{
                        -				svg.insertBefore(this.defs, svg.firstChild);
                        -			}
                        -			else
                        -			{
                        -				svg.appendChild(this.defs);
                        -			}
                        -		}
                        -
                        -		// Adds stylesheet
                        -		if (this.styleEnabled)
                        -		{
                        -			this.defs.appendChild(this.createStyle());
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Extends mxAbstractCanvas2D
                        - */
                        -mxUtils.extend(mxSvgCanvas2D, mxAbstractCanvas2D);
                        -
                        -/**
                        - * Capability check for DOM parser.
                        - */
                        -(function()
                        -{
                        -	mxSvgCanvas2D.prototype.useDomParser = !mxClient.IS_IE && typeof DOMParser === 'function' && typeof XMLSerializer === 'function';
                        -	
                        -	if (mxSvgCanvas2D.prototype.useDomParser)
                        -	{
                        -		// Checks using a generic test text if the parsing actually works. This is a workaround
                        -		// for older browsers where the capability check returns true but the parsing fails.
                        -		try
                        -		{
                        -			var doc = new DOMParser().parseFromString('test text', 'text/html');
                        -			mxSvgCanvas2D.prototype.useDomParser = doc != null;
                        -		}
                        -		catch (e)
                        -		{
                        -			mxSvgCanvas2D.prototype.useDomParser = false;
                        -		}
                        -	}
                        -})();
                        -
                        -/**
                        - * Variable: path
                        - * 
                        - * Holds the current DOM node.
                        - */
                        -mxSvgCanvas2D.prototype.node = null;
                        -
                        -/**
                        - * Variable: matchHtmlAlignment
                        - * 
                        - * Specifies if plain text output should match the vertical HTML alignment.
                        - * Defaul is true.
                        - */
                        -mxSvgCanvas2D.prototype.matchHtmlAlignment = true;
                        -
                        -/**
                        - * Variable: textEnabled
                        - * 
                        - * Specifies if text output should be enabled. Default is true.
                        - */
                        -mxSvgCanvas2D.prototype.textEnabled = true;
                        -
                        -/**
                        - * Variable: foEnabled
                        - * 
                        - * Specifies if use of foreignObject for HTML markup is allowed. Default is true.
                        - */
                        -mxSvgCanvas2D.prototype.foEnabled = true;
                        -
                        -/**
                        - * Variable: foAltText
                        - * 
                        - * Specifies the fallback text for unsupported foreignObjects in exported
                        - * documents. Default is '[Object]'. If this is set to null then no fallback
                        - * text is added to the exported document.
                        - */
                        -mxSvgCanvas2D.prototype.foAltText = '[Object]';
                        -
                        -/**
                        - * Variable: foOffset
                        - * 
                        - * Offset to be used for foreignObjects.
                        - */
                        -mxSvgCanvas2D.prototype.foOffset = 0;
                        -
                        -/**
                        - * Variable: textOffset
                        - * 
                        - * Offset to be used for text elements.
                        - */
                        -mxSvgCanvas2D.prototype.textOffset = 0;
                        -
                        -/**
                        - * Variable: imageOffset
                        - * 
                        - * Offset to be used for image elements.
                        - */
                        -mxSvgCanvas2D.prototype.imageOffset = 0;
                        -
                        -/**
                        - * Variable: strokeTolerance
                        - * 
                        - * Adds transparent paths for strokes.
                        - */
                        -mxSvgCanvas2D.prototype.strokeTolerance = 0;
                        -
                        -/**
                        - * Variable: minStrokeWidth
                        - * 
                        - * Minimum stroke width for output.
                        - */
                        -mxSvgCanvas2D.prototype.minStrokeWidth = 1;
                        -
                        -/**
                        - * Variable: refCount
                        - * 
                        - * Local counter for references in SVG export.
                        - */
                        -mxSvgCanvas2D.prototype.refCount = 0;
                        -
                        -/**
                        - * Variable: blockImagePointerEvents
                        - * 
                        - * Specifies if a transparent rectangle should be added on top of images to absorb
                        - * all pointer events. Default is false. This is only needed in Firefox to disable
                        - * control-clicks on images.
                        - */
                        -mxSvgCanvas2D.prototype.blockImagePointerEvents = false;
                        -
                        -/**
                        - * Variable: lineHeightCorrection
                        - * 
                        - * Correction factor for  in HTML output. Default is 1.
                        - */
                        -mxSvgCanvas2D.prototype.lineHeightCorrection = 1;
                        -
                        -/**
                        - * Variable: pointerEventsValue
                        - * 
                        - * Default value for active pointer events. Default is all.
                        - */
                        -mxSvgCanvas2D.prototype.pointerEventsValue = 'all';
                        -
                        -/**
                        - * Variable: fontMetricsPadding
                        - * 
                        - * Padding to be added for text that is not wrapped to account for differences
                        - * in font metrics on different platforms in pixels. Default is 10.
                        - */
                        -mxSvgCanvas2D.prototype.fontMetricsPadding = 10;
                        -
                        -/**
                        - * Variable: cacheOffsetSize
                        - * 
                        - * Specifies if offsetWidth and offsetHeight should be cached. Default is true.
                        - * This is used to speed up repaint of text in .
                        - */
                        -mxSvgCanvas2D.prototype.cacheOffsetSize = true;
                        -
                        -/**
                        - * Function: format
                        - * 
                        - * Rounds all numbers to 2 decimal points.
                        - */
                        -mxSvgCanvas2D.prototype.format = function(value)
                        -{
                        -	return parseFloat(parseFloat(value).toFixed(2));
                        -};
                        -
                        -/**
                        - * Function: getBaseUrl
                        - * 
                        - * Returns the URL of the page without the hash part. This needs to use href to
                        - * include any search part with no params (ie question mark alone). This is a
                        - * workaround for the fact that window.location.search is empty if there is
                        - * no search string behind the question mark.
                        - */
                        -mxSvgCanvas2D.prototype.getBaseUrl = function()
                        -{
                        -	var href = window.location.href;
                        -	var hash = href.lastIndexOf('#');
                        -	
                        -	if (hash > 0)
                        -	{
                        -		href = href.substring(0, hash);
                        -	}
                        -	
                        -	return href;
                        -};
                        -
                        -/**
                        - * Function: reset
                        - * 
                        - * Returns any offsets for rendering pixels.
                        - */
                        -mxSvgCanvas2D.prototype.reset = function()
                        -{
                        -	mxAbstractCanvas2D.prototype.reset.apply(this, arguments);
                        -	this.gradients = [];
                        -};
                        -
                        -/**
                        - * Function: createStyle
                        - * 
                        - * Creates the optional style section.
                        - */
                        -mxSvgCanvas2D.prototype.createStyle = function(x)
                        -{
                        -	var style = this.createElement('style');
                        -	style.setAttribute('type', 'text/css');
                        -	mxUtils.write(style, 'svg{font-family:' + mxConstants.DEFAULT_FONTFAMILY +
                        -			';font-size:' + mxConstants.DEFAULT_FONTSIZE +
                        -			';fill:none;stroke-miterlimit:10}');
                        -	
                        -	return style;
                        -};
                        -
                        -/**
                        - * Function: createElement
                        - * 
                        - * Private helper function to create SVG elements
                        - */
                        -mxSvgCanvas2D.prototype.createElement = function(tagName, namespace)
                        -{
                        -	if (this.root.ownerDocument.createElementNS != null)
                        -	{
                        -		return this.root.ownerDocument.createElementNS(namespace || mxConstants.NS_SVG, tagName);
                        -	}
                        -	else
                        -	{
                        -		var elt = this.root.ownerDocument.createElement(tagName);
                        -		
                        -		if (namespace != null)
                        -		{
                        -			elt.setAttribute('xmlns', namespace);
                        -		}
                        -		
                        -		return elt;
                        -	}
                        -};
                        -
                        -/**
                        - * Function: getAlternateContent
                        - * 
                        - * Returns the alternate content for the given foreignObject.
                        - */
                        -mxSvgCanvas2D.prototype.createAlternateContent = function(fo, x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation)
                        -{
                        -	if (this.foAltText != null)
                        -	{
                        -		var s = this.state;
                        -		var alt = this.createElement('text');
                        -		alt.setAttribute('x', Math.round(w / 2));
                        -		alt.setAttribute('y', Math.round((h + s.fontSize) / 2));
                        -		alt.setAttribute('fill', s.fontColor || 'black');
                        -		alt.setAttribute('text-anchor', 'middle');
                        -		alt.setAttribute('font-size', s.fontSize + 'px');
                        -		// Quotes are workaround for font name "m+"
                        -		alt.setAttribute('font-family', '\'' + s.fontFamily + '\'');
                        -		
                        -		if ((s.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD)
                        -		{
                        -			alt.setAttribute('font-weight', 'bold');
                        -		}
                        -		
                        -		if ((s.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC)
                        -		{
                        -			alt.setAttribute('font-style', 'italic');
                        -		}
                        -		
                        -		if ((s.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE)
                        -		{
                        -			alt.setAttribute('text-decoration', 'underline');
                        -		}
                        -		
                        -		mxUtils.write(alt, this.foAltText);
                        -		
                        -		return alt;
                        -	}
                        -	else
                        -	{
                        -		return null;
                        -	}
                        -};
                        -
                        -/**
                        - * Function: createGradientId
                        - * 
                        - * Private helper function to create SVG elements
                        - */
                        -mxSvgCanvas2D.prototype.createGradientId = function(start, end, alpha1, alpha2, direction)
                        -{
                        -	// Removes illegal characters from gradient ID
                        -	if (start.charAt(0) == '#')
                        -	{
                        -		start = start.substring(1);
                        -	}
                        -	
                        -	if (end.charAt(0) == '#')
                        -	{
                        -		end = end.substring(1);
                        -	}
                        -	
                        -	// Workaround for gradient IDs not working in Safari 5 / Chrome 6
                        -	// if they contain uppercase characters
                        -	start = start.toLowerCase() + '-' + alpha1;
                        -	end = end.toLowerCase() + '-' + alpha2;
                        -
                        -	// Wrong gradient directions possible?
                        -	var dir = null;
                        -	
                        -	if (direction == null || direction == mxConstants.DIRECTION_SOUTH)
                        -	{
                        -		dir = 's';
                        -	}
                        -	else if (direction == mxConstants.DIRECTION_EAST)
                        -	{
                        -		dir = 'e';
                        -	}
                        -	else
                        -	{
                        -		var tmp = start;
                        -		start = end;
                        -		end = tmp;
                        -		
                        -		if (direction == mxConstants.DIRECTION_NORTH)
                        -		{
                        -			dir = 's';
                        -		}
                        -		else if (direction == mxConstants.DIRECTION_WEST)
                        -		{
                        -			dir = 'e';
                        -		}
                        -	}
                        -	
                        -	return 'mx-gradient-' + start + '-' + end + '-' + dir;
                        -};
                        -
                        -/**
                        - * Function: getSvgGradient
                        - * 
                        - * Private helper function to create SVG elements
                        - */
                        -mxSvgCanvas2D.prototype.getSvgGradient = function(start, end, alpha1, alpha2, direction)
                        -{
                        -	var id = this.createGradientId(start, end, alpha1, alpha2, direction);
                        -	var gradient = this.gradients[id];
                        -	
                        -	if (gradient == null)
                        -	{
                        -		var svg = this.root.ownerSVGElement;
                        -
                        -		var counter = 0;
                        -		var tmpId = id + '-' + counter;
                        -
                        -		if (svg != null)
                        -		{
                        -			gradient = svg.ownerDocument.getElementById(tmpId);
                        -			
                        -			while (gradient != null && gradient.ownerSVGElement != svg)
                        -			{
                        -				tmpId = id + '-' + counter++;
                        -				gradient = svg.ownerDocument.getElementById(tmpId);
                        -			}
                        -		}
                        -		else
                        -		{
                        -			// Uses shorter IDs for export
                        -			tmpId = 'id' + (++this.refCount);
                        -		}
                        -		
                        -		if (gradient == null)
                        -		{
                        -			gradient = this.createSvgGradient(start, end, alpha1, alpha2, direction);
                        -			gradient.setAttribute('id', tmpId);
                        -			
                        -			if (this.defs != null)
                        -			{
                        -				this.defs.appendChild(gradient);
                        -			}
                        -			else
                        -			{
                        -				svg.appendChild(gradient);
                        -			}
                        -		}
                        -
                        -		this.gradients[id] = gradient;
                        -	}
                        -
                        -	return gradient.getAttribute('id');
                        -};
                        -
                        -/**
                        - * Function: createSvgGradient
                        - * 
                        - * Creates the given SVG gradient.
                        - */
                        -mxSvgCanvas2D.prototype.createSvgGradient = function(start, end, alpha1, alpha2, direction)
                        -{
                        -	var gradient = this.createElement('linearGradient');
                        -	gradient.setAttribute('x1', '0%');
                        -	gradient.setAttribute('y1', '0%');
                        -	gradient.setAttribute('x2', '0%');
                        -	gradient.setAttribute('y2', '0%');
                        -	
                        -	if (direction == null || direction == mxConstants.DIRECTION_SOUTH)
                        -	{
                        -		gradient.setAttribute('y2', '100%');
                        -	}
                        -	else if (direction == mxConstants.DIRECTION_EAST)
                        -	{
                        -		gradient.setAttribute('x2', '100%');
                        -	}
                        -	else if (direction == mxConstants.DIRECTION_NORTH)
                        -	{
                        -		gradient.setAttribute('y1', '100%');
                        -	}
                        -	else if (direction == mxConstants.DIRECTION_WEST)
                        -	{
                        -		gradient.setAttribute('x1', '100%');
                        -	}
                        -	
                        -	var op = (alpha1 < 1) ? ';stop-opacity:' + alpha1 : '';
                        -	
                        -	var stop = this.createElement('stop');
                        -	stop.setAttribute('offset', '0%');
                        -	stop.setAttribute('style', 'stop-color:' + start + op);
                        -	gradient.appendChild(stop);
                        -	
                        -	op = (alpha2 < 1) ? ';stop-opacity:' + alpha2 : '';
                        -	
                        -	stop = this.createElement('stop');
                        -	stop.setAttribute('offset', '100%');
                        -	stop.setAttribute('style', 'stop-color:' + end + op);
                        -	gradient.appendChild(stop);
                        -	
                        -	return gradient;
                        -};
                        -
                        -/**
                        - * Function: addNode
                        - * 
                        - * Private helper function to create SVG elements
                        - */
                        -mxSvgCanvas2D.prototype.addNode = function(filled, stroked)
                        -{
                        -	var node = this.node;
                        -	var s = this.state;
                        -
                        -	if (node != null)
                        -	{
                        -		if (node.nodeName == 'path')
                        -		{
                        -			// Checks if the path is not empty
                        -			if (this.path != null && this.path.length > 0)
                        -			{
                        -				node.setAttribute('d', this.path.join(' '));
                        -			}
                        -			else
                        -			{
                        -				return;
                        -			}
                        -		}
                        -
                        -		if (filled && s.fillColor != null)
                        -		{
                        -			this.updateFill();
                        -		}
                        -		else if (!this.styleEnabled)
                        -		{
                        -			// Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=814952
                        -			if (node.nodeName == 'ellipse' && mxClient.IS_FF)
                        -			{
                        -				node.setAttribute('fill', 'transparent');
                        -			}
                        -			else
                        -			{
                        -				node.setAttribute('fill', 'none');
                        -			}
                        -			
                        -			// Sets the actual filled state for stroke tolerance
                        -			filled = false;
                        -		}
                        -		
                        -		if (stroked && s.strokeColor != null)
                        -		{
                        -			this.updateStroke();
                        -		}
                        -		else if (!this.styleEnabled)
                        -		{
                        -			node.setAttribute('stroke', 'none');
                        -		}
                        -		
                        -		if (s.transform != null && s.transform.length > 0)
                        -		{
                        -			node.setAttribute('transform', s.transform);
                        -		}
                        -		
                        -		if (s.shadow)
                        -		{
                        -			this.root.appendChild(this.createShadow(node));
                        -		}
                        -	
                        -		// Adds stroke tolerance
                        -		if (this.strokeTolerance > 0 && !filled)
                        -		{
                        -			this.root.appendChild(this.createTolerance(node));
                        -		}
                        -
                        -		// Adds pointer events
                        -		if (this.pointerEvents)
                        -		{
                        -			node.setAttribute('pointer-events', this.pointerEventsValue);
                        -		}
                        -		// Enables clicks for nodes inside a link element
                        -		else if (!this.pointerEvents && this.originalRoot == null)
                        -		{
                        -			node.setAttribute('pointer-events', 'none');
                        -		}
                        -		
                        -		// Removes invisible nodes from output if they don't handle events
                        -		if ((node.nodeName != 'rect' && node.nodeName != 'path' && node.nodeName != 'ellipse') ||
                        -			(node.getAttribute('fill') != 'none' && node.getAttribute('fill') != 'transparent') ||
                        -			node.getAttribute('stroke') != 'none' || node.getAttribute('pointer-events') != 'none')
                        -		{
                        -			// LATER: Update existing DOM for performance		
                        -			this.root.appendChild(node);
                        -		}
                        -		
                        -		this.node = null;
                        -	}
                        -};
                        -
                        -/**
                        - * Function: updateFill
                        - * 
                        - * Transfers the stroke attributes from  to .
                        - */
                        -mxSvgCanvas2D.prototype.updateFill = function()
                        -{
                        -	var s = this.state;
                        -	
                        -	if (s.alpha < 1 || s.fillAlpha < 1)
                        -	{
                        -		this.node.setAttribute('fill-opacity', s.alpha * s.fillAlpha);
                        -	}
                        -	
                        -	if (s.fillColor != null)
                        -	{
                        -		if (s.gradientColor != null)
                        -		{
                        -			var id = this.getSvgGradient(String(s.fillColor), String(s.gradientColor),
                        -				s.gradientFillAlpha, s.gradientAlpha, s.gradientDirection);
                        -			
                        -			if (!mxClient.IS_CHROME_APP && !mxClient.IS_IE && !mxClient.IS_IE11 &&
                        -				!mxClient.IS_EDGE && this.root.ownerDocument == document)
                        -			{
                        -				// Workaround for potential base tag and brackets must be escaped
                        -				var base = this.getBaseUrl().replace(/([\(\)])/g, '\\$1');
                        -				this.node.setAttribute('fill', 'url(' + base + '#' + id + ')');
                        -			}
                        -			else
                        -			{
                        -				this.node.setAttribute('fill', 'url(#' + id + ')');
                        -			}
                        -		}
                        -		else
                        -		{
                        -			this.node.setAttribute('fill', String(s.fillColor).toLowerCase());
                        -		}
                        -	}
                        -};
                        -
                        -/**
                        - * Function: getCurrentStrokeWidth
                        - * 
                        - * Returns the current stroke width (>= 1), ie. max(1, this.format(this.state.strokeWidth * this.state.scale)).
                        - */
                        -mxSvgCanvas2D.prototype.getCurrentStrokeWidth = function()
                        -{
                        -	return Math.max(this.minStrokeWidth, Math.max(0.01, this.format(this.state.strokeWidth * this.state.scale)));
                        -};
                        -
                        -/**
                        - * Function: updateStroke
                        - * 
                        - * Transfers the stroke attributes from  to .
                        - */
                        -mxSvgCanvas2D.prototype.updateStroke = function()
                        -{
                        -	var s = this.state;
                        -
                        -	this.node.setAttribute('stroke', String(s.strokeColor).toLowerCase());
                        -	
                        -	if (s.alpha < 1 || s.strokeAlpha < 1)
                        -	{
                        -		this.node.setAttribute('stroke-opacity', s.alpha * s.strokeAlpha);
                        -	}
                        -	
                        -	var sw = this.getCurrentStrokeWidth();
                        -	
                        -	if (sw != 1)
                        -	{
                        -		this.node.setAttribute('stroke-width', sw);
                        -	}
                        -	
                        -	if (this.node.nodeName == 'path')
                        -	{
                        -		this.updateStrokeAttributes();
                        -	}
                        -	
                        -	if (s.dashed)
                        -	{
                        -		this.node.setAttribute('stroke-dasharray', this.createDashPattern(
                        -			((s.fixDash) ? 1 : s.strokeWidth) * s.scale));
                        -	}
                        -};
                        -
                        -/**
                        - * Function: updateStrokeAttributes
                        - * 
                        - * Transfers the stroke attributes from  to .
                        - */
                        -mxSvgCanvas2D.prototype.updateStrokeAttributes = function()
                        -{
                        -	var s = this.state;
                        -	
                        -	// Linejoin miter is default in SVG
                        -	if (s.lineJoin != null && s.lineJoin != 'miter')
                        -	{
                        -		this.node.setAttribute('stroke-linejoin', s.lineJoin);
                        -	}
                        -	
                        -	if (s.lineCap != null)
                        -	{
                        -		// flat is called butt in SVG
                        -		var value = s.lineCap;
                        -		
                        -		if (value == 'flat')
                        -		{
                        -			value = 'butt';
                        -		}
                        -		
                        -		// Linecap butt is default in SVG
                        -		if (value != 'butt')
                        -		{
                        -			this.node.setAttribute('stroke-linecap', value);
                        -		}
                        -	}
                        -	
                        -	// Miterlimit 10 is default in our document
                        -	if (s.miterLimit != null && (!this.styleEnabled || s.miterLimit != 10))
                        -	{
                        -		this.node.setAttribute('stroke-miterlimit', s.miterLimit);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: createDashPattern
                        - * 
                        - * Creates the SVG dash pattern for the given state.
                        - */
                        -mxSvgCanvas2D.prototype.createDashPattern = function(scale)
                        -{
                        -	var pat = [];
                        -	
                        -	if (typeof(this.state.dashPattern) === 'string')
                        -	{
                        -		var dash = this.state.dashPattern.split(' ');
                        -		
                        -		if (dash.length > 0)
                        -		{
                        -			for (var i = 0; i < dash.length; i++)
                        -			{
                        -				pat[i] = Number(dash[i]) * scale;
                        -			}
                        -		}
                        -	}
                        -	
                        -	return pat.join(' ');
                        -};
                        -
                        -/**
                        - * Function: createTolerance
                        - * 
                        - * Creates a hit detection tolerance shape for the given node.
                        - */
                        -mxSvgCanvas2D.prototype.createTolerance = function(node)
                        -{
                        -	var tol = node.cloneNode(true);
                        -	var sw = parseFloat(tol.getAttribute('stroke-width') || 1) + this.strokeTolerance;
                        -	tol.setAttribute('pointer-events', 'stroke');
                        -	tol.setAttribute('visibility', 'hidden');
                        -	tol.removeAttribute('stroke-dasharray');
                        -	tol.setAttribute('stroke-width', sw);
                        -	tol.setAttribute('fill', 'none');
                        -	
                        -	// Workaround for Opera ignoring the visiblity attribute above while
                        -	// other browsers need a stroke color to perform the hit-detection but
                        -	// do not ignore the visibility attribute. Side-effect is that Opera's
                        -	// hit detection for horizontal/vertical edges seems to ignore the tol.
                        -	tol.setAttribute('stroke', (mxClient.IS_OT) ? 'none' : 'white');
                        -	
                        -	return tol;
                        -};
                        -
                        -/**
                        - * Function: createShadow
                        - * 
                        - * Creates a shadow for the given node.
                        - */
                        -mxSvgCanvas2D.prototype.createShadow = function(node)
                        -{
                        -	var shadow = node.cloneNode(true);
                        -	var s = this.state;
                        -
                        -	// Firefox uses transparent for no fill in ellipses
                        -	if (shadow.getAttribute('fill') != 'none' && (!mxClient.IS_FF || shadow.getAttribute('fill') != 'transparent'))
                        -	{
                        -		shadow.setAttribute('fill', s.shadowColor);
                        -	}
                        -	
                        -	if (shadow.getAttribute('stroke') != 'none')
                        -	{
                        -		shadow.setAttribute('stroke', s.shadowColor);
                        -	}
                        -
                        -	shadow.setAttribute('transform', 'translate(' + this.format(s.shadowDx * s.scale) +
                        -		',' + this.format(s.shadowDy * s.scale) + ')' + (s.transform || ''));
                        -	shadow.setAttribute('opacity', s.shadowAlpha);
                        -	
                        -	return shadow;
                        -};
                        -
                        -/**
                        - * Function: setLink
                        - * 
                        - * Experimental implementation for hyperlinks.
                        - */
                        -mxSvgCanvas2D.prototype.setLink = function(link)
                        -{
                        -	if (link == null)
                        -	{
                        -		this.root = this.originalRoot;
                        -	}
                        -	else
                        -	{
                        -		this.originalRoot = this.root;
                        -		
                        -		var node = this.createElement('a');
                        -		
                        -		// Workaround for implicit namespace handling in HTML5 export, IE adds NS1 namespace so use code below
                        -		// in all IE versions except quirks mode. KNOWN: Adds xlink namespace to each image tag in output.
                        -		if (node.setAttributeNS == null || (this.root.ownerDocument != document && document.documentMode == null))
                        -		{
                        -			node.setAttribute('xlink:href', link);
                        -		}
                        -		else
                        -		{
                        -			node.setAttributeNS(mxConstants.NS_XLINK, 'xlink:href', link);
                        -		}
                        -		
                        -		this.root.appendChild(node);
                        -		this.root = node;
                        -	}
                        -};
                        -
                        -/**
                        - * Function: rotate
                        - * 
                        - * Sets the rotation of the canvas. Note that rotation cannot be concatenated.
                        - */
                        -mxSvgCanvas2D.prototype.rotate = function(theta, flipH, flipV, cx, cy)
                        -{
                        -	if (theta != 0 || flipH || flipV)
                        -	{
                        -		var s = this.state;
                        -		cx += s.dx;
                        -		cy += s.dy;
                        -	
                        -		cx *= s.scale;
                        -		cy *= s.scale;
                        -
                        -		s.transform = s.transform || '';
                        -		
                        -		// This implementation uses custom scale/translate and built-in rotation
                        -		// Rotation state is part of the AffineTransform in state.transform
                        -		if (flipH && flipV)
                        -		{
                        -			theta += 180;
                        -		}
                        -		else if (flipH != flipV)
                        -		{
                        -			var tx = (flipH) ? cx : 0;
                        -			var sx = (flipH) ? -1 : 1;
                        -	
                        -			var ty = (flipV) ? cy : 0;
                        -			var sy = (flipV) ? -1 : 1;
                        -
                        -			s.transform += 'translate(' + this.format(tx) + ',' + this.format(ty) + ')' +
                        -				'scale(' + this.format(sx) + ',' + this.format(sy) + ')' +
                        -				'translate(' + this.format(-tx) + ',' + this.format(-ty) + ')';
                        -		}
                        -		
                        -		if (flipH ? !flipV : flipV)
                        -		{
                        -			theta *= -1;
                        -		}
                        -		
                        -		if (theta != 0)
                        -		{
                        -			s.transform += 'rotate(' + this.format(theta) + ',' + this.format(cx) + ',' + this.format(cy) + ')';
                        -		}
                        -		
                        -		s.rotation = s.rotation + theta;
                        -		s.rotationCx = cx;
                        -		s.rotationCy = cy;
                        -	}
                        -};
                        -
                        -/**
                        - * Function: begin
                        - * 
                        - * Extends superclass to create path.
                        - */
                        -mxSvgCanvas2D.prototype.begin = function()
                        -{
                        -	mxAbstractCanvas2D.prototype.begin.apply(this, arguments);
                        -	this.node = this.createElement('path');
                        -};
                        -
                        -/**
                        - * Function: rect
                        - * 
                        - * Private helper function to create SVG elements
                        - */
                        -mxSvgCanvas2D.prototype.rect = function(x, y, w, h)
                        -{
                        -	var s = this.state;
                        -	var n = this.createElement('rect');
                        -	n.setAttribute('x', this.format((x + s.dx) * s.scale));
                        -	n.setAttribute('y', this.format((y + s.dy) * s.scale));
                        -	n.setAttribute('width', this.format(w * s.scale));
                        -	n.setAttribute('height', this.format(h * s.scale));
                        -	
                        -	this.node = n;
                        -};
                        -
                        -/**
                        - * Function: roundrect
                        - * 
                        - * Private helper function to create SVG elements
                        - */
                        -mxSvgCanvas2D.prototype.roundrect = function(x, y, w, h, dx, dy)
                        -{
                        -	this.rect(x, y, w, h);
                        -	
                        -	if (dx > 0)
                        -	{
                        -		this.node.setAttribute('rx', this.format(dx * this.state.scale));
                        -	}
                        -	
                        -	if (dy > 0)
                        -	{
                        -		this.node.setAttribute('ry', this.format(dy * this.state.scale));
                        -	}
                        -};
                        -
                        -/**
                        - * Function: ellipse
                        - * 
                        - * Private helper function to create SVG elements
                        - */
                        -mxSvgCanvas2D.prototype.ellipse = function(x, y, w, h)
                        -{
                        -	var s = this.state;
                        -	var n = this.createElement('ellipse');
                        -	// No rounding for consistent output with 1.x
                        -	n.setAttribute('cx', Math.round((x + w / 2 + s.dx) * s.scale));
                        -	n.setAttribute('cy', Math.round((y + h / 2 + s.dy) * s.scale));
                        -	n.setAttribute('rx', w / 2 * s.scale);
                        -	n.setAttribute('ry', h / 2 * s.scale);
                        -	this.node = n;
                        -};
                        -
                        -/**
                        - * Function: image
                        - * 
                        - * Private helper function to create SVG elements
                        - */
                        -mxSvgCanvas2D.prototype.image = function(x, y, w, h, src, aspect, flipH, flipV)
                        -{
                        -	src = this.converter.convert(src);
                        -	
                        -	// LATER: Add option for embedding images as base64.
                        -	aspect = (aspect != null) ? aspect : true;
                        -	flipH = (flipH != null) ? flipH : false;
                        -	flipV = (flipV != null) ? flipV : false;
                        -	
                        -	var s = this.state;
                        -	x += s.dx;
                        -	y += s.dy;
                        -	
                        -	var node = this.createElement('image');
                        -	node.setAttribute('x', this.format(x * s.scale) + this.imageOffset);
                        -	node.setAttribute('y', this.format(y * s.scale) + this.imageOffset);
                        -	node.setAttribute('width', this.format(w * s.scale));
                        -	node.setAttribute('height', this.format(h * s.scale));
                        -	
                        -	// Workaround for missing namespace support
                        -	if (node.setAttributeNS == null)
                        -	{
                        -		node.setAttribute('xlink:href', src);
                        -	}
                        -	else
                        -	{
                        -		node.setAttributeNS(mxConstants.NS_XLINK, 'xlink:href', src);
                        -	}
                        -	
                        -	if (!aspect)
                        -	{
                        -		node.setAttribute('preserveAspectRatio', 'none');
                        -	}
                        -
                        -	if (s.alpha < 1 || s.fillAlpha < 1)
                        -	{
                        -		node.setAttribute('opacity', s.alpha * s.fillAlpha);
                        -	}
                        -	
                        -	var tr = this.state.transform || '';
                        -	
                        -	if (flipH || flipV)
                        -	{
                        -		var sx = 1;
                        -		var sy = 1;
                        -		var dx = 0;
                        -		var dy = 0;
                        -		
                        -		if (flipH)
                        -		{
                        -			sx = -1;
                        -			dx = -w - 2 * x;
                        -		}
                        -		
                        -		if (flipV)
                        -		{
                        -			sy = -1;
                        -			dy = -h - 2 * y;
                        -		}
                        -		
                        -		// Adds image tansformation to existing transform
                        -		tr += 'scale(' + sx + ',' + sy + ')translate(' + (dx * s.scale) + ',' + (dy * s.scale) + ')';
                        -	}
                        -
                        -	if (tr.length > 0)
                        -	{
                        -		node.setAttribute('transform', tr);
                        -	}
                        -	
                        -	if (!this.pointerEvents)
                        -	{
                        -		node.setAttribute('pointer-events', 'none');
                        -	}
                        -	
                        -	this.root.appendChild(node);
                        -	
                        -	// Disables control-clicks on images in Firefox to open in new tab
                        -	// by putting a rect in the foreground that absorbs all events and
                        -	// disabling all pointer-events on the original image tag.
                        -	if (this.blockImagePointerEvents)
                        -	{
                        -		node.setAttribute('style', 'pointer-events:none');
                        -		
                        -		node = this.createElement('rect');
                        -		node.setAttribute('visibility', 'hidden');
                        -		node.setAttribute('pointer-events', 'fill');
                        -		node.setAttribute('x', this.format(x * s.scale));
                        -		node.setAttribute('y', this.format(y * s.scale));
                        -		node.setAttribute('width', this.format(w * s.scale));
                        -		node.setAttribute('height', this.format(h * s.scale));
                        -		this.root.appendChild(node);
                        -	}
                        -};
                        -
                        -/**
                        - * Function: convertHtml
                        - * 
                        - * Converts the given HTML string to XHTML.
                        - */
                        -mxSvgCanvas2D.prototype.convertHtml = function(val)
                        -{
                        -	if (this.useDomParser)
                        -	{
                        -		var doc = new DOMParser().parseFromString(val, 'text/html');
                        -
                        -		if (doc != null)
                        -		{
                        -			val = new XMLSerializer().serializeToString(doc.body);
                        -			
                        -			// Extracts body content from DOM
                        -			if (val.substring(0, 5) == '', 5) + 1);
                        -			}
                        -			
                        -			if (val.substring(val.length - 7, val.length) == '')
                        -			{
                        -				val = val.substring(0, val.length - 7);
                        -			}
                        -		}
                        -	}
                        -	else if (document.implementation != null && document.implementation.createDocument != null)
                        -	{
                        -		var xd = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
                        -		var xb = xd.createElement('body');
                        -		xd.documentElement.appendChild(xb);
                        -		
                        -		var div = document.createElement('div');
                        -		div.innerHTML = val;
                        -		var child = div.firstChild;
                        -		
                        -		while (child != null)
                        -		{
                        -			var next = child.nextSibling;
                        -			xb.appendChild(xd.adoptNode(child));
                        -			child = next;
                        -		}
                        -		
                        -		return xb.innerHTML;
                        -	}
                        -	else
                        -	{
                        -		var ta = document.createElement('textarea');
                        -		
                        -		// Handles special HTML entities < and > and double escaping
                        -		// and converts unclosed br, hr and img tags to XHTML
                        -		// LATER: Convert all unclosed tags
                        -		ta.innerHTML = val.replace(/&/g, '&amp;').
                        -			replace(/</g, '&lt;').replace(/>/g, '&gt;').
                        -			replace(/</g, '&lt;').replace(/>/g, '&gt;').
                        -			replace(//g, '>');
                        -		val = ta.value.replace(/&/g, '&').replace(/&lt;/g, '<').
                        -			replace(/&gt;/g, '>').replace(/&amp;/g, '&').
                        -			replace(/
                        /g, '
                        ').replace(/
                        /g, '
                        '). - replace(/(]+)>/gm, "$1 />"); - } - - return val; -}; - -/** - * Function: createDiv - * - * Private helper function to create SVG elements - */ -mxSvgCanvas2D.prototype.createDiv = function(str, align, valign, style, overflow, whiteSpace) -{ - var s = this.state; - - // Inline block for rendering HTML background over SVG in Safari - var lh = (mxConstants.ABSOLUTE_LINE_HEIGHT) ? (s.fontSize * mxConstants.LINE_HEIGHT) + 'px' : - (mxConstants.LINE_HEIGHT * this.lineHeightCorrection); - - // Quotes are workaround for font name "m+" - style = 'display:inline-block;font-size:' + s.fontSize + 'px;font-family:"' + s.fontFamily + - '";color:' + s.fontColor + ';line-height:' + lh + ';' + style; - - if ((s.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD) - { - style += 'font-weight:bold;'; - } - - if ((s.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC) - { - style += 'font-style:italic;'; - } - - if ((s.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE) - { - style += 'text-decoration:underline;'; - } - - if (align == mxConstants.ALIGN_CENTER) - { - style += 'text-align:center;'; - } - else if (align == mxConstants.ALIGN_RIGHT) - { - style += 'text-align:right;'; - } - - var css = ''; - - if (s.fontBackgroundColor != null) - { - css += 'background-color:' + s.fontBackgroundColor + ';'; - } - - if (s.fontBorderColor != null) - { - css += 'border:1px solid ' + s.fontBorderColor + ';'; - } - - var val = str; - - if (!mxUtils.isNode(val)) - { - val = this.convertHtml(val); - - if (overflow != 'fill' && overflow != 'width') - { - // Workaround for no wrapping in HTML canvas for image - // export if the inner HTML contains a DIV with width - if (whiteSpace != null) - { - css += 'white-space:' + whiteSpace + ';'; - } - - // Inner div always needed to measure wrapped text - val = '
                        ' + val + '
                        '; - } - else - { - style += css; - } - } - - // Uses DOM API where available. This cannot be used in IE to avoid - // an opening and two (!) closing TBODY tags being added to tables. - if (!mxClient.IS_IE && document.createElementNS) - { - var div = document.createElementNS('http://www.w3.org/1999/xhtml', 'div'); - div.setAttribute('style', style); - - if (mxUtils.isNode(val)) - { - // Creates a copy for export - if (this.root.ownerDocument != document) - { - div.appendChild(val.cloneNode(true)); - } - else - { - div.appendChild(val); - } - } - else - { - div.innerHTML = val; - } - - return div; - } - else - { - // Serializes for export - if (mxUtils.isNode(val) && this.root.ownerDocument != document) - { - val = val.outerHTML; - } - - // NOTE: FF 3.6 crashes if content CSS contains "height:100%" - return mxUtils.parseXml('
                        ' + val + '
                        ').documentElement; - } -}; - -/** - * Invalidates the cached offset size for the given node. - */ -mxSvgCanvas2D.prototype.invalidateCachedOffsetSize = function(node) -{ - delete node.firstChild.mxCachedOffsetWidth; - delete node.firstChild.mxCachedFinalOffsetWidth; - delete node.firstChild.mxCachedFinalOffsetHeight; -}; - -/** - * Updates existing DOM nodes for text rendering. LATER: Merge common parts with text function below. - */ -mxSvgCanvas2D.prototype.updateText = function(x, y, w, h, align, valign, wrap, overflow, clip, rotation, node) -{ - if (node != null && node.firstChild != null && node.firstChild.firstChild != null && - node.firstChild.firstChild.firstChild != null) - { - // Uses outer group for opacity and transforms to - // fix rendering order in Chrome - var group = node.firstChild; - var fo = group.firstChild; - var div = fo.firstChild; - - rotation = (rotation != null) ? rotation : 0; - - var s = this.state; - x += s.dx; - y += s.dy; - - if (clip) - { - div.style.maxHeight = Math.round(h) + 'px'; - div.style.maxWidth = Math.round(w) + 'px'; - } - else if (overflow == 'fill') - { - div.style.width = Math.round(w + 1) + 'px'; - div.style.height = Math.round(h + 1) + 'px'; - } - else if (overflow == 'width') - { - div.style.width = Math.round(w + 1) + 'px'; - - if (h > 0) - { - div.style.maxHeight = Math.round(h) + 'px'; - } - } - - if (wrap && w > 0) - { - div.style.width = Math.round(w + 1) + 'px'; - } - - // Code that depends on the size which is computed after - // the element was added to the DOM. - var ow = 0; - var oh = 0; - - // Padding avoids clipping on border and wrapping for differing font metrics on platforms - var padX = 0; - var padY = 2; - - var sizeDiv = div; - - if (sizeDiv.firstChild != null && sizeDiv.firstChild.nodeName == 'DIV') - { - sizeDiv = sizeDiv.firstChild; - } - - var tmp = (group.mxCachedOffsetWidth != null) ? group.mxCachedOffsetWidth : sizeDiv.offsetWidth; - ow = tmp + padX; - - // Recomputes the height of the element for wrapped width - if (wrap && overflow != 'fill') - { - if (clip) - { - ow = Math.min(ow, w); - } - - div.style.width = Math.round(ow + 1) + 'px'; - } - - ow = (group.mxCachedFinalOffsetWidth != null) ? group.mxCachedFinalOffsetWidth : sizeDiv.offsetWidth; - oh = (group.mxCachedFinalOffsetHeight != null) ? group.mxCachedFinalOffsetHeight : sizeDiv.offsetHeight; - - if (this.cacheOffsetSize) - { - group.mxCachedOffsetWidth = tmp; - group.mxCachedFinalOffsetWidth = ow; - group.mxCachedFinalOffsetHeight = oh; - } - - ow += padX; - oh -= 2; - - if (clip) - { - oh = Math.min(oh, h); - ow = Math.min(ow, w); - } - - if (overflow == 'width') - { - h = oh; - } - else if (overflow != 'fill') - { - w = ow; - h = oh; - } - - var dx = 0; - var dy = 0; - - if (align == mxConstants.ALIGN_CENTER) - { - dx -= w / 2; - } - else if (align == mxConstants.ALIGN_RIGHT) - { - dx -= w; - } - - x += dx; - - // FIXME: LINE_HEIGHT not ideal for all text sizes, fix for export - if (valign == mxConstants.ALIGN_MIDDLE) - { - dy -= h / 2; - } - else if (valign == mxConstants.ALIGN_BOTTOM) - { - dy -= h; - } - - // Workaround for rendering offsets - // TODO: Check if export needs these fixes, too - if (overflow != 'fill' && mxClient.IS_FF && mxClient.IS_WIN) - { - dy -= 2; - } - - y += dy; - - var tr = (s.scale != 1) ? 'scale(' + s.scale + ')' : ''; - - if (s.rotation != 0 && this.rotateHtml) - { - tr += 'rotate(' + (s.rotation) + ',' + (w / 2) + ',' + (h / 2) + ')'; - var pt = this.rotatePoint((x + w / 2) * s.scale, (y + h / 2) * s.scale, - s.rotation, s.rotationCx, s.rotationCy); - x = pt.x - w * s.scale / 2; - y = pt.y - h * s.scale / 2; - } - else - { - x *= s.scale; - y *= s.scale; - } - - if (rotation != 0) - { - tr += 'rotate(' + (rotation) + ',' + (-dx) + ',' + (-dy) + ')'; - } - - group.setAttribute('transform', 'translate(' + Math.round(x) + ',' + Math.round(y) + ')' + tr); - fo.setAttribute('width', Math.round(Math.max(1, w))); - fo.setAttribute('height', Math.round(Math.max(1, h))); - } -}; - -/** - * Function: text - * - * Paints the given text. Possible values for format are empty string for plain - * text and html for HTML markup. Note that HTML markup is only supported if - * foreignObject is supported and is true. (This means IE9 and later - * does currently not support HTML text as part of shapes.) - */ -mxSvgCanvas2D.prototype.text = function(x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation, dir) -{ - if (this.textEnabled && str != null) - { - rotation = (rotation != null) ? rotation : 0; - - var s = this.state; - x += s.dx; - y += s.dy; - - if (this.foEnabled && format == 'html') - { - var style = 'vertical-align:top;'; - - if (clip) - { - style += 'overflow:hidden;max-height:' + Math.round(h) + 'px;max-width:' + Math.round(w) + 'px;'; - } - else if (overflow == 'fill') - { - style += 'width:' + Math.round(w + 1) + 'px;height:' + Math.round(h + 1) + 'px;overflow:hidden;'; - } - else if (overflow == 'width') - { - style += 'width:' + Math.round(w + 1) + 'px;'; - - if (h > 0) - { - style += 'max-height:' + Math.round(h) + 'px;overflow:hidden;'; - } - } - - if (wrap && w > 0) - { - style += 'width:' + Math.round(w + 1) + 'px;white-space:normal;word-wrap:' + - mxConstants.WORD_WRAP + ';'; - } - else - { - style += 'white-space:nowrap;'; - } - - // Uses outer group for opacity and transforms to - // fix rendering order in Chrome - var group = this.createElement('g'); - - if (s.alpha < 1) - { - group.setAttribute('opacity', s.alpha); - } - - var fo = this.createElement('foreignObject'); - fo.setAttribute('style', 'overflow:visible;'); - fo.setAttribute('pointer-events', 'all'); - - var div = this.createDiv(str, align, valign, style, overflow, (wrap && w > 0) ? 'normal' : null); - - // Ignores invalid XHTML labels - if (div == null) - { - return; - } - else if (dir != null) - { - div.setAttribute('dir', dir); - } - - group.appendChild(fo); - this.root.appendChild(group); - - // Code that depends on the size which is computed after - // the element was added to the DOM. - var ow = 0; - var oh = 0; - - // Padding avoids clipping on border and wrapping for differing font metrics on platforms - var padX = 2; - var padY = 2; - - // NOTE: IE is always export as it does not support foreign objects - if (mxClient.IS_IE && (document.documentMode == 9 || !mxClient.IS_SVG)) - { - // Handles non-standard namespace for getting size in IE - var clone = document.createElement('div'); - - clone.style.cssText = div.getAttribute('style'); - clone.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - clone.style.position = 'absolute'; - clone.style.visibility = 'hidden'; - - // Inner DIV is needed for text measuring - var div2 = document.createElement('div'); - div2.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - div2.style.wordWrap = mxConstants.WORD_WRAP; - div2.innerHTML = (mxUtils.isNode(str)) ? str.outerHTML : str; - clone.appendChild(div2); - - document.body.appendChild(clone); - - // Workaround for different box models - if (document.documentMode != 8 && document.documentMode != 9 && s.fontBorderColor != null) - { - padX += 2; - padY += 2; - } - - if (wrap && w > 0) - { - var tmp = div2.offsetWidth; - - // Workaround for adding padding twice in IE8/IE9 standards mode if label is wrapped - padDx = 0; - - // For export, if no wrapping occurs, we add a large padding to make - // sure there is no wrapping even if the text metrics are different. - // This adds support for text metrics on different operating systems. - // Disables wrapping if text is not wrapped for given width - if (!clip && wrap && w > 0 && this.root.ownerDocument != document && overflow != 'fill') - { - var ws = clone.style.whiteSpace; - div2.style.whiteSpace = 'nowrap'; - - if (tmp < div2.offsetWidth) - { - clone.style.whiteSpace = ws; - } - } - - if (clip) - { - tmp = Math.min(tmp, w); - } - - clone.style.width = tmp + 'px'; - - // Padding avoids clipping on border - ow = div2.offsetWidth + padX + padDx; - oh = div2.offsetHeight + padY; - - // Overrides the width of the DIV via XML DOM by using the - // clone DOM style, getting the CSS text for that and - // then setting that on the DIV via setAttribute - clone.style.display = 'inline-block'; - clone.style.position = ''; - clone.style.visibility = ''; - clone.style.width = ow + 'px'; - - div.setAttribute('style', clone.style.cssText); - } - else - { - // Padding avoids clipping on border - ow = div2.offsetWidth + padX; - oh = div2.offsetHeight + padY; - } - - clone.parentNode.removeChild(clone); - fo.appendChild(div); - } - else - { - // Uses document for text measuring during export - if (this.root.ownerDocument != document) - { - div.style.visibility = 'hidden'; - document.body.appendChild(div); - } - else - { - fo.appendChild(div); - } - - var sizeDiv = div; - - if (sizeDiv.firstChild != null && sizeDiv.firstChild.nodeName == 'DIV') - { - sizeDiv = sizeDiv.firstChild; - - if (wrap && div.style.wordWrap == 'break-word') - { - sizeDiv.style.width = '100%'; - } - } - - var tmp = sizeDiv.offsetWidth; - - // Workaround for text measuring in hidden containers - if (tmp == 0 && div.parentNode == fo) - { - div.style.visibility = 'hidden'; - document.body.appendChild(div); - - tmp = sizeDiv.offsetWidth; - } - - if (this.cacheOffsetSize) - { - group.mxCachedOffsetWidth = tmp; - } - - // Disables wrapping if text is not wrapped for given width - if (!clip && wrap && w > 0 && this.root.ownerDocument != document && - overflow != 'fill' && overflow != 'width') - { - var ws = div.style.whiteSpace; - div.style.whiteSpace = 'nowrap'; - - if (tmp < sizeDiv.offsetWidth) - { - div.style.whiteSpace = ws; - } - } - - ow = tmp + padX - 1; - - // Recomputes the height of the element for wrapped width - if (wrap && overflow != 'fill' && overflow != 'width') - { - if (clip) - { - ow = Math.min(ow, w); - } - - div.style.width = ow + 'px'; - } - - ow = sizeDiv.offsetWidth; - oh = sizeDiv.offsetHeight; - - if (this.cacheOffsetSize) - { - group.mxCachedFinalOffsetWidth = ow; - group.mxCachedFinalOffsetHeight = oh; - } - - oh -= padY; - - if (div.parentNode != fo) - { - fo.appendChild(div); - div.style.visibility = ''; - } - } - - if (clip) - { - oh = Math.min(oh, h); - ow = Math.min(ow, w); - } - - if (overflow == 'width') - { - h = oh; - } - else if (overflow != 'fill') - { - w = ow; - h = oh; - } - - if (s.alpha < 1) - { - group.setAttribute('opacity', s.alpha); - } - - var dx = 0; - var dy = 0; - - if (align == mxConstants.ALIGN_CENTER) - { - dx -= w / 2; - } - else if (align == mxConstants.ALIGN_RIGHT) - { - dx -= w; - } - - x += dx; - - // FIXME: LINE_HEIGHT not ideal for all text sizes, fix for export - if (valign == mxConstants.ALIGN_MIDDLE) - { - dy -= h / 2; - } - else if (valign == mxConstants.ALIGN_BOTTOM) - { - dy -= h; - } - - // Workaround for rendering offsets - // TODO: Check if export needs these fixes, too - //if (this.root.ownerDocument == document) - if (overflow != 'fill' && mxClient.IS_FF && mxClient.IS_WIN) - { - dy -= 2; - } - - y += dy; - - var tr = (s.scale != 1) ? 'scale(' + s.scale + ')' : ''; - - if (s.rotation != 0 && this.rotateHtml) - { - tr += 'rotate(' + (s.rotation) + ',' + (w / 2) + ',' + (h / 2) + ')'; - var pt = this.rotatePoint((x + w / 2) * s.scale, (y + h / 2) * s.scale, - s.rotation, s.rotationCx, s.rotationCy); - x = pt.x - w * s.scale / 2; - y = pt.y - h * s.scale / 2; - } - else - { - x *= s.scale; - y *= s.scale; - } - - if (rotation != 0) - { - tr += 'rotate(' + (rotation) + ',' + (-dx) + ',' + (-dy) + ')'; - } - - group.setAttribute('transform', 'translate(' + (Math.round(x) + this.foOffset) + ',' + - (Math.round(y) + this.foOffset) + ')' + tr); - fo.setAttribute('width', Math.round(Math.max(1, w))); - fo.setAttribute('height', Math.round(Math.max(1, h))); - - // Adds alternate content if foreignObject not supported in viewer - if (this.root.ownerDocument != document) - { - var alt = this.createAlternateContent(fo, x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation); - - if (alt != null) - { - fo.setAttribute('requiredFeatures', 'http://www.w3.org/TR/SVG11/feature#Extensibility'); - var sw = this.createElement('switch'); - sw.appendChild(fo); - sw.appendChild(alt); - group.appendChild(sw); - } - } - } - else - { - this.plainText(x, y, w, h, str, align, valign, wrap, overflow, clip, rotation, dir); - } - } -}; - -/** - * Function: createClip - * - * Creates a clip for the given coordinates. - */ -mxSvgCanvas2D.prototype.createClip = function(x, y, w, h) -{ - x = Math.round(x); - y = Math.round(y); - w = Math.round(w); - h = Math.round(h); - - var id = 'mx-clip-' + x + '-' + y + '-' + w + '-' + h; - - var counter = 0; - var tmp = id + '-' + counter; - - // Resolves ID conflicts - while (document.getElementById(tmp) != null) - { - tmp = id + '-' + (++counter); - } - - clip = this.createElement('clipPath'); - clip.setAttribute('id', tmp); - - var rect = this.createElement('rect'); - rect.setAttribute('x', x); - rect.setAttribute('y', y); - rect.setAttribute('width', w); - rect.setAttribute('height', h); - - clip.appendChild(rect); - - return clip; -}; - -/** - * Function: text - * - * Paints the given text. Possible values for format are empty string for - * plain text and html for HTML markup. - */ -mxSvgCanvas2D.prototype.plainText = function(x, y, w, h, str, align, valign, wrap, overflow, clip, rotation, dir) -{ - rotation = (rotation != null) ? rotation : 0; - var s = this.state; - var size = s.fontSize; - var node = this.createElement('g'); - var tr = s.transform || ''; - this.updateFont(node); - - // Non-rotated text - if (rotation != 0) - { - tr += 'rotate(' + rotation + ',' + this.format(x * s.scale) + ',' + this.format(y * s.scale) + ')'; - } - - if (dir != null) - { - node.setAttribute('direction', dir); - } - - if (clip && w > 0 && h > 0) - { - var cx = x; - var cy = y; - - if (align == mxConstants.ALIGN_CENTER) - { - cx -= w / 2; - } - else if (align == mxConstants.ALIGN_RIGHT) - { - cx -= w; - } - - if (overflow != 'fill') - { - if (valign == mxConstants.ALIGN_MIDDLE) - { - cy -= h / 2; - } - else if (valign == mxConstants.ALIGN_BOTTOM) - { - cy -= h; - } - } - - // LATER: Remove spacing from clip rectangle - var c = this.createClip(cx * s.scale - 2, cy * s.scale - 2, w * s.scale + 4, h * s.scale + 4); - - if (this.defs != null) - { - this.defs.appendChild(c); - } - else - { - // Makes sure clip is removed with referencing node - this.root.appendChild(c); - } - - if (!mxClient.IS_CHROME_APP && !mxClient.IS_IE && !mxClient.IS_IE11 && - !mxClient.IS_EDGE && this.root.ownerDocument == document) - { - // Workaround for potential base tag - var base = this.getBaseUrl().replace(/([\(\)])/g, '\\$1'); - node.setAttribute('clip-path', 'url(' + base + '#' + c.getAttribute('id') + ')'); - } - else - { - node.setAttribute('clip-path', 'url(#' + c.getAttribute('id') + ')'); - } - } - - // Default is left - var anchor = (align == mxConstants.ALIGN_RIGHT) ? 'end' : - (align == mxConstants.ALIGN_CENTER) ? 'middle' : - 'start'; - - // Text-anchor start is default in SVG - if (anchor != 'start') - { - node.setAttribute('text-anchor', anchor); - } - - if (!this.styleEnabled || size != mxConstants.DEFAULT_FONTSIZE) - { - node.setAttribute('font-size', (size * s.scale) + 'px'); - } - - if (tr.length > 0) - { - node.setAttribute('transform', tr); - } - - if (s.alpha < 1) - { - node.setAttribute('opacity', s.alpha); - } - - var lines = str.split('\n'); - var lh = Math.round(size * mxConstants.LINE_HEIGHT); - var textHeight = size + (lines.length - 1) * lh; - - var cy = y + size - 1; - - if (valign == mxConstants.ALIGN_MIDDLE) - { - if (overflow == 'fill') - { - cy -= h / 2; - } - else - { - var dy = ((this.matchHtmlAlignment && clip && h > 0) ? Math.min(textHeight, h) : textHeight) / 2; - cy -= dy + 1; - } - } - else if (valign == mxConstants.ALIGN_BOTTOM) - { - if (overflow == 'fill') - { - cy -= h; - } - else - { - var dy = (this.matchHtmlAlignment && clip && h > 0) ? Math.min(textHeight, h) : textHeight; - cy -= dy + 2; - } - } - - for (var i = 0; i < lines.length; i++) - { - // Workaround for bounding box of empty lines and spaces - if (lines[i].length > 0 && mxUtils.trim(lines[i]).length > 0) - { - var text = this.createElement('text'); - // LATER: Match horizontal HTML alignment - text.setAttribute('x', this.format(x * s.scale) + this.textOffset); - text.setAttribute('y', this.format(cy * s.scale) + this.textOffset); - - mxUtils.write(text, lines[i]); - node.appendChild(text); - } - - cy += lh; - } - - this.root.appendChild(node); - this.addTextBackground(node, str, x, y, w, (overflow == 'fill') ? h : textHeight, align, valign, overflow); -}; - -/** - * Function: updateFont - * - * Updates the text properties for the given node. (NOTE: For this to work in - * IE, the given node must be a text or tspan element.) - */ -mxSvgCanvas2D.prototype.updateFont = function(node) -{ - var s = this.state; - - node.setAttribute('fill', s.fontColor); - - if (!this.styleEnabled || s.fontFamily != mxConstants.DEFAULT_FONTFAMILY) - { - node.setAttribute('font-family', '\'' + s.fontFamily + '\''); - } - - if ((s.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD) - { - node.setAttribute('font-weight', 'bold'); - } - - if ((s.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC) - { - node.setAttribute('font-style', 'italic'); - } - - if ((s.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE) - { - node.setAttribute('text-decoration', 'underline'); - } -}; - -/** - * Function: addTextBackground - * - * Background color and border - */ -mxSvgCanvas2D.prototype.addTextBackground = function(node, str, x, y, w, h, align, valign, overflow) -{ - var s = this.state; - - if (s.fontBackgroundColor != null || s.fontBorderColor != null) - { - var bbox = null; - - if (overflow == 'fill' || overflow == 'width') - { - if (align == mxConstants.ALIGN_CENTER) - { - x -= w / 2; - } - else if (align == mxConstants.ALIGN_RIGHT) - { - x -= w; - } - - if (valign == mxConstants.ALIGN_MIDDLE) - { - y -= h / 2; - } - else if (valign == mxConstants.ALIGN_BOTTOM) - { - y -= h; - } - - bbox = new mxRectangle((x + 1) * s.scale, y * s.scale, (w - 2) * s.scale, (h + 2) * s.scale); - } - else if (node.getBBox != null && this.root.ownerDocument == document) - { - // Uses getBBox only if inside document for correct size - try - { - bbox = node.getBBox(); - var ie = mxClient.IS_IE && mxClient.IS_SVG; - bbox = new mxRectangle(bbox.x, bbox.y + ((ie) ? 0 : 1), bbox.width, bbox.height + ((ie) ? 1 : 0)); - } - catch (e) - { - // Ignores NS_ERROR_FAILURE in FF if container display is none. - } - } - else - { - // Computes size if not in document or no getBBox available - var div = document.createElement('div'); - - // Wrapping and clipping can be ignored here - div.style.lineHeight = (mxConstants.ABSOLUTE_LINE_HEIGHT) ? (s.fontSize * mxConstants.LINE_HEIGHT) + 'px' : mxConstants.LINE_HEIGHT; - div.style.fontSize = s.fontSize + 'px'; - // Quotes are workaround for font name "m+" - div.style.fontFamily = '"' + s.fontFamily + '"'; - div.style.whiteSpace = 'nowrap'; - div.style.position = 'absolute'; - div.style.visibility = 'hidden'; - div.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - div.style.zoom = '1'; - - if ((s.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD) - { - div.style.fontWeight = 'bold'; - } - - if ((s.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC) - { - div.style.fontStyle = 'italic'; - } - - str = mxUtils.htmlEntities(str, false); - div.innerHTML = str.replace(/\n/g, '
                        '); - - document.body.appendChild(div); - var w = div.offsetWidth; - var h = div.offsetHeight; - div.parentNode.removeChild(div); - - if (align == mxConstants.ALIGN_CENTER) - { - x -= w / 2; - } - else if (align == mxConstants.ALIGN_RIGHT) - { - x -= w; - } - - if (valign == mxConstants.ALIGN_MIDDLE) - { - y -= h / 2; - } - else if (valign == mxConstants.ALIGN_BOTTOM) - { - y -= h; - } - - bbox = new mxRectangle((x + 1) * s.scale, (y + 2) * s.scale, w * s.scale, (h + 1) * s.scale); - } - - if (bbox != null) - { - var n = this.createElement('rect'); - n.setAttribute('fill', s.fontBackgroundColor || 'none'); - n.setAttribute('stroke', s.fontBorderColor || 'none'); - n.setAttribute('x', Math.floor(bbox.x - 1)); - n.setAttribute('y', Math.floor(bbox.y - 1)); - n.setAttribute('width', Math.ceil(bbox.width + 2)); - n.setAttribute('height', Math.ceil(bbox.height)); - - var sw = (s.fontBorderColor != null) ? Math.max(1, this.format(s.scale)) : 0; - n.setAttribute('stroke-width', sw); - - // Workaround for crisp rendering - only required if not exporting - if (this.root.ownerDocument == document && mxUtils.mod(sw, 2) == 1) - { - n.setAttribute('transform', 'translate(0.5, 0.5)'); - } - - node.insertBefore(n, node.firstChild); - } - } -}; - -/** - * Function: stroke - * - * Paints the outline of the current path. - */ -mxSvgCanvas2D.prototype.stroke = function() -{ - this.addNode(false, true); -}; - -/** - * Function: fill - * - * Fills the current path. - */ -mxSvgCanvas2D.prototype.fill = function() -{ - this.addNode(true, false); -}; - -/** - * Function: fillAndStroke - * - * Fills and paints the outline of the current path. - */ -mxSvgCanvas2D.prototype.fillAndStroke = function() -{ - this.addNode(true, true); -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -/** - * - * Class: mxVmlCanvas2D - * - * Implements a canvas to be used for rendering VML. Here is an example of implementing a - * fallback for SVG images which are not supported in VML-based browsers. - * - * (code) - * var mxVmlCanvas2DImage = mxVmlCanvas2D.prototype.image; - * mxVmlCanvas2D.prototype.image = function(x, y, w, h, src, aspect, flipH, flipV) - * { - * if (src.substring(src.length - 4, src.length) == '.svg') - * { - * src = 'http://www.jgraph.com/images/mxgraph.gif'; - * } - * - * mxVmlCanvas2DImage.apply(this, arguments); - * }; - * (end) - * - * To disable anti-aliasing in the output, use the following code. - * - * (code) - * document.createStyleSheet().cssText = mxClient.VML_PREFIX + '\\:*{antialias:false;)}'; - * (end) - * - * A description of the public API is available in . Note that - * there is a known issue in VML where gradients are painted using the outer - * bounding box of rotated shapes, not the actual bounds of the shape. See - * also for plain text label restrictions in shapes for VML. - */ -var mxVmlCanvas2D = function(root) -{ - mxAbstractCanvas2D.call(this); - - /** - * Variable: root - * - * Reference to the container for the SVG content. - */ - this.root = root; -}; - -/** - * Extends mxAbstractCanvas2D - */ -mxUtils.extend(mxVmlCanvas2D, mxAbstractCanvas2D); - -/** - * Variable: path - * - * Holds the current DOM node. - */ -mxVmlCanvas2D.prototype.node = null; - -/** - * Variable: textEnabled - * - * Specifies if text output should be enabledetB. Default is true. - */ -mxVmlCanvas2D.prototype.textEnabled = true; - -/** - * Variable: moveOp - * - * Contains the string used for moving in paths. Default is 'm'. - */ -mxVmlCanvas2D.prototype.moveOp = 'm'; - -/** - * Variable: lineOp - * - * Contains the string used for moving in paths. Default is 'l'. - */ -mxVmlCanvas2D.prototype.lineOp = 'l'; - -/** - * Variable: curveOp - * - * Contains the string used for bezier curves. Default is 'c'. - */ -mxVmlCanvas2D.prototype.curveOp = 'c'; - -/** - * Variable: closeOp - * - * Holds the operator for closing curves. Default is 'x e'. - */ -mxVmlCanvas2D.prototype.closeOp = 'x'; - -/** - * Variable: rotatedHtmlBackground - * - * Background color for rotated HTML. Default is ''. This can be set to eg. - * white to improve rendering of rotated text in VML for IE9. - */ -mxVmlCanvas2D.prototype.rotatedHtmlBackground = ''; - -/** - * Variable: vmlScale - * - * Specifies the scale used to draw VML shapes. - */ -mxVmlCanvas2D.prototype.vmlScale = 1; - -/** - * Function: createElement - * - * Creates the given element using the document. - */ -mxVmlCanvas2D.prototype.createElement = function(name) -{ - return document.createElement(name); -}; - -/** - * Function: createVmlElement - * - * Creates a new element using and prefixes the given name with - * . - */ -mxVmlCanvas2D.prototype.createVmlElement = function(name) -{ - return this.createElement(mxClient.VML_PREFIX + ':' + name); -}; - -/** - * Function: addNode - * - * Adds the current node to the . - */ -mxVmlCanvas2D.prototype.addNode = function(filled, stroked) -{ - var node = this.node; - var s = this.state; - - if (node != null) - { - if (node.nodeName == 'shape') - { - // Checks if the path is not empty - if (this.path != null && this.path.length > 0) - { - node.path = this.path.join(' ') + ' e'; - node.style.width = this.root.style.width; - node.style.height = this.root.style.height; - node.coordsize = parseInt(node.style.width) + ' ' + parseInt(node.style.height); - } - else - { - return; - } - } - - node.strokeweight = this.format(Math.max(1, s.strokeWidth * s.scale / this.vmlScale)) + 'px'; - - if (s.shadow) - { - this.root.appendChild(this.createShadow(node, - filled && s.fillColor != null, - stroked && s.strokeColor != null)); - } - - if (stroked && s.strokeColor != null) - { - node.stroked = 'true'; - node.strokecolor = s.strokeColor; - } - else - { - node.stroked = 'false'; - } - - node.appendChild(this.createStroke()); - - if (filled && s.fillColor != null) - { - node.appendChild(this.createFill()); - } - else if (this.pointerEvents && (node.nodeName != 'shape' || - this.path[this.path.length - 1] == this.closeOp)) - { - node.appendChild(this.createTransparentFill()); - } - else - { - node.filled = 'false'; - } - - // LATER: Update existing DOM for performance - this.root.appendChild(node); - } -}; - -/** - * Function: createTransparentFill - * - * Creates a transparent fill. - */ -mxVmlCanvas2D.prototype.createTransparentFill = function() -{ - var fill = this.createVmlElement('fill'); - fill.src = mxClient.imageBasePath + '/transparent.gif'; - fill.type = 'tile'; - - return fill; -}; - -/** - * Function: createFill - * - * Creates a fill for the current state. - */ -mxVmlCanvas2D.prototype.createFill = function() -{ - var s = this.state; - - // Gradients in foregrounds not supported because special gradients - // with bounds must be created for each element in graphics-canvases - var fill = this.createVmlElement('fill'); - fill.color = s.fillColor; - - if (s.gradientColor != null) - { - fill.type = 'gradient'; - fill.method = 'none'; - fill.color2 = s.gradientColor; - var angle = 180 - s.rotation; - - if (s.gradientDirection == mxConstants.DIRECTION_WEST) - { - angle -= 90 + ((this.root.style.flip == 'x') ? 180 : 0); - } - else if (s.gradientDirection == mxConstants.DIRECTION_EAST) - { - angle += 90 + ((this.root.style.flip == 'x') ? 180 : 0); - } - else if (s.gradientDirection == mxConstants.DIRECTION_NORTH) - { - angle -= 180 + ((this.root.style.flip == 'y') ? -180 : 0); - } - else - { - angle += ((this.root.style.flip == 'y') ? -180 : 0); - } - - if (this.root.style.flip == 'x' || this.root.style.flip == 'y') - { - angle *= -1; - } - - // LATER: Fix outer bounding box for rotated shapes used in VML. - fill.angle = mxUtils.mod(angle, 360); - fill.opacity = (s.alpha * s.gradientFillAlpha * 100) + '%'; - fill.setAttribute(mxClient.OFFICE_PREFIX + ':opacity2', (s.alpha * s.gradientAlpha * 100) + '%'); - } - else if (s.alpha < 1 || s.fillAlpha < 1) - { - fill.opacity = (s.alpha * s.fillAlpha * 100) + '%'; - } - - return fill; -}; -/** - * Function: createStroke - * - * Creates a fill for the current state. - */ -mxVmlCanvas2D.prototype.createStroke = function() -{ - var s = this.state; - var stroke = this.createVmlElement('stroke'); - stroke.endcap = s.lineCap || 'flat'; - stroke.joinstyle = s.lineJoin || 'miter'; - stroke.miterlimit = s.miterLimit || '10'; - - if (s.alpha < 1 || s.strokeAlpha < 1) - { - stroke.opacity = (s.alpha * s.strokeAlpha * 100) + '%'; - } - - if (s.dashed) - { - stroke.dashstyle = this.getVmlDashStyle(); - } - - return stroke; -}; - -/** - * Function: getVmlDashPattern - * - * Returns a VML dash pattern for the current dashPattern. - * See http://msdn.microsoft.com/en-us/library/bb264085(v=vs.85).aspx - */ -mxVmlCanvas2D.prototype.getVmlDashStyle = function() -{ - var result = 'dash'; - - if (typeof(this.state.dashPattern) === 'string') - { - var tok = this.state.dashPattern.split(' '); - - if (tok.length > 0 && tok[0] == 1) - { - result = '0 2'; - } - } - - return result; -}; - -/** - * Function: createShadow - * - * Creates a shadow for the given node. - */ -mxVmlCanvas2D.prototype.createShadow = function(node, filled, stroked) -{ - var s = this.state; - var rad = -s.rotation * (Math.PI / 180); - var cos = Math.cos(rad); - var sin = Math.sin(rad); - - var dx = s.shadowDx * s.scale; - var dy = s.shadowDy * s.scale; - - if (this.root.style.flip == 'x') - { - dx *= -1; - } - else if (this.root.style.flip == 'y') - { - dy *= -1; - } - - var shadow = node.cloneNode(true); - shadow.style.marginLeft = Math.round(dx * cos - dy * sin) + 'px'; - shadow.style.marginTop = Math.round(dx * sin + dy * cos) + 'px'; - - // Workaround for wrong cloning in IE8 standards mode - if (document.documentMode == 8) - { - shadow.strokeweight = node.strokeweight; - - if (node.nodeName == 'shape') - { - shadow.path = this.path.join(' ') + ' e'; - shadow.style.width = this.root.style.width; - shadow.style.height = this.root.style.height; - shadow.coordsize = parseInt(node.style.width) + ' ' + parseInt(node.style.height); - } - } - - if (stroked) - { - shadow.strokecolor = s.shadowColor; - shadow.appendChild(this.createShadowStroke()); - } - else - { - shadow.stroked = 'false'; - } - - if (filled) - { - shadow.appendChild(this.createShadowFill()); - } - else - { - shadow.filled = 'false'; - } - - return shadow; -}; - -/** - * Function: createShadowFill - * - * Creates the fill for the shadow. - */ -mxVmlCanvas2D.prototype.createShadowFill = function() -{ - var fill = this.createVmlElement('fill'); - fill.color = this.state.shadowColor; - fill.opacity = (this.state.alpha * this.state.shadowAlpha * 100) + '%'; - - return fill; -}; - -/** - * Function: createShadowStroke - * - * Creates the stroke for the shadow. - */ -mxVmlCanvas2D.prototype.createShadowStroke = function() -{ - var stroke = this.createStroke(); - stroke.opacity = (this.state.alpha * this.state.shadowAlpha * 100) + '%'; - - return stroke; -}; - -/** - * Function: rotate - * - * Sets the rotation of the canvas. Note that rotation cannot be concatenated. - */ -mxVmlCanvas2D.prototype.rotate = function(theta, flipH, flipV, cx, cy) -{ - if (flipH && flipV) - { - theta += 180; - } - else if (flipH) - { - this.root.style.flip = 'x'; - } - else if (flipV) - { - this.root.style.flip = 'y'; - } - - if (flipH ? !flipV : flipV) - { - theta *= -1; - } - - this.root.style.rotation = theta; - this.state.rotation = this.state.rotation + theta; - this.state.rotationCx = cx; - this.state.rotationCy = cy; -}; - -/** - * Function: begin - * - * Extends superclass to create path. - */ -mxVmlCanvas2D.prototype.begin = function() -{ - mxAbstractCanvas2D.prototype.begin.apply(this, arguments); - this.node = this.createVmlElement('shape'); - this.node.style.position = 'absolute'; -}; - -/** - * Function: quadTo - * - * Replaces quadratic curve with bezier curve in VML. - */ -mxVmlCanvas2D.prototype.quadTo = function(x1, y1, x2, y2) -{ - var s = this.state; - - var cpx0 = (this.lastX + s.dx) * s.scale; - var cpy0 = (this.lastY + s.dy) * s.scale; - var qpx1 = (x1 + s.dx) * s.scale; - var qpy1 = (y1 + s.dy) * s.scale; - var cpx3 = (x2 + s.dx) * s.scale; - var cpy3 = (y2 + s.dy) * s.scale; - - var cpx1 = cpx0 + 2/3 * (qpx1 - cpx0); - var cpy1 = cpy0 + 2/3 * (qpy1 - cpy0); - - var cpx2 = cpx3 + 2/3 * (qpx1 - cpx3); - var cpy2 = cpy3 + 2/3 * (qpy1 - cpy3); - - this.path.push('c ' + this.format(cpx1) + ' ' + this.format(cpy1) + - ' ' + this.format(cpx2) + ' ' + this.format(cpy2) + - ' ' + this.format(cpx3) + ' ' + this.format(cpy3)); - this.lastX = (cpx3 / s.scale) - s.dx; - this.lastY = (cpy3 / s.scale) - s.dy; - -}; - -/** - * Function: createRect - * - * Sets the glass gradient. - */ -mxVmlCanvas2D.prototype.createRect = function(nodeName, x, y, w, h) -{ - var s = this.state; - var n = this.createVmlElement(nodeName); - n.style.position = 'absolute'; - n.style.left = this.format((x + s.dx) * s.scale) + 'px'; - n.style.top = this.format((y + s.dy) * s.scale) + 'px'; - n.style.width = this.format(w * s.scale) + 'px'; - n.style.height = this.format(h * s.scale) + 'px'; - - return n; -}; - -/** - * Function: rect - * - * Sets the current path to a rectangle. - */ -mxVmlCanvas2D.prototype.rect = function(x, y, w, h) -{ - this.node = this.createRect('rect', x, y, w, h); -}; - -/** - * Function: roundrect - * - * Sets the current path to a rounded rectangle. - */ -mxVmlCanvas2D.prototype.roundrect = function(x, y, w, h, dx, dy) -{ - this.node = this.createRect('roundrect', x, y, w, h); - // SetAttribute needed here for IE8 - this.node.setAttribute('arcsize', Math.max(dx * 100 / w, dy * 100 / h) + '%'); -}; - -/** - * Function: ellipse - * - * Sets the current path to an ellipse. - */ -mxVmlCanvas2D.prototype.ellipse = function(x, y, w, h) -{ - this.node = this.createRect('oval', x, y, w, h); -}; - -/** - * Function: image - * - * Paints an image. - */ -mxVmlCanvas2D.prototype.image = function(x, y, w, h, src, aspect, flipH, flipV) -{ - var node = null; - - if (!aspect) - { - node = this.createRect('image', x, y, w, h); - node.src = src; - } - else - { - // Uses fill with aspect to avoid asynchronous update of size - node = this.createRect('rect', x, y, w, h); - node.stroked = 'false'; - - // Handles image aspect via fill - var fill = this.createVmlElement('fill'); - fill.aspect = (aspect) ? 'atmost' : 'ignore'; - fill.rotate = 'true'; - fill.type = 'frame'; - fill.src = src; - - node.appendChild(fill); - } - - if (flipH && flipV) - { - node.style.rotation = '180'; - } - else if (flipH) - { - node.style.flip = 'x'; - } - else if (flipV) - { - node.style.flip = 'y'; - } - - if (this.state.alpha < 1 || this.state.fillAlpha < 1) - { - // KNOWN: Borders around transparent images in IE<9. Using fill.opacity - // fixes this problem by adding a white background in all IE versions. - node.style.filter += 'alpha(opacity=' + (this.state.alpha * this.state.fillAlpha * 100) + ')'; - } - - this.root.appendChild(node); -}; - -/** - * Function: createText - * - * Creates the innermost element that contains the HTML text. - */ -mxVmlCanvas2D.prototype.createDiv = function(str, align, valign, overflow) -{ - var div = this.createElement('div'); - var state = this.state; - - var css = ''; - - if (state.fontBackgroundColor != null) - { - css += 'background-color:' + state.fontBackgroundColor + ';'; - } - - if (state.fontBorderColor != null) - { - css += 'border:1px solid ' + state.fontBorderColor + ';'; - } - - if (mxUtils.isNode(str)) - { - div.appendChild(str); - } - else - { - if (overflow != 'fill' && overflow != 'width') - { - var div2 = this.createElement('div'); - div2.style.cssText = css; - div2.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - div2.style.zoom = '1'; - div2.style.textDecoration = 'inherit'; - div2.innerHTML = str; - div.appendChild(div2); - } - else - { - div.style.cssText = css; - div.innerHTML = str; - } - } - - var style = div.style; - - style.fontSize = (state.fontSize / this.vmlScale) + 'px'; - style.fontFamily = state.fontFamily; - style.color = state.fontColor; - style.verticalAlign = 'top'; - style.textAlign = align || 'left'; - style.lineHeight = (mxConstants.ABSOLUTE_LINE_HEIGHT) ? (state.fontSize * mxConstants.LINE_HEIGHT / this.vmlScale) + 'px' : mxConstants.LINE_HEIGHT; - - if ((state.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD) - { - style.fontWeight = 'bold'; - } - - if ((state.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC) - { - style.fontStyle = 'italic'; - } - - if ((state.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE) - { - style.textDecoration = 'underline'; - } - - return div; -}; - -/** - * Function: text - * - * Paints the given text. Possible values for format are empty string for plain - * text and html for HTML markup. Clipping, text background and border are not - * supported for plain text in VML. - */ -mxVmlCanvas2D.prototype.text = function(x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation, dir) -{ - if (this.textEnabled && str != null) - { - var s = this.state; - - if (format == 'html') - { - if (s.rotation != null) - { - var pt = this.rotatePoint(x, y, s.rotation, s.rotationCx, s.rotationCy); - - x = pt.x; - y = pt.y; - } - - if (document.documentMode == 8 && !mxClient.IS_EM) - { - x += s.dx; - y += s.dy; - - // Workaround for rendering offsets - if (overflow != 'fill' && valign == mxConstants.ALIGN_TOP) - { - y -= 1; - } - } - else - { - x *= s.scale; - y *= s.scale; - } - - // Adds event transparency in IE8 standards without the transparent background - // filter which cannot be used due to bugs in the zoomed bounding box (too slow) - // FIXME: No event transparency if inside v:rect (ie part of shape) - // KNOWN: Offset wrong for rotated text with word that are longer than the wrapping - // width in IE8 because real width of text cannot be determined here. - // This should be fixed in mxText.updateBoundingBox by calling before this and - // passing the real width to this method if not clipped and wrapped. - var abs = (document.documentMode == 8 && !mxClient.IS_EM) ? this.createVmlElement('group') : this.createElement('div'); - abs.style.position = 'absolute'; - abs.style.display = 'inline'; - abs.style.left = this.format(x) + 'px'; - abs.style.top = this.format(y) + 'px'; - abs.style.zoom = s.scale; - - var box = this.createElement('div'); - box.style.position = 'relative'; - box.style.display = 'inline'; - - var margin = mxUtils.getAlignmentAsPoint(align, valign); - var dx = margin.x; - var dy = margin.y; - - var div = this.createDiv(str, align, valign, overflow); - var inner = this.createElement('div'); - - if (dir != null) - { - div.setAttribute('dir', dir); - } - - if (wrap && w > 0) - { - if (!clip) - { - div.style.width = Math.round(w) + 'px'; - } - - div.style.wordWrap = mxConstants.WORD_WRAP; - div.style.whiteSpace = 'normal'; - - // LATER: Check if other cases need to be handled - if (div.style.wordWrap == 'break-word') - { - var tmp = div; - - if (tmp.firstChild != null && tmp.firstChild.nodeName == 'DIV') - { - tmp.firstChild.style.width = '100%'; - } - } - } - else - { - div.style.whiteSpace = 'nowrap'; - } - - var rot = s.rotation + (rotation || 0); - - if (this.rotateHtml && rot != 0) - { - inner.style.display = 'inline'; - inner.style.zoom = '1'; - inner.appendChild(div); - - // Box not needed for rendering in IE8 standards - if (document.documentMode == 8 && !mxClient.IS_EM && this.root.nodeName != 'DIV') - { - box.appendChild(inner); - abs.appendChild(box); - } - else - { - abs.appendChild(inner); - } - } - else if (document.documentMode == 8 && !mxClient.IS_EM) - { - box.appendChild(div); - abs.appendChild(box); - } - else - { - div.style.display = 'inline'; - abs.appendChild(div); - } - - // Inserts the node into the DOM - if (this.root.nodeName != 'DIV') - { - // Rectangle to fix position in group - var rect = this.createVmlElement('rect'); - rect.stroked = 'false'; - rect.filled = 'false'; - - rect.appendChild(abs); - this.root.appendChild(rect); - } - else - { - this.root.appendChild(abs); - } - - if (clip) - { - div.style.overflow = 'hidden'; - div.style.width = Math.round(w) + 'px'; - - if (!mxClient.IS_QUIRKS) - { - div.style.maxHeight = Math.round(h) + 'px'; - } - } - else if (overflow == 'fill') - { - // KNOWN: Affects horizontal alignment in quirks - // but fill should only be used with align=left - div.style.overflow = 'hidden'; - div.style.width = (Math.max(0, w) + 1) + 'px'; - div.style.height = (Math.max(0, h) + 1) + 'px'; - } - else if (overflow == 'width') - { - // KNOWN: Affects horizontal alignment in quirks - // but fill should only be used with align=left - div.style.overflow = 'hidden'; - div.style.width = (Math.max(0, w) + 1) + 'px'; - div.style.maxHeight = (Math.max(0, h) + 1) + 'px'; - } - - if (this.rotateHtml && rot != 0) - { - var rad = rot * (Math.PI / 180); - - // Precalculate cos and sin for the rotation - var real_cos = parseFloat(parseFloat(Math.cos(rad)).toFixed(8)); - var real_sin = parseFloat(parseFloat(Math.sin(-rad)).toFixed(8)); - - rad %= 2 * Math.PI; - if (rad < 0) rad += 2 * Math.PI; - rad %= Math.PI; - if (rad > Math.PI / 2) rad = Math.PI - rad; - - var cos = Math.cos(rad); - var sin = Math.sin(rad); - - // Adds div to document to measure size - if (document.documentMode == 8 && !mxClient.IS_EM) - { - div.style.display = 'inline-block'; - inner.style.display = 'inline-block'; - box.style.display = 'inline-block'; - } - - div.style.visibility = 'hidden'; - div.style.position = 'absolute'; - document.body.appendChild(div); - - var sizeDiv = div; - - if (sizeDiv.firstChild != null && sizeDiv.firstChild.nodeName == 'DIV') - { - sizeDiv = sizeDiv.firstChild; - } - - var tmp = sizeDiv.offsetWidth + 3; - var oh = sizeDiv.offsetHeight; - - if (clip) - { - w = Math.min(w, tmp); - oh = Math.min(oh, h); - } - else - { - w = tmp; - } - - // Handles words that are longer than the given wrapping width - if (wrap) - { - div.style.width = w + 'px'; - } - - // Simulates max-height in quirks - if (mxClient.IS_QUIRKS && (clip || overflow == 'width') && oh > h) - { - oh = h; - - // Quirks does not support maxHeight - div.style.height = oh + 'px'; - } - - h = oh; - - var top_fix = (h - h * cos + w * -sin) / 2 - real_sin * w * (dx + 0.5) + real_cos * h * (dy + 0.5); - var left_fix = (w - w * cos + h * -sin) / 2 + real_cos * w * (dx + 0.5) + real_sin * h * (dy + 0.5); - - if (abs.nodeName == 'group' && this.root.nodeName == 'DIV') - { - // Workaround for bug where group gets moved away if left and top are non-zero in IE8 standards - var pos = this.createElement('div'); - pos.style.display = 'inline-block'; - pos.style.position = 'absolute'; - pos.style.left = this.format(x + (left_fix - w / 2) * s.scale) + 'px'; - pos.style.top = this.format(y + (top_fix - h / 2) * s.scale) + 'px'; - - abs.parentNode.appendChild(pos); - pos.appendChild(abs); - } - else - { - var sc = (document.documentMode == 8 && !mxClient.IS_EM) ? 1 : s.scale; - - abs.style.left = this.format(x + (left_fix - w / 2) * sc) + 'px'; - abs.style.top = this.format(y + (top_fix - h / 2) * sc) + 'px'; - } - - // KNOWN: Rotated text rendering quality is bad for IE9 quirks - inner.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11="+real_cos+", M12="+ - real_sin+", M21="+(-real_sin)+", M22="+real_cos+", sizingMethod='auto expand')"; - inner.style.backgroundColor = this.rotatedHtmlBackground; - - if (this.state.alpha < 1) - { - inner.style.filter += 'alpha(opacity=' + (this.state.alpha * 100) + ')'; - } - - // Restore parent node for DIV - inner.appendChild(div); - div.style.position = ''; - div.style.visibility = ''; - } - else if (document.documentMode != 8 || mxClient.IS_EM) - { - div.style.verticalAlign = 'top'; - - if (this.state.alpha < 1) - { - abs.style.filter = 'alpha(opacity=' + (this.state.alpha * 100) + ')'; - } - - // Adds div to document to measure size - var divParent = div.parentNode; - div.style.visibility = 'hidden'; - document.body.appendChild(div); - - w = div.offsetWidth; - var oh = div.offsetHeight; - - // Simulates max-height in quirks - if (mxClient.IS_QUIRKS && clip && oh > h) - { - oh = h; - - // Quirks does not support maxHeight - div.style.height = oh + 'px'; - } - - h = oh; - - div.style.visibility = ''; - divParent.appendChild(div); - - abs.style.left = this.format(x + w * dx * this.state.scale) + 'px'; - abs.style.top = this.format(y + h * dy * this.state.scale) + 'px'; - } - else - { - if (this.state.alpha < 1) - { - div.style.filter = 'alpha(opacity=' + (this.state.alpha * 100) + ')'; - } - - // Faster rendering in IE8 without offsetWidth/Height - box.style.left = (dx * 100) + '%'; - box.style.top = (dy * 100) + '%'; - } - } - else - { - this.plainText(x, y, w, h, mxUtils.htmlEntities(str, false), align, valign, wrap, format, overflow, clip, rotation, dir); - } - } -}; - -/** - * Function: plainText - * - * Paints the outline of the current path. - */ -mxVmlCanvas2D.prototype.plainText = function(x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation, dir) -{ - // TextDirection is ignored since this code is not used (format is always HTML in the text function) - var s = this.state; - x = (x + s.dx) * s.scale; - y = (y + s.dy) * s.scale; - - var node = this.createVmlElement('shape'); - node.style.width = '1px'; - node.style.height = '1px'; - node.stroked = 'false'; - - var fill = this.createVmlElement('fill'); - fill.color = s.fontColor; - fill.opacity = (s.alpha * 100) + '%'; - node.appendChild(fill); - - var path = this.createVmlElement('path'); - path.textpathok = 'true'; - path.v = 'm ' + this.format(0) + ' ' + this.format(0) + ' l ' + this.format(1) + ' ' + this.format(0); - - node.appendChild(path); - - // KNOWN: Font family and text decoration ignored - var tp = this.createVmlElement('textpath'); - tp.style.cssText = 'v-text-align:' + align; - tp.style.align = align; - tp.style.fontFamily = s.fontFamily; - tp.string = str; - tp.on = 'true'; - - // Scale via fontsize instead of node.style.zoom for correct offsets in IE8 - var size = s.fontSize * s.scale / this.vmlScale; - tp.style.fontSize = size + 'px'; - - // Bold - if ((s.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD) - { - tp.style.fontWeight = 'bold'; - } - - // Italic - if ((s.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC) - { - tp.style.fontStyle = 'italic'; - } - - // Underline - if ((s.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE) - { - tp.style.textDecoration = 'underline'; - } - - var lines = str.split('\n'); - var textHeight = size + (lines.length - 1) * size * mxConstants.LINE_HEIGHT; - var dx = 0; - var dy = 0; - - if (valign == mxConstants.ALIGN_BOTTOM) - { - dy = - textHeight / 2; - } - else if (valign != mxConstants.ALIGN_MIDDLE) // top - { - dy = textHeight / 2; - } - - if (rotation != null) - { - node.style.rotation = rotation; - var rad = rotation * (Math.PI / 180); - dx = Math.sin(rad) * dy; - dy = Math.cos(rad) * dy; - } - - // FIXME: Clipping is relative to bounding box - /*if (clip) - { - node.style.clip = 'rect(0px ' + this.format(w) + 'px ' + this.format(h) + 'px 0px)'; - }*/ - - node.appendChild(tp); - node.style.left = this.format(x - dx) + 'px'; - node.style.top = this.format(y + dy) + 'px'; - - this.root.appendChild(node); -}; - -/** - * Function: stroke - * - * Paints the outline of the current path. - */ -mxVmlCanvas2D.prototype.stroke = function() -{ - this.addNode(false, true); -}; - -/** - * Function: fill - * - * Fills the current path. - */ -mxVmlCanvas2D.prototype.fill = function() -{ - this.addNode(true, false); -}; - -/** - * Function: fillAndStroke - * - * Fills and paints the outline of the current path. - */ -mxVmlCanvas2D.prototype.fillAndStroke = function() -{ - this.addNode(true, true); -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -/** - * Class: mxGuide - * - * Implements the alignment of selection cells to other cells in the graph. - * - * Constructor: mxGuide - * - * Constructs a new guide object. - */ -function mxGuide(graph, states) -{ - this.graph = graph; - this.setStates(states); -}; - -/** - * Variable: graph - * - * Reference to the enclosing instance. - */ -mxGuide.prototype.graph = null; - -/** - * Variable: states - * - * Contains the that are used for alignment. - */ -mxGuide.prototype.states = null; - -/** - * Variable: horizontal - * - * Specifies if horizontal guides are enabled. Default is true. - */ -mxGuide.prototype.horizontal = true; - -/** - * Variable: vertical - * - * Specifies if vertical guides are enabled. Default is true. - */ -mxGuide.prototype.vertical = true; - -/** - * Variable: vertical - * - * Holds the for the horizontal guide. - */ -mxGuide.prototype.guideX = null; - -/** - * Variable: vertical - * - * Holds the for the vertical guide. - */ -mxGuide.prototype.guideY = null; - -/** - * Variable: rounded - * - * Specifies if rounded coordinates should be used. Default is false. - */ -mxGuide.prototype.rounded = false; - -/** - * Function: setStates - * - * Sets the that should be used for alignment. - */ -mxGuide.prototype.setStates = function(states) -{ - this.states = states; -}; - -/** - * Function: isEnabledForEvent - * - * Returns true if the guide should be enabled for the given native event. This - * implementation always returns true. - */ -mxGuide.prototype.isEnabledForEvent = function(evt) -{ - return true; -}; - -/** - * Function: getGuideTolerance - * - * Returns the tolerance for the guides. Default value is gridSize / 2. - */ -mxGuide.prototype.getGuideTolerance = function() -{ - return this.graph.gridSize / 2; -}; - -/** - * Function: createGuideShape - * - * Returns the mxShape to be used for painting the respective guide. This - * implementation returns a new, dashed and crisp using - * and as the format. - * - * Parameters: - * - * horizontal - Boolean that specifies which guide should be created. - */ -mxGuide.prototype.createGuideShape = function(horizontal) -{ - var guide = new mxPolyline([], mxConstants.GUIDE_COLOR, mxConstants.GUIDE_STROKEWIDTH); - guide.isDashed = true; - - return guide; -}; - -/** - * Function: move - * - * Moves the by the given and returnt the snapped point. - */ -mxGuide.prototype.move = function(bounds, delta, gridEnabled, clone) -{ - if (this.states != null && (this.horizontal || this.vertical) && bounds != null && delta != null) - { - var trx = this.graph.getView().translate; - var scale = this.graph.getView().scale; - var dx = delta.x; - var dy = delta.y; - - var overrideX = false; - var stateX = null; - var valueX = null; - var overrideY = false; - var stateY = null; - var valueY = null; - - var tt = this.getGuideTolerance(); - var ttX = tt; - var ttY = tt; - - var b = bounds.clone(); - b.x += delta.x; - b.y += delta.y; - - var left = b.x; - var right = b.x + b.width; - var center = b.getCenterX(); - var top = b.y; - var bottom = b.y + b.height; - var middle = b.getCenterY(); - - // Snaps the left, center and right to the given x-coordinate - function snapX(x, state) - { - x += this.graph.panDx; - var override = false; - - if (Math.abs(x - center) < ttX) - { - dx = x - bounds.getCenterX(); - ttX = Math.abs(x - center); - override = true; - } - else if (Math.abs(x - left) < ttX) - { - dx = x - bounds.x; - ttX = Math.abs(x - left); - override = true; - } - else if (Math.abs(x - right) < ttX) - { - dx = x - bounds.x - bounds.width; - ttX = Math.abs(x - right); - override = true; - } - - if (override) - { - stateX = state; - valueX = Math.round(x - this.graph.panDx); - - if (this.guideX == null) - { - this.guideX = this.createGuideShape(true); - - // Makes sure to use either VML or SVG shapes in order to implement - // event-transparency on the background area of the rectangle since - // HTML shapes do not let mouseevents through even when transparent - this.guideX.dialect = (this.graph.dialect != mxConstants.DIALECT_SVG) ? - mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG; - this.guideX.pointerEvents = false; - this.guideX.init(this.graph.getView().getOverlayPane()); - } - } - - overrideX = overrideX || override; - }; - - // Snaps the top, middle or bottom to the given y-coordinate - function snapY(y, state) - { - y += this.graph.panDy; - var override = false; - - if (Math.abs(y - middle) < ttY) - { - dy = y - bounds.getCenterY(); - ttY = Math.abs(y - middle); - override = true; - } - else if (Math.abs(y - top) < ttY) - { - dy = y - bounds.y; - ttY = Math.abs(y - top); - override = true; - } - else if (Math.abs(y - bottom) < ttY) - { - dy = y - bounds.y - bounds.height; - ttY = Math.abs(y - bottom); - override = true; - } - - if (override) - { - stateY = state; - valueY = Math.round(y - this.graph.panDy); - - if (this.guideY == null) - { - this.guideY = this.createGuideShape(false); - - // Makes sure to use either VML or SVG shapes in order to implement - // event-transparency on the background area of the rectangle since - // HTML shapes do not let mouseevents through even when transparent - this.guideY.dialect = (this.graph.dialect != mxConstants.DIALECT_SVG) ? - mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG; - this.guideY.pointerEvents = false; - this.guideY.init(this.graph.getView().getOverlayPane()); - } - } - - overrideY = overrideY || override; - }; - - for (var i = 0; i < this.states.length; i++) - { - var state = this.states[i]; - - if (state != null) - { - // Align x - if (this.horizontal) - { - snapX.call(this, state.getCenterX(), state); - snapX.call(this, state.x, state); - snapX.call(this, state.x + state.width, state); - } - - // Align y - if (this.vertical) - { - snapY.call(this, state.getCenterY(), state); - snapY.call(this, state.y, state); - snapY.call(this, state.y + state.height, state); - } - } - } - - // Moves cells that are off-grid back to the grid on move - if (gridEnabled) - { - if (!overrideX) - { - var tx = bounds.x - (this.graph.snap(bounds.x / - scale - trx.x) + trx.x) * scale; - dx = this.graph.snap(dx / scale) * scale - tx; - } - - if (!overrideY) - { - var ty = bounds.y - (this.graph.snap(bounds.y / - scale - trx.y) + trx.y) * scale; - dy = this.graph.snap(dy / scale) * scale - ty; - } - } - - // Redraws the guides - var c = this.graph.container; - - if (!overrideX && this.guideX != null) - { - this.guideX.node.style.visibility = 'hidden'; - } - else if (this.guideX != null) - { - if (stateX != null && bounds != null) - { - minY = Math.min(bounds.y + dy - this.graph.panDy, stateX.y); - maxY = Math.max(bounds.y + bounds.height + dy - this.graph.panDy, stateX.y + stateX.height); - } - - if (minY != null && maxY != null) - { - this.guideX.points = [new mxPoint(valueX, minY), new mxPoint(valueX, maxY)]; - } - else - { - this.guideX.points = [new mxPoint(valueX, -this.graph.panDy), new mxPoint(valueX, c.scrollHeight - 3 - this.graph.panDy)]; - } - - this.guideX.stroke = this.getGuideColor(stateX, true); - this.guideX.node.style.visibility = 'visible'; - this.guideX.redraw(); - } - - if (!overrideY && this.guideY != null) - { - this.guideY.node.style.visibility = 'hidden'; - } - else if (this.guideY != null) - { - if (stateY != null && bounds != null) - { - minX = Math.min(bounds.x + dx - this.graph.panDx, stateY.x); - maxX = Math.max(bounds.x + bounds.width + dx - this.graph.panDx, stateY.x + stateY.width); - } - - if (minX != null && maxX != null) - { - this.guideY.points = [new mxPoint(minX, valueY), new mxPoint(maxX, valueY)]; - } - else - { - this.guideY.points = [new mxPoint(-this.graph.panDx, valueY), new mxPoint(c.scrollWidth - 3 - this.graph.panDx, valueY)]; - } - - this.guideY.stroke = this.getGuideColor(stateY, false); - this.guideY.node.style.visibility = 'visible'; - this.guideY.redraw(); - } - - delta = this.getDelta(bounds, stateX, dx, stateY, dy) - } - - return delta; -}; - -/** - * Function: hide - * - * Hides all current guides. - */ -mxGuide.prototype.getDelta = function(bounds, stateX, dx, stateY, dy) -{ - // Round to pixels for virtual states (eg. page guides) - if (this.rounded || (stateX != null && stateX.cell == null)) - { - dx = Math.floor(bounds.x + dx) - bounds.x; - } - - if (this.rounded || (stateY != null && stateY.cell == null)) - { - dy = Math.floor(bounds.y + dy) - bounds.y; - } - - return new mxPoint(dx, dy); -}; - -/** - * Function: hide - * - * Hides all current guides. - */ -mxGuide.prototype.getGuideColor = function(state, horizontal) -{ - return mxConstants.GUIDE_COLOR; -}; - -/** - * Function: hide - * - * Hides all current guides. - */ -mxGuide.prototype.hide = function() -{ - this.setVisible(false); -}; - -/** - * Function: setVisible - * - * Shows or hides the current guides. - */ -mxGuide.prototype.setVisible = function(visible) -{ - if (this.guideX != null) - { - this.guideX.node.style.visibility = (visible) ? 'visible' : 'hidden'; - } - - if (this.guideY != null) - { - this.guideY.node.style.visibility = (visible) ? 'visible' : 'hidden'; - } -}; - -/** - * Function: destroy - * - * Destroys all resources that this object uses. - */ -mxGuide.prototype.destroy = function() -{ - if (this.guideX != null) - { - this.guideX.destroy(); - this.guideX = null; - } - - if (this.guideY != null) - { - this.guideY.destroy(); - this.guideY = null; - } -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -/** - * Class: mxShape - * - * Base class for all shapes. A shape in mxGraph is a - * separate implementation for SVG, VML and HTML. Which - * implementation to use is controlled by the - * property which is assigned from within the - * when the shape is created. The dialect must be assigned - * for a shape, and it does normally depend on the browser and - * the confiuration of the graph (see rendering hint). - * - * For each supported shape in SVG and VML, a corresponding - * shape exists in mxGraph, namely for text, image, rectangle, - * rhombus, ellipse and polyline. The other shapes are a - * combination of these shapes (eg. label and swimlane) - * or they consist of one or more (filled) path objects - * (eg. actor and cylinder). The HTML implementation is - * optional but may be required for a HTML-only view of - * the graph. - * - * Custom Shapes: - * - * To extend from this class, the basic code looks as follows. - * In the special case where the custom shape consists only of - * one filled region or one filled region and an additional stroke - * the and should be subclassed, - * respectively. - * - * (code) - * function CustomShape() { } - * - * CustomShape.prototype = new mxShape(); - * CustomShape.prototype.constructor = CustomShape; - * (end) - * - * To register a custom shape in an existing graph instance, - * one must register the shape under a new name in the graph's - * cell renderer as follows: - * - * (code) - * mxCellRenderer.registerShape('customShape', CustomShape); - * (end) - * - * The second argument is the name of the constructor. - * - * In order to use the shape you can refer to the given name above - * in a stylesheet. For example, to change the shape for the default - * vertex style, the following code is used: - * - * (code) - * var style = graph.getStylesheet().getDefaultVertexStyle(); - * style[mxConstants.STYLE_SHAPE] = 'customShape'; - * (end) - * - * Constructor: mxShape - * - * Constructs a new shape. - */ -function mxShape(stencil) -{ - this.stencil = stencil; - this.initStyles(); -}; - -/** - * Variable: dialect - * - * Holds the dialect in which the shape is to be painted. - * This can be one of the DIALECT constants in . - */ -mxShape.prototype.dialect = null; - -/** - * Variable: scale - * - * Holds the scale in which the shape is being painted. - */ -mxShape.prototype.scale = 1; - -/** - * Variable: antiAlias - * - * Rendering hint for configuring the canvas. - */ -mxShape.prototype.antiAlias = true; - -/** - * Variable: minSvgStrokeWidth - * - * Minimum stroke width for SVG output. - */ -mxShape.prototype.minSvgStrokeWidth = 1; - -/** - * Variable: bounds - * - * Holds the that specifies the bounds of this shape. - */ -mxShape.prototype.bounds = null; - -/** - * Variable: points - * - * Holds the array of that specify the points of this shape. - */ -mxShape.prototype.points = null; - -/** - * Variable: node - * - * Holds the outermost DOM node that represents this shape. - */ -mxShape.prototype.node = null; - -/** - * Variable: state - * - * Optional reference to the corresponding . - */ -mxShape.prototype.state = null; - -/** - * Variable: style - * - * Optional reference to the style of the corresponding . - */ -mxShape.prototype.style = null; - -/** - * Variable: boundingBox - * - * Contains the bounding box of the shape, that is, the smallest rectangle - * that includes all pixels of the shape. - */ -mxShape.prototype.boundingBox = null; - -/** - * Variable: stencil - * - * Holds the that defines the shape. - */ -mxShape.prototype.stencil = null; - -/** - * Variable: svgStrokeTolerance - * - * Event-tolerance for SVG strokes (in px). Default is 8. This is only passed - * to the canvas in if is true. - */ -mxShape.prototype.svgStrokeTolerance = 8; - -/** - * Variable: pointerEvents - * - * Specifies if pointer events should be handled. Default is true. - */ -mxShape.prototype.pointerEvents = true; - -/** - * Variable: svgPointerEvents - * - * Specifies if pointer events should be handled. Default is true. - */ -mxShape.prototype.svgPointerEvents = 'all'; - -/** - * Variable: shapePointerEvents - * - * Specifies if pointer events outside of shape should be handled. Default - * is false. - */ -mxShape.prototype.shapePointerEvents = false; - -/** - * Variable: stencilPointerEvents - * - * Specifies if pointer events outside of stencils should be handled. Default - * is false. Set this to true for backwards compatibility with the 1.x branch. - */ -mxShape.prototype.stencilPointerEvents = false; - -/** - * Variable: vmlScale - * - * Scale for improving the precision of VML rendering. Default is 1. - */ -mxShape.prototype.vmlScale = 1; - -/** - * Variable: outline - * - * Specifies if the shape should be drawn as an outline. This disables all - * fill colors and can be used to disable other drawing states that should - * not be painted for outlines. Default is false. This should be set before - * calling . - */ -mxShape.prototype.outline = false; - -/** - * Variable: visible - * - * Specifies if the shape is visible. Default is true. - */ -mxShape.prototype.visible = true; - -/** - * Variable: useSvgBoundingBox - * - * Allows to use the SVG bounding box in SVG. Default is false for performance - * reasons. - */ -mxShape.prototype.useSvgBoundingBox = false; - -/** - * Function: init - * - * Initializes the shape by creaing the DOM node using - * and adding it into the given container. - * - * Parameters: - * - * container - DOM node that will contain the shape. - */ -mxShape.prototype.init = function(container) -{ - if (this.node == null) - { - this.node = this.create(container); - - if (container != null) - { - container.appendChild(this.node); - } - } -}; - -/** - * Function: initStyles - * - * Sets the styles to their default values. - */ -mxShape.prototype.initStyles = function(container) -{ - this.strokewidth = 1; - this.rotation = 0; - this.opacity = 100; - this.fillOpacity = 100; - this.strokeOpacity = 100; - this.flipH = false; - this.flipV = false; -}; - -/** - * Function: isParseVml - * - * Specifies if any VML should be added via insertAdjacentHtml to the DOM. This - * is only needed in IE8 and only if the shape contains VML markup. This method - * returns true. - */ -mxShape.prototype.isParseVml = function() -{ - return true; -}; - -/** - * Function: isHtmlAllowed - * - * Returns true if HTML is allowed for this shape. This implementation always - * returns false. - */ -mxShape.prototype.isHtmlAllowed = function() -{ - return false; -}; - -/** - * Function: getSvgScreenOffset - * - * Returns 0, or 0.5 if % 2 == 1. - */ -mxShape.prototype.getSvgScreenOffset = function() -{ - var sw = this.stencil && this.stencil.strokewidth != 'inherit' ? Number(this.stencil.strokewidth) : this.strokewidth; - - return (mxUtils.mod(Math.max(1, Math.round(sw * this.scale)), 2) == 1) ? 0.5 : 0; -}; - -/** - * Function: create - * - * Creates and returns the DOM node(s) for the shape in - * the given container. This implementation invokes - * , or depending - * on the and style settings. - * - * Parameters: - * - * container - DOM node that will contain the shape. - */ -mxShape.prototype.create = function(container) -{ - var node = null; - - if (container != null && container.ownerSVGElement != null) - { - node = this.createSvg(container); - } - else if (document.documentMode == 8 || !mxClient.IS_VML || - (this.dialect != mxConstants.DIALECT_VML && this.isHtmlAllowed())) - { - node = this.createHtml(container); - } - else - { - node = this.createVml(container); - } - - return node; -}; - -/** - * Function: createSvg - * - * Creates and returns the SVG node(s) to represent this shape. - */ -mxShape.prototype.createSvg = function() -{ - return document.createElementNS(mxConstants.NS_SVG, 'g'); -}; - -/** - * Function: createVml - * - * Creates and returns the VML node to represent this shape. - */ -mxShape.prototype.createVml = function() -{ - var node = document.createElement(mxClient.VML_PREFIX + ':group'); - node.style.position = 'absolute'; - - return node; -}; - -/** - * Function: createHtml - * - * Creates and returns the HTML DOM node(s) to represent - * this shape. This implementation falls back to - * so that the HTML creation is optional. - */ -mxShape.prototype.createHtml = function() -{ - var node = document.createElement('div'); - node.style.position = 'absolute'; - - return node; -}; - -/** - * Function: reconfigure - * - * Reconfigures this shape. This will update the colors etc in - * addition to the bounds or points. - */ -mxShape.prototype.reconfigure = function() -{ - this.redraw(); -}; - -/** - * Function: redraw - * - * Creates and returns the SVG node(s) to represent this shape. - */ -mxShape.prototype.redraw = function() -{ - this.updateBoundsFromPoints(); - - if (this.visible && this.checkBounds()) - { - this.node.style.visibility = 'visible'; - this.clear(); - - if (this.node.nodeName == 'DIV' && (this.isHtmlAllowed() || !mxClient.IS_VML)) - { - this.redrawHtmlShape(); - } - else - { - this.redrawShape(); - } - - this.updateBoundingBox(); - } - else - { - this.node.style.visibility = 'hidden'; - this.boundingBox = null; - } -}; - -/** - * Function: clear - * - * Removes all child nodes and resets all CSS. - */ -mxShape.prototype.clear = function() -{ - if (this.node.ownerSVGElement != null) - { - while (this.node.lastChild != null) - { - this.node.removeChild(this.node.lastChild); - } - } - else - { - this.node.style.cssText = 'position:absolute;' + ((this.cursor != null) ? - ('cursor:' + this.cursor + ';') : ''); - this.node.innerHTML = ''; - } -}; - -/** - * Function: updateBoundsFromPoints - * - * Updates the bounds based on the points. - */ -mxShape.prototype.updateBoundsFromPoints = function() -{ - var pts = this.points; - - if (pts != null && pts.length > 0 && pts[0] != null) - { - this.bounds = new mxRectangle(Number(pts[0].x), Number(pts[0].y), 1, 1); - - for (var i = 1; i < this.points.length; i++) - { - if (pts[i] != null) - { - this.bounds.add(new mxRectangle(Number(pts[i].x), Number(pts[i].y), 1, 1)); - } - } - } -}; - -/** - * Function: getLabelBounds - * - * Returns the for the label bounds of this shape, based on the - * given scaled and translated bounds of the shape. This method should not - * change the rectangle in-place. This implementation returns the given rect. - */ -mxShape.prototype.getLabelBounds = function(rect) -{ - var d = mxUtils.getValue(this.style, mxConstants.STYLE_DIRECTION, mxConstants.DIRECTION_EAST); - var bounds = rect; - - // Normalizes argument for getLabelMargins hook - if (d != mxConstants.DIRECTION_SOUTH && d != mxConstants.DIRECTION_NORTH && - this.state != null && this.state.text != null && - this.state.text.isPaintBoundsInverted()) - { - bounds = bounds.clone(); - var tmp = bounds.width; - bounds.width = bounds.height; - bounds.height = tmp; - } - - var m = this.getLabelMargins(bounds); - - if (m != null) - { - var flipH = mxUtils.getValue(this.style, mxConstants.STYLE_FLIPH, false) == '1'; - var flipV = mxUtils.getValue(this.style, mxConstants.STYLE_FLIPV, false) == '1'; - - // Handles special case for vertical labels - if (this.state != null && this.state.text != null && - this.state.text.isPaintBoundsInverted()) - { - var tmp = m.x; - m.x = m.height; - m.height = m.width; - m.width = m.y; - m.y = tmp; - - tmp = flipH; - flipH = flipV; - flipV = tmp; - } - - return mxUtils.getDirectedBounds(rect, m, this.style, flipH, flipV); - } - - return rect; -}; - -/** - * Function: getLabelMargins - * - * Returns the scaled top, left, bottom and right margin to be used for - * computing the label bounds as an , where the bottom and right - * margin are defined in the width and height of the rectangle, respectively. - */ -mxShape.prototype.getLabelMargins= function(rect) -{ - return null; -}; - -/** - * Function: checkBounds - * - * Returns true if the bounds are not null and all of its variables are numeric. - */ -mxShape.prototype.checkBounds = function() -{ - return (!isNaN(this.scale) && isFinite(this.scale) && this.scale > 0 && - this.bounds != null && !isNaN(this.bounds.x) && !isNaN(this.bounds.y) && - !isNaN(this.bounds.width) && !isNaN(this.bounds.height) && - this.bounds.width > 0 && this.bounds.height > 0); -}; - -/** - * Function: createVmlGroup - * - * Returns the temporary element used for rendering in IE8 standards mode. - */ -mxShape.prototype.createVmlGroup = function() -{ - var node = document.createElement(mxClient.VML_PREFIX + ':group'); - node.style.position = 'absolute'; - node.style.width = this.node.style.width; - node.style.height = this.node.style.height; - - return node; -}; - -/** - * Function: redrawShape - * - * Updates the SVG or VML shape. - */ -mxShape.prototype.redrawShape = function() -{ - var canvas = this.createCanvas(); - - if (canvas != null) - { - // Specifies if events should be handled - canvas.pointerEvents = this.pointerEvents; - - this.paint(canvas); - - if (this.node != canvas.root) - { - // Forces parsing in IE8 standards mode - slow! avoid - this.node.insertAdjacentHTML('beforeend', canvas.root.outerHTML); - } - - if (this.node.nodeName == 'DIV' && document.documentMode == 8) - { - // Makes DIV transparent to events for IE8 in IE8 standards - // mode (Note: Does not work for IE9 in IE8 standards mode - // and not for IE11 in enterprise mode) - this.node.style.filter = ''; - - // Adds event transparency in IE8 standards - mxUtils.addTransparentBackgroundFilter(this.node); - } - - this.destroyCanvas(canvas); - } -}; - -/** - * Function: createCanvas - * - * Creates a new canvas for drawing this shape. May return null. - */ -mxShape.prototype.createCanvas = function() -{ - var canvas = null; - - // LATER: Check if reusing existing DOM nodes improves performance - if (this.node.ownerSVGElement != null) - { - canvas = this.createSvgCanvas(); - } - else if (mxClient.IS_VML) - { - this.updateVmlContainer(); - canvas = this.createVmlCanvas(); - } - - if (canvas != null && this.outline) - { - canvas.setStrokeWidth(this.strokewidth); - canvas.setStrokeColor(this.stroke); - - if (this.isDashed != null) - { - canvas.setDashed(this.isDashed); - } - - canvas.setStrokeWidth = function() {}; - canvas.setStrokeColor = function() {}; - canvas.setFillColor = function() {}; - canvas.setGradient = function() {}; - canvas.setDashed = function() {}; - canvas.text = function() {}; - } - - return canvas; -}; - -/** - * Function: createSvgCanvas - * - * Creates and returns an for rendering this shape. - */ -mxShape.prototype.createSvgCanvas = function() -{ - var canvas = new mxSvgCanvas2D(this.node, false); - canvas.strokeTolerance = (this.pointerEvents) ? this.svgStrokeTolerance : 0; - canvas.pointerEventsValue = this.svgPointerEvents; - canvas.blockImagePointerEvents = mxClient.IS_FF; - var off = this.getSvgScreenOffset(); - - if (off != 0) - { - this.node.setAttribute('transform', 'translate(' + off + ',' + off + ')'); - } - else - { - this.node.removeAttribute('transform'); - } - - canvas.minStrokeWidth = this.minSvgStrokeWidth; - - if (!this.antiAlias) - { - // Rounds all numbers in the SVG output to integers - canvas.format = function(value) - { - return Math.round(parseFloat(value)); - }; - } - - return canvas; -}; - -/** - * Function: createVmlCanvas - * - * Creates and returns an for rendering this shape. - */ -mxShape.prototype.createVmlCanvas = function() -{ - // Workaround for VML rendering bug in IE8 standards mode - var node = (document.documentMode == 8 && this.isParseVml()) ? this.createVmlGroup() : this.node; - var canvas = new mxVmlCanvas2D(node, false); - - if (node.tagUrn != '') - { - var w = Math.max(1, Math.round(this.bounds.width)); - var h = Math.max(1, Math.round(this.bounds.height)); - node.coordsize = (w * this.vmlScale) + ',' + (h * this.vmlScale); - canvas.scale(this.vmlScale); - canvas.vmlScale = this.vmlScale; - } - - // Painting relative to top, left shape corner - var s = this.scale; - canvas.translate(-Math.round(this.bounds.x / s), -Math.round(this.bounds.y / s)); - - return canvas; -}; - -/** - * Function: updateVmlContainer - * - * Updates the bounds of the VML container. - */ -mxShape.prototype.updateVmlContainer = function() -{ - this.node.style.left = Math.round(this.bounds.x) + 'px'; - this.node.style.top = Math.round(this.bounds.y) + 'px'; - var w = Math.max(1, Math.round(this.bounds.width)); - var h = Math.max(1, Math.round(this.bounds.height)); - this.node.style.width = w + 'px'; - this.node.style.height = h + 'px'; - this.node.style.overflow = 'visible'; -}; - -/** - * Function: redrawHtml - * - * Allow optimization by replacing VML with HTML. - */ -mxShape.prototype.redrawHtmlShape = function() -{ - // LATER: Refactor methods - this.updateHtmlBounds(this.node); - this.updateHtmlFilters(this.node); - this.updateHtmlColors(this.node); -}; - -/** - * Function: updateHtmlFilters - * - * Allow optimization by replacing VML with HTML. - */ -mxShape.prototype.updateHtmlFilters = function(node) -{ - var f = ''; - - if (this.opacity < 100) - { - f += 'alpha(opacity=' + (this.opacity) + ')'; - } - - if (this.isShadow) - { - // FIXME: Cannot implement shadow transparency with filter - f += 'progid:DXImageTransform.Microsoft.dropShadow (' + - 'OffX=\'' + Math.round(mxConstants.SHADOW_OFFSET_X * this.scale) + '\', ' + - 'OffY=\'' + Math.round(mxConstants.SHADOW_OFFSET_Y * this.scale) + '\', ' + - 'Color=\'' + mxConstants.VML_SHADOWCOLOR + '\')'; - } - - if (this.fill != null && this.fill != mxConstants.NONE && this.gradient && this.gradient != mxConstants.NONE) - { - var start = this.fill; - var end = this.gradient; - var type = '0'; - - var lookup = {east:0,south:1,west:2,north:3}; - var dir = (this.direction != null) ? lookup[this.direction] : 0; - - if (this.gradientDirection != null) - { - dir = mxUtils.mod(dir + lookup[this.gradientDirection] - 1, 4); - } - - if (dir == 1) - { - type = '1'; - var tmp = start; - start = end; - end = tmp; - } - else if (dir == 2) - { - var tmp = start; - start = end; - end = tmp; - } - else if (dir == 3) - { - type = '1'; - } - - f += 'progid:DXImageTransform.Microsoft.gradient(' + - 'startColorStr=\'' + start + '\', endColorStr=\'' + end + - '\', gradientType=\'' + type + '\')'; - } - - node.style.filter = f; -}; - -/** - * Function: mixedModeHtml - * - * Allow optimization by replacing VML with HTML. - */ -mxShape.prototype.updateHtmlColors = function(node) -{ - var color = this.stroke; - - if (color != null && color != mxConstants.NONE) - { - node.style.borderColor = color; - - if (this.isDashed) - { - node.style.borderStyle = 'dashed'; - } - else if (this.strokewidth > 0) - { - node.style.borderStyle = 'solid'; - } - - node.style.borderWidth = Math.max(1, Math.ceil(this.strokewidth * this.scale)) + 'px'; - } - else - { - node.style.borderWidth = '0px'; - } - - color = (this.outline) ? null : this.fill; - - if (color != null && color != mxConstants.NONE) - { - node.style.backgroundColor = color; - node.style.backgroundImage = 'none'; - } - else if (this.pointerEvents) - { - node.style.backgroundColor = 'transparent'; - } - else if (document.documentMode == 8) - { - mxUtils.addTransparentBackgroundFilter(node); - } - else - { - this.setTransparentBackgroundImage(node); - } -}; - -/** - * Function: mixedModeHtml - * - * Allow optimization by replacing VML with HTML. - */ -mxShape.prototype.updateHtmlBounds = function(node) -{ - var sw = (document.documentMode >= 9) ? 0 : Math.ceil(this.strokewidth * this.scale); - node.style.borderWidth = Math.max(1, sw) + 'px'; - node.style.overflow = 'hidden'; - - node.style.left = Math.round(this.bounds.x - sw / 2) + 'px'; - node.style.top = Math.round(this.bounds.y - sw / 2) + 'px'; - - if (document.compatMode == 'CSS1Compat') - { - sw = -sw; - } - - node.style.width = Math.round(Math.max(0, this.bounds.width + sw)) + 'px'; - node.style.height = Math.round(Math.max(0, this.bounds.height + sw)) + 'px'; -}; - -/** - * Function: destroyCanvas - * - * Destroys the given canvas which was used for drawing. This implementation - * increments the reference counts on all shared gradients used in the canvas. - */ -mxShape.prototype.destroyCanvas = function(canvas) -{ - // Manages reference counts - if (canvas instanceof mxSvgCanvas2D) - { - // Increments ref counts - for (var key in canvas.gradients) - { - var gradient = canvas.gradients[key]; - - if (gradient != null) - { - gradient.mxRefCount = (gradient.mxRefCount || 0) + 1; - } - } - - this.releaseSvgGradients(this.oldGradients); - this.oldGradients = canvas.gradients; - } -}; - -/** - * Function: paint - * - * Generic rendering code. - */ -mxShape.prototype.paint = function(c) -{ - var strokeDrawn = false; - - if (c != null && this.outline) - { - var stroke = c.stroke; - - c.stroke = function() - { - strokeDrawn = true; - stroke.apply(this, arguments); - }; - - var fillAndStroke = c.fillAndStroke; - - c.fillAndStroke = function() - { - strokeDrawn = true; - fillAndStroke.apply(this, arguments); - }; - } - - // Scale is passed-through to canvas - var s = this.scale; - var x = this.bounds.x / s; - var y = this.bounds.y / s; - var w = this.bounds.width / s; - var h = this.bounds.height / s; - - if (this.isPaintBoundsInverted()) - { - var t = (w - h) / 2; - x += t; - y -= t; - var tmp = w; - w = h; - h = tmp; - } - - this.updateTransform(c, x, y, w, h); - this.configureCanvas(c, x, y, w, h); - - // Adds background rectangle to capture events - var bg = null; - - if ((this.stencil == null && this.points == null && this.shapePointerEvents) || - (this.stencil != null && this.stencilPointerEvents)) - { - var bb = this.createBoundingBox(); - - if (this.dialect == mxConstants.DIALECT_SVG) - { - bg = this.createTransparentSvgRectangle(bb.x, bb.y, bb.width, bb.height); - this.node.appendChild(bg); - } - else - { - var rect = c.createRect('rect', bb.x / s, bb.y / s, bb.width / s, bb.height / s); - rect.appendChild(c.createTransparentFill()); - rect.stroked = 'false'; - c.root.appendChild(rect); - } - } - - if (this.stencil != null) - { - this.stencil.drawShape(c, this, x, y, w, h); - } - else - { - // Stencils have separate strokewidth - c.setStrokeWidth(this.strokewidth); - - if (this.points != null) - { - // Paints edge shape - var pts = []; - - for (var i = 0; i < this.points.length; i++) - { - if (this.points[i] != null) - { - pts.push(new mxPoint(this.points[i].x / s, this.points[i].y / s)); - } - } - - this.paintEdgeShape(c, pts); - } - else - { - // Paints vertex shape - this.paintVertexShape(c, x, y, w, h); - } - } - - if (bg != null && c.state != null && c.state.transform != null) - { - bg.setAttribute('transform', c.state.transform); - } - - // Draws highlight rectangle if no stroke was used - if (c != null && this.outline && !strokeDrawn) - { - c.rect(x, y, w, h); - c.stroke(); - } -}; - -/** - * Function: configureCanvas - * - * Sets the state of the canvas for drawing the shape. - */ -mxShape.prototype.configureCanvas = function(c, x, y, w, h) -{ - var dash = null; - - if (this.style != null) - { - dash = this.style['dashPattern']; - } - - c.setAlpha(this.opacity / 100); - c.setFillAlpha(this.fillOpacity / 100); - c.setStrokeAlpha(this.strokeOpacity / 100); - - // Sets alpha, colors and gradients - if (this.isShadow != null) - { - c.setShadow(this.isShadow); - } - - // Dash pattern - if (this.isDashed != null) - { - c.setDashed(this.isDashed, (this.style != null) ? - mxUtils.getValue(this.style, mxConstants.STYLE_FIX_DASH, false) == 1 : false); - } - - if (dash != null) - { - c.setDashPattern(dash); - } - - if (this.fill != null && this.fill != mxConstants.NONE && this.gradient && this.gradient != mxConstants.NONE) - { - var b = this.getGradientBounds(c, x, y, w, h); - c.setGradient(this.fill, this.gradient, b.x, b.y, b.width, b.height, this.gradientDirection); - } - else - { - c.setFillColor(this.fill); - } - - c.setStrokeColor(this.stroke); -}; - -/** - * Function: getGradientBounds - * - * Returns the bounding box for the gradient box for this shape. - */ -mxShape.prototype.getGradientBounds = function(c, x, y, w, h) -{ - return new mxRectangle(x, y, w, h); -}; - -/** - * Function: updateTransform - * - * Sets the scale and rotation on the given canvas. - */ -mxShape.prototype.updateTransform = function(c, x, y, w, h) -{ - // NOTE: Currently, scale is implemented in state and canvas. This will - // move to canvas in a later version, so that the states are unscaled - // and untranslated and do not need an update after zooming or panning. - c.scale(this.scale); - c.rotate(this.getShapeRotation(), this.flipH, this.flipV, x + w / 2, y + h / 2); -}; - -/** - * Function: paintVertexShape - * - * Paints the vertex shape. - */ -mxShape.prototype.paintVertexShape = function(c, x, y, w, h) -{ - this.paintBackground(c, x, y, w, h); - - if (!this.outline || this.style == null || mxUtils.getValue( - this.style, mxConstants.STYLE_BACKGROUND_OUTLINE, 0) == 0) - { - c.setShadow(false); - this.paintForeground(c, x, y, w, h); - } -}; - -/** - * Function: paintBackground - * - * Hook for subclassers. This implementation is empty. - */ -mxShape.prototype.paintBackground = function(c, x, y, w, h) { }; - -/** - * Function: paintForeground - * - * Hook for subclassers. This implementation is empty. - */ -mxShape.prototype.paintForeground = function(c, x, y, w, h) { }; - -/** - * Function: paintEdgeShape - * - * Hook for subclassers. This implementation is empty. - */ -mxShape.prototype.paintEdgeShape = function(c, pts) { }; - -/** - * Function: getArcSize - * - * Returns the arc size for the given dimension. - */ -mxShape.prototype.getArcSize = function(w, h) -{ - var r = 0; - - if (mxUtils.getValue(this.style, mxConstants.STYLE_ABSOLUTE_ARCSIZE, 0) == '1') - { - r = Math.min(w / 2, Math.min(h / 2, mxUtils.getValue(this.style, - mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2)); - } - else - { - var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, - mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100; - r = Math.min(w * f, h * f); - } - - return r; -}; - -/** - * Function: paintGlassEffect - * - * Paints the glass gradient effect. - */ -mxShape.prototype.paintGlassEffect = function(c, x, y, w, h, arc) -{ - var sw = Math.ceil(this.strokewidth / 2); - var size = 0.4; - - c.setGradient('#ffffff', '#ffffff', x, y, w, h * 0.6, 'south', 0.9, 0.1); - c.begin(); - arc += 2 * sw; - - if (this.isRounded) - { - c.moveTo(x - sw + arc, y - sw); - c.quadTo(x - sw, y - sw, x - sw, y - sw + arc); - c.lineTo(x - sw, y + h * size); - c.quadTo(x + w * 0.5, y + h * 0.7, x + w + sw, y + h * size); - c.lineTo(x + w + sw, y - sw + arc); - c.quadTo(x + w + sw, y - sw, x + w + sw - arc, y - sw); - } - else - { - c.moveTo(x - sw, y - sw); - c.lineTo(x - sw, y + h * size); - c.quadTo(x + w * 0.5, y + h * 0.7, x + w + sw, y + h * size); - c.lineTo(x + w + sw, y - sw); - } - - c.close(); - c.fill(); -}; - -/** - * Function: addPoints - * - * Paints the given points with rounded corners. - */ -mxShape.prototype.addPoints = function(c, pts, rounded, arcSize, close, exclude, initialMove) -{ - if (pts != null && pts.length > 0) - { - initialMove = (initialMove != null) ? initialMove : true; - var pe = pts[pts.length - 1]; - - // Adds virtual waypoint in the center between start and end point - if (close && rounded) - { - pts = pts.slice(); - var p0 = pts[0]; - var wp = new mxPoint(pe.x + (p0.x - pe.x) / 2, pe.y + (p0.y - pe.y) / 2); - pts.splice(0, 0, wp); - } - - var pt = pts[0]; - var i = 1; - - // Draws the line segments - if (initialMove) - { - c.moveTo(pt.x, pt.y); - } - else - { - c.lineTo(pt.x, pt.y); - } - - while (i < ((close) ? pts.length : pts.length - 1)) - { - var tmp = pts[mxUtils.mod(i, pts.length)]; - var dx = pt.x - tmp.x; - var dy = pt.y - tmp.y; - - if (rounded && (dx != 0 || dy != 0) && (exclude == null || mxUtils.indexOf(exclude, i - 1) < 0)) - { - // Draws a line from the last point to the current - // point with a spacing of size off the current point - // into direction of the last point - var dist = Math.sqrt(dx * dx + dy * dy); - var nx1 = dx * Math.min(arcSize, dist / 2) / dist; - var ny1 = dy * Math.min(arcSize, dist / 2) / dist; - - var x1 = tmp.x + nx1; - var y1 = tmp.y + ny1; - c.lineTo(x1, y1); - - // Draws a curve from the last point to the current - // point with a spacing of size off the current point - // into direction of the next point - var next = pts[mxUtils.mod(i + 1, pts.length)]; - - // Uses next non-overlapping point - while (i < pts.length - 2 && Math.round(next.x - tmp.x) == 0 && Math.round(next.y - tmp.y) == 0) - { - next = pts[mxUtils.mod(i + 2, pts.length)]; - i++; - } - - dx = next.x - tmp.x; - dy = next.y - tmp.y; - - dist = Math.max(1, Math.sqrt(dx * dx + dy * dy)); - var nx2 = dx * Math.min(arcSize, dist / 2) / dist; - var ny2 = dy * Math.min(arcSize, dist / 2) / dist; - - var x2 = tmp.x + nx2; - var y2 = tmp.y + ny2; - - c.quadTo(tmp.x, tmp.y, x2, y2); - tmp = new mxPoint(x2, y2); - } - else - { - c.lineTo(tmp.x, tmp.y); - } - - pt = tmp; - i++; - } - - if (close) - { - c.close(); - } - else - { - c.lineTo(pe.x, pe.y); - } - } -}; - -/** - * Function: resetStyles - * - * Resets all styles. - */ -mxShape.prototype.resetStyles = function() -{ - this.initStyles(); - - this.spacing = 0; - - delete this.fill; - delete this.gradient; - delete this.gradientDirection; - delete this.stroke; - delete this.startSize; - delete this.endSize; - delete this.startArrow; - delete this.endArrow; - delete this.direction; - delete this.isShadow; - delete this.isDashed; - delete this.isRounded; - delete this.glass; -}; - -/** - * Function: apply - * - * Applies the style of the given to the shape. This - * implementation assigns the following styles to local fields: - * - * - => fill - * - => gradient - * - => gradientDirection - * - => opacity - * - => fillOpacity - * - => strokeOpacity - * - => stroke - * - => strokewidth - * - => isShadow - * - => isDashed - * - => spacing - * - => startSize - * - => endSize - * - => isRounded - * - => startArrow - * - => endArrow - * - => rotation - * - => direction - * - => glass - * - * This keeps a reference to the '); - * }; - * (end) - * - * Headers: - * - * Apart from setting the title argument in the mxPrintPreview constructor you - * can override as follows to add a header to any page: - * - * (code) - * var oldRenderPage = mxPrintPreview.prototype.renderPage; - * mxPrintPreview.prototype.renderPage = function(w, h, x, y, content, pageNumber) - * { - * var div = oldRenderPage.apply(this, arguments); - * - * var header = document.createElement('div'); - * header.style.position = 'absolute'; - * header.style.top = '0px'; - * header.style.width = '100%'; - * header.style.textAlign = 'right'; - * mxUtils.write(header, 'Your header here'); - * div.firstChild.appendChild(header); - * - * return div; - * }; - * (end) - * - * The pageNumber argument contains the number of the current page, starting at - * 1. To display a header on the first page only, check pageNumber and add a - * vertical offset in the constructor call for the height of the header. - * - * Page Format: - * - * For landscape printing, use as - * the pageFormat in and . - * Keep in mind that one can not set the defaults for the print dialog - * of the operating system from JavaScript so the user must manually choose - * a page format that matches this setting. - * - * You can try passing the following CSS directive to to set the - * page format in the print dialog to landscape. However, this CSS - * directive seems to be ignored in most major browsers, including IE. - * - * (code) - * @page { - * size: landscape; - * } - * (end) - * - * Note that the print preview behaves differently in IE when used from the - * filesystem or via HTTP so printing should always be tested via HTTP. - * - * If you are using a DOCTYPE in the source page you can override - * and provide the same DOCTYPE for the print preview if required. Here is - * an example for IE8 standards mode. - * - * (code) - * var preview = new mxPrintPreview(graph); - * preview.getDoctype = function() - * { - * return ''; - * }; - * preview.open(); - * (end) - * - * Constructor: mxPrintPreview - * - * Constructs a new print preview for the given parameters. - * - * Parameters: - * - * graph - to be previewed. - * scale - Optional scale of the output. Default is 1 / . - * border - Border in pixels along each side of every page. Note that the - * actual print function in the browser will add another border for - * printing. - * pageFormat - that specifies the page format (in pixels). - * This should match the page format of the printer. Default uses the - * of the given graph. - * x0 - Optional left offset of the output. Default is 0. - * y0 - Optional top offset of the output. Default is 0. - * borderColor - Optional color of the page border. Default is no border. - * Note that a border is sometimes useful to highlight the printed page - * border in the print preview of the browser. - * title - Optional string that is used for the window title. Default - * is 'Printer-friendly version'. - * pageSelector - Optional boolean that specifies if the page selector - * should appear in the window with the print preview. Default is true. - */ -function mxPrintPreview(graph, scale, pageFormat, border, x0, y0, borderColor, title, pageSelector) -{ - this.graph = graph; - this.scale = (scale != null) ? scale : 1 / graph.pageScale; - this.border = (border != null) ? border : 0; - this.pageFormat = mxRectangle.fromRectangle((pageFormat != null) ? pageFormat : graph.pageFormat); - this.title = (title != null) ? title : 'Printer-friendly version'; - this.x0 = (x0 != null) ? x0 : 0; - this.y0 = (y0 != null) ? y0 : 0; - this.borderColor = borderColor; - this.pageSelector = (pageSelector != null) ? pageSelector : true; -}; - -/** - * Variable: graph - * - * Reference to the that should be previewed. - */ -mxPrintPreview.prototype.graph = null; - -/** - * Variable: pageFormat - * - * Holds the that defines the page format. - */ -mxPrintPreview.prototype.pageFormat = null; - -/** - * Variable: scale - * - * Holds the scale of the print preview. - */ -mxPrintPreview.prototype.scale = null; - -/** - * Variable: border - * - * The border inset around each side of every page in the preview. This is set - * to 0 if autoOrigin is false. - */ -mxPrintPreview.prototype.border = 0; - -/** - * Variable: marginTop - * - * The margin at the top of the page (number). Default is 0. - */ -mxPrintPreview.prototype.marginTop = 0; - -/** - * Variable: marginBottom - * - * The margin at the bottom of the page (number). Default is 0. - */ -mxPrintPreview.prototype.marginBottom = 0; - -/** - * Variable: x0 - * - * Holds the horizontal offset of the output. - */ -mxPrintPreview.prototype.x0 = 0; - -/** - * Variable: y0 - * - * Holds the vertical offset of the output. - */ -mxPrintPreview.prototype.y0 = 0; - -/** - * Variable: autoOrigin - * - * Specifies if the origin should be automatically computed based on the top, - * left corner of the actual diagram contents. The required offset will be added - * to and in . Default is true. - */ -mxPrintPreview.prototype.autoOrigin = true; - -/** - * Variable: printOverlays - * - * Specifies if overlays should be printed. Default is false. - */ -mxPrintPreview.prototype.printOverlays = false; - -/** - * Variable: printControls - * - * Specifies if controls (such as folding icons) should be printed. Default is - * false. - */ -mxPrintPreview.prototype.printControls = false; - -/** - * Variable: printBackgroundImage - * - * Specifies if the background image should be printed. Default is false. - */ -mxPrintPreview.prototype.printBackgroundImage = false; - -/** - * Variable: backgroundColor - * - * Holds the color value for the page background color. Default is #ffffff. - */ -mxPrintPreview.prototype.backgroundColor = '#ffffff'; - -/** - * Variable: borderColor - * - * Holds the color value for the page border. - */ -mxPrintPreview.prototype.borderColor = null; - -/** - * Variable: title - * - * Holds the title of the preview window. - */ -mxPrintPreview.prototype.title = null; - -/** - * Variable: pageSelector - * - * Boolean that specifies if the page selector should be - * displayed. Default is true. - */ -mxPrintPreview.prototype.pageSelector = null; - -/** - * Variable: wnd - * - * Reference to the preview window. - */ -mxPrintPreview.prototype.wnd = null; - -/** - * Variable: targetWindow - * - * Assign any window here to redirect the rendering in . - */ -mxPrintPreview.prototype.targetWindow = null; - -/** - * Variable: pageCount - * - * Holds the actual number of pages in the preview. - */ -mxPrintPreview.prototype.pageCount = 0; - -/** - * Variable: clipping - * - * Specifies is clipping should be used to avoid creating too many cell states - * in large diagrams. The bounding box of the cells in the original diagram is - * used if this is enabled. Default is true. - */ -mxPrintPreview.prototype.clipping = true; - -/** - * Function: getWindow - * - * Returns . - */ -mxPrintPreview.prototype.getWindow = function() -{ - return this.wnd; -}; - -/** - * Function: getDocType - * - * Returns the string that should go before the HTML tag in the print preview - * page. This implementation returns an X-UA meta tag for IE5 in quirks mode, - * IE8 in IE8 standards mode and edge in IE9 standards mode. - */ -mxPrintPreview.prototype.getDoctype = function() -{ - var dt = ''; - - if (document.documentMode == 5) - { - dt = ''; - } - else if (document.documentMode == 8) - { - dt = ''; - } - else if (document.documentMode > 8) - { - // Comment needed to make standards doctype apply in IE - dt = ''; - } - - return dt; -}; - -/** - * Function: appendGraph - * - * Adds the given graph to the existing print preview. - * - * Parameters: - * - * css - Optional CSS string to be used in the head section. - * targetWindow - Optional window that should be used for rendering. If - * this is specified then no HEAD tag, CSS and BODY tag will be written. - */ -mxPrintPreview.prototype.appendGraph = function(graph, scale, x0, y0, forcePageBreaks, keepOpen) -{ - this.graph = graph; - this.scale = (scale != null) ? scale : 1 / graph.pageScale; - this.x0 = x0; - this.y0 = y0; - this.open(null, null, forcePageBreaks, keepOpen); -}; - -/** - * Function: open - * - * Shows the print preview window. The window is created here if it does - * not exist. - * - * Parameters: - * - * css - Optional CSS string to be used in the head section. - * targetWindow - Optional window that should be used for rendering. If - * this is specified then no HEAD tag, CSS and BODY tag will be written. - */ -mxPrintPreview.prototype.open = function(css, targetWindow, forcePageBreaks, keepOpen) -{ - // Closing the window while the page is being rendered may cause an - // exception in IE. This and any other exceptions are simply ignored. - var previousInitializeOverlay = this.graph.cellRenderer.initializeOverlay; - var div = null; - - try - { - // Temporarily overrides the method to redirect rendering of overlays - // to the draw pane so that they are visible in the printout - if (this.printOverlays) - { - this.graph.cellRenderer.initializeOverlay = function(state, overlay) - { - overlay.init(state.view.getDrawPane()); - }; - } - - if (this.printControls) - { - this.graph.cellRenderer.initControl = function(state, control, handleEvents, clickHandler) - { - control.dialect = state.view.graph.dialect; - control.init(state.view.getDrawPane()); - }; - } - - this.wnd = (targetWindow != null) ? targetWindow : this.wnd; - var isNewWindow = false; - - if (this.wnd == null) - { - isNewWindow = true; - this.wnd = window.open(); - } - - var doc = this.wnd.document; - - if (isNewWindow) - { - var dt = this.getDoctype(); - - if (dt != null && dt.length > 0) - { - doc.writeln(dt); - } - - if (mxClient.IS_VML) - { - doc.writeln(''); - } - else - { - if (document.compatMode === 'CSS1Compat') - { - doc.writeln(''); - } - - doc.writeln(''); - } - - doc.writeln(''); - this.writeHead(doc, css); - doc.writeln(''); - doc.writeln(''); - } - - // Computes the horizontal and vertical page count - var bounds = this.graph.getGraphBounds().clone(); - var currentScale = this.graph.getView().getScale(); - var sc = currentScale / this.scale; - var tr = this.graph.getView().getTranslate(); - - // Uses the absolute origin with no offset for all printing - if (!this.autoOrigin) - { - this.x0 -= tr.x * this.scale; - this.y0 -= tr.y * this.scale; - bounds.width += bounds.x; - bounds.height += bounds.y; - bounds.x = 0; - bounds.y = 0; - this.border = 0; - } - - // Store the available page area - var availableWidth = this.pageFormat.width - (this.border * 2); - var availableHeight = this.pageFormat.height - (this.border * 2); - - // Adds margins to page format - this.pageFormat.height += this.marginTop + this.marginBottom; - - // Compute the unscaled, untranslated bounds to find - // the number of vertical and horizontal pages - bounds.width /= sc; - bounds.height /= sc; - - var hpages = Math.max(1, Math.ceil((bounds.width + this.x0) / availableWidth)); - var vpages = Math.max(1, Math.ceil((bounds.height + this.y0) / availableHeight)); - this.pageCount = hpages * vpages; - - var writePageSelector = mxUtils.bind(this, function() - { - if (this.pageSelector && (vpages > 1 || hpages > 1)) - { - var table = this.createPageSelector(vpages, hpages); - doc.body.appendChild(table); - - // Implements position: fixed in IE quirks mode - if (mxClient.IS_IE && doc.documentMode == null || doc.documentMode == 5 || doc.documentMode == 8 || doc.documentMode == 7) - { - table.style.position = 'absolute'; - - var update = function() - { - table.style.top = ((doc.body.scrollTop || doc.documentElement.scrollTop) + 10) + 'px'; - }; - - mxEvent.addListener(this.wnd, 'scroll', function(evt) - { - update(); - }); - - mxEvent.addListener(this.wnd, 'resize', function(evt) - { - update(); - }); - } - } - }); - - var addPage = mxUtils.bind(this, function(div, addBreak) - { - // Border of the DIV (aka page) inside the document - if (this.borderColor != null) - { - div.style.borderColor = this.borderColor; - div.style.borderStyle = 'solid'; - div.style.borderWidth = '1px'; - } - - // Needs to be assigned directly because IE doesn't support - // child selectors, eg. body > div { background: white; } - div.style.background = this.backgroundColor; - - if (forcePageBreaks || addBreak) - { - div.style.pageBreakAfter = 'always'; - } - - // NOTE: We are dealing with cross-window DOM here, which - // is a problem in IE, so we copy the HTML markup instead. - // The underlying problem is that the graph display markup - // creation (in mxShape, mxGraphView) is hardwired to using - // document.createElement and hence we must use this document - // to create the complete page and then copy it over to the - // new window.document. This can be fixed later by using the - // ownerDocument of the container in mxShape and mxGraphView. - if (isNewWindow && (mxClient.IS_IE || document.documentMode >= 11 || mxClient.IS_EDGE)) - { - // For some obscure reason, removing the DIV from the - // parent before fetching its outerHTML has missing - // fillcolor properties and fill children, so the div - // must be removed afterwards to keep the fillcolors. - doc.writeln(div.outerHTML); - div.parentNode.removeChild(div); - } - else if (mxClient.IS_IE || document.documentMode >= 11 || mxClient.IS_EDGE) - { - var clone = doc.createElement('div'); - clone.innerHTML = div.outerHTML; - clone = clone.getElementsByTagName('div')[0]; - doc.body.appendChild(clone); - div.parentNode.removeChild(div); - } - else - { - div.parentNode.removeChild(div); - doc.body.appendChild(div); - } - - if (forcePageBreaks || addBreak) - { - this.addPageBreak(doc); - } - }); - - var cov = this.getCoverPages(this.pageFormat.width, this.pageFormat.height); - - if (cov != null) - { - for (var i = 0; i < cov.length; i++) - { - addPage(cov[i], true); - } - } - - var apx = this.getAppendices(this.pageFormat.width, this.pageFormat.height); - - // Appends each page to the page output for printing, making - // sure there will be a page break after each page (ie. div) - for (var i = 0; i < vpages; i++) - { - var dy = i * availableHeight / this.scale - this.y0 / this.scale + - (bounds.y - tr.y * currentScale) / currentScale; - - for (var j = 0; j < hpages; j++) - { - if (this.wnd == null) - { - return null; - } - - var dx = j * availableWidth / this.scale - this.x0 / this.scale + - (bounds.x - tr.x * currentScale) / currentScale; - var pageNum = i * hpages + j + 1; - var clip = new mxRectangle(dx, dy, availableWidth, availableHeight); - div = this.renderPage(this.pageFormat.width, this.pageFormat.height, 0, 0, mxUtils.bind(this, function(div) - { - this.addGraphFragment(-dx, -dy, this.scale, pageNum, div, clip); - - if (this.printBackgroundImage) - { - this.insertBackgroundImage(div, -dx, -dy); - } - }), pageNum); - - // Gives the page a unique ID for later accessing the page - div.setAttribute('id', 'mxPage-'+pageNum); - - addPage(div, apx != null || i < vpages - 1 || j < hpages - 1); - } - } - - if (apx != null) - { - for (var i = 0; i < apx.length; i++) - { - addPage(apx[i], i < apx.length - 1); - } - } - - if (isNewWindow && !keepOpen) - { - this.closeDocument(); - writePageSelector(); - } - - this.wnd.focus(); - } - catch (e) - { - // Removes the DIV from the document in case of an error - if (div != null && div.parentNode != null) - { - div.parentNode.removeChild(div); - } - } - finally - { - this.graph.cellRenderer.initializeOverlay = previousInitializeOverlay; - } - - return this.wnd; -}; - -/** - * Function: addPageBreak - * - * Adds a page break to the given document. - */ -mxPrintPreview.prototype.addPageBreak = function(doc) -{ - var hr = doc.createElement('hr'); - hr.className = 'mxPageBreak'; - doc.body.appendChild(hr); -}; - -/** - * Function: closeDocument - * - * Writes the closing tags for body and page after calling . - */ -mxPrintPreview.prototype.closeDocument = function() -{ - try - { - if (this.wnd != null && this.wnd.document != null) - { - var doc = this.wnd.document; - - this.writePostfix(doc); - doc.writeln(''); - doc.writeln(''); - doc.close(); - - // Removes all event handlers in the print output - mxEvent.release(doc.body); - } - } - catch (e) - { - // ignore any errors resulting from wnd no longer being available - } -}; - -/** - * Function: writeHead - * - * Writes the HEAD section into the given document, without the opening - * and closing HEAD tags. - */ -mxPrintPreview.prototype.writeHead = function(doc, css) -{ - if (this.title != null) - { - doc.writeln('' + this.title + ''); - } - - // Adds required namespaces - if (mxClient.IS_VML) - { - doc.writeln(''); - } - - // Adds all required stylesheets - mxClient.link('stylesheet', mxClient.basePath + '/css/common.css', doc); - - // Removes horizontal rules and page selector from print output - doc.writeln(''); -}; - -/** - * Function: writePostfix - * - * Called before closing the body of the page. This implementation is empty. - */ -mxPrintPreview.prototype.writePostfix = function(doc) -{ - // empty -}; - -/** - * Function: createPageSelector - * - * Creates the page selector table. - */ -mxPrintPreview.prototype.createPageSelector = function(vpages, hpages) -{ - var doc = this.wnd.document; - var table = doc.createElement('table'); - table.className = 'mxPageSelector'; - table.setAttribute('border', '0'); - - var tbody = doc.createElement('tbody'); - - for (var i = 0; i < vpages; i++) - { - var row = doc.createElement('tr'); - - for (var j = 0; j < hpages; j++) - { - var pageNum = i * hpages + j + 1; - var cell = doc.createElement('td'); - var a = doc.createElement('a'); - a.setAttribute('href', '#mxPage-' + pageNum); - - // Workaround for FF where the anchor is appended to the URL of the original document - if (mxClient.IS_NS && !mxClient.IS_SF && !mxClient.IS_GC) - { - var js = 'var page = document.getElementById(\'mxPage-' + pageNum + '\');page.scrollIntoView(true);event.preventDefault();'; - a.setAttribute('onclick', js); - } - - mxUtils.write(a, pageNum, doc); - cell.appendChild(a); - row.appendChild(cell); - } - - tbody.appendChild(row); - } - - table.appendChild(tbody); - - return table; -}; - -/** - * Function: renderPage - * - * Creates a DIV that prints a single page of the given - * graph using the given scale and returns the DIV that - * represents the page. - * - * Parameters: - * - * w - Width of the page in pixels. - * h - Height of the page in pixels. - * dx - Optional horizontal page offset in pixels (used internally). - * dy - Optional vertical page offset in pixels (used internally). - * content - Callback that adds the HTML content to the inner div of a page. - * Takes the inner div as the argument. - * pageNumber - Integer representing the page number. - */ -mxPrintPreview.prototype.renderPage = function(w, h, dx, dy, content, pageNumber) -{ - var doc = this.wnd.document; - var div = document.createElement('div'); - var arg = null; - - try - { - // Workaround for ignored clipping in IE 9 standards - // when printing with page breaks and HTML labels. - if (dx != 0 || dy != 0) - { - div.style.position = 'relative'; - div.style.width = w + 'px'; - div.style.height = h + 'px'; - div.style.pageBreakInside = 'avoid'; - - var innerDiv = document.createElement('div'); - innerDiv.style.position = 'relative'; - innerDiv.style.top = this.border + 'px'; - innerDiv.style.left = this.border + 'px'; - innerDiv.style.width = (w - 2 * this.border) + 'px'; - innerDiv.style.height = (h - 2 * this.border) + 'px'; - innerDiv.style.overflow = 'hidden'; - - var viewport = document.createElement('div'); - viewport.style.position = 'relative'; - viewport.style.marginLeft = dx + 'px'; - viewport.style.marginTop = dy + 'px'; - - // FIXME: IE8 standards output problems - if (doc.documentMode == 8) - { - innerDiv.style.position = 'absolute'; - viewport.style.position = 'absolute'; - } - - if (doc.documentMode == 10) - { - viewport.style.width = '100%'; - viewport.style.height = '100%'; - } - - innerDiv.appendChild(viewport); - div.appendChild(innerDiv); - document.body.appendChild(div); - arg = viewport; - } - // FIXME: IE10/11 too many pages - else - { - div.style.width = w + 'px'; - div.style.height = h + 'px'; - div.style.overflow = 'hidden'; - div.style.pageBreakInside = 'avoid'; - - // IE8 uses above branch currently - if (doc.documentMode == 8) - { - div.style.position = 'relative'; - } - - var innerDiv = document.createElement('div'); - innerDiv.style.width = (w - 2 * this.border) + 'px'; - innerDiv.style.height = (h - 2 * this.border) + 'px'; - innerDiv.style.overflow = 'hidden'; - - if (mxClient.IS_IE && (doc.documentMode == null || doc.documentMode == 5 || doc.documentMode == 8 || doc.documentMode == 7)) - { - innerDiv.style.marginTop = this.border + 'px'; - innerDiv.style.marginLeft = this.border + 'px'; - } - else - { - innerDiv.style.top = this.border + 'px'; - innerDiv.style.left = this.border + 'px'; - } - - if (this.graph.dialect == mxConstants.DIALECT_VML) - { - innerDiv.style.position = 'absolute'; - } - - div.appendChild(innerDiv); - document.body.appendChild(div); - arg = innerDiv; - } - } - catch (e) - { - div.parentNode.removeChild(div); - div = null; - - throw e; - } - - content(arg); - - return div; -}; - -/** - * Function: getRoot - * - * Returns the root cell for painting the graph. - */ -mxPrintPreview.prototype.getRoot = function() -{ - var root = this.graph.view.currentRoot; - - if (root == null) - { - root = this.graph.getModel().getRoot(); - } - - return root; -}; - -/** - * Function: addGraphFragment - * - * Adds a graph fragment to the given div. - * - * Parameters: - * - * dx - Horizontal translation for the diagram. - * dy - Vertical translation for the diagram. - * scale - Scale for the diagram. - * pageNumber - Number of the page to be rendered. - * div - Div that contains the output. - * clip - Contains the clipping rectangle as an . - */ -mxPrintPreview.prototype.addGraphFragment = function(dx, dy, scale, pageNumber, div, clip) -{ - var view = this.graph.getView(); - var previousContainer = this.graph.container; - this.graph.container = div; - - var canvas = view.getCanvas(); - var backgroundPane = view.getBackgroundPane(); - var drawPane = view.getDrawPane(); - var overlayPane = view.getOverlayPane(); - - if (this.graph.dialect == mxConstants.DIALECT_SVG) - { - view.createSvg(); - - // Uses CSS transform for scaling - if (!mxClient.NO_FO) - { - var g = view.getDrawPane().parentNode; - var prev = g.getAttribute('transform'); - g.setAttribute('transformOrigin', '0 0'); - g.setAttribute('transform', 'scale(' + scale + ',' + scale + ')' + - 'translate(' + dx + ',' + dy + ')'); - - scale = 1; - dx = 0; - dy = 0; - } - } - else if (this.graph.dialect == mxConstants.DIALECT_VML) - { - view.createVml(); - } - else - { - view.createHtml(); - } - - // Disables events on the view - var eventsEnabled = view.isEventsEnabled(); - view.setEventsEnabled(false); - - // Disables the graph to avoid cursors - var graphEnabled = this.graph.isEnabled(); - this.graph.setEnabled(false); - - // Resets the translation - var translate = view.getTranslate(); - view.translate = new mxPoint(dx, dy); - - // Redraws only states that intersect the clip - var redraw = this.graph.cellRenderer.redraw; - var states = view.states; - var s = view.scale; - - // Gets the transformed clip for intersection check below - if (this.clipping) - { - var tempClip = new mxRectangle((clip.x + translate.x) * s, (clip.y + translate.y) * s, - clip.width * s / scale, clip.height * s / scale); - - // Checks clipping rectangle for speedup - // Must create terminal states for edge clipping even if terminal outside of clip - this.graph.cellRenderer.redraw = function(state, force, rendering) - { - if (state != null) - { - // Gets original state from graph to find bounding box - var orig = states.get(state.cell); - - if (orig != null) - { - var bbox = view.getBoundingBox(orig, false); - - // Stops rendering if outside clip for speedup - if (bbox != null && !mxUtils.intersects(tempClip, bbox)) - { - //return; - } - } - } - - redraw.apply(this, arguments); - }; - } - - var temp = null; - - try - { - // Creates the temporary cell states in the view and - // draws them onto the temporary DOM nodes in the view - var cells = [this.getRoot()]; - temp = new mxTemporaryCellStates(view, scale, cells, null, mxUtils.bind(this, function(state) - { - return this.getLinkForCellState(state); - })); - } - finally - { - // Removes overlay pane with selection handles - // controls and icons from the print output - if (mxClient.IS_IE) - { - view.overlayPane.innerHTML = ''; - view.canvas.style.overflow = 'hidden'; - view.canvas.style.position = 'relative'; - view.canvas.style.top = this.marginTop + 'px'; - view.canvas.style.width = clip.width + 'px'; - view.canvas.style.height = clip.height + 'px'; - } - else - { - // Removes everything but the SVG node - var tmp = div.firstChild; - - while (tmp != null) - { - var next = tmp.nextSibling; - var name = tmp.nodeName.toLowerCase(); - - // Note: Width and height are required in FF 11 - if (name == 'svg') - { - tmp.style.overflow = 'hidden'; - tmp.style.position = 'relative'; - tmp.style.top = this.marginTop + 'px'; - tmp.setAttribute('width', clip.width); - tmp.setAttribute('height', clip.height); - tmp.style.width = ''; - tmp.style.height = ''; - } - // Tries to fetch all text labels and only text labels - else if (tmp.style.cursor != 'default' && name != 'div') - { - tmp.parentNode.removeChild(tmp); - } - - tmp = next; - } - } - - // Puts background image behind SVG output - if (this.printBackgroundImage) - { - var svgs = div.getElementsByTagName('svg'); - - if (svgs.length > 0) - { - svgs[0].style.position = 'absolute'; - } - } - - // Completely removes the overlay pane to remove more handles - view.overlayPane.parentNode.removeChild(view.overlayPane); - - // Restores the state of the view - this.graph.setEnabled(graphEnabled); - this.graph.container = previousContainer; - this.graph.cellRenderer.redraw = redraw; - view.canvas = canvas; - view.backgroundPane = backgroundPane; - view.drawPane = drawPane; - view.overlayPane = overlayPane; - view.translate = translate; - temp.destroy(); - view.setEventsEnabled(eventsEnabled); - } -}; - -/** - * Function: getLinkForCellState - * - * Returns the link for the given cell state. This returns null. - */ -mxPrintPreview.prototype.getLinkForCellState = function(state) -{ - return this.graph.getLinkForCell(state.cell); -}; - -/** - * Function: insertBackgroundImage - * - * Inserts the background image into the given div. - */ -mxPrintPreview.prototype.insertBackgroundImage = function(div, dx, dy) -{ - var bg = this.graph.backgroundImage; - - if (bg != null) - { - var img = document.createElement('img'); - img.style.position = 'absolute'; - img.style.marginLeft = Math.round(dx * this.scale) + 'px'; - img.style.marginTop = Math.round(dy * this.scale) + 'px'; - img.setAttribute('width', Math.round(this.scale * bg.width)); - img.setAttribute('height', Math.round(this.scale * bg.height)); - img.src = bg.src; - - div.insertBefore(img, div.firstChild); - } -}; - -/** - * Function: getCoverPages - * - * Returns the pages to be added before the print output. This returns null. - */ -mxPrintPreview.prototype.getCoverPages = function() -{ - return null; -}; - -/** - * Function: getAppendices - * - * Returns the pages to be added after the print output. This returns null. - */ -mxPrintPreview.prototype.getAppendices = function() -{ - return null; -}; - -/** - * Function: print - * - * Opens the print preview and shows the print dialog. - * - * Parameters: - * - * css - Optional CSS string to be used in the head section. - */ -mxPrintPreview.prototype.print = function(css) -{ - var wnd = this.open(css); - - if (wnd != null) - { - wnd.print(); - } -}; - -/** - * Function: close - * - * Closes the print preview window. - */ -mxPrintPreview.prototype.close = function() -{ - if (this.wnd != null) - { - this.wnd.close(); - this.wnd = null; - } -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -/** - * Class: mxStylesheet - * - * Defines the appearance of the cells in a graph. See for an - * example of creating a new cell style. It is recommended to use objects, not - * arrays for holding cell styles. Existing styles can be cloned using - * and turned into a string for debugging using - * . - * - * Default Styles: - * - * The stylesheet contains two built-in styles, which are used if no style is - * defined for a cell: - * - * defaultVertex - Default style for vertices - * defaultEdge - Default style for edges - * - * Example: - * - * (code) - * var vertexStyle = stylesheet.getDefaultVertexStyle(); - * vertexStyle[mxConstants.ROUNDED] = true; - * var edgeStyle = stylesheet.getDefaultEdgeStyle(); - * edgeStyle[mxConstants.STYLE_EDGE] = mxEdgeStyle.EntityRelation; - * (end) - * - * Modifies the built-in default styles. - * - * To avoid the default style for a cell, add a leading semicolon - * to the style definition, eg. - * - * (code) - * ;shadow=1 - * (end) - * - * Removing keys: - * - * For removing a key in a cell style of the form [stylename;|key=value;] the - * special value none can be used, eg. highlight;fillColor=none - * - * See also the helper methods in mxUtils to modify strings of this format, - * namely , , - * , , - * and . - * - * Constructor: mxStylesheet - * - * Constructs a new stylesheet and assigns default styles. - */ -function mxStylesheet() -{ - this.styles = new Object(); - - this.putDefaultVertexStyle(this.createDefaultVertexStyle()); - this.putDefaultEdgeStyle(this.createDefaultEdgeStyle()); -}; - -/** - * Function: styles - * - * Maps from names to cell styles. Each cell style is a map of key, - * value pairs. - */ -mxStylesheet.prototype.styles; - -/** - * Function: createDefaultVertexStyle - * - * Creates and returns the default vertex style. - */ -mxStylesheet.prototype.createDefaultVertexStyle = function() -{ - var style = new Object(); - - style[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_RECTANGLE; - style[mxConstants.STYLE_PERIMETER] = mxPerimeter.RectanglePerimeter; - style[mxConstants.STYLE_VERTICAL_ALIGN] = mxConstants.ALIGN_MIDDLE; - style[mxConstants.STYLE_ALIGN] = mxConstants.ALIGN_CENTER; - style[mxConstants.STYLE_FILLCOLOR] = '#C3D9FF'; - style[mxConstants.STYLE_STROKECOLOR] = '#6482B9'; - style[mxConstants.STYLE_FONTCOLOR] = '#774400'; - - return style; -}; - -/** - * Function: createDefaultEdgeStyle - * - * Creates and returns the default edge style. - */ -mxStylesheet.prototype.createDefaultEdgeStyle = function() -{ - var style = new Object(); - - style[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_CONNECTOR; - style[mxConstants.STYLE_ENDARROW] = mxConstants.ARROW_CLASSIC; - style[mxConstants.STYLE_VERTICAL_ALIGN] = mxConstants.ALIGN_MIDDLE; - style[mxConstants.STYLE_ALIGN] = mxConstants.ALIGN_CENTER; - style[mxConstants.STYLE_STROKECOLOR] = '#6482B9'; - style[mxConstants.STYLE_FONTCOLOR] = '#446299'; - - return style; -}; - -/** - * Function: putDefaultVertexStyle - * - * Sets the default style for vertices using defaultVertex as the - * stylename. - * - * Parameters: - * style - Key, value pairs that define the style. - */ -mxStylesheet.prototype.putDefaultVertexStyle = function(style) -{ - this.putCellStyle('defaultVertex', style); -}; - -/** - * Function: putDefaultEdgeStyle - * - * Sets the default style for edges using defaultEdge as the stylename. - */ -mxStylesheet.prototype.putDefaultEdgeStyle = function(style) -{ - this.putCellStyle('defaultEdge', style); -}; - -/** - * Function: getDefaultVertexStyle - * - * Returns the default style for vertices. - */ -mxStylesheet.prototype.getDefaultVertexStyle = function() -{ - return this.styles['defaultVertex']; -}; - -/** - * Function: getDefaultEdgeStyle - * - * Sets the default style for edges. - */ -mxStylesheet.prototype.getDefaultEdgeStyle = function() -{ - return this.styles['defaultEdge']; -}; - -/** - * Function: putCellStyle - * - * Stores the given map of key, value pairs under the given name in - * . - * - * Example: - * - * The following example adds a new style called 'rounded' into an - * existing stylesheet: - * - * (code) - * var style = new Object(); - * style[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_RECTANGLE; - * style[mxConstants.STYLE_PERIMETER] = mxPerimeter.RectanglePerimeter; - * style[mxConstants.STYLE_ROUNDED] = true; - * graph.getStylesheet().putCellStyle('rounded', style); - * (end) - * - * In the above example, the new style is an object. The possible keys of - * the object are all the constants in that start with STYLE - * and the values are either JavaScript objects, such as - * (which is in fact a function) - * or expressions, such as true. Note that not all keys will be - * interpreted by all shapes (eg. the line shape ignores the fill color). - * The final call to this method associates the style with a name in the - * stylesheet. The style is used in a cell with the following code: - * - * (code) - * model.setStyle(cell, 'rounded'); - * (end) - * - * Parameters: - * - * name - Name for the style to be stored. - * style - Key, value pairs that define the style. - */ -mxStylesheet.prototype.putCellStyle = function(name, style) -{ - this.styles[name] = style; -}; - -/** - * Function: getCellStyle - * - * Returns the cell style for the specified stylename or the given - * defaultStyle if no style can be found for the given stylename. - * - * Parameters: - * - * name - String of the form [(stylename|key=value);] that represents the - * style. - * defaultStyle - Default style to be returned if no style can be found. - */ -mxStylesheet.prototype.getCellStyle = function(name, defaultStyle) -{ - var style = defaultStyle; - - if (name != null && name.length > 0) - { - var pairs = name.split(';'); - - if (style != null && - name.charAt(0) != ';') - { - style = mxUtils.clone(style); - } - else - { - style = new Object(); - } - - // Parses each key, value pair into the existing style - for (var i = 0; i < pairs.length; i++) - { - var tmp = pairs[i]; - var pos = tmp.indexOf('='); - - if (pos >= 0) - { - var key = tmp.substring(0, pos); - var value = tmp.substring(pos + 1); - - if (value == mxConstants.NONE) - { - delete style[key]; - } - else if (mxUtils.isNumeric(value)) - { - style[key] = parseFloat(value); - } - else - { - style[key] = value; - } - } - else - { - // Merges the entries from a named style - var tmpStyle = this.styles[tmp]; - - if (tmpStyle != null) - { - for (var key in tmpStyle) - { - style[key] = tmpStyle[key]; - } - } - } - } - } - - return style; -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -/** - * Class: mxCellState - * - * Represents the current state of a cell in a given . - * - * For edges, the edge label position is stored in . - * - * The size for oversize labels can be retrieved using the boundingBox property - * of the field as shown below. - * - * (code) - * var bbox = (state.text != null) ? state.text.boundingBox : null; - * (end) - * - * Constructor: mxCellState - * - * Constructs a new object that represents the current state of the given - * cell in the specified view. - * - * Parameters: - * - * view - that contains the state. - * cell - that this state represents. - * style - Array of key, value pairs that constitute the style. - */ -function mxCellState(view, cell, style) -{ - this.view = view; - this.cell = cell; - this.style = (style != null) ? style : {}; - - this.origin = new mxPoint(); - this.absoluteOffset = new mxPoint(); -}; - -/** - * Extends mxRectangle. - */ -mxCellState.prototype = new mxRectangle(); -mxCellState.prototype.constructor = mxCellState; - -/** - * Variable: view - * - * Reference to the enclosing . - */ -mxCellState.prototype.view = null; - -/** - * Variable: cell - * - * Reference to the that is represented by this state. - */ -mxCellState.prototype.cell = null; - -/** - * Variable: style - * - * Contains an array of key, value pairs that represent the style of the - * cell. - */ -mxCellState.prototype.style = null; - -/** - * Variable: invalidStyle - * - * Specifies if the style is invalid. Default is false. - */ -mxCellState.prototype.invalidStyle = false; - -/** - * Variable: invalid - * - * Specifies if the state is invalid. Default is true. - */ -mxCellState.prototype.invalid = true; - -/** - * Variable: origin - * - * that holds the origin for all child cells. Default is a new - * empty . - */ -mxCellState.prototype.origin = null; - -/** - * Variable: absolutePoints - * - * Holds an array of that represent the absolute points of an - * edge. - */ -mxCellState.prototype.absolutePoints = null; - -/** - * Variable: absoluteOffset - * - * that holds the absolute offset. For edges, this is the - * absolute coordinates of the label position. For vertices, this is the - * offset of the label relative to the top, left corner of the vertex. - */ -mxCellState.prototype.absoluteOffset = null; - -/** - * Variable: visibleSourceState - * - * Caches the visible source terminal state. - */ -mxCellState.prototype.visibleSourceState = null; - -/** - * Variable: visibleTargetState - * - * Caches the visible target terminal state. - */ -mxCellState.prototype.visibleTargetState = null; - -/** - * Variable: terminalDistance - * - * Caches the distance between the end points for an edge. - */ -mxCellState.prototype.terminalDistance = 0; - -/** - * Variable: length - * - * Caches the length of an edge. - */ -mxCellState.prototype.length = 0; - -/** - * Variable: segments - * - * Array of numbers that represent the cached length of each segment of the - * edge. - */ -mxCellState.prototype.segments = null; - -/** - * Variable: shape - * - * Holds the that represents the cell graphically. - */ -mxCellState.prototype.shape = null; - -/** - * Variable: text - * - * Holds the that represents the label of the cell. Thi smay be - * null if the cell has no label. - */ -mxCellState.prototype.text = null; - -/** - * Variable: unscaledWidth - * - * Holds the unscaled width of the state. - */ -mxCellState.prototype.unscaledWidth = null; - -/** - * Function: getPerimeterBounds - * - * Returns the that should be used as the perimeter of the - * cell. - * - * Parameters: - * - * border - Optional border to be added around the perimeter bounds. - * bounds - Optional to be used as the initial bounds. - */ -mxCellState.prototype.getPerimeterBounds = function(border, bounds) -{ - border = border || 0; - bounds = (bounds != null) ? bounds : new mxRectangle(this.x, this.y, this.width, this.height); - - if (this.shape != null && this.shape.stencil != null && this.shape.stencil.aspect == 'fixed') - { - var aspect = this.shape.stencil.computeAspect(this.style, bounds.x, bounds.y, bounds.width, bounds.height); - - bounds.x = aspect.x; - bounds.y = aspect.y; - bounds.width = this.shape.stencil.w0 * aspect.width; - bounds.height = this.shape.stencil.h0 * aspect.height; - } - - if (border != 0) - { - bounds.grow(border); - } - - return bounds; -}; - -/** - * Function: setAbsoluteTerminalPoint - * - * Sets the first or last point in depending on isSource. - * - * Parameters: - * - * point - that represents the terminal point. - * isSource - Boolean that specifies if the first or last point should - * be assigned. - */ -mxCellState.prototype.setAbsoluteTerminalPoint = function(point, isSource) -{ - if (isSource) - { - if (this.absolutePoints == null) - { - this.absolutePoints = []; - } - - if (this.absolutePoints.length == 0) - { - this.absolutePoints.push(point); - } - else - { - this.absolutePoints[0] = point; - } - } - else - { - if (this.absolutePoints == null) - { - this.absolutePoints = []; - this.absolutePoints.push(null); - this.absolutePoints.push(point); - } - else if (this.absolutePoints.length == 1) - { - this.absolutePoints.push(point); - } - else - { - this.absolutePoints[this.absolutePoints.length - 1] = point; - } - } -}; - -/** - * Function: setCursor - * - * Sets the given cursor on the shape and text shape. - */ -mxCellState.prototype.setCursor = function(cursor) -{ - if (this.shape != null) - { - this.shape.setCursor(cursor); - } - - if (this.text != null) - { - this.text.setCursor(cursor); - } -}; - -/** - * Function: getVisibleTerminal - * - * Returns the visible source or target terminal cell. - * - * Parameters: - * - * source - Boolean that specifies if the source or target cell should be - * returned. - */ -mxCellState.prototype.getVisibleTerminal = function(source) -{ - var tmp = this.getVisibleTerminalState(source); - - return (tmp != null) ? tmp.cell : null; -}; - -/** - * Function: getVisibleTerminalState - * - * Returns the visible source or target terminal state. - * - * Parameters: - * - * source - Boolean that specifies if the source or target state should be - * returned. - */ -mxCellState.prototype.getVisibleTerminalState = function(source) -{ - return (source) ? this.visibleSourceState : this.visibleTargetState; -}; - -/** - * Function: setVisibleTerminalState - * - * Sets the visible source or target terminal state. - * - * Parameters: - * - * terminalState - that represents the terminal. - * source - Boolean that specifies if the source or target state should be set. - */ -mxCellState.prototype.setVisibleTerminalState = function(terminalState, source) -{ - if (source) - { - this.visibleSourceState = terminalState; - } - else - { - this.visibleTargetState = terminalState; - } -}; - -/** - * Function: getCellBounds - * - * Returns the unscaled, untranslated bounds. - */ -mxCellState.prototype.getCellBounds = function() -{ - return this.cellBounds; -}; - -/** - * Function: getPaintBounds - * - * Returns the unscaled, untranslated paint bounds. This is the same as - * but with a 90 degree rotation if the shape's - * isPaintBoundsInverted returns true. - */ -mxCellState.prototype.getPaintBounds = function() -{ - return this.paintBounds; -}; - -/** - * Function: updateCachedBounds - * - * Updates the cellBounds and paintBounds. - */ -mxCellState.prototype.updateCachedBounds = function() -{ - var tr = this.view.translate; - var s = this.view.scale; - this.cellBounds = new mxRectangle(this.x / s - tr.x, this.y / s - tr.y, this.width / s, this.height / s); - this.paintBounds = mxRectangle.fromRectangle(this.cellBounds); - - if (this.shape != null && this.shape.isPaintBoundsInverted()) - { - this.paintBounds.rotate90(); - } -}; - -/** - * Destructor: setState - * - * Copies all fields from the given state to this state. - */ -mxCellState.prototype.setState = function(state) -{ - this.view = state.view; - this.cell = state.cell; - this.style = state.style; - this.absolutePoints = state.absolutePoints; - this.origin = state.origin; - this.absoluteOffset = state.absoluteOffset; - this.boundingBox = state.boundingBox; - this.terminalDistance = state.terminalDistance; - this.segments = state.segments; - this.length = state.length; - this.x = state.x; - this.y = state.y; - this.width = state.width; - this.height = state.height; - this.unscaledWidth = state.unscaledWidth; -}; - -/** - * Function: clone - * - * Returns a clone of this . - */ -mxCellState.prototype.clone = function() -{ - var clone = new mxCellState(this.view, this.cell, this.style); - - // Clones the absolute points - if (this.absolutePoints != null) - { - clone.absolutePoints = []; - - for (var i = 0; i < this.absolutePoints.length; i++) - { - clone.absolutePoints[i] = this.absolutePoints[i].clone(); - } - } - - if (this.origin != null) - { - clone.origin = this.origin.clone(); - } - - if (this.absoluteOffset != null) - { - clone.absoluteOffset = this.absoluteOffset.clone(); - } - - if (this.boundingBox != null) - { - clone.boundingBox = this.boundingBox.clone(); - } - - clone.terminalDistance = this.terminalDistance; - clone.segments = this.segments; - clone.length = this.length; - clone.x = this.x; - clone.y = this.y; - clone.width = this.width; - clone.height = this.height; - clone.unscaledWidth = this.unscaledWidth; - - return clone; -}; - -/** - * Destructor: destroy - * - * Destroys the state and all associated resources. - */ -mxCellState.prototype.destroy = function() -{ - this.view.graph.cellRenderer.destroy(this); -}; -/** - * Copyright (c) 2006-2015, JGraph Ltd - * Copyright (c) 2006-2015, Gaudenz Alder - */ -/** - * Class: mxGraphSelectionModel - * - * Implements the selection model for a graph. Here is a listener that handles - * all removed selection cells. - * - * (code) - * graph.getSelectionModel().addListener(mxEvent.CHANGE, function(sender, evt) - * { - * var cells = evt.getProperty('added'); - * - * for (var i = 0; i < cells.length; i++) - * { - * // Handle cells[i]... - * } - * }); - * (end) - * - * Event: mxEvent.UNDO - * - * Fires after the selection was changed in . The - * edit property contains the which contains the - * . - * - * Event: mxEvent.CHANGE - * - * Fires after the selection changes by executing an . The - * added and removed properties contain arrays of - * cells that have been added to or removed from the selection, respectively. - * The names are inverted due to historic reasons. This cannot be changed. - * - * Constructor: mxGraphSelectionModel - * - * Constructs a new graph selection model for the given . - * - * Parameters: - * - * graph - Reference to the enclosing . - */ -function mxGraphSelectionModel(graph) -{ - this.graph = graph; - this.cells = []; -}; - -/** - * Extends mxEventSource. - */ -mxGraphSelectionModel.prototype = new mxEventSource(); -mxGraphSelectionModel.prototype.constructor = mxGraphSelectionModel; - -/** - * Variable: doneResource - * - * Specifies the resource key for the status message after a long operation. - * If the resource for this key does not exist then the value is used as - * the status message. Default is 'done'. - */ -mxGraphSelectionModel.prototype.doneResource = (mxClient.language != 'none') ? 'done' : ''; - -/** - * Variable: updatingSelectionResource - * - * Specifies the resource key for the status message while the selection is - * being updated. If the resource for this key does not exist then the - * value is used as the status message. Default is 'updatingSelection'. - */ -mxGraphSelectionModel.prototype.updatingSelectionResource = (mxClient.language != 'none') ? 'updatingSelection' : ''; - -/** - * Variable: graph - * - * Reference to the enclosing . - */ -mxGraphSelectionModel.prototype.graph = null; - -/** - * Variable: singleSelection - * - * Specifies if only one selected item at a time is allowed. - * Default is false. - */ -mxGraphSelectionModel.prototype.singleSelection = false; - -/** - * Function: isSingleSelection - * - * Returns as a boolean. - */ -mxGraphSelectionModel.prototype.isSingleSelection = function() -{ - return this.singleSelection; -}; - -/** - * Function: setSingleSelection - * - * Sets the flag. - * - * Parameters: - * - * singleSelection - Boolean that specifies the new value for - * . - */ -mxGraphSelectionModel.prototype.setSingleSelection = function(singleSelection) -{ - this.singleSelection = singleSelection; -}; - -/** - * Function: isSelected - * - * Returns true if the given is selected. - */ -mxGraphSelectionModel.prototype.isSelected = function(cell) -{ - if (cell != null) - { - return mxUtils.indexOf(this.cells, cell) >= 0; - } - - return false; -}; - -/** - * Function: isEmpty - * - * Returns true if no cells are currently selected. - */ -mxGraphSelectionModel.prototype.isEmpty = function() -{ - return this.cells.length == 0; -}; - -/** - * Function: clear - * - * Clears the selection and fires a event if the selection was not - * empty. - */ -mxGraphSelectionModel.prototype.clear = function() -{ - this.changeSelection(null, this.cells); -}; - -/** - * Function: setCell - * - * Selects the specified using . - * - * Parameters: - * - * cell - to be selected. - */ -mxGraphSelectionModel.prototype.setCell = function(cell) -{ - if (cell != null) - { - this.setCells([cell]); - } -}; - -/** - * Function: setCells - * - * Selects the given array of and fires a event. - * - * Parameters: - * - * cells - Array of to be selected. - */ -mxGraphSelectionModel.prototype.setCells = function(cells) -{ - if (cells != null) - { - if (this.singleSelection) - { - cells = [this.getFirstSelectableCell(cells)]; - } - - var tmp = []; - - for (var i = 0; i < cells.length; i++) - { - if (this.graph.isCellSelectable(cells[i])) - { - tmp.push(cells[i]); - } - } - - this.changeSelection(tmp, this.cells); - } -}; - -/** - * Function: getFirstSelectableCell - * - * Returns the first selectable cell in the given array of cells. - */ -mxGraphSelectionModel.prototype.getFirstSelectableCell = function(cells) -{ - if (cells != null) - { - for (var i = 0; i < cells.length; i++) - { - if (this.graph.isCellSelectable(cells[i])) - { - return cells[i]; - } - } - } - - return null; -}; - -/** - * Function: addCell - * - * Adds the given to the selection and fires a - * event. - * - * Parameters: - * - * cells - Array of to add to the selection. - */ -mxGraphSelectionModel.prototype.addCells = function(cells) -{ - if (cells != null) - { - var remove = null; - - if (this.singleSelection) - { - remove = this.cells; - cells = [this.getFirstSelectableCell(cells)]; - } - - var tmp = []; - - for (var i = 0; i < cells.length; i++) - { - if (!this.isSelected(cells[i]) && - this.graph.isCellSelectable(cells[i])) - { - tmp.push(cells[i]); - } - } - - this.changeSelection(tmp, remove); - } -}; - -/** - * Function: removeCell - * - * Removes the specified from the selection and fires a -
                        -
                        -
                        - - -
                        - - - - \ No newline at end of file diff --git a/spider/resources/static/variables.html b/spider/resources/static/variables.html deleted file mode 100644 index d6881a2..0000000 --- a/spider/resources/static/variables.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - DataSource - - - - - - 添加变量 -
                        -
                        - - - - \ No newline at end of file diff --git a/spider/spiderflow/ExpressionEngine.java b/spider/spiderflow/ExpressionEngine.java deleted file mode 100644 index 1565a1a..0000000 --- a/spider/spiderflow/ExpressionEngine.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.spiderflow; - -import java.util.Map; - -public interface ExpressionEngine { - - Object execute(String expression, Map variables); - -} diff --git a/spider/spiderflow/Grammerable.java b/spider/spiderflow/Grammerable.java deleted file mode 100644 index 0e68061..0000000 --- a/spider/spiderflow/Grammerable.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.spiderflow; - -import java.util.List; -import org.spiderflow.model.Grammer; - -public interface Grammerable { - - List grammers(); - -} diff --git a/spider/spiderflow/SpiderApplication.java b/spider/spiderflow/SpiderApplication.java deleted file mode 100644 index 2eb2c3c..0000000 --- a/spider/spiderflow/SpiderApplication.java +++ /dev/null @@ -1,38 +0,0 @@ - - -import java.io.IOException; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; - -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.ServletContextInitializer; -import org.springframework.context.annotation.Bean; -import org.springframework.scheduling.annotation.EnableScheduling; - -import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; - -@SpringBootApplication -@EnableScheduling -@MapperScan("org.spiderflow.*.mapper") -public class SpiderApplication implements ServletContextInitializer{ - - public static void main(String[] args) throws IOException { - - SpringApplication.run(SpiderApplication.class, args); - } - - @Override - public void onStartup(ServletContext servletContext) throws ServletException { - //设置文本缓存1M - servletContext.setInitParameter("org.apache.tomcat.websocket.textBufferSize", Integer.toString((1024 * 1024))); - } - - @Bean - public PaginationInterceptor paginationInterceptor() { - return new PaginationInterceptor(); - } - -} diff --git a/spider/spiderflow/annotation/Comment.java b/spider/spiderflow/annotation/Comment.java deleted file mode 100644 index 70a3815..0000000 --- a/spider/spiderflow/annotation/Comment.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.spiderflow.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Documented -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.METHOD,ElementType.TYPE}) -public @interface Comment { - String value(); -} diff --git a/spider/spiderflow/annotation/Example.java b/spider/spiderflow/annotation/Example.java deleted file mode 100644 index a8dda70..0000000 --- a/spider/spiderflow/annotation/Example.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.spiderflow.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Documented -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface Example { - String value(); -} diff --git a/spider/spiderflow/annotation/Return.java b/spider/spiderflow/annotation/Return.java deleted file mode 100644 index 837c1d3..0000000 --- a/spider/spiderflow/annotation/Return.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.spiderflow.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Documented -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface Return { - Class[] value(); -} diff --git a/spider/spiderflow/common/CURDController.java b/spider/spiderflow/common/CURDController.java deleted file mode 100644 index 00726f8..0000000 --- a/spider/spiderflow/common/CURDController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.spiderflow.common; - -import org.spiderflow.model.JsonBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - -public abstract class CURDController,M extends BaseMapper, T> { - - @Autowired - private S service; - - @RequestMapping("/list") - public IPage list(@RequestParam(name = "page",defaultValue = "1")Integer page, @RequestParam(name = "limit",defaultValue = "1")Integer size){ - return service.page(new Page(page, size), new QueryWrapper().orderByDesc("create_date")); - } - - @RequestMapping("get") - public JsonBean get(String id) { - return new JsonBean(service.getById(id)); - } - - @RequestMapping("delete") - public JsonBean delete(String id){ - return new JsonBean(service.removeById(id)); - } - - @RequestMapping("save") - public JsonBean save(T t){ - return new JsonBean(service.saveOrUpdate(t)); - } - -} \ No newline at end of file diff --git a/spider/spiderflow/concurrent/SpiderFlowThreadPoolExecutor.java b/spider/spiderflow/concurrent/SpiderFlowThreadPoolExecutor.java deleted file mode 100644 index 9bd2132..0000000 --- a/spider/spiderflow/concurrent/SpiderFlowThreadPoolExecutor.java +++ /dev/null @@ -1,116 +0,0 @@ -package org.spiderflow.concurrent; - -import java.util.concurrent.Future; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -public class SpiderFlowThreadPoolExecutor { - - private int maxThreads; - - private ThreadPoolExecutor executor; - - private final AtomicInteger poolNumber = new AtomicInteger(1); - - private static final ThreadGroup SPIDER_FLOW_THREAD_GROUP = new ThreadGroup("spider-flow-group"); - - private static final String THREAD_POOL_NAME_PREFIX = "spider-flow-"; - - public SpiderFlowThreadPoolExecutor(int maxThreads) { - super(); - this.maxThreads = maxThreads; - this.executor = new ThreadPoolExecutor(maxThreads, maxThreads, 10, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(),new ThreadFactory() { - - @Override - public Thread newThread(Runnable runnable) { - return new Thread(SPIDER_FLOW_THREAD_GROUP, runnable, THREAD_POOL_NAME_PREFIX + poolNumber.getAndIncrement()); - } - }); - } - - - public SubThreadPoolExecutor createSubThreadPoolExecutor(int threads){ - return new SubThreadPoolExecutor(Math.min(maxThreads, threads)); - } - - - public class SubThreadPoolExecutor{ - - private int threads; - - private Future[] futures; - - private AtomicInteger executing = new AtomicInteger(0); - - public SubThreadPoolExecutor(int threads) { - super(); - this.threads = threads; - this.futures = new Future[threads]; - } - - /** - * 等待所有线程执行完毕 - */ - public void awaitTermination(){ - while(executing.get() > 0){ - removeDoneFuture(); - } - } - - private int index(){ - for (int i = 0; i < threads; i++) { - if(futures[i] == null || futures[i].isDone()){ - return i; - } - } - return -1; - } - - /** - * 清除已完成的任务 - */ - private void removeDoneFuture(){ - for (int i = 0; i < threads; i++) { - try { - if(futures[i] != null && futures[i].get(10,TimeUnit.MILLISECONDS) == null){ - futures[i] = null; - } - } catch (Throwable t) { - //忽略异常 - } - } - } - - private void await(){ - while(index() == -1){ - removeDoneFuture(); - } - } - - public void submit(Runnable runnable){ - //正在执行的线程数+1 - executing.incrementAndGet(); - Runnable task = ()->{ - try{ - //执行任务 - runnable.run(); - } finally{ - //正在执行的线程数-1 - executing.decrementAndGet(); - } - }; - //如果没有空闲线程且在线程池中提交,则直接运行 - if(index() == -1 && Thread.currentThread().getThreadGroup() == SPIDER_FLOW_THREAD_GROUP){ - task.run(); - return; - } - //等待有空闲线程时在提交 - await(); - futures[index()] = executor.submit(task); - } - } - -} diff --git a/spider/spiderflow/configuration/ResourcesConfiguration.java b/spider/spiderflow/configuration/ResourcesConfiguration.java deleted file mode 100644 index 033a809..0000000 --- a/spider/spiderflow/configuration/ResourcesConfiguration.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.spiderflow.configuration; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * 配置放行静态资源文件 - * @author Administrator - * - */ -@Configuration -public class ResourcesConfiguration implements WebMvcConfigurer{ - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); - } - - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedOrigins("*") - .allowedMethods("GET","POST","OPTIONS") - .allowCredentials(true); - } -} diff --git a/spider/spiderflow/configuration/WebSocketConfiguration.java b/spider/spiderflow/configuration/WebSocketConfiguration.java deleted file mode 100644 index 5d84ac9..0000000 --- a/spider/spiderflow/configuration/WebSocketConfiguration.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.spiderflow.configuration; - -import org.spiderflow.core.Spider; -import org.spiderflow.websocket.WebSocketEditorServer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.socket.server.standard.ServerEndpointExporter; - -/** - * 配置WebSocket - * @author Administrator - * - */ -@Configuration -public class WebSocketConfiguration { - - @Bean - public ServerEndpointExporter endpointExporter(){ - return new ServerEndpointExporter(); - } - - @Autowired - public void setSpider(Spider spider) { - WebSocketEditorServer.spider = spider; - } - -} diff --git a/spider/spiderflow/context/CookieContext.java b/spider/spiderflow/context/CookieContext.java deleted file mode 100644 index 45b0d77..0000000 --- a/spider/spiderflow/context/CookieContext.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.spiderflow.context; - -import java.util.HashMap; - -public class CookieContext extends HashMap { -} diff --git a/spider/spiderflow/context/RunnableNode.java b/spider/spiderflow/context/RunnableNode.java deleted file mode 100644 index 0753983..0000000 --- a/spider/spiderflow/context/RunnableNode.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.spiderflow.context; - -import java.util.function.Function; - -public class RunnableNode{ - - public enum State{ - WAITING,RUNNING,DONE - } - - private State state = State.WAITING; - - public boolean isDone(){ - return this.state == State.DONE; - } - - public void setState(State state){ - this.state = state; - } -} diff --git a/spider/spiderflow/context/RunnableTreeNode.java b/spider/spiderflow/context/RunnableTreeNode.java deleted file mode 100644 index 879608f..0000000 --- a/spider/spiderflow/context/RunnableTreeNode.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.spiderflow.context; - -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -public class RunnableTreeNode { - - private String id; - - private RunnableNode node; - - private List children = new CopyOnWriteArrayList<>(); - - private boolean cleared = false; - - public RunnableTreeNode(String id, RunnableNode node) { - this.id = id; - this.node = node; - } - - public RunnableTreeNode(String id) { - this.id = id; - } - - - public void add(String id){ - this.children.add(new RunnableTreeNode(id)); - } - - public void add(RunnableTreeNode node){ - this.children.add(node); - } - - public void add(String id, RunnableNode child){ - this.children.add(new RunnableTreeNode(id, child)); - } - - public void clear(){ - children.clear(); - cleared = true; - } - - public String getId() { - return id; - } - - public synchronized boolean isDone(){ - if(cleared){ - return false; - } - for (RunnableTreeNode child : children) { - if(!child.isDone()){ - return false; - } - } - children.clear(); - return this.node == null || this.node.isDone(); - } -} diff --git a/spider/spiderflow/context/SpiderContext.java b/spider/spiderflow/context/SpiderContext.java deleted file mode 100644 index 1d03633..0000000 --- a/spider/spiderflow/context/SpiderContext.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.spiderflow.context; - -import org.spiderflow.concurrent.SpiderFlowThreadPoolExecutor.SubThreadPoolExecutor; -import org.spiderflow.model.SpiderNode; -import org.spiderflow.model.SpiderOutput; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.UUID; -import java.util.concurrent.locks.ReentrantLock; - -/** - * 爬虫上下文集合 - * @author jmxd - * - */ -public class SpiderContext extends HashMap{ - - private String id = UUID.randomUUID().toString().replace("-", ""); - - private static final long serialVersionUID = 8379177178417619790L; - /** - * 爬虫输出参数列表 - */ - private List outputs = new ArrayList<>(); - - /** - * 流程执行线程 - */ - private SubThreadPoolExecutor threadPool; - - /** - * 处理流程同步锁 - */ - private ReentrantLock lock = new ReentrantLock(); - - private SpiderNode rootNode; - - private boolean running = true; - - private CookieContext cookieContext = new CookieContext(); - - public List getOutputs() { - return outputs; - } - - public T get(String key){ - return (T) super.get(key); - } - - public T get(String key,T defaultValue){ - T value = this.get(key); - return value == null ? defaultValue : value; - } - - public boolean isRunning() { - return running; - } - - public void setRunning(boolean running) { - this.running = running; - } - - public void addOutput(SpiderOutput output){ - this.outputs.add(output); - } - - public SubThreadPoolExecutor getThreadPool() { - return threadPool; - } - - public void setThreadPool(SubThreadPoolExecutor threadPool) { - this.threadPool = threadPool; - } - - public SpiderNode getRootNode() { - return rootNode; - } - - public void setRootNode(SpiderNode rootNode) { - this.rootNode = rootNode; - } - - public String getId() { - return id; - } - - public CookieContext getCookieContext() { - return cookieContext; - } - - public void lock(){ - lock.lock(); - } - - public void unlock(){ - lock.unlock(); - } - -} diff --git a/spider/spiderflow/context/SpiderContextHolder.java b/spider/spiderflow/context/SpiderContextHolder.java deleted file mode 100644 index ddfa17a..0000000 --- a/spider/spiderflow/context/SpiderContextHolder.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.spiderflow.context; - -import com.alibaba.ttl.TransmittableThreadLocal; - -public class SpiderContextHolder { - - private static final ThreadLocal THREAD_LOCAL = new TransmittableThreadLocal<>(); - - public static SpiderContext get() { - return THREAD_LOCAL.get(); - } - - public static void set(SpiderContext context) { - THREAD_LOCAL.set(context); - } - - public static void remove() { - THREAD_LOCAL.remove(); - } - - -} diff --git a/spider/spiderflow/controller/DataSourceController.java b/spider/spiderflow/controller/DataSourceController.java deleted file mode 100644 index 16f8677..0000000 --- a/spider/spiderflow/controller/DataSourceController.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.spiderflow.controller; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.spiderflow.core.model.DataSource; -import org.spiderflow.core.service.DataSourceService; -import org.spiderflow.core.utils.DataSourceUtils; -import org.spiderflow.model.JsonBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; - -@RestController -@RequestMapping("/datasource") -public class DataSourceController { - - @Autowired - private DataSourceService dataSourceService; - - @RequestMapping("/list") - public IPage list(@RequestParam(name = "page",defaultValue = "1")Integer page, @RequestParam(name = "limit",defaultValue = "1")Integer size) { - return dataSourceService.page(new Page(page, size), new QueryWrapper().select("id", "name", "driver_class_name", "create_date").orderByDesc("create_date")); - } - - @RequestMapping("/all") - public List all(){ - return dataSourceService.list(); - } - - @RequestMapping("/save") - public String save(DataSource dataSource){ - if(StringUtils.isNotBlank(dataSource.getId())){ - DataSourceUtils.remove(dataSource.getId()); - } - dataSourceService.saveOrUpdate(dataSource); - return dataSource.getId(); - } - - @RequestMapping("/get") - public DataSource get(String id){ - DataSource dataSource = dataSourceService.getById(id); - dataSource.setPassword(null); - return dataSource; - } - - @RequestMapping("/remove") - public void remove(String id){ - DataSourceUtils.remove(id); - dataSourceService.removeById(id); - } - - @RequestMapping("/test") - public JsonBean test(DataSource dataSource){ - if(StringUtils.isBlank(dataSource.getDriverClassName())){ - return new JsonBean<>(0, "DriverClassName不能为空!"); - } - if(StringUtils.isBlank(dataSource.getJdbcUrl())){ - return new JsonBean<>(0, "jdbcUrl不能为空!"); - } - Connection connection = null; - try { - Class.forName(dataSource.getDriverClassName()); - String url = dataSource.getJdbcUrl(); - String username = dataSource.getUsername(); - String password = dataSource.getPassword(); - if(StringUtils.isNotBlank(username)){ - connection = DriverManager.getConnection(url,username,password); - }else{ - connection = DriverManager.getConnection(url); - } - return new JsonBean<>(1, "测试连接成功"); - } catch (ClassNotFoundException e) { - return new JsonBean<>(0, "找不到驱动包:" + dataSource.getDriverClassName()); - } catch (Exception e){ - return new JsonBean<>(0, "连接失败,"+ e.getMessage()); - } finally{ - if(connection != null){ - try { - connection.close(); - } catch (Exception e) { - } - } - } - } - -} diff --git a/spider/spiderflow/controller/SpiderFlowController.java b/spider/spiderflow/controller/SpiderFlowController.java deleted file mode 100644 index fa59cce..0000000 --- a/spider/spiderflow/controller/SpiderFlowController.java +++ /dev/null @@ -1,193 +0,0 @@ -package org.spiderflow.controller; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; -import org.spiderflow.Grammerable; -import org.spiderflow.annotation.Comment; -import org.spiderflow.core.model.SpiderFlow; -import org.spiderflow.core.service.SpiderFlowService; -import org.spiderflow.executor.FunctionExecutor; -import org.spiderflow.executor.FunctionExtension; -import org.spiderflow.executor.PluginConfig; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.io.Line; -import org.spiderflow.io.RandomAccessFileReader; -import org.spiderflow.model.Grammer; -import org.spiderflow.model.JsonBean; -import org.spiderflow.model.Plugin; -import org.spiderflow.model.Shape; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.PostConstruct; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 爬虫Controller - * @author Administrator - * - */ -@RestController -@RequestMapping("/spider") -public class SpiderFlowController { - - @Autowired - private List executors; - - @Autowired - private List functionExecutors; - - @Autowired - private List functionExtensions; - - @Autowired - private List grammerables; - - @Autowired - private SpiderFlowService spiderFlowService; - - @Autowired(required = false) - private List pluginConfigs; - - @Value("${spider.job.log.path:./}") - private String spiderLogPath; - - private final List grammers = new ArrayList(); - - private static Logger logger = LoggerFactory.getLogger(SpiderFlowController.class); - - @PostConstruct - private void init(){ - for (FunctionExecutor executor : functionExecutors) { - String function = executor.getFunctionPrefix(); - grammers.addAll(Grammer.findGrammers(executor.getClass(),function,function,true)); - Comment comment = executor.getClass().getAnnotation(Comment.class); - Grammer grammer = new Grammer(); - if(comment!= null){ - grammer.setComment(comment.value()); - } - grammer.setFunction(function); - grammers.add(grammer); - } - - for (FunctionExtension extension : functionExtensions) { - String owner = extension.support().getSimpleName(); - grammers.addAll(Grammer.findGrammers(extension.getClass(),null,owner,true)); - } - for (Grammerable grammerable : grammerables) { - grammers.addAll(grammerable.grammers()); - } - } - - /** - * 爬虫列表 - * @param page 页数 - * @param size 每页显示条数 - * @return Page 所有爬虫的列表页 - */ - @RequestMapping("/list") - public IPage list(@RequestParam(name = "page", defaultValue = "1") Integer page, @RequestParam(name = "limit", defaultValue = "1") Integer size, @RequestParam(name = "name", defaultValue = "") String name) { - return spiderFlowService.selectSpiderPage(new Page<>(page, size), name); - } - - @RequestMapping("/save") - public String save(SpiderFlow spiderFlow){ - spiderFlowService.save(spiderFlow); - return spiderFlow.getId(); - } - - @RequestMapping("/get") - public SpiderFlow get(String id){ - return spiderFlowService.getById(id); - } - - @RequestMapping("/other") - public List other(String id){ - if(StringUtils.isBlank(id)){ - return spiderFlowService.selectFlows(); - } - return spiderFlowService.selectOtherFlows(id); - } - - @RequestMapping("/remove") - public void remove(String id){ - spiderFlowService.remove(id); - } - - @RequestMapping("/start") - public void start(String id){ - spiderFlowService.start(id); - } - - @RequestMapping("/stop") - public void stop(String id){ - spiderFlowService.stop(id); - } - - @RequestMapping("/run") - public void run(String id){ - spiderFlowService.run(id); - } - - @RequestMapping("/cron") - public void cron(String id,String cron){ - spiderFlowService.resetCornExpression(id, cron); - } - - @RequestMapping("/xml") - public String xml(String id){ - return spiderFlowService.getById(id).getXml(); - } - - @RequestMapping("/log") - public JsonBean> log(String id, String taskId, String keywords, Long index, Integer count, Boolean reversed, Boolean matchcase, Boolean regx) { - if (StringUtils.isBlank(taskId)) { - Integer maxId = spiderFlowService.getFlowMaxTaskId(id); - taskId = maxId == null ? "" : maxId.toString(); - } - try (RandomAccessFileReader reader = new RandomAccessFileReader(new RandomAccessFile(new File(spiderLogPath,id + taskId +".log"),"r"), index == null ? -1 : index, reversed == null || reversed)){ - return new JsonBean<>(reader.readLine(count == null ? 10 : count,keywords,matchcase != null && matchcase,regx != null && regx)); - } catch(FileNotFoundException e){ - return new JsonBean<>(0,"日志文件不存在"); - } catch (IOException e) { - logger.error("读取日志文件出错",e); - return new JsonBean<>(-1,"读取日志文件出错"); - } - } - - @RequestMapping("/shapes") - public List shapes(){ - return executors.stream().filter(e-> e.shape() !=null).map(executor -> executor.shape()).collect(Collectors.toList()); - } - - @RequestMapping("/pluginConfigs") - public List pluginConfigs(){ - return null == pluginConfigs ? Collections.emptyList() : pluginConfigs.stream().filter(e-> e.plugin() != null).map(plugin -> plugin.plugin()).collect(Collectors.toList()); - } - - @RequestMapping("/grammers") - public JsonBean> grammers(){ - return new JsonBean<>(this.grammers); - } - - @GetMapping("/recent5TriggerTime") - public List getRecent5TriggerTime(String cron){ - return spiderFlowService.getRecentTriggerTime(cron,5); - } -} diff --git a/spider/spiderflow/controller/SpiderRestController.java b/spider/spiderflow/controller/SpiderRestController.java deleted file mode 100644 index 96312b7..0000000 --- a/spider/spiderflow/controller/SpiderRestController.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.spiderflow.controller; - -import java.util.List; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.core.Spider; -import org.spiderflow.core.job.SpiderJobContext; -import org.spiderflow.core.model.SpiderFlow; -import org.spiderflow.core.service.SpiderFlowService; -import org.spiderflow.model.JsonBean; -import org.spiderflow.model.SpiderOutput; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/rest") -public class SpiderRestController { - - private static Logger logger = LoggerFactory.getLogger(SpiderRestController.class); - - @Autowired - private SpiderFlowService spiderFlowService; - - @Autowired - private Spider spider; - - @Value("${spider.job.log.path:./}") - private String spiderLogPath; - - @RequestMapping("/run/{id}") - public JsonBean> run(@PathVariable("id")String id,@RequestBody(required = false)Map params){ - SpiderFlow flow = spiderFlowService.getById(id); - if(flow == null){ - return new JsonBean<>(0, "找不到此爬虫信息"); - } - List outputs = null; - SpiderJobContext context = SpiderJobContext.create(spiderLogPath, id + ".log"); - try{ - outputs = spider.run(flow,context, params); - }catch(Exception e){ - logger.error("执行爬虫失败",e); - return new JsonBean<>(-1, "执行失败"); - } finally{ - context.close(); - } - return new JsonBean<>(outputs); - } - -} diff --git a/spider/spiderflow/controller/TaskController.java b/spider/spiderflow/controller/TaskController.java deleted file mode 100644 index 4611a23..0000000 --- a/spider/spiderflow/controller/TaskController.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.spiderflow.controller; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.core.job.SpiderJob; -import org.spiderflow.core.model.Task; -import org.spiderflow.core.service.TaskService; -import org.spiderflow.model.JsonBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/task") -public class TaskController { - - @Autowired - private TaskService taskService; - - @RequestMapping("/list") - public IPage list(@RequestParam(name = "page", defaultValue = "1") Integer page, @RequestParam(name = "limit", defaultValue = "1") Integer size,String flowId){ - return taskService.page(new Page<>(page,size),new QueryWrapper().eq("flow_id",flowId).last("order by isnull(end_time) desc,end_time desc")); - } - - /** - * 停止执行任务 - * @param id - * @return - */ - @RequestMapping("/stop") - public JsonBean stop(Integer id){ - SpiderContext context = SpiderJob.getSpiderContext(id); - if(context != null){ - context.setRunning(false); - } - return new JsonBean<>(context != null); - } - - @RequestMapping("/remove") - public JsonBean remove(Integer id){ - return new JsonBean<>(taskService.removeById(id)); - } -} diff --git a/spider/spiderflow/controller/VariableController.java b/spider/spiderflow/controller/VariableController.java deleted file mode 100644 index 3d248db..0000000 --- a/spider/spiderflow/controller/VariableController.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.spiderflow.controller; - -import org.spiderflow.common.CURDController; -import org.spiderflow.core.mapper.VariableMapper; -import org.spiderflow.core.model.Variable; -import org.spiderflow.core.service.VariableService; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/variable") -public class VariableController extends CURDController { -} diff --git a/spider/spiderflow/core/Spider.java b/spider/spiderflow/core/Spider.java deleted file mode 100644 index 6ad9ded..0000000 --- a/spider/spiderflow/core/Spider.java +++ /dev/null @@ -1,255 +0,0 @@ -package org.spiderflow.core; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.math.NumberUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.ExpressionEngine; -import org.spiderflow.concurrent.SpiderFlowThreadPoolExecutor; -import org.spiderflow.concurrent.SpiderFlowThreadPoolExecutor.SubThreadPoolExecutor; -import org.spiderflow.context.RunnableNode; -import org.spiderflow.context.RunnableTreeNode; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.context.SpiderContextHolder; -import org.spiderflow.core.executor.shape.LoopExecutor; -import org.spiderflow.core.executor.shape.LoopJoinExecutor; -import org.spiderflow.core.model.SpiderFlow; -import org.spiderflow.core.utils.SpiderFlowUtils; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.listener.SpiderListener; -import org.spiderflow.model.SpiderNode; -import org.spiderflow.model.SpiderOutput; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.util.*; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -/** - * 爬虫的核心类 - * - * @author jmxd - */ -@Component -public class Spider { - - /** - * 节点执行器列表 当前爬虫的全部流程 - */ - @Autowired - private List executors; - /** - * 选择器 - */ - @Autowired - private ExpressionEngine engine; - - @Autowired(required = false) - private List listeners; - - @Value("${spider.thread.max:64}") - private Integer totalThreads; - - @Value("${spider.thread.default:8}") - private Integer defaultThreads; - - @Value("${spider.detect.dead-cycle:5000}") - private Integer deadCycle; - - private static Map executorMap = new HashMap<>(); - - private static SpiderFlowThreadPoolExecutor executor; - - private static final String ATOMIC_DEAD_CYCLE = "__atomic_dead_cycle"; - - private static Logger logger = LoggerFactory.getLogger(Spider.class); - - @PostConstruct - private void init() { - executorMap = executors.stream().collect(Collectors.toMap(ShapeExecutor::supportShape, v -> v)); - executor = new SpiderFlowThreadPoolExecutor(totalThreads); - } - - public List run(SpiderFlow spiderFlow, SpiderContext context, Map variables) { - if (variables == null) { - variables = new HashMap<>(); - } - SpiderNode root = SpiderFlowUtils.loadXMLFromString(spiderFlow.getXml()); - executeRoot(root, context, variables); - return context.getOutputs(); - } - - public List run(SpiderFlow spiderFlow, SpiderContext context) { - return run(spiderFlow, context, new HashMap<>()); - } - - public void runWithTest(SpiderNode root, SpiderContext context) { - SpiderContextHolder.set(context); - AtomicInteger executeCount = new AtomicInteger(0); - context.put(ATOMIC_DEAD_CYCLE, executeCount); - executeRoot(root, context, new HashMap<>()); - if (executeCount.get() > deadCycle) { - logger.error("检测到可能出现死循环,测试终止"); - } else { - logger.info("测试完毕!"); - } - SpiderContextHolder.remove(); - } - - private void executeRoot(SpiderNode root, SpiderContext context, Map variables) { - int nThreads = NumberUtils.toInt(root.getStringJsonValue(ShapeExecutor.THREAD_COUNT), defaultThreads); - SubThreadPoolExecutor pool = executor.createSubThreadPoolExecutor(nThreads); - context.setRootNode(root); - context.setThreadPool(pool); - if (listeners != null) { - listeners.forEach(listener -> listener.beforeStart(context)); - } - try { - executeNode(null, root, context, variables); - pool.awaitTermination(); - } finally { - if (listeners != null) { - listeners.forEach(listener -> listener.afterEnd(context)); - } - } - } - - public void execute(int nThreads, SpiderNode fromNode, SpiderNode node, SpiderContext context, Map variables) { - SubThreadPoolExecutor pool = executor.createSubThreadPoolExecutor(nThreads); - context.setThreadPool(pool); - executeNode(fromNode, node, context, variables); - pool.awaitTermination(); - } - - private void executeNextNodes(SpiderNode node, SpiderContext context, Map variables) { - List nextNodes = node.getNextNodes(); - if (nextNodes != null) { - for (SpiderNode nextNode : nextNodes) { - executeNode(node, nextNode, context, variables); - } - } - } - - public void executeNode(SpiderNode fromNode, SpiderNode node, SpiderContext context, Map variables) { - String shape = node.getStringJsonValue("shape"); - if (StringUtils.isBlank(shape)) { - executeNextNodes(node, context, variables); - return; - } - //判断条件,如果不成立则不执行 - if (!executeCondition(fromNode, node, variables)) { - return; - } - logger.debug("执行节点[{}:{}]", node.getNodeName(), node.getNodeId()); - ShapeExecutor executor = executorMap.get(shape); - if (executor == null) { - logger.error("执行失败,找不到对应的执行器:{}", shape); - context.setRunning(false); - } - int loopCount = 1; - String loopCountStr = node.getStringJsonValue(ShapeExecutor.LOOP_COUNT); - if (StringUtils.isNotBlank(loopCountStr)) { - try { - Object result = engine.execute(loopCountStr, variables); - result = result == null ? 0 : result; - logger.info("获取循环次数{}={}", loopCountStr, result); - loopCount = Integer.parseInt(result.toString()); - } catch (Throwable t) { - loopCount = 0; - logger.error("获取循环次数失败,异常信息:{}", t); - } - } - if (loopCount > 0) { - String loopVariableName = node.getStringJsonValue(ShapeExecutor.LOOP_VARIABLE_NAME); - RunnableTreeNode treeNode = new RunnableTreeNode(node.getNodeId()); - RunnableTreeNode parentNode = (RunnableTreeNode) variables.get(LoopExecutor.LOOP_NODE_KEY); - if (parentNode != null) { - parentNode.add(treeNode); - } - if (executor instanceof LoopExecutor) { - variables.put(LoopExecutor.LOOP_NODE_KEY + node.getNodeId(), treeNode); - variables.put(LoopExecutor.LOOP_NODE_KEY, treeNode); - variables.put(LoopExecutor.BEFORE_LOOP_VARIABLE + node.getNodeId(), variables); - variables.put(LoopJoinExecutor.VARIABLE_CONTEXT + node.getNodeId(), new LinkedBlockingQueue<>()); - } - List runnables = new ArrayList<>(); - for (int i = 0; i < loopCount; i++) { - if (context.isRunning()) { - RunnableNode runnableNode = new RunnableNode(); - treeNode.add(new RunnableTreeNode("loop-" + node.getNodeId(), runnableNode)); - Map nVariables = new HashMap<>(variables); - // 存入下标变量 - if (!StringUtils.isBlank(loopVariableName)) { - nVariables.put(loopVariableName, i); - } - runnables.add(() -> { - runnableNode.setState(RunnableNode.State.RUNNING); - if (context.isRunning()) { - try { - SpiderContextHolder.set(context); - //死循环检测,当执行节点次数大于阈值时,结束本次测试 - AtomicInteger executeCount = context.get(ATOMIC_DEAD_CYCLE); - if (executeCount != null && executeCount.incrementAndGet() > deadCycle) { - context.setRunning(false); - //设置当前线程为已完成状态 - runnableNode.setState(RunnableNode.State.DONE); - return; - } - //执行节点具体逻辑 - executor.execute(node, context, nVariables); - } catch (Throwable t) { - nVariables.put("ex", t); - logger.error("执行节点[{}:{}]出错,异常信息:{}", node.getNodeName(), node.getNodeId(), t); - context.setRunning(false); - } finally { - if (node.isSync()) { - context.lock(); - } - //设置当前线程为已完成状态 - runnableNode.setState(RunnableNode.State.DONE); - //判断是否允许执行后续节点 - if (executor.allowExecuteNext(node, context, nVariables)) { - logger.debug("执行节点[{}:{}]完毕", node.getNodeName(), node.getNodeId()); - // 递归执行下一级节点 - executeNextNodes(node, context, nVariables); - } else { - logger.debug("执行节点[{}:{}]完毕,忽略执行下一节点", node.getNodeName(), node.getNodeId()); - } - if (node.isSync()) { - context.unlock(); - } - SpiderContextHolder.remove(); - } - } - }); - } - } - runnables.forEach(executor.isThread() ? context.getThreadPool()::submit : Runnable::run); - } - } - - private boolean executeCondition(SpiderNode fromNode, SpiderNode node, Map variables) { - if (fromNode != null) { - String condition = node.getCondition(fromNode.getNodeId()); - if (StringUtils.isNotBlank(condition)) { // 判断是否有条件 - Object result = null; - try { - result = engine.execute(condition, variables); - } catch (Exception e) { - logger.error("判断{}出错,异常信息:{}", condition, e); - } - if (result != null) { - boolean isContinue = "true".equals(result) || Objects.equals(result, true); - logger.debug("判断{}={}", condition, isContinue); - return isContinue; - } - return false; - } - } - return true; - } -} diff --git a/spider/spiderflow/core/executor/function/Base64FunctionExecutor.java b/spider/spiderflow/core/executor/function/Base64FunctionExecutor.java deleted file mode 100644 index c60d088..0000000 --- a/spider/spiderflow/core/executor/function/Base64FunctionExecutor.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.spiderflow.core.executor.function; - -import org.apache.commons.codec.binary.Base64; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; - -/** - * 字符串内容和Base64互相转换 工具类 防止NPE - * @author Administrator - * - */ -@Component -@Comment("base64常用方法") -public class Base64FunctionExecutor implements FunctionExecutor{ - - @Override - public String getFunctionPrefix() { - return "base64"; - } - - @Comment("根据byte[]进行base64加密") - @Example("${base64.encode(resp.bytes)}") - public static String encode(byte[] bytes){ - return bytes != null ? Base64.encodeBase64String(bytes) : null; - } - - @Comment("根据String进行base64加密") - @Example("${base64.encode(resp.bytes,'UTF-8')}") - public static String encode(String content,String charset){ - return encode(StringFunctionExecutor.bytes(content,charset)); - } - - @Comment("根据String进行base64加密") - @Example("${base64.encode(resp.html)}") - public static String encode(String content){ - return encode(StringFunctionExecutor.bytes(content)); - } - - @Comment("根据byte[]进行base64加密") - @Example("${base64.encodeBytes(resp.bytes)}") - public static byte[] encodeBytes(byte[] bytes){ - return bytes != null ? Base64.encodeBase64(bytes) : null; - } - - @Comment("根据String进行base64加密") - @Example("${base64.encodeBytes(resp.html,'UTF-8')}") - public static byte[] encodeBytes(String content,String charset){ - return encodeBytes(StringFunctionExecutor.bytes(content,charset)); - } - - @Comment("根据String进行base64加密") - @Example("${base64.encodeBytes(resp.html)}") - public static byte[] encodeBytes(String content){ - return encodeBytes(StringFunctionExecutor.bytes(content)); - } - - @Comment("根据String进行base64解密") - @Example("${base64.decode(resp.html)}") - public static byte[] decode(String base64){ - return base64 != null ? Base64.decodeBase64(base64) :null; - } - - @Comment("根据byte[]进行base64解密") - @Example("${base64.decode(resp.bytes)}") - public static byte[] decode(byte[] base64){ - return base64 != null ? Base64.decodeBase64(base64) :null; - } - - @Comment("根据String进行base64解密") - @Example("${base64.decodeString(resp.html)}") - public static String decodeString(String base64){ - return base64 != null ? new String(Base64.decodeBase64(base64)) :null; - } - - @Comment("根据byte[]进行base64解密") - @Example("${base64.decodeString(resp.bytes)}") - public static String decodeString(byte[] base64){ - return base64 != null ? new String(Base64.decodeBase64(base64)) :null; - } - - @Comment("根据byte[]进行base64解密") - @Example("${base64.decodeString(resp.bytes,'UTF-8')}") - public static String decodeString(byte[] base64,String charset){ - return base64 != null ? StringFunctionExecutor.newString(Base64.decodeBase64(base64),charset) :null; - } -} diff --git a/spider/spiderflow/core/executor/function/DateFunctionExecutor.java b/spider/spiderflow/core/executor/function/DateFunctionExecutor.java deleted file mode 100644 index 695fded..0000000 --- a/spider/spiderflow/core/executor/function/DateFunctionExecutor.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.spiderflow.core.executor.function; - -import java.text.ParseException; -import java.util.Date; - -import org.apache.commons.lang3.time.DateFormatUtils; -import org.apache.commons.lang3.time.DateUtils; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; - -/** - * 时间获取/格式化 工具类 防止NPE 默认格式(yyyy-MM-dd HH:mm:ss) - * @author Administrator - * - */ -@Component -@Comment("日期常用方法") -public class DateFunctionExecutor implements FunctionExecutor{ - - @Override - public String getFunctionPrefix() { - return "date"; - } - - private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss"; - - @Comment("格式化日期") - @Example("${date.format(date.now())}") - public static String format(Date date) { - return format(date, DEFAULT_PATTERN); - } - - @Comment("格式化日期") - @Example("${date.format(1569059534000l)}") - public static String format(Long millis) { - return format(millis, DEFAULT_PATTERN); - } - - @Comment("格式化日期") - @Example("${date.format(date.now(),'yyyy-MM-dd')}") - public static String format(Date date, String pattern) { - return date != null ? DateFormatUtils.format(date, pattern) : null; - } - - @Comment("格式化日期") - @Example("${date.format(1569059534000l,'yyyy-MM-dd')}") - public static String format(Long millis, String pattern) { - return millis != null ? DateFormatUtils.format(millis, pattern) : null; - } - - @Comment("字符串转为日期类型") - @Example("${date.parse('2019-01-01 00:00:00')}") - public static Date parse(String date) throws ParseException{ - return date != null ? DateUtils.parseDate(date, DEFAULT_PATTERN) : null; - } - - @Comment("字符串转为日期类型") - @Example("${date.parse('2019-01-01','yyyy-MM-dd')}") - public static Date parse(String date,String pattern) throws ParseException{ - return date != null ? DateUtils.parseDate(date, pattern) : null; - } - - @Comment("数字为日期类型") - @Example("${date.parse(1569059534000l)}") - public static Date parse(Long millis){ - return new Date(millis); - } - - @Comment("获取当前时间") - @Example("${date.now()}") - public static Date now(){ - return new Date(); - } - - @Comment("获取指定日期n年后的日期") - @Example("${date.addYears(date.now(),2)}") - public static Date addYears(Date date,int amount){ - return DateUtils.addYears(date, amount); - } - - @Comment("获取指定日期n月后的日期") - @Example("${date.addMonths(date.now(),2)}") - public static Date addMonths(Date date,int amount){ - return DateUtils.addMonths(date, amount); - } - - @Comment("获取指定日期n天后的日期") - @Example("${date.addDays(date.now(),2)}") - public static Date addDays(Date date,int amount){ - return DateUtils.addDays(date, amount); - } - - @Comment("获取指定日期n小时后的日期") - @Example("${date.addHours(date.now(),2)}") - public static Date addHours(Date date,int amount){ - return DateUtils.addHours(date, amount); - } - - @Comment("获取指定日期n分钟后的日期") - @Example("${date.addMinutes(date.now(),2)}") - public static Date addMinutes(Date date,int amount){ - return DateUtils.addMinutes(date, amount); - } - - @Comment("获取指定日期n秒后的日期") - @Example("${date.addSeconds(date.now(),2)}") - public static Date addSeconds(Date date,int amount){ - return DateUtils.addSeconds(date, amount); - } -} diff --git a/spider/spiderflow/core/executor/function/ExtractFunctionExecutor.java b/spider/spiderflow/core/executor/function/ExtractFunctionExecutor.java deleted file mode 100644 index b131532..0000000 --- a/spider/spiderflow/core/executor/function/ExtractFunctionExecutor.java +++ /dev/null @@ -1,150 +0,0 @@ -package org.spiderflow.core.executor.function; - -import java.util.List; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Element; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.core.utils.ExtractUtils; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; - -@Component -@Comment("数据抽取常用方法") -public class ExtractFunctionExecutor implements FunctionExecutor{ - - @Override - public String getFunctionPrefix() { - return "extract"; - } - - @Comment("根据jsonpath提取内容") - @Example("${extract.jsonpath(resp.json,'$.code')}") - public static Object jsonpath(Object root,String jsonpath){ - return ExtractUtils.getValueByJsonPath(root, jsonpath); - } - - @Comment("根据正则表达式提取内容") - @Example("${extract.regx(resp.html,'(.*?)')}") - public static String regx(String content,String pattern){ - return ExtractUtils.getFirstMatcher(content, pattern, true); - } - - @Comment("根据正则表达式提取内容") - @Example("${extract.regx(resp.html,'(.*?)',1)}") - public static String regx(String content,String pattern,int groupIndex){ - return ExtractUtils.getFirstMatcher(content, pattern, groupIndex); - } - - @Comment("根据正则表达式提取内容") - @Example("${extract.regx(resp.html,'(.*?)',[1,2])}") - public static List regx(String content,String pattern,List groups){ - return ExtractUtils.getFirstMatcher(content, pattern, groups); - } - - @Comment("根据正则表达式提取内容") - @Example("${extract.regxs(resp.html,'

                        (.*?)

                        ')}") - public static List regxs(String content,String pattern){ - return ExtractUtils.getMatchers(content, pattern, true); - } - - @Comment("根据正则表达式提取内容") - @Example("${extract.regxs(resp.html,'

                        (.*?)

                        ',1)}") - public static List regxs(String content,String pattern,int groupIndex){ - return ExtractUtils.getMatchers(content, pattern, groupIndex); - } - - @Comment("根据正则表达式提取内容") - @Example("${extract.regxs(resp.html,'(.*?)',[1,2])}") - public static List> regxs(String content,String pattern,List groups){ - return ExtractUtils.getMatchers(content, pattern, groups); - } - - @Comment("根据xpath提取内容") - @Example("${extract.xpath(resp.element(),'//title/text()')}") - public static String xpath(Element element,String xpath){ - return ExtractUtils.getValueByXPath(element, xpath); - } - - @Comment("根据xpath提取内容") - @Example("${extract.xpath(resp.html,'//title/text()')}") - public static String xpath(String content,String xpath){ - return xpath(Jsoup.parse(content),xpath); - } - - @Comment("根据xpaths提取内容") - @Example("${extract.xpaths(resp.element(),'//h2/text()')}") - public static List xpaths(Element element,String xpath){ - return ExtractUtils.getValuesByXPath(element, xpath); - } - - @Comment("根据xpaths提取内容") - @Example("${extract.xpaths(resp.html,'//h2/text()')}") - public static List xpaths(String content,String xpath){ - return xpaths(Jsoup.parse(content),xpath); - } - - @Comment("根据css选择器提取内容") - @Example("${extract.selectors(resp.html,'div > a')}") - public static List selectors(Object object,String selector){ - return ExtractUtils.getHTMLBySelector(getElement(object), selector); - } - - @Comment("根据css选择器提取内容") - @Example("${extract.selector(resp.html,'div > a','text')}") - public static Object selector(Object object,String selector,String type){ - if("element".equals(type)){ - return ExtractUtils.getFirstElement(getElement(object), selector); - }else if("text".equals(type)){ - return ExtractUtils.getFirstTextBySelector(getElement(object), selector); - }else if("outerhtml".equals(type)){ - return ExtractUtils.getFirstOuterHTMLBySelector(getElement(object), selector); - } - return null; - } - - @Comment("根据css选择器提取内容") - @Example("${extract.selector(resp.html,'div > a','attr','href')}") - public static String selector(Object object,String selector,String type,String attrValue){ - if("attr".equals(type)){ - return ExtractUtils.getFirstAttrBySelector(getElement(object), selector,attrValue); - } - return null; - } - - @Comment("根据css选择器提取内容") - @Example("${extract.selector(resp.html,'div > a')}") - public static String selector(Object object,String selector){ - return ExtractUtils.getFirstHTMLBySelector(getElement(object), selector); - } - - @Comment("根据css选择器提取内容") - @Example("${extract.selectors(resp.html,'div > a','element')}") - public static Object selectors(Object object,String selector,String type){ - if("element".equals(type)){ - return ExtractUtils.getElements(getElement(object), selector); - }else if("text".equals(type)){ - return ExtractUtils.getTextBySelector(getElement(object), selector); - }else if("outerhtml".equals(type)){ - return ExtractUtils.getOuterHTMLBySelector(getElement(object), selector); - } - return null; - } - - @Comment("根据css选择器提取内容") - @Example("${extract.selectors(resp.html,'div > a','attr','href')}") - public static Object selectors(Object object,String selector,String type,String attrValue){ - if("attr".equals(type)){ - return ExtractUtils.getAttrBySelector(getElement(object), selector,attrValue); - } - return null; - } - - private static Element getElement(Object object){ - if(object != null){ - return object instanceof Element ? (Element)object:Jsoup.parse((String) object); - } - return null; - } -} diff --git a/spider/spiderflow/core/executor/function/FileFunctionExecutor.java b/spider/spiderflow/core/executor/function/FileFunctionExecutor.java deleted file mode 100644 index 8e8cc79..0000000 --- a/spider/spiderflow/core/executor/function/FileFunctionExecutor.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.spiderflow.core.executor.function; - -import java.io.*; -import java.nio.charset.Charset; -import java.util.List; - -import org.apache.commons.io.IOUtils; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.core.utils.FileUtils; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; -import org.springframework.util.DigestUtils; - -/** - * 文件读写 工具类 防止NPE - * @author Administrator - * - */ -@Component -@Comment("file常用方法") -public class FileFunctionExecutor implements FunctionExecutor{ - - @Override - public String getFunctionPrefix() { - return "file"; - } - - /** - * - * @param path 文件路径/名 - * @param createDirectory 是否需要创建 - * @return File 文件 - */ - private static File getFile(String path,boolean createDirectory){ - File f = new File(path); - if(createDirectory&&!f.getParentFile().exists()){ - f.getParentFile().mkdirs(); - } - return f; - } - - @Comment("写出文件") - @Example("${file.write('e:/result.html',resp.html,false)}") - public static void write(String path,String content,boolean append) throws IOException{ - write(path,content,Charset.defaultCharset().name(),append); - } - - @Comment("写出文件") - @Example("${file.write('e:/result.html',resp.html,'UTF-8',false)}") - public static void write(String path,String content,String charset,boolean append) throws IOException{ - write(path,StringFunctionExecutor.bytes(content, charset),append); - } - - @Comment("写出文件") - @Example("${file.write('e:/result.html',resp.bytes,false)}") - public static void write(String path,byte[] bytes,boolean append) throws IOException{ - write(path, new ByteArrayInputStream(bytes),append); - } - - @Comment("写出文件") - @Example("${file.write('e:/result.html',resp.stream,false)}") - public static void write(String path, InputStream stream, boolean append) throws IOException { - try(FileOutputStream fos = new FileOutputStream(getFile(path,true),append)){ - IOUtils.copyLarge(stream, fos); - } - } - - @Comment("写出文件") - @Example("${file.write('e:/result.html',resp.bytes,false)}") - public static void write(String path, InputStream stream) throws IOException { - write(path, stream,false); - } - - @Comment("写出文件") - @Example("${file.write('e:/result.html',resp.html)}") - public static void write(String path,String content) throws IOException{ - write(path,content,false); - } - - @Comment("写出文件") - @Example("${file.write('e:/result.html',resp.html,'UTF-8')}") - public static void write(String path,String content,String charset) throws IOException{ - write(path,content,charset,false); - } - - @Comment("写出文件") - @Example("${file.write('e:/result.html',resp.bytes)}") - public static void write(String path,byte[] bytes) throws IOException{ - write(path,bytes,false); - } - - @Comment("下载Url资源") - @Example("${file.write('e:/downloadPath',urls)}") - public static void write(String path, List urls) throws IOException{ - if(!CollectionUtils.isEmpty(urls)) { - for (String url : urls) { - FileUtils.downloadFile(path, url, true); - } - } - } - - @Comment("读取文件") - @Example("${file.bytes('e:/result.html')}") - public static byte[] bytes(String path) throws IOException{ - try(FileInputStream fis = new FileInputStream(getFile(path, false))){ - return IOUtils.toByteArray(fis); - } - } - - @Comment("读取文件") - @Example("${file.string('e:/result.html','UTF-8')}") - public static String string(String path,String charset) throws IOException{ - return StringFunctionExecutor.newString(bytes(path), charset); - } - - @Comment("读取文件") - @Example("${file.string('e:/result.html')}") - public static String string(String path) throws IOException{ - return StringFunctionExecutor.newString(bytes(path), Charset.defaultCharset().name()); - } - -} diff --git a/spider/spiderflow/core/executor/function/JsonFunctionExecutor.java b/spider/spiderflow/core/executor/function/JsonFunctionExecutor.java deleted file mode 100644 index c8677de..0000000 --- a/spider/spiderflow/core/executor/function/JsonFunctionExecutor.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.spiderflow.core.executor.function; - -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; - -import com.alibaba.fastjson.JSON; - -/** - * Json和String互相转换 工具类 防止NPE - * @author Administrator - * - */ -@Component -@Comment("json常用方法") -public class JsonFunctionExecutor implements FunctionExecutor{ - - @Override - public String getFunctionPrefix() { - return "json"; - } - - @Comment("将字符串转为json对象") - @Example("${json.parse('{code : 1}')}") - public static Object parse(String jsonString){ - return jsonString != null ? JSON.parse(jsonString) : null; - } - - @Comment("将对象转为json字符串") - @Example("${json.stringify(objVar)}") - public static String stringify(Object object){ - return object != null ? JSON.toJSONString(object) : null; - } -} diff --git a/spider/spiderflow/core/executor/function/ListFunctionExecutor.java b/spider/spiderflow/core/executor/function/ListFunctionExecutor.java deleted file mode 100644 index 248e142..0000000 --- a/spider/spiderflow/core/executor/function/ListFunctionExecutor.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.spiderflow.core.executor.function; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; - -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; - -/** - * List 工具类 防止NPE 添加了类似python的split()方法 - * @author Administrator - * - */ -@Component -@Comment("list常用方法") -public class ListFunctionExecutor implements FunctionExecutor{ - - @Override - public String getFunctionPrefix() { - return "list"; - } - - @Comment("获取list的长度") - @Example("${list.length(listVar)}") - public static int length(List list){ - return list != null ? list.size() : 0; - } - - /** - * - * @param list 原List - * @param len 按多长进行分割 - * @return List> 分割后的数组 - */ - @Comment("分割List") - @Example("${list.split(listVar,10)}") - public static List> split(List list,int len){ - List> result = new ArrayList<>(); - if (list == null || list.size() == 0 || len < 1) { - return result; - } - int size = list.size(); - int count = (size + len - 1) / len; - for (int i = 0; i < count; i++) { - List subList = list.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1))); - result.add(subList); - } - return result; - } - - @Comment("截取List") - @Example("${list.sublist(listVar,fromIndex,toIndex)}") - public static List sublist(List list,int fromIndex,int toIndex){ - return list!= null ? list.subList(fromIndex, toIndex) : new ArrayList<>(); - } - - @Comment("过滤字符串list元素") - @Example("${listVar.filterStr(pattern)}") - public static List filterStr(List list, String pattern) { - if (list == null || list.isEmpty()) { - return null; - } - List result = new ArrayList<>(list.size()); - for (String item : list) { - if (Pattern.matches(pattern, item)) { - result.add(item); - } - } - return result; - } - -} diff --git a/spider/spiderflow/core/executor/function/MD5FunctionExecutor.java b/spider/spiderflow/core/executor/function/MD5FunctionExecutor.java deleted file mode 100644 index 92da0c9..0000000 --- a/spider/spiderflow/core/executor/function/MD5FunctionExecutor.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.spiderflow.core.executor.function; - -import org.apache.commons.codec.digest.DigestUtils; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.io.InputStream; - -@Component -@Comment("MD5常用方法") -public class MD5FunctionExecutor implements FunctionExecutor { - - @Override - public String getFunctionPrefix() { - return "md5"; - } - - @Comment("md5加密") - @Example("${md5.string(resp.html)}") - public static String string(String str){ - return DigestUtils.md5Hex(str); - } - - @Comment("md5加密") - @Example("${md5.string(resp.bytes)}") - public static String string(byte[] bytes){ - return DigestUtils.md5Hex(bytes); - } - - @Comment("md5加密") - @Example("${md5.string(resp.stream)}") - public static String string(InputStream stream) throws IOException { - return DigestUtils.md5Hex(stream); - } - - @Comment("md5加密") - @Example("${md5.bytes(resp.html)}") - public static byte[] bytes(String str){ - return DigestUtils.md5(str); - } - - @Comment("md5加密") - @Example("${md5.bytes(resp.bytes)}") - public static byte[] bytes(byte[] bytes){ - return DigestUtils.md5(bytes); - } - - @Comment("md5加密") - @Example("${md5.bytes(resp.stream)}") - public static byte[] bytes(InputStream stream) throws IOException { - return DigestUtils.md5(stream); - } -} diff --git a/spider/spiderflow/core/executor/function/RandomFunctionExecutor.java b/spider/spiderflow/core/executor/function/RandomFunctionExecutor.java deleted file mode 100644 index 54857f3..0000000 --- a/spider/spiderflow/core/executor/function/RandomFunctionExecutor.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.spiderflow.core.executor.function; - -import org.apache.commons.lang3.RandomUtils; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; - -/** - * 随机数/字符串 生成方法 - * @author Administrator - * - */ -@Component -public class RandomFunctionExecutor implements FunctionExecutor{ - - @Override - public String getFunctionPrefix() { - return "random"; - } - - @Comment("随机获取int") - @Example("${random.randomInt(1,10)}") - public static int randomInt(int min,int max){ - return RandomUtils.nextInt(min, max); - } - - @Comment("随机获取double") - @Example("${random.randomDouble(1,10)}") - public static double randomDouble(double min,double max){ - return RandomUtils.nextDouble(min, max); - } - - @Comment("随机获取long") - @Example("${random.randomLong(1,10)}") - public static long randomLong(long min,long max){ - return RandomUtils.nextLong(min, max); - } - - /** - * - * @param chars 字符个数 - * @param length 字符范围 - * @return String 随机字符串 - */ - @Comment("随机获取字符串") - @Example("${random.string('abcde',10)}") - public static String string(String chars,int length){ - if (chars != null) { - char[] newChars = new char[length]; - int len = chars.length(); - for (int i = 0; i < length; i++) { - newChars[i] = chars.charAt(randomInt(0,len)); - } - return new String(newChars); - } - return null; - } - -} diff --git a/spider/spiderflow/core/executor/function/StringFunctionExecutor.java b/spider/spiderflow/core/executor/function/StringFunctionExecutor.java deleted file mode 100644 index a7b87aa..0000000 --- a/spider/spiderflow/core/executor/function/StringFunctionExecutor.java +++ /dev/null @@ -1,176 +0,0 @@ -package org.spiderflow.core.executor.function; - -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; - -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; - -/** - * String 工具类 防止NPE - * @author Administrator - * - */ -@Component -@Comment("string常用方法") -public class StringFunctionExecutor implements FunctionExecutor{ - - @Override - public String getFunctionPrefix() { - return "string"; - } - - @Comment("截取字符串方法") - @Example("${string.substring(str,5)}") - public static String substring(String content, int beginIndex) { - return content != null ? content.substring(beginIndex) : null; - } - - @Comment("截取字符串方法") - @Example("${string.substring(str,0,str.length() - 1)}") - public static String substring(String content, int beginIndex, int endIndex) { - return content != null ? content.substring(beginIndex, endIndex) : null; - } - - @Comment("将字符串转为小写") - @Example("${string.lower(str)}") - public static String lower(String content) { - return content != null ? content.toLowerCase() : null; - } - - @Comment("将字符串转为大写") - @Example("${string.upper(str)}") - public static String upper(String content) { - return content != null ? content.toUpperCase() : null; - } - - @Comment("查找指定字符在字符串在中的位置") - @Example("${string.indexOf(content,str)}") - public static int indexOf(String content, String str) { - return content != null ? content.indexOf(str) : -1; - } - - @Comment("查找指定字符在字符串中最后出现的位置") - @Example("${string.lastIndexOf(content,str)}") - public static int lastIndexOf(String content, String str) { - return content != null ? content.lastIndexOf(str) : -1; - } - - @Comment("查找指定字符在字符串在中的位置") - @Example("${string.indexOf(content,str,fromIndex)}") - public static int indexOf(String content, String str, int fromIndex) { - return content != null ? content.indexOf(str, fromIndex) : -1; - } - - @Comment("将字符串转为int") - @Example("${string.toInt(value)}") - public static int toInt(String value){ - return Integer.parseInt(value); - } - - @Comment("将字符串转为Integer") - @Example("${string.toInt(value,defaultValue)}") - public static Integer toInt(String value,Integer defaultValue){ - try { - return Integer.parseInt(value); - } catch (Exception e) { - return defaultValue; - } - } - - @Comment("字符串替换") - @Example("${string.replace(content,source,target)}") - public static String replace(String content,String source,String target){ - return content != null ? content.replace(source, target): null; - } - - @Comment("正则替换字符串") - @Example("${string.replaceAll(content,regx,target)}") - public static String replaceAll(String content,String regx,String target){ - return content != null ? content.replaceAll(regx, target): null; - } - - @Comment("正则替换字符串") - @Example("${string.replaceFirst(content,regx,target)}") - public static String replaceFirst(String content,String regx,String target){ - return content != null ? content.replaceFirst(regx, target): null; - } - - @Comment("正则替换字符串") - @Example("${string.length(content)}") - public static int length(String content){ - return content != null ? content.length() : -1; - } - - @Comment("去除字符串两边的空格") - @Example("${string.trim(content)}") - public static String trim(String content){ - return content != null ? content.trim() : null; - } - - @Comment("分割字符串") - @Example("${string.split(content,regx)}") - public static List split(String content,String regx){ - return content != null ? Arrays.asList(content.split(regx)) : new ArrayList<>(0); - } - - @Comment("获取字符串的byte[]") - @Example("${string.bytes(content)}") - public static byte[] bytes(String content){ - return content != null ? content.getBytes() : null; - } - - @Comment("获取字符串的byte[]") - @Example("${string.bytes(content,charset)}") - public static byte[] bytes(String content,String charset){ - try { - return content != null ? content.getBytes(charset) : null; - } catch (UnsupportedEncodingException e) { - return null; - } - } - - @Comment("byte[]转String") - @Example("${string.newString(bytes)}") - public static String newString(byte[] bytes){ - return bytes != null ? new String(bytes) : null; - } - - @Comment("byte[]转String") - @Example("${string.newString(bytes,charset)}") - public static String newString(byte[] bytes,String charset){ - try { - return bytes != null ? new String(bytes,charset) : null; - } catch (UnsupportedEncodingException e) { - return null; - } - } - - @Comment("判断两个字符串是否相同") - @Example("${string.newString(bytes,charset)}") - public static boolean equals(String str1,String str2){ - return str1 == null ? str2 == null : str1.equals(str2); - } - - @Comment("生成UUID") - @Example("${string.uuid()}") - public static String uuid() { - return UUID.randomUUID().toString().replace("-", ""); - } - - @Comment("生成多个UUID") - @Example("${string.uuid(size)}") - public static List uuids(Integer size) { - List ids = new ArrayList(); - for (int i = 0; i < size; i++) { - ids.add(UUID.randomUUID().toString().replace("-", "")); - } - return ids; - } - -} diff --git a/spider/spiderflow/core/executor/function/ThreadFunctionExecutor.java b/spider/spiderflow/core/executor/function/ThreadFunctionExecutor.java deleted file mode 100644 index ed1046b..0000000 --- a/spider/spiderflow/core/executor/function/ThreadFunctionExecutor.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.spiderflow.core.executor.function; - -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; - -/** - * Created on 2019-12-06 - * - * @author YZ255027 - Octopus - */ -@Component -@Comment("thread常用方法") -public class ThreadFunctionExecutor implements FunctionExecutor { - @Override - public String getFunctionPrefix() { - return "thread"; - } - - @Comment("线程休眠") - @Example("${thread.sleep(1000L)}") - public static void sleep(Long sleepTime){ - try { - Thread.sleep(sleepTime); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/spider/spiderflow/core/executor/function/UrlFunctionExecutor.java b/spider/spiderflow/core/executor/function/UrlFunctionExecutor.java deleted file mode 100644 index 16a5ed3..0000000 --- a/spider/spiderflow/core/executor/function/UrlFunctionExecutor.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.spiderflow.core.executor.function; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExecutor; -import org.springframework.stereotype.Component; - -/** - * url 按指定字符集进行编码/解码 默认字符集(UTF-8) 工具类 防止NPE - */ -@Component -public class UrlFunctionExecutor implements FunctionExecutor{ - - @Override - public String getFunctionPrefix() { - return "url"; - } - - @Comment("获取url参数") - @Example("${url.parameter('http://www.baidu.com/s?wd=spider-flow')}") - public static String parameter(String url,String key){ - return parameterMap(url).get(key); - } - - @Comment("获取url全部参数") - @Example("${url.parameterMap('http://www.baidu.com/s?wd=spider-flow&abbr=sf')}") - public static Map parameterMap(String url){ - Map map = new HashMap(); - int index = url.indexOf("?"); - if(index != -1) { - String param = url.substring(index+1); - if(StringUtils.isNotBlank(param)) { - String[] params = param.split("&"); - for (String item : params) { - String[] kv = item.split("="); - if(kv.length > 0) { - if(StringUtils.isNotBlank(kv[0])) { - String value = ""; - if(StringUtils.isNotBlank(kv[1])) { - int kv1Index = kv[1].indexOf("#"); - if(kv1Index != -1) { - value = kv[1].substring(0,kv1Index); - }else { - value = kv[1]; - } - } - map.put(kv[0],value); - } - } - } - } - } - return map; - } - - @Comment("url编码") - @Example("${url.encode('http://www.baidu.com/s?wd=spider-flow')}") - public static String encode(String url){ - return encode(url,Charset.defaultCharset().name()); - } - - @Comment("url编码") - @Example("${url.encode('http://www.baidu.com/s?wd=spider-flow','UTF-8')}") - public static String encode(String url,String charset){ - try { - return url != null ? URLEncoder.encode(url,charset) : null; - } catch (UnsupportedEncodingException e) { - return null; - } - } - - @Comment("url解码") - @Example("${url.decode(strVar)}") - public static String decode(String url){ - return decode(url,Charset.defaultCharset().name()); - } - - @Comment("url解码") - @Example("${url.decode(strVar,'UTF-8')}") - public static String decode(String url,String charset){ - try { - return url != null ? URLDecoder.decode(url, charset) : null; - } catch (UnsupportedEncodingException e) { - return null; - } - } -} diff --git a/spider/spiderflow/core/executor/function/extension/ArrayFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ArrayFunctionExtension.java deleted file mode 100644 index e463265..0000000 --- a/spider/spiderflow/core/executor/function/extension/ArrayFunctionExtension.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.spiderflow.core.executor.function.extension; - -import java.util.Arrays; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExtension; -import org.springframework.stereotype.Component; - -@Component -public class ArrayFunctionExtension implements FunctionExtension{ - - @Override - public Class support() { - return Object[].class; - } - - @Comment("获取数组的长度") - @Example("${arrayVar.size()}") - public static int size(Object[] objs){ - return objs.length; - } - - @Comment("将数组拼接起来") - @Example("${arrayVar.join()}") - public static String join(Object[] objs,String separator){ - return StringUtils.join(objs,separator); - } - - @Comment("将数组用separator拼接起来") - @Example("${arrayVar.join('-')}") - public static String join(Object[] objs){ - return StringUtils.join(objs); - } - - @Comment("将数组转为List") - @Example("${arrayVar.toList()}") - public static List toList(Object[] objs){ - return Arrays.asList(objs); - } - -} diff --git a/spider/spiderflow/core/executor/function/extension/DateFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/DateFunctionExtension.java deleted file mode 100644 index 32fccbf..0000000 --- a/spider/spiderflow/core/executor/function/extension/DateFunctionExtension.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.spiderflow.core.executor.function.extension; - -import java.util.Date; - -import org.apache.commons.lang3.time.DateFormatUtils; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExtension; -import org.springframework.stereotype.Component; - -@Component -public class DateFunctionExtension implements FunctionExtension{ - - @Override - public Class support() { - return Date.class; - } - - @Comment("格式化日期") - @Example("${dateVar.format()}") - public static String format(Date date){ - return format(date, "yyyy-MM-dd HH:mm:ss"); - } - - @Comment("格式化日期") - @Example("${dateVar.format('yyyy-MM-dd HH:mm:ss')}") - public static String format(Date date,String pattern){ - return DateFormatUtils.format(date,pattern); - } -} diff --git a/spider/spiderflow/core/executor/function/extension/ElementFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ElementFunctionExtension.java deleted file mode 100644 index 4ea62c1..0000000 --- a/spider/spiderflow/core/executor/function/extension/ElementFunctionExtension.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.spiderflow.core.executor.function.extension; - -import java.util.List; - -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.annotation.Return; -import org.spiderflow.core.utils.ExtractUtils; -import org.spiderflow.executor.FunctionExtension; -import org.springframework.stereotype.Component; - -@Component -public class ElementFunctionExtension implements FunctionExtension{ - - @Override - public Class support() { - return Element.class; - } - - @Comment("根据xpath提取内容") - @Example("${elementVar.xpath('//title/text()')}") - @Return({Element.class,String.class}) - public static String xpath(Element element,String xpath){ - return ExtractUtils.getValueByXPath(element, xpath); - } - - - @Comment("根据xpath提取内容") - @Example("${elementVar.xpaths('//h2/text()')}") - @Return({Element.class,String.class}) - public static List xpaths(Element element,String xpath){ - return ExtractUtils.getValuesByXPath(element, xpath); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementVar.regx('(.*?)')}") - public static String regx(Element element,String regx){ - return ExtractUtils.getFirstMatcher(element.html(), regx, true); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementVar.regx('(.*?)',1)}") - public static String regx(Element element,String regx,int groupIndex){ - return ExtractUtils.getFirstMatcher(element.html(), regx, groupIndex); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementVar.regx('(.*?)',[1,2])}") - public static List regx(Element element,String regx,List groups){ - return ExtractUtils.getFirstMatcher(element.html(), regx, groups); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementVar.regxs('

                        (.*?)

                        ')}") - public static List regxs(Element element,String regx){ - return ExtractUtils.getMatchers(element.html(), regx, true); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementVar.regxs('

                        (.*?)

                        ',1)}") - public static List regxs(Element element,String regx,int groupIndex){ - return ExtractUtils.getMatchers(element.html(), regx, groupIndex); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementVar.regxs('(.*?)',[1,2])}") - public static List> regxs(Element element,String regx,List groups){ - return ExtractUtils.getMatchers(element.html(), regx, groups); - } - - @Comment("根据css选择器提取内容") - @Example("${elementVar.selector('div > a')}") - public static Element selector(Element element,String cssQuery){ - return element.selectFirst(cssQuery); - } - - @Comment("根据css选择器提取内容") - @Example("${elementVar.selectors('div > a')}") - public static Elements selectors(Element element,String cssQuery){ - return element.select(cssQuery); - } - - -} diff --git a/spider/spiderflow/core/executor/function/extension/ElementsFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ElementsFunctionExtension.java deleted file mode 100644 index 8f20d28..0000000 --- a/spider/spiderflow/core/executor/function/extension/ElementsFunctionExtension.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.spiderflow.core.executor.function.extension; - -import java.util.List; - -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.annotation.Return; -import org.spiderflow.core.utils.ExtractUtils; -import org.spiderflow.executor.FunctionExtension; -import org.springframework.stereotype.Component; - -@Component -public class ElementsFunctionExtension implements FunctionExtension{ - - @Override - public Class support() { - return Elements.class; - } - - @Comment("根据xpath提取内容") - @Example("${elementsVar.xpath('//title/text()')}") - @Return({Element.class,String.class}) - public static String xpath(Elements elements,String xpath){ - return ExtractUtils.getValueByXPath(elements, xpath); - } - - @Comment("根据xpath提取内容") - @Example("${elementsVar.xpaths('//h2/text()')}") - @Return({Element.class,String.class}) - public static List xpaths(Elements elements,String xpath){ - return ExtractUtils.getValuesByXPath(elements, xpath); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementsVar.regx('(.*?)')}") - public static String regx(Elements elements,String regx){ - return ExtractUtils.getFirstMatcher(elements.html(), regx, true); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementsVar.regx('(.*?)',1)}") - public static String regx(Elements elements,String regx,int groupIndex){ - return ExtractUtils.getFirstMatcher(elements.html(), regx, groupIndex); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementsVar.regx('(.*?)',[1,2])}") - public static List regx(Elements elements,String regx,List groups){ - return ExtractUtils.getFirstMatcher(elements.html(), regx, groups); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementsVar.regxs('

                        (.*?)

                        ')}") - public static List regxs(Elements elements,String regx){ - return ExtractUtils.getMatchers(elements.html(), regx, true); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementsVar.regxs('

                        (.*?)

                        ',1)}") - public static List regxs(Elements elements,String regx,int groupIndex){ - return ExtractUtils.getMatchers(elements.html(), regx, groupIndex); - } - - @Comment("根据正则表达式提取内容") - @Example("${elementsVar.regxs('(.*?)',[1,2])}") - public static List> regxs(Elements elements,String regx,List groups){ - return ExtractUtils.getMatchers(elements.html(), regx, groups); - } - - @Comment("根据css选择器提取内容") - @Example("${elementsVar.selector('div > a')}") - public static Element selector(Elements elements,String selector){ - Elements foundElements = elements.select(selector); - if(foundElements.size() > 0){ - return foundElements.get(0); - } - return null; - } - - @Comment("根据css选择器提取内容") - @Example("${elementsVar.selectors('div > a')}") - public static Elements selectors(Elements elements,String selector){ - return elements.select(selector); - } -} diff --git a/spider/spiderflow/core/executor/function/extension/ListFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ListFunctionExtension.java deleted file mode 100644 index c75a202..0000000 --- a/spider/spiderflow/core/executor/function/extension/ListFunctionExtension.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.spiderflow.core.executor.function.extension; - -import org.apache.commons.lang3.StringUtils; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExtension; -import org.springframework.stereotype.Component; - -import java.util.Collections; -import java.util.List; - - -@Component -public class ListFunctionExtension implements FunctionExtension{ - - @Override - public Class support() { - return List.class; - } - - @Comment("获取list的长度") - @Example("${listVar.length()}") - public static int length(List list){ - return list.size(); - } - - @Comment("将list拼接起来") - @Example("${listVar.join()}") - public static String join(List list){ - return StringUtils.join(list.toArray()); - } - - @Comment("将list用separator拼接起来") - @Example("${listVar.join('-')}") - public static String join(List list,String separator){ - if(list.size() == 1){ - return list.get(0).toString(); - }else{ - return StringUtils.join(list.toArray(),separator); - } - } - - @Comment("将list排序") - @Example("${listVar.sort()}") - public static List sort(List list){ - Collections.sort(list); - return list; - } - - @Comment("将list打乱顺序") - @Example("${listVar.shuffle()}") - public static List shuffle(List list){ - Collections.shuffle(list); - return list; - } - -} diff --git a/spider/spiderflow/core/executor/function/extension/MapFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/MapFunctionExtension.java deleted file mode 100644 index e351f81..0000000 --- a/spider/spiderflow/core/executor/function/extension/MapFunctionExtension.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.spiderflow.core.executor.function.extension; - -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.executor.FunctionExtension; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Component -public class MapFunctionExtension implements FunctionExtension { - - @Override - public Class support() { - return Map.class; - } - - @Comment("将map转换为List") - @Example("${mapmVar.toList('=')}") - public static List toList(Map map,String separator){ - return map.entrySet().stream().map(entry-> entry.getKey() + separator + entry.getValue()).collect(Collectors.toList()); - } -} diff --git a/spider/spiderflow/core/executor/function/extension/ObjectFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ObjectFunctionExtension.java deleted file mode 100644 index 4ecf320..0000000 --- a/spider/spiderflow/core/executor/function/extension/ObjectFunctionExtension.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.spiderflow.core.executor.function.extension; - -import java.util.Objects; - -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.core.utils.ExtractUtils; -import org.spiderflow.executor.FunctionExtension; -import org.springframework.stereotype.Component; - -import com.alibaba.fastjson.JSON; - -@Component -public class ObjectFunctionExtension implements FunctionExtension{ - - @Override - public Class support() { - return Object.class; - } - - @Comment("将对象转为string类型") - @Example("${objVar.string()}") - public static String string(Object obj){ - if (obj instanceof String) { - return (String) obj; - } - return Objects.toString(obj); - } - - @Comment("根据jsonpath提取内容") - @Example("${objVar.jsonpath('$.code')}") - public static Object jsonpath(Object obj,String path){ - if(obj instanceof String){ - return ExtractUtils.getValueByJsonPath(JSON.parse((String)obj), path); - } - return ExtractUtils.getValueByJsonPath(obj, path); - } - - @Comment("睡眠等待一段时间") - @Example("${objVar.sleep(1000)}") - public static Object sleep(Object obj, int millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException ignored) { - } - return obj; - } -} diff --git a/spider/spiderflow/core/executor/function/extension/ResponseFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/ResponseFunctionExtension.java deleted file mode 100644 index 7bc62df..0000000 --- a/spider/spiderflow/core/executor/function/extension/ResponseFunctionExtension.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.spiderflow.core.executor.function.extension; - -import java.util.List; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.annotation.Return; -import org.spiderflow.core.utils.ExtractUtils; -import org.spiderflow.executor.FunctionExtension; -import org.spiderflow.io.SpiderResponse; -import org.springframework.stereotype.Component; - -@Component -public class ResponseFunctionExtension implements FunctionExtension { - - @Override - public Class support() { - return SpiderResponse.class; - } - - @Comment("将请求结果转为Element对象") - @Example("${resp.element()}") - public static Element element(SpiderResponse response) { - return Jsoup.parse(response.getHtml()); - } - - @Comment("根据xpath在请求结果中查找") - @Example("${resp.xpath('//title/text()')}") - @Return({Element.class, String.class}) - public static String xpath(SpiderResponse response, String xpath) { - return ExtractUtils.getValueByXPath(element(response), xpath); - } - - @Comment("根据xpath在请求结果中查找") - @Example("${resp.xpaths('//a/@href')}") - public static List xpaths(SpiderResponse response, String xpath) { - return ExtractUtils.getValuesByXPath(element(response), xpath); - } - - @Comment("根据正则表达式提取请求结果中的内容") - @Example("${resp.regx('(.*?)')}") - public static String regx(SpiderResponse response, String pattern) { - return ExtractUtils.getFirstMatcher(response.getHtml(), pattern, true); - } - - @Comment("根据正则表达式提取请求结果中的内容") - @Example("${resp.regx('(.*?)',1)}") - public static String regx(SpiderResponse response, String pattern, int groupIndex) { - return ExtractUtils.getFirstMatcher(response.getHtml(), pattern, groupIndex); - } - - @Comment("根据正则表达式提取请求结果中的内容") - @Example("${resp.regx('(.*?)',[1,2])}") - public static List regx(SpiderResponse response, String pattern, List groups) { - return ExtractUtils.getFirstMatcher(response.getHtml(), pattern, groups); - } - - @Comment("根据正则表达式提取请求结果中的内容") - @Example("${resp.regxs('

                        (.*?)

                        ')}") - public static List regxs(SpiderResponse response, String pattern) { - return ExtractUtils.getMatchers(response.getHtml(), pattern, true); - } - - @Comment("根据正则表达式提取请求结果中的内容") - @Example("${resp.regxs('

                        (.*?)

                        ',1)}") - public static List regxs(SpiderResponse response, String pattern, int groupIndex) { - return ExtractUtils.getMatchers(response.getHtml(), pattern, groupIndex); - } - - @Comment("根据正则表达式提取请求结果中的内容") - @Example("${resp.regxs('(.*?)',[1,2])}") - public static List> regxs(SpiderResponse response, String pattern, List groups) { - return ExtractUtils.getMatchers(response.getHtml(), pattern, groups); - } - - @Comment("根据css选择器提取请求结果") - @Example("${resp.selector('div > a')}") - public static Element selector(SpiderResponse response, String selector) { - return ElementFunctionExtension.selector(element(response), selector); - } - - @Comment("根据css选择器提取请求结果") - @Example("${resp.selectors('div > a')}") - public static Elements selectors(SpiderResponse response, String selector) { - return ElementFunctionExtension.selectors(element(response), selector); - } - - @Comment("根据jsonpath提取请求结果") - @Example("${resp.jsonpath('$.code')}") - public static Object jsonpath(SpiderResponse response, String path) { - return ExtractUtils.getValueByJsonPath(response.getJson(), path); - } - - @Comment("获取页面上的链接") - @Example("${resp.links()}") - public static List links(SpiderResponse response) { - return ExtractUtils.getAttrBySelector(element(response), "a", "abs:href") - .stream() - .filter(link -> StringUtils.isNotBlank(link)) - .collect(Collectors.toList()); - } - - @Comment("获取页面上的链接") - @Example("${resp.links('https://www\\.xxx\\.com/xxxx/(.*?)')}") - public static List links(SpiderResponse response, String regx) { - Pattern pattern = Pattern.compile(regx); - return links(response) - .stream() - .filter(link -> pattern.matcher(link).matches()) - .collect(Collectors.toList()); - } - - @Comment("获取当前页面所有图片链接") - @Example("${resp.images()}") - public static List images(SpiderResponse response) { - return ExtractUtils.getAttrBySelector(element(response), "img", "src") - .stream() - .filter(link -> StringUtils.isNotBlank(link)) - .collect(Collectors.toList()); - } -} diff --git a/spider/spiderflow/core/executor/function/extension/StringFunctionExtension.java b/spider/spiderflow/core/executor/function/extension/StringFunctionExtension.java deleted file mode 100644 index eb1380f..0000000 --- a/spider/spiderflow/core/executor/function/extension/StringFunctionExtension.java +++ /dev/null @@ -1,137 +0,0 @@ -package org.spiderflow.core.executor.function.extension; - -import java.text.ParseException; -import java.util.Date; -import java.util.List; - -import org.apache.commons.lang3.math.NumberUtils; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.annotation.Return; -import org.spiderflow.core.executor.function.DateFunctionExecutor; -import org.spiderflow.core.utils.ExtractUtils; -import org.spiderflow.executor.FunctionExtension; -import org.springframework.stereotype.Component; - -import com.alibaba.fastjson.JSON; - -@Component -public class StringFunctionExtension implements FunctionExtension{ - - @Override - public Class support() { - return String.class; - } - - @Comment("根据正则表达式提取String中的内容") - @Example("${strVar.regx('(.*?)')}") - public static String regx(String source,String pattern){ - return ExtractUtils.getFirstMatcher(source, pattern, true); - } - - @Comment("根据正则表达式提取String中的内容") - @Example("${strVar.regx('(.*?)',1)}") - public static String regx(String source,String pattern,int groupIndex){ - return ExtractUtils.getFirstMatcher(source, pattern, groupIndex); - } - - @Comment("根据正则表达式提取String中的内容") - @Example("${strVar.regx('(.*?)',[1,2])}") - public static List regx(String source,String pattern,List groups){ - return ExtractUtils.getFirstMatcher(source, pattern, groups); - } - - @Comment("根据正则表达式提取String中的内容") - @Example("${strVar.regxs('

                        (.*?)

                        ')}") - public static List regxs(String source,String pattern){ - return ExtractUtils.getMatchers(source, pattern, true); - } - - @Comment("根据正则表达式提取String中的内容") - @Example("${strVar.regxs('

                        (.*?)

                        ',1)}") - public static List regxs(String source,String pattern,int groupIndex){ - return ExtractUtils.getMatchers(source, pattern, groupIndex); - } - - @Comment("根据正则表达式提取String中的内容") - @Example("${strVar.regxs('(.*?)',[1,2])}") - public static List> regxs(String source,String pattern,List groups){ - return ExtractUtils.getMatchers(source, pattern, groups); - } - - @Comment("根据xpath在String变量中查找") - @Example("${strVar.xpath('//title/text()')}") - @Return({Element.class,String.class}) - public static String xpath(String source,String xpath){ - return ExtractUtils.getValueByXPath(Jsoup.parse(source), xpath); - } - - @Comment("根据xpath在String变量中查找") - @Example("${resp.xpaths('//a/@href')}") - public static List xpaths(String source,String xpath){ - return ExtractUtils.getValuesByXPath(Jsoup.parse(source), xpath); - } - - @Comment("将String变量转为Element对象") - @Example("${strVar.element()}") - public static Element element(String source){ - return Jsoup.parse(source); - } - - @Comment("根据css选择器提取") - @Example("${strVar.selector('div > a')}") - public static Element selector(String source,String cssQuery){ - return element(source).selectFirst(cssQuery); - } - - @Comment("根据css选择器提取") - @Example("${strVar.selector('div > a')}") - public static Elements selectors(String source,String cssQuery){ - return element(source).select(cssQuery); - } - - @Comment("将string转为json对象") - @Example("${strVar.json()}") - public static Object json(String source){ - return JSON.parse(source); - } - - @Comment("根据jsonpath提取内容") - @Example("${strVar.jsonpath('$.code')}") - public static Object jsonpath(String source,String jsonPath){ - return ExtractUtils.getValueByJsonPath(json(source), jsonPath); - } - - @Comment("将字符串转为int类型") - @Example("${strVar.toInt(0)}") - public static Integer toInt(String source,int defaultValue){ - return NumberUtils.toInt(source, defaultValue); - } - - @Comment("将字符串转为int类型") - @Example("${strVar.toInt()}") - public static Integer toInt(String source){ - return NumberUtils.toInt(source); - } - - @Comment("将字符串转为double类型") - @Example("${strVar.toDouble()}") - public static Double toDouble(String source){ - return NumberUtils.toDouble(source); - } - - @Comment("将字符串转为long类型") - @Example("${strVar.toLong()}") - public static Long toLong(String source){ - return NumberUtils.toLong(source); - } - - @Comment("将字符串转为date类型") - @Example("${strVar.toDate('yyyy-MM-dd HH:mm:ss')}") - public static Date toDate(String source,String pattern) throws ParseException{ - return DateFunctionExecutor.parse(source, pattern); - } -} diff --git a/spider/spiderflow/core/executor/shape/ExecuteSQLExecutor.java b/spider/spiderflow/core/executor/shape/ExecuteSQLExecutor.java deleted file mode 100644 index 8d21af9..0000000 --- a/spider/spiderflow/core/executor/shape/ExecuteSQLExecutor.java +++ /dev/null @@ -1,201 +0,0 @@ -package org.spiderflow.core.executor.shape; - -import java.lang.reflect.Array; -import java.util.*; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.ExpressionEngine; -import org.spiderflow.Grammerable; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.core.utils.DataSourceUtils; -import org.spiderflow.core.utils.ExtractUtils; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.model.Grammer; -import org.spiderflow.model.SpiderNode; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -/** - * SQL执行器 - * - * @author jmxd - */ -@Component -public class ExecuteSQLExecutor implements ShapeExecutor, Grammerable { - - public static final String DATASOURCE_ID = "datasourceId"; - - public static final String SQL = "sql"; - - public static final String STATEMENT_TYPE = "statementType"; - - public static final String STATEMENT_SELECT = "select"; - - public static final String STATEMENT_SELECT_ONE = "selectOne"; - - public static final String STATEMENT_SELECT_INT = "selectInt"; - - public static final String STATEMENT_INSERT = "insert"; - - public static final String STATEMENT_UPDATE = "update"; - - public static final String STATEMENT_DELETE = "delete"; - - private static final Logger logger = LoggerFactory.getLogger(ExecuteSQLExecutor.class); - - @Autowired - private ExpressionEngine engine; - - @Override - public void execute(SpiderNode node, SpiderContext context, Map variables) { - String dsId = node.getStringJsonValue(DATASOURCE_ID); - String sql = node.getStringJsonValue(SQL); - if (!StringUtils.isNotBlank(dsId)) { - logger.warn("数据源ID为空!"); - } else if (!StringUtils.isNotBlank(sql)) { - logger.warn("sql为空!"); - } else { - JdbcTemplate template = new JdbcTemplate(DataSourceUtils.getDataSource(dsId)); - //把变量替换成占位符 - List parameters = ExtractUtils.getMatchers(sql, "#(.*?)#", true); - sql = sql.replaceAll("#(.*?)#", "?"); - try { - Object sqlObject = engine.execute(sql, variables); - if(sqlObject == null){ - logger.warn("获取的sql为空!"); - return; - } - sql = sqlObject.toString(); - } catch (Exception e) { - logger.error("获取sql出错,异常信息:{}", e); - ExceptionUtils.wrapAndThrow(e); - } - int size = parameters.size(); - Object[] params = new Object[size]; - boolean hasList = false; - int parameterSize = 0; - //当参数中存在List或者数组时,认为是批量操作 - for (int i = 0; i < size; i++) { - Object parameter = engine.execute(parameters.get(i), variables); - if (parameter != null) { - if (parameter instanceof List) { - hasList = true; - parameterSize = Math.max(parameterSize, ((List) parameter).size()); - } else if (parameter.getClass().isArray()) { - hasList = true; - parameterSize = Math.max(parameterSize, Array.getLength(parameter)); - } - } - - params[i] = parameter; - } - String statementType = node.getStringJsonValue(STATEMENT_TYPE); - logger.debug("执行sql:{}", sql); - if (STATEMENT_SELECT.equals(statementType)) { - List> rs = null; - try { - rs = template.queryForList(sql, params); - variables.put("rs", rs); - } catch (Exception e) { - logger.error("执行sql出错,异常信息:{}", e); - ExceptionUtils.wrapAndThrow(e); - } - } else if (STATEMENT_SELECT_ONE.equals(statementType)) { - Map rs = null; - try { - rs = template.queryForMap(sql, params); - variables.put("rs", rs); - } catch (Exception e) { - logger.error("执行sql出错,异常信息:{}", e); - ExceptionUtils.wrapAndThrow(e); - } - } else if (STATEMENT_SELECT_INT.equals(statementType)) { - Integer rs = null; - try { - rs = template.queryForObject(sql, params, Integer.class); - rs = rs == null ? 0 : rs; - variables.put("rs", rs); - } catch (Exception e) { - logger.error("执行sql出错,异常信息:{}", e); - ExceptionUtils.wrapAndThrow(e); - } - } else if (STATEMENT_UPDATE.equals(statementType) || STATEMENT_INSERT.equals(statementType) || STATEMENT_DELETE.equals(statementType)) { - try { - int updateCount = 0; - if (hasList) { - /** - * 批量操作时,将参数Object[]转化为List - * 当参数不为数组或List时,自动转为Object[] - * 当数组或List长度不足时,自动取最后一项补齐 - */ - int[] rs = template.batchUpdate(sql, convertParameters(params, parameterSize)); - if (rs != null) { - updateCount = Arrays.stream(rs).sum(); - } - } else { - updateCount = template.update(sql, params); - } - variables.put("rs", updateCount); - } catch (Exception e) { - logger.error("执行sql出错,异常信息:{}", e); - variables.put("rs", -1); - ExceptionUtils.wrapAndThrow(e); - } - } - } - } - - private List convertParameters(Object[] params, int length) { - List result = new ArrayList<>(length); - int size = params.length; - for (int i = 0; i < length; i++) { - Object[] parameters = new Object[size]; - for (int j = 0; j < size; j++) { - parameters[j] = getValue(params[j], i); - } - result.add(parameters); - } - return result; - } - - private Object getValue(Object object, int index) { - if (object == null) { - return null; - } else if (object instanceof List) { - List list = (List) object; - int size = list.size(); - if (size > 0) { - return list.get(Math.min(list.size() - 1, index)); - } - } else if (object.getClass().isArray()) { - int size = Array.getLength(object); - if (size > 0) { - Array.get(object, Math.min(-1, index)); - } - } else { - return object; - } - return null; - } - - @Override - public String supportShape() { - return "executeSql"; - } - - @Override - public List grammers() { - Grammer grammer = new Grammer(); - grammer.setComment("执行SQL结果"); - grammer.setFunction("rs"); - grammer.setReturns(Arrays.asList("List>", "int")); - return Arrays.asList(grammer); - } - - -} diff --git a/spider/spiderflow/core/executor/shape/FunctionExecutor.java b/spider/spiderflow/core/executor/shape/FunctionExecutor.java deleted file mode 100644 index d0588b2..0000000 --- a/spider/spiderflow/core/executor/shape/FunctionExecutor.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.spiderflow.core.executor.shape; - -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.ExpressionEngine; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.model.SpiderNode; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 函数执行器 - * @author Administrator - * - */ -@Component -public class FunctionExecutor implements ShapeExecutor{ - - public static final String FUNCTION = "function"; - - private static final Logger logger = LoggerFactory.getLogger(FunctionExecutor.class); - - @Autowired - private ExpressionEngine engine; - - @Override - public void execute(SpiderNode node, SpiderContext context, Map variables) { - List> functions = node.getListJsonValue(FUNCTION); - for (Map item : functions) { - String function = item.get(FUNCTION); - if(StringUtils.isNotBlank(function)){ - try { - logger.debug("执行函数{}",function); - engine.execute(function, variables); - } catch (Exception e) { - logger.error("执行函数{}失败,异常信息:{}",function,e); - ExceptionUtils.wrapAndThrow(e); - } - } - } - } - - @Override - public String supportShape() { - return "function"; - } - -} diff --git a/spider/spiderflow/core/executor/shape/LoopExecutor.java b/spider/spiderflow/core/executor/shape/LoopExecutor.java deleted file mode 100644 index 6f04144..0000000 --- a/spider/spiderflow/core/executor/shape/LoopExecutor.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.spiderflow.core.executor.shape; - -import java.util.Map; - -import org.spiderflow.context.SpiderContext; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.model.SpiderNode; -import org.springframework.stereotype.Component; - -/** - * 循环执行器 - * @author Administrator - * - */ -@Component -public class LoopExecutor implements ShapeExecutor{ - - public static final String LOOP_NODE_KEY = "__loop_node_"; - - public static final String BEFORE_LOOP_VARIABLE = "__loop_before_variable_"; - - @Override - public void execute(SpiderNode node, SpiderContext context, Map variables) { - } - - @Override - public String supportShape() { - return "loop"; - } -} diff --git a/spider/spiderflow/core/executor/shape/LoopJoinExecutor.java b/spider/spiderflow/core/executor/shape/LoopJoinExecutor.java deleted file mode 100644 index 58e9a8d..0000000 --- a/spider/spiderflow/core/executor/shape/LoopJoinExecutor.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.spiderflow.core.executor.shape; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.context.RunnableTreeNode; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.model.SpiderNode; -import org.springframework.stereotype.Component; - -import java.util.Collection; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 等待循环结束执行器 - * - * @author Administrator - * - */ -@Component -public class LoopJoinExecutor implements ShapeExecutor { - - public static final String JOIN_NODE_ID = "joinNode"; - - public static final String VARIABLE_CONTEXT = "__variable_context"; - - private static final Logger logger = LoggerFactory.getLogger(LoopJoinExecutor.class); - - @Override - public void execute(SpiderNode node, SpiderContext context, Map variables) { - } - - @Override - public String supportShape() { - return "loopJoin"; - } - - @SuppressWarnings("unchecked") - @Override - public boolean allowExecuteNext(SpiderNode node, SpiderContext context, Map variables) { - String joinNodeId = node.getStringJsonValue(JOIN_NODE_ID); - Collection> variableCollection = (Collection>) variables.get(VARIABLE_CONTEXT + joinNodeId); - variableCollection.add(variables); - RunnableTreeNode treeNode = (RunnableTreeNode) variables.get(LoopExecutor.LOOP_NODE_KEY + joinNodeId); - if(treeNode != null){ - boolean isDone = treeNode.isDone(); - if(isDone){ - Map beforeLoopVariable = (Map) variables.get(LoopExecutor.BEFORE_LOOP_VARIABLE + joinNodeId); - variableCollection.stream() - .flatMap(map -> map.entrySet().stream()) - .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()))) - .forEach((k,v)->{ - String key = "@" + k; - if(variables.containsKey(key) == false || k.startsWith("@")){ - if(key.startsWith("@@")){ - key = k; - } - //清除掉原有变量 - variables.remove(k); - variables.put(key, v); - } - }); - //与循环前的变量进行合并 - variables.putAll(beforeLoopVariable); - //删除掉多余出来的聚合变量 - beforeLoopVariable.forEach((k,v)->{ - variables.remove("@" + k); - }); - variables.remove(VARIABLE_CONTEXT + joinNodeId); - beforeLoopVariable.clear(); - } - return isDone; - } else { - logger.warn("找不到等待节点:{}" + node.getStringJsonValue(JOIN_NODE_ID)); - } - return false; - } -} diff --git a/spider/spiderflow/core/executor/shape/OutputExecutor.java b/spider/spiderflow/core/executor/shape/OutputExecutor.java deleted file mode 100644 index 3d7efd4..0000000 --- a/spider/spiderflow/core/executor/shape/OutputExecutor.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.spiderflow.core.executor.shape; - -import java.util.List; -import java.util.Map; - -import com.alibaba.fastjson.JSON; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.ExpressionEngine; -import org.spiderflow.context.RunnableTreeNode; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.core.serializer.FastJsonSerializer; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.io.SpiderResponse; -import org.spiderflow.model.SpiderNode; -import org.spiderflow.model.SpiderOutput; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 输出执行器 - * @author Administrator - * - */ -@Component -public class OutputExecutor implements ShapeExecutor{ - - public static final String OUTPUT_ALL = "output-all"; - - public static final String OUTPUT_NAME = "output-name"; - - public static final String OUTPUT_VALUE = "output-value"; - - private static Logger logger = LoggerFactory.getLogger(OutputExecutor.class); - - @Autowired - private ExpressionEngine engine; - - @Override - public void execute(SpiderNode node, SpiderContext context, Map variables) { - SpiderOutput output = new SpiderOutput(); - output.setNodeName(node.getNodeName()); - output.setNodeId(node.getNodeId()); - boolean outputAll = "1".equals(node.getStringJsonValue(OUTPUT_ALL)); - if (outputAll) { - outputAll(output, variables); - } - List> outputs = node.getListJsonValue(OUTPUT_NAME, OUTPUT_VALUE); - for (Map item : outputs) { - Object value = null; - String outputValue = item.get(OUTPUT_VALUE); - String outputName = item.get(OUTPUT_NAME); - try { - value = engine.execute(outputValue, variables); - logger.debug("输出{}={}", outputName,value); - } catch (Exception e) { - logger.error("输出{}出错,异常信息:{}", outputName,e); - } - output.addOutput(outputName, value); - } - context.addOutput(output); - } - - /** - * 输出所有参数 - * @param output - * @param variables - */ - private void outputAll(SpiderOutput output,Map variables){ - for (Map.Entry item : variables.entrySet()) { - Object value = item.getValue(); - if (value instanceof SpiderResponse) { - SpiderResponse resp = (SpiderResponse) value; - output.addOutput(item.getKey() + ".html", resp.getHtml()); - continue; - } - //去除不输出的信息 - if ("ex".equals(item.getKey()) || value instanceof RunnableTreeNode) { - continue; - } - //去除不能序列化的参数 - try { - JSON.toJSONString(value, FastJsonSerializer.serializeConfig); - } catch (Exception e) { - continue; - } - //输出信息 - output.addOutput(item.getKey(), item.getValue()); - } - } - - @Override - public String supportShape() { - return "output"; - } - - @Override - public boolean isThread() { - return false; - } -} diff --git a/spider/spiderflow/core/executor/shape/ProcessExecutor.java b/spider/spiderflow/core/executor/shape/ProcessExecutor.java deleted file mode 100644 index 71d975c..0000000 --- a/spider/spiderflow/core/executor/shape/ProcessExecutor.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.spiderflow.core.executor.shape; - -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.core.Spider; -import org.spiderflow.core.model.SpiderFlow; -import org.spiderflow.core.service.SpiderFlowService; -import org.spiderflow.core.utils.SpiderFlowUtils; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.model.SpiderNode; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 子流程执行器 - * @author Administrator - * - */ -@Component -public class ProcessExecutor implements ShapeExecutor{ - - public static final String FLOW_ID = "flowId"; - - private static Logger logger = LoggerFactory.getLogger(ProcessExecutor.class); - - @Autowired - private SpiderFlowService spiderFlowService; - - @Autowired - private Spider spider; - - @Override - public void execute(SpiderNode node, SpiderContext context, Map variables) { - String flowId = node.getStringJsonValue("flowId"); - SpiderFlow spiderFlow = spiderFlowService.getById(flowId); - if(spiderFlow != null){ - logger.info("执行子流程:{}", spiderFlow.getName()); - SpiderNode root = SpiderFlowUtils.loadXMLFromString(spiderFlow.getXml()); - spider.executeNode(null,root,context,variables); - }else{ - logger.info("执行子流程:{}失败,找不到该子流程", flowId); - } - } - - @Override - public String supportShape() { - return "process"; - } - -} diff --git a/spider/spiderflow/core/executor/shape/RequestExecutor.java b/spider/spiderflow/core/executor/shape/RequestExecutor.java deleted file mode 100644 index fa40a73..0000000 --- a/spider/spiderflow/core/executor/shape/RequestExecutor.java +++ /dev/null @@ -1,367 +0,0 @@ -package org.spiderflow.core.executor.shape; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.*; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.apache.commons.lang3.math.NumberUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.ExpressionEngine; -import org.spiderflow.Grammerable; -import org.spiderflow.context.CookieContext; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.core.io.HttpRequest; -import org.spiderflow.core.io.HttpResponse; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.io.SpiderResponse; -import org.spiderflow.model.Grammer; -import org.spiderflow.model.SpiderNode; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * 请求执行器 - * @author Administrator - * - */ -@Component -public class RequestExecutor implements ShapeExecutor,Grammerable{ - - public static final String SLEEP = "sleep"; - - public static final String URL = "url"; - - public static final String PROXY = "proxy"; - - public static final String REQUEST_METHOD = "method"; - - public static final String PARAMETER_NAME = "parameter-name"; - - public static final String PARAMETER_VALUE = "parameter-value"; - - public static final String COOKIE_NAME = "cookie-name"; - - public static final String COOKIE_VALUE = "cookie-value"; - - public static final String PARAMETER_FORM_NAME = "parameter-form-name"; - - public static final String PARAMETER_FORM_VALUE = "parameter-form-value"; - - public static final String PARAMETER_FORM_FILENAME = "parameter-form-filename"; - - public static final String PARAMETER_FORM_TYPE = "parameter-form-type"; - - public static final String BODY_TYPE = "body-type"; - - public static final String BODY_CONTENT_TYPE = "body-content-type"; - - public static final String REQUEST_BODY = "request-body"; - - public static final String HEADER_NAME = "header-name"; - - public static final String HEADER_VALUE = "header-value"; - - public static final String TIMEOUT = "timeout"; - - public static final String RESPONSE_CHARSET = "response-charset"; - - public static final String FOLLOW_REDIRECT = "follow-redirect"; - - public static final String TLS_VALIDATE = "tls-validate"; - - public static final String LAST_EXECUTE_TIME = "__last_execute_time_"; - - public static final String COOKIE_AUTO_SET = "cookie-auto-set"; - - private static final Logger logger = LoggerFactory.getLogger(RequestExecutor.class); - - @Autowired - private ExpressionEngine engine; - - @Override - public String supportShape() { - return "request"; - } - - @PostConstruct - void init(){ - //允许设置被限制的请求头 - System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); - } - - @Override - public void execute(SpiderNode node, SpiderContext context, Map variables) { - CookieContext cookieContext = context.getCookieContext(); - String sleepCondition = node.getStringJsonValue(SLEEP); - if(StringUtils.isNotBlank(sleepCondition)){ - try { - Object value = engine.execute(sleepCondition, variables); - if(value != null){ - long sleepTime = NumberUtils.toLong(value.toString(), 0L); - synchronized (node.getNodeId().intern()) { - //实际等待时间 = 上次执行时间 + 睡眠时间 - 当前时间 - Long lastExecuteTime = context.get(LAST_EXECUTE_TIME + node.getNodeId(), 0L); - if (lastExecuteTime != 0) { - sleepTime = lastExecuteTime + sleepTime - System.currentTimeMillis(); - } - if (sleepTime > 0) { - logger.debug("设置延迟时间:{}ms", sleepTime); - Thread.sleep(sleepTime); - } - context.put(LAST_EXECUTE_TIME + node.getNodeId(), System.currentTimeMillis()); - } - } - } catch (Throwable t) { - logger.error("设置延迟时间失败:{}", t); - } - } - HttpRequest request = HttpRequest.create(); - //设置请求url - String url = null; - try { - url = engine.execute(node.getStringJsonValue(URL), variables).toString(); - } catch (Exception e) { - logger.error("设置请求url出错,异常信息:{}", e); - ExceptionUtils.wrapAndThrow(e); - } - logger.info("设置请求url:{}", url); - request.url(url); - //设置请求超时时间 - int timeout = NumberUtils.toInt(node.getStringJsonValue(TIMEOUT), 60000); - logger.debug("设置请求超时时间:{}", timeout); - request.timeout(timeout); - - String method = Objects.toString(node.getStringJsonValue(REQUEST_METHOD), "GET"); - //设置请求方法 - request.method(method); - logger.debug("设置请求方法:{}", method); - - //是否跟随重定向 - boolean followRedirects = !"0".equals(node.getStringJsonValue(FOLLOW_REDIRECT)); - request.followRedirect(followRedirects); - logger.debug("设置跟随重定向:{}", followRedirects); - - //是否验证TLS证书,默认是验证 - if("0".equals(node.getStringJsonValue(TLS_VALIDATE))){ - request.validateTLSCertificates(false); - logger.debug("设置TLS证书验证:{}", false); - } - SpiderNode root = context.getRootNode(); - //设置请求header - setRequestHeader(request, root.getListJsonValue(HEADER_NAME,HEADER_VALUE), context, variables); - setRequestHeader(request, node.getListJsonValue(HEADER_NAME,HEADER_VALUE), context, variables); - - //设置全局Cookie - Map cookies = getRequestCookie(request, root.getListJsonValue(COOKIE_NAME, COOKIE_VALUE), context, variables); - if(!cookies.isEmpty()){ - logger.info("设置全局Cookie:{}", cookies); - request.cookies(cookies); - } - //设置自动管理的Cookie - boolean cookieAutoSet = !"0".equals(node.getStringJsonValue(COOKIE_AUTO_SET)); - if(cookieAutoSet && !cookieContext.isEmpty()){ - request.cookies(cookieContext); - logger.info("自动设置Cookie:{}", cookieContext); - } - //设置本节点Cookie - cookies = getRequestCookie(request, node.getListJsonValue(COOKIE_NAME, COOKIE_VALUE), context, variables); - if(!cookies.isEmpty()){ - cookies.entrySet().forEach(entry->{ - try { - Object value = engine.execute(entry.getValue(), variables); - entry.setValue(Objects.toString(value)); - } catch (Exception e) { - logger.error("设置Cookie出错:{}",e); - } - - }); - logger.debug("设置Cookie:{}", cookies); - request.cookies(cookies); - } - if(cookieAutoSet){ - cookieContext.putAll(cookies); - } - - String bodyType = node.getStringJsonValue(BODY_TYPE); - List streams = null; - if("raw".equals(bodyType)){ - String contentType = node.getStringJsonValue(BODY_CONTENT_TYPE); - request.contentType(contentType); - try { - Object requestBody = engine.execute(node.getStringJsonValue(REQUEST_BODY), variables); - request.data(requestBody); - logger.info("设置请求Body:{}", requestBody); - } catch (Exception e) { - logger.debug("设置请求Body出错:{}", e); - } - }else if("form-data".equals(bodyType)){ - List> formParameters = node.getListJsonValue(PARAMETER_FORM_NAME,PARAMETER_FORM_VALUE,PARAMETER_FORM_TYPE,PARAMETER_FORM_FILENAME); - streams = setRequestFormParameter(request,formParameters,context,variables); - }else{ - //设置请求参数 - setRequestParameter(request,root.getListJsonValue(PARAMETER_NAME,PARAMETER_VALUE), context, variables); - setRequestParameter(request,node.getListJsonValue(PARAMETER_NAME,PARAMETER_VALUE),context,variables); - } - //设置代理 - String proxy = node.getStringJsonValue(PROXY); - if(proxy != null){ - try { - Object value = engine.execute(proxy, variables); - if(value != null){ - String[] proxyArr = value.toString().split(":"); - if(proxyArr.length == 2){ - request.proxy(proxyArr[0], Integer.parseInt(proxyArr[1])); - logger.info("设置代理:{}",proxy); - } - } - } catch (Exception e) { - logger.error("设置代理出错,异常信息:{}",e); - } - } - try { - HttpResponse response = request.execute(); - String charset = node.getStringJsonValue(RESPONSE_CHARSET); - if(StringUtils.isNotBlank(charset)){ - response.setCharset(charset); - logger.debug("设置response charset:{}",charset); - } - //cookie存入cookieContext - cookieContext.putAll(response.getCookies()); - //结果存入变量 - variables.put("resp", response); - } catch (IOException e) { - logger.error("请求{}出错,异常信息:{}",url,e); - ExceptionUtils.wrapAndThrow(e); - } finally{ - if(streams != null){ - for (InputStream is : streams) { - try { - is.close(); - } catch (Exception e) { - } - } - } - } - } - - private List setRequestFormParameter(HttpRequest request,List> parameters,SpiderContext context,Map variables){ - List streams = new ArrayList<>(); - if(parameters != null){ - for (Map nameValue : parameters) { - Object value = null; - String parameterName = nameValue.get(PARAMETER_FORM_NAME); - if(StringUtils.isNotBlank(parameterName)){ - String parameterValue = nameValue.get(PARAMETER_FORM_VALUE); - String parameterType = nameValue.get(PARAMETER_FORM_TYPE); - String parameterFilename = nameValue.get(PARAMETER_FORM_FILENAME); - boolean hasFile = "file".equals(parameterType); - try { - value = engine.execute(parameterValue, variables); - if(hasFile){ - InputStream stream = null; - if(value instanceof byte[]){ - stream = new ByteArrayInputStream((byte[]) value); - }else if(value instanceof String){ - stream = new ByteArrayInputStream(((String)value).getBytes()); - }else if(value instanceof InputStream){ - stream = (InputStream) value; - } - if(stream != null){ - streams.add(stream); - request.data(parameterName, parameterFilename, stream); - logger.info("设置请求参数:{}={}",parameterName,parameterFilename); - }else{ - logger.warn("设置请求参数:{}失败,无二进制内容",parameterName); - } - }else{ - request.data(parameterName, value); - logger.info("设置请求参数:{}={}",parameterName,value); - } - - } catch (Exception e) { - logger.error("设置请求参数:{}出错,异常信息:{}",parameterName,e); - } - } - } - } - return streams; - } - - private Map getRequestCookie(HttpRequest request, List> cookies, SpiderContext context, Map variables) { - Map cookieMap = new HashMap<>(); - if (cookies != null) { - for (Map nameValue : cookies) { - Object value = null; - String cookieName = nameValue.get(COOKIE_NAME); - if (StringUtils.isNotBlank(cookieName)) { - String cookieValue = nameValue.get(COOKIE_VALUE); - try { - value = engine.execute(cookieValue, variables); - if (value != null) { - cookieMap.put(cookieName, cookieValue); - logger.info("设置请求Cookie:{}={}", cookieName, value); - } - } catch (Exception e) { - logger.error("设置请求Cookie:{}出错,异常信息:{}", cookieName, e); - } - } - } - } - return cookieMap; - } - - private void setRequestParameter(HttpRequest request, List> parameters, SpiderContext context, Map variables) { - if (parameters != null) { - for (Map nameValue : parameters) { - Object value = null; - String parameterName = nameValue.get(PARAMETER_NAME); - if (StringUtils.isNotBlank(parameterName)) { - String parameterValue = nameValue.get(PARAMETER_VALUE); - try { - value = engine.execute(parameterValue, variables); - logger.info("设置请求参数:{}={}", parameterName, value); - } catch (Exception e) { - logger.error("设置请求参数:{}出错,异常信息:{}", parameterName, e); - } - request.data(parameterName, value); - } - } - } - } - - private void setRequestHeader(HttpRequest request, List> headers, SpiderContext context, Map variables) { - if (headers != null) { - for (Map nameValue : headers) { - Object value = null; - String headerName = nameValue.get(HEADER_NAME); - if (StringUtils.isNotBlank(headerName)) { - String headerValue = nameValue.get(HEADER_VALUE); - try { - value = engine.execute(headerValue, variables); - logger.info("设置请求Header:{}={}", headerName, value); - } catch (Exception e) { - logger.error("设置请求Header:{}出错,异常信息:{}", headerName, e); - } - request.header(headerName, value); - } - } - } - } - - @Override - public List grammers() { - List grammers = Grammer.findGrammers(SpiderResponse.class,"resp" , "SpiderResponse", false); - Grammer grammer = new Grammer(); - grammer.setFunction("resp"); - grammer.setComment("抓取结果"); - grammer.setOwner("SpiderResponse"); - grammers.add(grammer); - return grammers; - } -} diff --git a/spider/spiderflow/core/executor/shape/StartExecutor.java b/spider/spiderflow/core/executor/shape/StartExecutor.java deleted file mode 100644 index 8fc32ce..0000000 --- a/spider/spiderflow/core/executor/shape/StartExecutor.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.spiderflow.core.executor.shape; - -import java.util.Map; - -import org.spiderflow.context.SpiderContext; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.model.SpiderNode; -import org.springframework.stereotype.Component; - -/** - * 开始执行器 - * @author Administrator - * - */ -@Component -public class StartExecutor implements ShapeExecutor{ - - @Override - public void execute(SpiderNode node, SpiderContext context, Map variables) { - - } - - @Override - public String supportShape() { - return "start"; - } - -} diff --git a/spider/spiderflow/core/executor/shape/VariableExecutor.java b/spider/spiderflow/core/executor/shape/VariableExecutor.java deleted file mode 100644 index ec0287f..0000000 --- a/spider/spiderflow/core/executor/shape/VariableExecutor.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.spiderflow.core.executor.shape; - -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.ExpressionEngine; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.executor.ShapeExecutor; -import org.spiderflow.model.SpiderNode; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 定义变量执行器 - * @author Administrator - * - */ -@Component -public class VariableExecutor implements ShapeExecutor{ - - private static final String VARIABLE_NAME = "variable-name"; - - private static final String VARIABLE_VALUE = "variable-value"; - - private static final Logger logger = LoggerFactory.getLogger(VariableExecutor.class); - - @Autowired - private ExpressionEngine engine; - - @Override - public void execute(SpiderNode node, SpiderContext context, Map variables) { - List> variableList = node.getListJsonValue(VARIABLE_NAME,VARIABLE_VALUE); - for (Map nameValue : variableList) { - Object value = null; - String variableName = nameValue.get(VARIABLE_NAME); - String variableValue = nameValue.get(VARIABLE_VALUE); - try { - value = engine.execute(variableValue, variables); - logger.debug("设置变量{}={}",variableName,value); - } catch (Exception e) { - logger.error("设置变量{}出错,异常信息:{}",variableName,e); - ExceptionUtils.wrapAndThrow(e); - } - variables.put(variableName, value); - } - } - - @Override - public String supportShape() { - return "variable"; - } - - @Override - public boolean isThread() { - return false; - } - -} diff --git a/spider/spiderflow/core/expression/DefaultExpressionEngine.java b/spider/spiderflow/core/expression/DefaultExpressionEngine.java deleted file mode 100644 index d384e84..0000000 --- a/spider/spiderflow/core/expression/DefaultExpressionEngine.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.spiderflow.core.expression; - -import java.util.List; -import java.util.Map; - -import javax.annotation.PostConstruct; - -import org.apache.commons.lang3.StringUtils; -import org.spiderflow.ExpressionEngine; -import org.spiderflow.core.expression.interpreter.Reflection; -import org.spiderflow.executor.FunctionExecutor; -import org.spiderflow.executor.FunctionExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class DefaultExpressionEngine implements ExpressionEngine{ - - @Autowired - private List functionExecutors; - - @Autowired - private List functionExtensions; - - @PostConstruct - private void init(){ - for (FunctionExtension extension : functionExtensions) { - Reflection.getInstance().registerExtensionClass(extension.support(), extension.getClass()); - } - } - - @Override - public Object execute(String expression, Map variables) { - if(StringUtils.isBlank(expression)){ - return expression; - } - ExpressionTemplateContext context = new ExpressionTemplateContext(variables); - for (FunctionExecutor executor : functionExecutors) { - context.set(executor.getFunctionPrefix(), executor); - } - ExpressionGlobalVariables.getVariables().entrySet().forEach(entry->{ - context.set(entry.getKey(),ExpressionTemplate.create(entry.getValue()).render(context)); - }); - Object value = ExpressionTemplate.create(expression).render(context); - return value; - } - -} diff --git a/spider/spiderflow/core/expression/ExpressionError.java b/spider/spiderflow/core/expression/ExpressionError.java deleted file mode 100644 index fd49832..0000000 --- a/spider/spiderflow/core/expression/ExpressionError.java +++ /dev/null @@ -1,118 +0,0 @@ - -package org.spiderflow.core.expression; - -import org.spiderflow.core.expression.parsing.Span; -import org.spiderflow.core.expression.parsing.Span.Line; -import org.spiderflow.core.expression.parsing.TokenStream; - -/** All errors reported by the library go through the static functions of this class. */ -public class ExpressionError { - - /** - *

                        - * Create an error message based on the provided message and stream, highlighting the line on which the error happened. If the - * stream has more tokens, the next token will be highlighted. Otherwise the end of the source of the stream will be - * highlighted. - *

                        - * - *

                        - * Throws a {@link RuntimeException} - *

                        - */ - public static void error (String message, TokenStream stream) { - if (stream.hasMore()) - error(message, stream.consume().getSpan()); - else { - String source = stream.getSource(); - if (source == null) - error(message, new Span(" ", 0, 1)); - else - error(message, new Span(source, source.length() - 1, source.length())); - } - } - - /** Create an error message based on the provided message and location, highlighting the location in the line on which the - * error happened. Throws a {@link TemplateException} **/ - public static void error (String message, Span location, Throwable cause) { - - Line line = location.getLine(); - message = "Error (" + line.getLineNumber() + "): " + message + "\n\n"; - message += line.getText(); - message += "\n"; - - int errorStart = location.getStart() - line.getStart(); - int errorEnd = errorStart + location.getText().length() - 1; - for (int i = 0, n = line.getText().length(); i < n; i++) { - boolean useTab = line.getText().charAt(i) == '\t'; - message += i >= errorStart && i <= errorEnd ? "^" : useTab ? "\t" : " "; - } - - if (cause == null) - throw new TemplateException(message, location); - else - throw new TemplateException(message, location, cause); - } - - /** Create an error message based on the provided message and location, highlighting the location in the line on which the - * error happened. Throws a {@link TemplateException} **/ - public static void error (String message, Span location) { - error(message, location, null); - } - - /** Exception thrown by all basis-template code via {@link ExpressionError#error(String, Span)}. In case an error happens deep inside a - * list of included templates, the {@link #getMessage()} method will return a condensed error message. **/ - public static class TemplateException extends RuntimeException { - private static final long serialVersionUID = 1L; - private final Span location; - private final String errorMessage; - - private TemplateException (String message, Span location) { - super(message); - this.errorMessage = message; - this.location = location; - } - - public TemplateException (String message, Span location, Throwable cause) { - super(message, cause); - this.errorMessage = message; - this.location = location; - } - - /** Returns the location in the template at which the error happened. **/ - public Span getLocation () { - return location; - } - - @Override - public String getMessage () { - StringBuilder builder = new StringBuilder(); - - if (getCause() == null || getCause() == this) { - return super.getMessage(); - } - - builder.append(errorMessage.substring(0, errorMessage.indexOf('\n'))); - builder.append("\n"); - - Throwable cause = getCause(); - while (cause != null && cause != this) { - if (cause instanceof TemplateException) { - TemplateException ex = (TemplateException)cause; - if (ex.getCause() == null || ex.getCause() == ex) - builder.append(ex.errorMessage); - else - builder.append(ex.errorMessage.substring(0, ex.errorMessage.indexOf('\n'))); - builder.append("\n"); - } - cause = cause.getCause(); - } - return builder.toString(); - } - } - - public static class StringLiteralException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - } -} diff --git a/spider/spiderflow/core/expression/ExpressionGlobalVariables.java b/spider/spiderflow/core/expression/ExpressionGlobalVariables.java deleted file mode 100644 index 194d5db..0000000 --- a/spider/spiderflow/core/expression/ExpressionGlobalVariables.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.spiderflow.core.expression; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -public class ExpressionGlobalVariables { - - private static Map variables = new HashMap<>(); - - private static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); - - public static void reset(Map map){ - Lock lock = readWriteLock.writeLock(); - lock.lock(); - try { - variables.clear(); - variables.putAll(map); - } finally { - lock.unlock(); - } - } - - public static Map getVariables(){ - Lock lock = readWriteLock.readLock(); - lock.lock(); - try { - return variables; - } finally { - lock.unlock(); - } - } -} diff --git a/spider/spiderflow/core/expression/ExpressionTemplate.java b/spider/spiderflow/core/expression/ExpressionTemplate.java deleted file mode 100644 index 2f6b148..0000000 --- a/spider/spiderflow/core/expression/ExpressionTemplate.java +++ /dev/null @@ -1,38 +0,0 @@ - -package org.spiderflow.core.expression; - -import java.io.OutputStream; -import java.util.List; - -import org.spiderflow.core.expression.interpreter.AstInterpreter; -import org.spiderflow.core.expression.parsing.Ast; -import org.spiderflow.core.expression.parsing.Ast.Node; -import org.spiderflow.core.expression.parsing.Parser; - - -/** A template is loaded by a {@link TemplateLoader} from a file marked up with the basis-template language. The template can be - * rendered to a {@link String} or {@link OutputStream} by calling one of the render() methods. The - * {@link ExpressionTemplateContext} passed to the render() methods is used to look up variable values referenced in the - * template. */ -public class ExpressionTemplate { - private final List nodes; - - /** Internal. Created by {@link Parser}. **/ - private ExpressionTemplate (List nodes) { - this.nodes = nodes; - } - - public static ExpressionTemplate create(String source){ - return new ExpressionTemplate(Parser.parse(source)); - } - - /** Internal. The AST nodes representing this template after parsing. See {@link Ast}. Used by {@link AstInterpreter}. **/ - public List getNodes () { - return nodes; - } - - /** Renders the template using the TemplateContext to resolve variable values referenced in the template. **/ - public Object render (ExpressionTemplateContext context) { - return AstInterpreter.interpret(this, context); - } -} diff --git a/spider/spiderflow/core/expression/ExpressionTemplateContext.java b/spider/spiderflow/core/expression/ExpressionTemplateContext.java deleted file mode 100644 index 7f7d52a..0000000 --- a/spider/spiderflow/core/expression/ExpressionTemplateContext.java +++ /dev/null @@ -1,98 +0,0 @@ - -package org.spiderflow.core.expression; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.spiderflow.core.expression.interpreter.AstInterpreter; - - -/** - *

                        - * A template context stores mappings from variable names to user provided variable values. A {@link ExpressionTemplate} is given a context - * for rendering to resolve variable values it references in template expressions. - *

                        - * - *

                        - * Internally, a template context is a stack of these mappings, similar to scopes in a programming language, and used as such by - * the {@link AstInterpreter}. - *

                        - */ -public class ExpressionTemplateContext { - private final List> scopes = new ArrayList>(); - - /** Keeps track of previously allocated, unused scopes. New scopes are first tried to be retrieved from this pool to avoid - * generating garbage. **/ - private final List> freeScopes = new ArrayList>(); - - public ExpressionTemplateContext () { - push(); - } - - public ExpressionTemplateContext(Map variables) { - this(); - if(variables != null){ - variables.forEach(this::set); - } - } - - /** Sets the value of the variable with the given name. If the variable already exists in one of the scopes, that variable is - * set. Otherwise the variable is set on the last pushed scope. */ - public ExpressionTemplateContext set (String name, Object value) { - for (int i = scopes.size() - 1; i >= 0; i--) { - Map ctx = scopes.get(i); - if (ctx.isEmpty()) continue; - if (ctx.containsKey(name)) { - ctx.put(name, value); - return this; - } - } - - scopes.get(scopes.size() - 1).put(name, value); - return this; - } - - /** Sets the value of the variable with the given name on the last pushed scope **/ - public ExpressionTemplateContext setOnCurrentScope (String name, Object value) { - scopes.get(scopes.size() - 1).put(name, value); - return this; - } - - /** Internal. Returns the value of the variable with the given name, walking the scope stack from top to bottom, similar to how - * scopes in programming languages are searched for variables. */ - public Object get (String name) { - for (int i = scopes.size() - 1; i >= 0; i--) { - Map ctx = scopes.get(i); - if (ctx.isEmpty()) continue; - Object value = ctx.get(name); - if (value != null) return value; - } - return null; - } - - /** Internal. Returns all variables currently defined in this context. */ - public Set getVariables () { - Set variables = new HashSet(); - for (int i = 0, n = scopes.size(); i < n; i++) { - variables.addAll(scopes.get(i).keySet()); - } - return variables; - } - - /** Internal. Pushes a new "scope" onto the stack. **/ - public void push () { - Map newScope = freeScopes.size() > 0 ? freeScopes.remove(freeScopes.size() - 1) : new HashMap(); - scopes.add(newScope); - } - - /** Internal. Pops the top of the "scope" stack. **/ - public void pop () { - Map oldScope = scopes.remove(scopes.size() - 1); - oldScope.clear(); - freeScopes.add(oldScope); - } -} diff --git a/spider/spiderflow/core/expression/interpreter/AstInterpreter.java b/spider/spiderflow/core/expression/interpreter/AstInterpreter.java deleted file mode 100644 index 093934c..0000000 --- a/spider/spiderflow/core/expression/interpreter/AstInterpreter.java +++ /dev/null @@ -1,67 +0,0 @@ - -package org.spiderflow.core.expression.interpreter; - -import java.io.IOException; -import java.util.List; - -import org.spiderflow.core.expression.ExpressionError; -import org.spiderflow.core.expression.ExpressionError.TemplateException; -import org.spiderflow.core.expression.ExpressionTemplate; -import org.spiderflow.core.expression.ExpressionTemplateContext; -import org.spiderflow.core.expression.parsing.Ast; -import org.spiderflow.core.expression.parsing.Ast.Node; -import org.spiderflow.core.expression.parsing.Ast.Text; - -/** - *

                        - * Interprets a Template given a TemplateContext to lookup variable values in and writes the evaluation results to an output - * stream. Uses the global {@link Reflection} instance as returned by {@link Reflection#getInstance()} to access members and call - * methods. - *

                        - * - *

                        - * The interpeter traverses the AST as stored in {@link ExpressionTemplate#getNodes()}. the interpeter has a method for each AST node type - * (see {@link Ast} that evaluates that node. A node may return a value, to be used in the interpretation of a parent node or to - * be written to the output stream. - *

                        - **/ -public class AstInterpreter { - public static Object interpret (ExpressionTemplate template, ExpressionTemplateContext context) { - try { - return interpretNodeList(template.getNodes(), template, context); - } catch (Throwable t) { - if (t instanceof TemplateException) - throw (TemplateException)t; - else { - ExpressionError.error("执行表达式出错 " + t.getMessage(), template.getNodes().get(0).getSpan(),t); - return null; // never reached - } - } - } - - public static Object interpretNodeList (List nodes, ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - String result = ""; - for (int i = 0, n = nodes.size(); i < n; i++) { - Node node = nodes.get(i); - Object value = node.evaluate(template, context); - if(node instanceof Text){ - result += node.getSpan().getText(); - }else if(value == null){ - if(i == 0 && i + 1 == n){ - return null; - } - result += "null"; - }else if(value instanceof String || value instanceof Number || value instanceof Boolean){ - if(i ==0 && i + 1 ==n){ - return value; - } - result += value; - }else if(i + 1 < n){ - ExpressionError.error("表达式执行错误", node.getSpan()); - }else{ - return value; - } - } - return result; - } -} diff --git a/spider/spiderflow/core/expression/interpreter/JavaReflection.java b/spider/spiderflow/core/expression/interpreter/JavaReflection.java deleted file mode 100644 index 3e73d93..0000000 --- a/spider/spiderflow/core/expression/interpreter/JavaReflection.java +++ /dev/null @@ -1,365 +0,0 @@ - -package org.spiderflow.core.expression.interpreter; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class JavaReflection extends Reflection { - private final Map, Map> fieldCache = new ConcurrentHashMap, Map>(); - private final Map, Map> methodCache = new ConcurrentHashMap, Map>(); - private final Map, Map>> extensionmethodCache = new ConcurrentHashMap<>(); - - @SuppressWarnings("rawtypes") - @Override - public Object getField (Object obj, String name) { - Class cls = obj instanceof Class ? (Class)obj : obj.getClass(); - Map fields = fieldCache.get(cls); - if (fields == null) { - fields = new ConcurrentHashMap(); - fieldCache.put(cls, fields); - } - - Field field = fields.get(name); - if (field == null) { - try { - field = cls.getDeclaredField(name); - field.setAccessible(true); - fields.put(name, field); - } catch (Throwable t) { - // fall through, try super classes - } - - if (field == null) { - Class parentClass = cls.getSuperclass(); - while (parentClass != Object.class && parentClass != null) { - try { - field = parentClass.getDeclaredField(name); - field.setAccessible(true); - fields.put(name, field); - } catch (NoSuchFieldException e) { - // fall through - } - parentClass = parentClass.getSuperclass(); - } - } - } - - return field; - } - - @Override - public Object getFieldValue (Object obj, Object field) { - Field javaField = (Field)field; - try { - return javaField.get(obj); - } catch (Throwable e) { - throw new RuntimeException("Couldn't get value of field '" + javaField.getName() + "' from object of type '" + obj.getClass().getSimpleName() + "'"); - } - } - - @Override - public void registerExtensionClass(Class target,Class clazz){ - Method[] methods = clazz.getDeclaredMethods(); - if(methods != null){ - Map> cachedMethodMap = extensionmethodCache.get(target); - if(cachedMethodMap == null){ - cachedMethodMap = new HashMap<>(); - extensionmethodCache.put(target,cachedMethodMap); - } - for (Method method : methods) { - if(Modifier.isStatic(method.getModifiers()) && method.getParameterCount() > 0){ - List cachedList = cachedMethodMap.get(method.getName()); - if(cachedList == null){ - cachedList = new ArrayList<>(); - cachedMethodMap.put(method.getName(), cachedList); - } - cachedList.add(method); - } - } - } - } - - @Override - public Object getExtensionMethod(Object obj, String name, Object... arguments) { - Class cls = obj instanceof Class ? (Class)obj : obj.getClass(); - if(cls.isArray()){ - cls = Object[].class; - } - return getExtensionMethod(cls,name,arguments); - } - - private Object getExtensionMethod(Class cls, String name, Object... arguments) { - if(cls == null){ - cls = Object.class; - } - Map> methodMap = extensionmethodCache.get(cls); - if(methodMap != null){ - List methodList = methodMap.get(name); - if(methodList != null){ - Class[] parameterTypes = new Class[arguments.length + 1]; - parameterTypes[0] = cls; - for (int i = 0; i < arguments.length; i++) { - parameterTypes[i + 1] = arguments[i] == null ? null : arguments[i].getClass(); - } - return findMethod(methodList, parameterTypes); - } - } - if(cls != Object.class){ - Class[] interfaces = cls.getInterfaces(); - if(interfaces != null){ - for (Class clazz : interfaces) { - Object method = getExtensionMethod(clazz,name,arguments); - if(method != null){ - return method; - } - } - } - return getExtensionMethod(cls.getSuperclass(),name,arguments); - } - return null; - } - - @Override - public Object getMethod (Object obj, String name, Object... arguments) { - Class cls = obj instanceof Class ? (Class)obj : obj.getClass(); - Map methods = methodCache.get(cls); - if (methods == null) { - methods = new ConcurrentHashMap(); - methodCache.put(cls, methods); - } - - Class[] parameterTypes = new Class[arguments.length]; - for (int i = 0; i < arguments.length; i++) { - parameterTypes[i] = arguments[i] == null ? null : arguments[i].getClass(); - } - - JavaReflection.MethodSignature signature = new MethodSignature(name, parameterTypes); - Method method = methods.get(signature); - - if (method == null) { - try { - if (name == null) { - method = findApply(cls); - } else { - method = findMethod(cls, name, parameterTypes); - if(method == null && parameterTypes != null){ - method = findMethod(cls, name, new Class[]{Object[].class}); - } - } - method.setAccessible(true); - methods.put(signature, method); - } catch (Throwable e) { - // fall through - } - - if (method == null) { - Class parentClass = cls.getSuperclass(); - while (parentClass != Object.class && parentClass != null) { - try { - if (name == null) - method = findApply(parentClass); - else { - method = findMethod(parentClass, name, parameterTypes); - } - method.setAccessible(true); - methods.put(signature, method); - } catch (Throwable e) { - // fall through - } - parentClass = parentClass.getSuperclass(); - } - } - } - - return method; - } - - /** Returns the apply() method of a functional interface. **/ - private static Method findApply (Class cls) { - for (Method method : cls.getDeclaredMethods()) { - if (method.getName().equals("apply")) return method; - } - return null; - } - - private static Method findMethod (List methods, Class[] parameterTypes) { - Method foundMethod = null; - int foundScore = 0; - for (Method method : methods) { - // Check if the types match. - Class[] otherTypes = method.getParameterTypes(); - if(parameterTypes.length != otherTypes.length){ - continue; - } - boolean match = true; - int score = 0; - for (int ii = 0, nn = parameterTypes.length; ii < nn; ii++) { - Class type = parameterTypes[ii]; - Class otherType = otherTypes[ii]; - - if (!otherType.isAssignableFrom(type)) { - score++; - if (!isPrimitiveAssignableFrom(type, otherType)) { - score++; - if (!isCoercible(type, otherType)) { - match = false; - break; - } else { - score++; - } - } - }else if(type == null && otherType.isPrimitive()){ - match = false; - break; - } - } - if (match) { - if (foundMethod == null) { - foundMethod = method; - foundScore = score; - } else { - if (score < foundScore) { - foundScore = score; - foundMethod = method; - } - } - } - } - return foundMethod; - } - - /** Returns the method best matching the given signature, including type coercion, or null. **/ - private static Method findMethod (Class cls, String name, Class[] parameterTypes) { - Method[] methods = cls.getDeclaredMethods(); - List methodList = new ArrayList<>(); - for (int i = 0, n = methods.length; i < n; i++) { - Method method = methods[i]; - - // if neither name or parameter list size match, bail on this method - if (!method.getName().equals(name)) continue; - if (method.getParameterTypes().length != parameterTypes.length) continue; - methodList.add(method); - } - return findMethod(methodList,parameterTypes); - } - - /** Returns whether the from type can be assigned to the to type, assuming either type is a (boxed) primitive type. We can - * relax the type constraint a little, as we'll invoke a method via reflection. That means the from type will always be boxed, - * as the {@link Method#invoke(Object, Object...)} method takes objects. **/ - private static boolean isPrimitiveAssignableFrom (Class from, Class to) { - if ((from == Boolean.class || from == boolean.class) && (to == boolean.class || to == Boolean.class)) return true; - if ((from == Integer.class || from == int.class) && (to == int.class || to == Integer.class)) return true; - if ((from == Float.class || from == float.class) && (to == float.class || to == Float.class)) return true; - if ((from == Double.class || from == double.class) && (to == double.class || to == Double.class)) return true; - if ((from == Byte.class || from == byte.class) && (to == byte.class || to == Byte.class)) return true; - if ((from == Short.class || from == short.class) && (to == short.class || to == Short.class)) return true; - if ((from == Long.class || from == long.class) && (to == long.class || to == Long.class)) return true; - if ((from == Character.class || from == char.class) && (to == char.class || to == Character.class)) return true; - return false; - } - - public static String[] getStringTypes(Object[] objects){ - String[] parameterTypes = new String[objects == null ? 0: objects.length]; - if(objects != null){ - for(int i=0,len = objects.length;i from, Class to) { - if (from == Integer.class || from == int.class) { - return to == float.class || to == Float.class || to == double.class || to == Double.class || to == long.class || to == Long.class; - } - - if (from == Float.class || from == float.class) { - return to == double.class || to == Double.class; - } - - if (from == Double.class || from == double.class) { - return false; - } - - if (from == Character.class || from == char.class) { - return to == int.class || to == Integer.class || to == float.class || to == Float.class || to == double.class || to == Double.class || to == long.class - || to == Long.class; - } - - if (from == Byte.class || from == byte.class) { - return to == int.class || to == Integer.class || to == float.class || to == Float.class || to == double.class || to == Double.class || to == long.class - || to == Long.class || to == short.class || to == Short.class; - } - - if (from == Short.class || from == short.class) { - return to == int.class || to == Integer.class || to == float.class || to == Float.class || to == double.class || to == Double.class || to == long.class - || to == Long.class; - } - - if (from == Long.class || from == long.class) { - return to == float.class || to == Float.class || to == double.class || to == Double.class; - } - - if(from == int[].class || from == Integer[].class){ - return to == Object[].class || to == float[].class || to == Float[].class || to == double[].class || to == Double[].class || to == long[].class || to == Long[].class; - } - - return false; - } - - @Override - public Object callMethod (Object obj, Object method, Object... arguments) { - Method javaMethod = (Method)method; - try { - return javaMethod.invoke(obj, arguments); - } catch (Throwable t) { - throw new RuntimeException("Couldn't call method '" + javaMethod.getName() + "' with arguments '" + Arrays.toString(arguments) - + "' on object of type '" + obj.getClass().getSimpleName() + "'.", t); - } - } - - private static class MethodSignature { - private final String name; - @SuppressWarnings("rawtypes") private final Class[] parameters; - private final int hashCode; - - @SuppressWarnings("rawtypes") - public MethodSignature (String name, Class[] parameters) { - this.name = name; - this.parameters = parameters; - final int prime = 31; - int hash = 1; - hash = prime * hash + ((name == null) ? 0 : name.hashCode()); - hash = prime * hash + Arrays.hashCode(parameters); - hashCode = hash; - } - - @Override - public int hashCode () { - return hashCode; - } - - @Override - public boolean equals (Object obj) { - if (this == obj) return true; - if (obj == null) return false; - if (getClass() != obj.getClass()) return false; - JavaReflection.MethodSignature other = (JavaReflection.MethodSignature)obj; - if (name == null) { - if (other.name != null) return false; - } else if (!name.equals(other.name)) return false; - if (!Arrays.equals(parameters, other.parameters)) return false; - return true; - } - } -} diff --git a/spider/spiderflow/core/expression/interpreter/Reflection.java b/spider/spiderflow/core/expression/interpreter/Reflection.java deleted file mode 100644 index bddc723..0000000 --- a/spider/spiderflow/core/expression/interpreter/Reflection.java +++ /dev/null @@ -1,39 +0,0 @@ - -package org.spiderflow.core.expression.interpreter; - -/** Used by {@link AstInterpreter} to access fields and methods of objects. This is a singleton class used by all - * {@link AstInterpreter} instances. Replace the default implementation via {@link #setInstance(Reflection)}. The implementation - * must be thread-safe. */ -public abstract class Reflection { - private static Reflection instance = new JavaReflection(); - - /** Sets the Reflection instance to be used by all Template interpreters **/ - public synchronized static void setInstance (Reflection reflection) { - instance = reflection; - } - - /** Returns the Reflection instance used to fetch field and call methods **/ - public synchronized static Reflection getInstance () { - return instance; - } - - /** Returns an opaque handle to a field with the given name or null if the field could not be found **/ - public abstract Object getField (Object obj, String name); - - /** Returns an opaque handle to the method with the given name best matching the signature implied by the given arguments, or - * null if the method could not be found. If obj is an instance of Class, the matching static method is returned. If the name - * is null and the object is a {@link FunctionalInterface}, the first declared method on the object is returned. **/ - public abstract Object getMethod (Object obj, String name, Object... arguments); - - public abstract Object getExtensionMethod (Object obj, String name,Object ... arguments); - - public abstract void registerExtensionClass(Class target,Class clazz); - - /** Returns the value of the field from the object. The field must have been previously retrieved via - * {@link #getField(Object, String)}. **/ - public abstract Object getFieldValue (Object obj, Object field); - - /** Calls the method on the object with the given arguments. The method must have been previously retrieved via - * {@link #getMethod(Object, String, Object...)}. **/ - public abstract Object callMethod (Object obj, Object method, Object... arguments); -} diff --git a/spider/spiderflow/core/expression/parsing/Ast.java b/spider/spiderflow/core/expression/parsing/Ast.java deleted file mode 100644 index b820cd9..0000000 --- a/spider/spiderflow/core/expression/parsing/Ast.java +++ /dev/null @@ -1,1320 +0,0 @@ - -package org.spiderflow.core.expression.parsing; - -import java.io.IOException; -import java.lang.reflect.Array; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.xml.transform.Source; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.spiderflow.core.expression.ExpressionError; -import org.spiderflow.core.expression.ExpressionError.TemplateException; -import org.spiderflow.core.expression.ExpressionTemplate; -import org.spiderflow.core.expression.ExpressionTemplateContext; -import org.spiderflow.core.expression.interpreter.AstInterpreter; -import org.spiderflow.core.expression.interpreter.JavaReflection; -import org.spiderflow.core.expression.interpreter.Reflection; -import org.spiderflow.expression.DynamicMethod; - - -/** Templates are parsed into an abstract syntax tree (AST) nodes by a Parser. This class contains all AST node types. */ -public abstract class Ast { - - /** Base class for all AST nodes. A node minimally stores the {@link Span} that references its location in the - * {@link Source}. **/ - public abstract static class Node { - private final Span span; - - public Node (Span span) { - this.span = span; - } - - /** Returns the {@link Span} referencing this node's location in the {@link Source}. **/ - public Span getSpan () { - return span; - } - - @Override - public String toString () { - return span.getText(); - } - - public abstract Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException; - } - - /** A text node represents an "un-templated" span in the source that should be emitted verbatim. **/ - public static class Text extends Node { - private final String content; - - public Text (Span text) { - super(text); - String unescapedValue = text.getText(); - StringBuilder builder = new StringBuilder(); - - CharacterStream stream = new CharacterStream(unescapedValue); - while (stream.hasMore()) { - if (stream.match("\\{", true)) { - builder.append('{'); - } else if (stream.match("\\}", true)) { - builder.append('}'); - } else { - builder.append(stream.consume()); - } - } - content = builder.toString(); - } - - /** Returns the UTF-8 representation of this text node. **/ - public String getContent () { - return content; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return null; - } - } - - /** All expressions are subclasses of this node type. Expressions are separated into unary operations (!, -), binary operations - * (+, -, *, /, etc.) and ternary operations (?:). */ - public abstract static class Expression extends Node { - public Expression (Span span) { - super(span); - } - } - - /** An unary operation node represents a logical or numerical negation. **/ - public static class UnaryOperation extends Expression { - - public static enum UnaryOperator { - Not, Negate, Positive; - - public static UnaryOperator getOperator (Token op) { - if (op.getType() == TokenType.Not) { - return UnaryOperator.Not; - } - if (op.getType() == TokenType.Plus) { - return UnaryOperator.Positive; - } - if (op.getType() == TokenType.Minus) { - return UnaryOperator.Negate; - } - ExpressionError.error("Unknown unary operator " + op + ".", op.getSpan()); - return null; // not reached - } - } - - private final UnaryOperator operator; - private final Expression operand; - - public UnaryOperation (Token operator, Expression operand) { - super(operator.getSpan()); - this.operator = UnaryOperator.getOperator(operator); - this.operand = operand; - } - - public UnaryOperator getOperator () { - return operator; - } - - public Expression getOperand () { - return operand; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - Object operand = getOperand().evaluate(template, context); - - if (getOperator() == UnaryOperator.Negate) { - if (operand instanceof Integer) { - return -(Integer)operand; - } else if (operand instanceof Float) { - return -(Float)operand; - } else if (operand instanceof Double) { - return -(Double)operand; - } else if (operand instanceof Byte) { - return -(Byte)operand; - } else if (operand instanceof Short) { - return -(Short)operand; - } else if (operand instanceof Long) { - return -(Long)operand; - } else { - ExpressionError.error("Operand of operator '" + getOperator().name() + "' must be a number, got " + operand, getSpan()); - return null; // never reached - } - } else if (getOperator() == UnaryOperator.Not) { - if (!(operand instanceof Boolean)) { - ExpressionError.error("Operand of operator '" + getOperator().name() + "' must be a boolean", getSpan()); - } - return !(Boolean)operand; - } else { - return operand; - } - } - } - - /** A binary operation represents arithmetic operators, like addition or division, comparison operators, like less than or - * equals, logical operators, like and, or an assignment. **/ - public static class BinaryOperation extends Expression { - - public static enum BinaryOperator { - Addition, Subtraction, Multiplication, Division, Modulo, Equal, NotEqual, Less, LessEqual, Greater, GreaterEqual, And, Or, Xor, Assignment; - - public static BinaryOperator getOperator (Token op) { - if (op.getType() == TokenType.Plus) { - return BinaryOperator.Addition; - } - if (op.getType() == TokenType.Minus) { - return BinaryOperator.Subtraction; - } - if (op.getType() == TokenType.Asterisk) { - return BinaryOperator.Multiplication; - } - if (op.getType() == TokenType.ForwardSlash) { - return BinaryOperator.Division; - } - if (op.getType() == TokenType.Percentage) { - return BinaryOperator.Modulo; - } - if (op.getType() == TokenType.Equal) { - return BinaryOperator.Equal; - } - if (op.getType() == TokenType.NotEqual) { - return BinaryOperator.NotEqual; - } - if (op.getType() == TokenType.Less) { - return BinaryOperator.Less; - } - if (op.getType() == TokenType.LessEqual) { - return BinaryOperator.LessEqual; - } - if (op.getType() == TokenType.Greater) { - return BinaryOperator.Greater; - } - if (op.getType() == TokenType.GreaterEqual) { - return BinaryOperator.GreaterEqual; - } - if (op.getType() == TokenType.And) { - return BinaryOperator.And; - } - if (op.getType() == TokenType.Or) { - return BinaryOperator.Or; - } - if (op.getType() == TokenType.Xor) { - return BinaryOperator.Xor; - } - if (op.getType() == TokenType.Assignment) { - return BinaryOperator.Assignment; - } - ExpressionError.error("Unknown binary operator " + op + ".", op.getSpan()); - return null; // not reached - } - } - - private final Expression leftOperand; - private final BinaryOperator operator; - private final Expression rightOperand; - - public BinaryOperation (Expression leftOperand, Token operator, Expression rightOperand) { - super(operator.getSpan()); - this.leftOperand = leftOperand; - this.operator = BinaryOperator.getOperator(operator); - this.rightOperand = rightOperand; - } - - public Expression getLeftOperand () { - return leftOperand; - } - - public BinaryOperator getOperator () { - return operator; - } - - public Expression getRightOperand () { - return rightOperand; - } - - private Object evaluateAddition (Object left, Object right) { - if (left instanceof String || right instanceof String) { - return left.toString() + right.toString(); - } - if (left instanceof Double || right instanceof Double) { - return ((Number)left).doubleValue() + ((Number)right).doubleValue(); - } - if (left instanceof Float || right instanceof Float) { - return ((Number)left).floatValue() + ((Number)right).floatValue(); - } - if (left instanceof Long || right instanceof Long) { - return ((Number)left).longValue() + ((Number)right).longValue(); - } - if (left instanceof Integer || right instanceof Integer) { - return ((Number)left).intValue() + ((Number)right).intValue(); - } - if (left instanceof Short || right instanceof Short) { - return ((Number)left).shortValue() + ((Number)right).shortValue(); - } - if (left instanceof Byte || right instanceof Byte) { - return ((Number)left).byteValue() + ((Number)right).byteValue(); - } - - ExpressionError.error("Operands for addition operator must be numbers or strings, got " + left + ", " + right + ".", getSpan()); - return null; // never reached - } - - private Object evaluateSubtraction (Object left, Object right) { - if (left instanceof Double || right instanceof Double) { - return ((Number)left).doubleValue() - ((Number)right).doubleValue(); - } else if (left instanceof Float || right instanceof Float) { - return ((Number)left).floatValue() - ((Number)right).floatValue(); - } else if (left instanceof Long || right instanceof Long) { - return ((Number)left).longValue() - ((Number)right).longValue(); - } else if (left instanceof Integer || right instanceof Integer) { - return ((Number)left).intValue() - ((Number)right).intValue(); - } else if (left instanceof Short || right instanceof Short) { - return ((Number)left).shortValue() - ((Number)right).shortValue(); - } else if (left instanceof Byte || right instanceof Byte) { - return ((Number)left).byteValue() - ((Number)right).byteValue(); - } else { - ExpressionError.error("Operands for subtraction operator must be numbers" + left + ", " + right + ".", getSpan()); - return null; // never reached - } - } - - private Object evaluateMultiplication (Object left, Object right) { - if (left instanceof Double || right instanceof Double) { - return ((Number)left).doubleValue() * ((Number)right).doubleValue(); - } else if (left instanceof Float || right instanceof Float) { - return ((Number)left).floatValue() * ((Number)right).floatValue(); - } else if (left instanceof Long || right instanceof Long) { - return ((Number)left).longValue() * ((Number)right).longValue(); - } else if (left instanceof Integer || right instanceof Integer) { - return ((Number)left).intValue() * ((Number)right).intValue(); - } else if (left instanceof Short || right instanceof Short) { - return ((Number)left).shortValue() * ((Number)right).shortValue(); - } else if (left instanceof Byte || right instanceof Byte) { - return ((Number)left).byteValue() * ((Number)right).byteValue(); - } else { - ExpressionError.error("Operands for multiplication operator must be numbers" + left + ", " + right + ".", getSpan()); - return null; // never reached - } - } - - private Object evaluateDivision (Object left, Object right) { - if (left instanceof Double || right instanceof Double) { - return ((Number)left).doubleValue() / ((Number)right).doubleValue(); - } else if (left instanceof Float || right instanceof Float) { - return ((Number)left).floatValue() / ((Number)right).floatValue(); - } else if (left instanceof Long || right instanceof Long) { - return ((Number)left).longValue() / ((Number)right).longValue(); - } else if (left instanceof Integer || right instanceof Integer) { - return ((Number)left).intValue() / ((Number)right).intValue(); - } else if (left instanceof Short || right instanceof Short) { - return ((Number)left).shortValue() / ((Number)right).shortValue(); - } else if (left instanceof Byte || right instanceof Byte) { - return ((Number)left).byteValue() / ((Number)right).byteValue(); - } else { - ExpressionError.error("Operands for division operator must be numbers" + left + ", " + right + ".", getSpan()); - return null; // never reached - } - } - - private Object evaluateModulo (Object left, Object right) { - if (left instanceof Double || right instanceof Double) { - return ((Number)left).doubleValue() % ((Number)right).doubleValue(); - } else if (left instanceof Float || right instanceof Float) { - return ((Number)left).floatValue() % ((Number)right).floatValue(); - } else if (left instanceof Long || right instanceof Long) { - return ((Number)left).longValue() % ((Number)right).longValue(); - } else if (left instanceof Integer || right instanceof Integer) { - return ((Number)left).intValue() % ((Number)right).intValue(); - } else if (left instanceof Short || right instanceof Short) { - return ((Number)left).shortValue() % ((Number)right).shortValue(); - } else if (left instanceof Byte || right instanceof Byte) { - return ((Number)left).byteValue() % ((Number)right).byteValue(); - } else { - ExpressionError.error("Operands for modulo operator must be numbers" + left + ", " + right + ".", getSpan()); - return null; // never reached - } - } - - private boolean evaluateLess (Object left, Object right) { - if (left instanceof Double || right instanceof Double) { - return ((Number)left).doubleValue() < ((Number)right).doubleValue(); - } else if (left instanceof Float || right instanceof Float) { - return ((Number)left).floatValue() < ((Number)right).floatValue(); - } else if (left instanceof Long || right instanceof Long) { - return ((Number)left).longValue() < ((Number)right).longValue(); - } else if (left instanceof Integer || right instanceof Integer) { - return ((Number)left).intValue() < ((Number)right).intValue(); - } else if (left instanceof Short || right instanceof Short) { - return ((Number)left).shortValue() < ((Number)right).shortValue(); - } else if (left instanceof Byte || right instanceof Byte) { - return ((Number)left).byteValue() < ((Number)right).byteValue(); - } else { - ExpressionError.error("Operands for less operator must be numbers" + left + ", " + right + ".", getSpan()); - return false; // never reached - } - } - - private Object evaluateLessEqual (Object left, Object right) { - if (left instanceof Double || right instanceof Double) { - return ((Number)left).doubleValue() <= ((Number)right).doubleValue(); - } else if (left instanceof Float || right instanceof Float) { - return ((Number)left).floatValue() <= ((Number)right).floatValue(); - } else if (left instanceof Long || right instanceof Long) { - return ((Number)left).longValue() <= ((Number)right).longValue(); - } else if (left instanceof Integer || right instanceof Integer) { - return ((Number)left).intValue() <= ((Number)right).intValue(); - } else if (left instanceof Short || right instanceof Short) { - return ((Number)left).shortValue() <= ((Number)right).shortValue(); - } else if (left instanceof Byte || right instanceof Byte) { - return ((Number)left).byteValue() <= ((Number)right).byteValue(); - } else { - ExpressionError.error("Operands for less/equal operator must be numbers" + left + ", " + right + ".", getSpan()); - return null; // never reached - } - } - - private Object evaluateGreater (Object left, Object right) { - if (left instanceof Double || right instanceof Double) { - return ((Number)left).doubleValue() > ((Number)right).doubleValue(); - } else if (left instanceof Float || right instanceof Float) { - return ((Number)left).floatValue() > ((Number)right).floatValue(); - } else if (left instanceof Long || right instanceof Long) { - return ((Number)left).longValue() > ((Number)right).longValue(); - } else if (left instanceof Integer || right instanceof Integer) { - return ((Number)left).intValue() > ((Number)right).intValue(); - } else if (left instanceof Short || right instanceof Short) { - return ((Number)left).shortValue() > ((Number)right).shortValue(); - } else if (left instanceof Byte || right instanceof Byte) { - return ((Number)left).byteValue() > ((Number)right).byteValue(); - } else { - ExpressionError.error("Operands for greater operator must be numbers" + left + ", " + right + ".", getSpan()); - return null; // never reached - } - } - - private Object evaluateGreaterEqual (Object left, Object right) { - if (left instanceof Double || right instanceof Double) { - return ((Number)left).doubleValue() >= ((Number)right).doubleValue(); - } else if (left instanceof Float || right instanceof Float) { - return ((Number)left).floatValue() >= ((Number)right).floatValue(); - } else if (left instanceof Long || right instanceof Long) { - return ((Number)left).longValue() >= ((Number)right).longValue(); - } else if (left instanceof Integer || right instanceof Integer) { - return ((Number)left).intValue() >= ((Number)right).intValue(); - } else if (left instanceof Short || right instanceof Short) { - return ((Number)left).shortValue() >= ((Number)right).shortValue(); - } else if (left instanceof Byte || right instanceof Byte) { - return ((Number)left).byteValue() >= ((Number)right).byteValue(); - } else { - ExpressionError.error("Operands for greater/equal operator must be numbers" + left + ", " + right + ".", getSpan()); - return null; // never reached - } - } - - private Object evaluateAnd (Object left, ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - if (!(left instanceof Boolean)) { - ExpressionError.error("Left operand must be a boolean, got " + left + ".", getLeftOperand().getSpan()); - } - if (!(Boolean)left) { - return false; - } - Object right = getRightOperand().evaluate(template, context); - if (!(right instanceof Boolean)) { - ExpressionError.error("Right operand must be a boolean, got " + right + ".", getRightOperand().getSpan()); - } - return (Boolean)left && (Boolean)right; - } - - private Object evaluateOr (Object left, ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - if (!(left instanceof Boolean)) { - ExpressionError.error("Left operand must be a boolean, got " + left + ".", getLeftOperand().getSpan()); - } - if ((Boolean)left) { - return true; - } - Object right = getRightOperand().evaluate(template, context); - if (!(right instanceof Boolean)) { - ExpressionError.error("Right operand must be a boolean, got " + right + ".", getRightOperand().getSpan()); - } - return (Boolean)left || (Boolean)right; - } - - private Object evaluateXor (Object left, Object right) { - if (!(left instanceof Boolean)) { - ExpressionError.error("Left operand must be a boolean, got " + left + ".", getLeftOperand().getSpan()); - } - if (!(right instanceof Boolean)) { - ExpressionError.error("Right operand must be a boolean, got " + right + ".", getRightOperand().getSpan()); - } - return (Boolean)left ^ (Boolean)right; - } - - private Object evaluateEqual (Object left, Object right) { - if (left != null) { - return left.equals(right); - } - if (right != null) { - return right.equals(left); - } - return true; - } - - private Object evaluateNotEqual (Object left, Object right) { - return !(Boolean)evaluateEqual(left, right); - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - if (getOperator() == BinaryOperator.Assignment) { - if (!(getLeftOperand() instanceof VariableAccess)) { - ExpressionError.error("Can only assign to top-level variables in context.", getLeftOperand().getSpan()); - } - Object value = getRightOperand().evaluate(template, context); - context.set(((VariableAccess)getLeftOperand()).getVariableName().getText(), value); - return null; - } - - Object left = getLeftOperand().evaluate(template, context); - Object right = getOperator() == BinaryOperator.And || getOperator() == BinaryOperator.Or ? null : getRightOperand().evaluate(template, context); - - switch (getOperator()) { - case Addition: - return evaluateAddition(left, right); - case Subtraction: - return evaluateSubtraction(left, right); - case Multiplication: - return evaluateMultiplication(left, right); - case Division: - return evaluateDivision(left, right); - case Modulo: - return evaluateModulo(left, right); - case Less: - return evaluateLess(left, right); - case LessEqual: - return evaluateLessEqual(left, right); - case Greater: - return evaluateGreater(left, right); - case GreaterEqual: - return evaluateGreaterEqual(left, right); - case Equal: - return evaluateEqual(left, right); - case NotEqual: - return evaluateNotEqual(left, right); - case And: - return evaluateAnd(left, template, context); - case Or: - return evaluateOr(left, template, context); - case Xor: - return evaluateXor(left, right); - default: - ExpressionError.error("Binary operator " + getOperator().name() + " not implemented", getSpan()); - return null; - } - } - } - - /** A ternary operation is an abbreviated if/then/else operation, and equivalent to the the ternary operator in Java. **/ - public static class TernaryOperation extends Expression { - private final Expression condition; - private final Expression trueExpression; - private final Expression falseExpression; - - public TernaryOperation (Expression condition, Expression trueExpression, Expression falseExpression) { - super(new Span(condition.getSpan(), falseExpression.getSpan())); - this.condition = condition; - this.trueExpression = trueExpression; - this.falseExpression = falseExpression; - } - - public Expression getCondition () { - return condition; - } - - public Expression getTrueExpression () { - return trueExpression; - } - - public Expression getFalseExpression () { - return falseExpression; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - Object condition = getCondition().evaluate(template, context); - if (!(condition instanceof Boolean)) { - ExpressionError.error("Condition of ternary operator must be a boolean, got " + condition + ".", getSpan()); - } - return ((Boolean)condition) ? getTrueExpression().evaluate(template, context) : getFalseExpression().evaluate(template, context); - } - } - - /** A null literal, with the single value null **/ - public static class NullLiteral extends Expression { - public NullLiteral (Span span) { - super(span); - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return null; - } - } - - /** A boolean literal, with the values true and false **/ - public static class BooleanLiteral extends Expression { - private final Boolean value; - - public BooleanLiteral (Span literal) { - super(literal); - this.value = Boolean.parseBoolean(literal.getText()); - } - - public Boolean getValue () { - return value; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return value; - } - } - - /** A double precision floating point literal. Must be marked with the d suffix, e.g. "1.0d". **/ - public static class DoubleLiteral extends Expression { - private final Double value; - - public DoubleLiteral (Span literal) { - super(literal); - this.value = Double.parseDouble(literal.getText().substring(0, literal.getText().length() - 1)); - } - - public Double getValue () { - return value; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return value; - } - } - - /** A single precision floating point literla. May be optionally marked with the f suffix, e.g. "1.0f". **/ - public static class FloatLiteral extends Expression { - private final Float value; - - public FloatLiteral (Span literal) { - super(literal); - String text = literal.getText(); - if (text.charAt(text.length() - 1) == 'f') { - text = text.substring(0, text.length() - 1); - } - this.value = Float.parseFloat(text); - } - - public Float getValue () { - return value; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return value; - } - } - - /** A byte literal. Must be marked with the b suffix, e.g. "123b". **/ - public static class ByteLiteral extends Expression { - private final Byte value; - - public ByteLiteral (Span literal) { - super(literal); - this.value = Byte.parseByte(literal.getText().substring(0, literal.getText().length() - 1)); - } - - public Byte getValue () { - return value; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return value; - } - } - - /** A short literal. Must be marked with the s suffix, e.g. "123s". **/ - public static class ShortLiteral extends Expression { - private final Short value; - - public ShortLiteral (Span literal) { - super(literal); - this.value = Short.parseShort(literal.getText().substring(0, literal.getText().length() - 1)); - } - - public Short getValue () { - return value; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return value; - } - } - - /** An integer literal. **/ - public static class IntegerLiteral extends Expression { - private final Integer value; - - public IntegerLiteral (Span literal) { - super(literal); - this.value = Integer.parseInt(literal.getText()); - } - - public Integer getValue () { - return value; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return value; - } - } - - /** A long integer literal. Must be marked with the l suffix, e.g. "123l". **/ - public static class LongLiteral extends Expression { - private final Long value; - - public LongLiteral (Span literal) { - super(literal); - this.value = Long.parseLong(literal.getText().substring(0, literal.getText().length() - 1)); - } - - public Long getValue () { - return value; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return value; - } - } - - /** A character literal, enclosed in single quotes. Supports escape sequences \n, \r,\t, \' and \\. **/ - public static class CharacterLiteral extends Expression { - private final Character value; - - public CharacterLiteral (Span literal) { - super(literal); - - String text = literal.getText(); - if (text.length() > 3) { - if (text.charAt(2) == 'n') { - value = '\n'; - } else if (text.charAt(2) == 'r') { - value = '\r'; - } else if (text.charAt(2) == 't') { - value = '\t'; - } else if (text.charAt(2) == '\\') { - value = '\\'; - } else if (text.charAt(2) == '\'') { - value = '\''; - } else { - ExpressionError.error("Unknown escape sequence '" + literal.getText() + "'.", literal); - value = 0; // never reached - } - } else { - this.value = literal.getText().charAt(1); - } - } - - public Character getValue () { - return value; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return value; - } - } - - /** A string literal, enclosed in double quotes. Supports escape sequences \n, \r, \t, \" and \\. **/ - public static class StringLiteral extends Expression { - private final String value; - - public StringLiteral (Span literal) { - super(literal); - String text = getSpan().getText(); - String unescapedValue = text.substring(1, text.length() - 1); - StringBuilder builder = new StringBuilder(); - - CharacterStream stream = new CharacterStream(unescapedValue); - while (stream.hasMore()) { - if (stream.match("\\\\", true)) { - builder.append('\\'); - } else if (stream.match("\\n", true)) { - builder.append('\n'); - } else if (stream.match("\\r", true)) { - builder.append('\r'); - } else if (stream.match("\\t", true)) { - builder.append('\t'); - } else if (stream.match("\\\"", true)) { - builder.append('"'); - } else { - builder.append(stream.consume()); - } - } - value = builder.toString(); - } - - /** Returns the literal without quotes **/ - public String getValue () { - return value; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - return value; - } - } - - /** Represents a top-level variable access by name. E.g. in the expression "a + 1", a would be encoded as a - * VariableAccess node. Variables can be both read (in expressions) and written to (in assignments). Variable values are looked - * up and written to a {@link ExpressionTemplateContext}. **/ - public static class VariableAccess extends Expression { - public VariableAccess (Span name) { - super(name); - } - - public Span getVariableName () { - return getSpan(); - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - Object value = context.get(getSpan().getText()); - //if (value == null) ExpressionError.error("找不到变量'" + getSpan().getText() + "'或变量值为null", getSpan()); - return value; - } - } - - /** Represents a map or array element access of the form mapOrArray[keyOrIndex]. Maps and arrays may only be read - * from. **/ - public static class MapOrArrayAccess extends Expression { - private final Expression mapOrArray; - private final Expression keyOrIndex; - - public MapOrArrayAccess (Span span, Expression mapOrArray, Expression keyOrIndex) { - super(span); - this.mapOrArray = mapOrArray; - this.keyOrIndex = keyOrIndex; - } - - /** Returns an expression that must evaluate to a map or array. **/ - public Expression getMapOrArray () { - return mapOrArray; - } - - /** Returns an expression that is used as the key or index to fetch a map or array element. **/ - public Expression getKeyOrIndex () { - return keyOrIndex; - } - - @SuppressWarnings("rawtypes") - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - Object mapOrArray = getMapOrArray().evaluate(template, context); - if (mapOrArray == null) { - return null; - } - Object keyOrIndex = getKeyOrIndex().evaluate(template, context); - if (keyOrIndex == null) { - return null; - } - - if (mapOrArray instanceof Map) { - return ((Map)mapOrArray).get(keyOrIndex); - } else if (mapOrArray instanceof List) { - if (!(keyOrIndex instanceof Number)) { - ExpressionError.error("List index must be an integer, but was " + keyOrIndex.getClass().getSimpleName(), getKeyOrIndex().getSpan()); - } - int index = ((Number)keyOrIndex).intValue(); - return ((List)mapOrArray).get(index); - } else { - if (!(keyOrIndex instanceof Number)) { - ExpressionError.error("Array index must be an integer, but was " + keyOrIndex.getClass().getSimpleName(), getKeyOrIndex().getSpan()); - } - int index = ((Number)keyOrIndex).intValue(); - if (mapOrArray instanceof int[]) { - return ((int[])mapOrArray)[index]; - } else if (mapOrArray instanceof float[]) { - return ((float[])mapOrArray)[index]; - } else if (mapOrArray instanceof double[]) { - return ((double[])mapOrArray)[index]; - } else if (mapOrArray instanceof boolean[]) { - return ((boolean[])mapOrArray)[index]; - } else if (mapOrArray instanceof char[]) { - return ((char[])mapOrArray)[index]; - } else if (mapOrArray instanceof short[]) { - return ((short[])mapOrArray)[index]; - } else if (mapOrArray instanceof long[]) { - return ((long[])mapOrArray)[index]; - } else if (mapOrArray instanceof byte[]) { - return ((byte[])mapOrArray)[index]; - } else if (mapOrArray instanceof String) { - return Character.toString(((String)mapOrArray).charAt(index)); - } else { - return ((Object[])mapOrArray)[index]; - } - } - } - } - - /** Represents an access of a member (field or method or entry in a map) of the form object.member. Members may - * only be read from. **/ - public static class MemberAccess extends Expression { - private final Expression object; - private final Span name; - private Object cachedMember; - - public MemberAccess (Expression object, Span name) { - super(name); - this.object = object; - this.name = name; - } - - /** Returns the object on which to access the member. **/ - public Expression getObject () { - return object; - } - - /** The name of the member. **/ - public Span getName () { - return name; - } - - /** Returns the cached member descriptor as returned by {@link Reflection#getField(Object, String)} or - * {@link Reflection#getMethod(Object, String, Object...)}. See {@link #setCachedMember(Object)}. **/ - public Object getCachedMember () { - return cachedMember; - } - - /** Sets the member descriptor as returned by {@link Reflection#getField(Object, String)} or - * {@link Reflection#getMethod(Object, String, Object...)} for faster member lookups. Called by {@link AstInterpreter} the - * first time this node is evaluated. Subsequent evaluations can use the cached descriptor, avoiding a costly reflective - * lookup. **/ - public void setCachedMember (Object cachedMember) { - this.cachedMember = cachedMember; - } - - @SuppressWarnings("rawtypes") - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - Object object = getObject().evaluate(template, context); - if (object == null) { - return null; - } - - // special case for array.length - if (object.getClass().isArray() && getName().getText().equals("length")) { - return Array.getLength(object); - } - - // special case for map, allows to do map.key instead of map[key] - if (object instanceof Map) { - Map map = (Map)object; - return map.get(getName().getText()); - } - - Object field = getCachedMember(); - if (field != null) { - try { - return Reflection.getInstance().getFieldValue(object, field); - } catch (Throwable t) { - // fall through - } - } - String text = getName().getText(); - field = Reflection.getInstance().getField(object, text); - if (field == null) { - String methodName = null; - if(text.length() > 1){ - methodName = text.substring(0,1).toUpperCase() + text.substring(1); - }else{ - methodName = text.toUpperCase(); - } - MemberAccess access = new MemberAccess(this.object, new Span("get" + methodName)); - MethodCall methodCall = new MethodCall(getName(),access, Collections.emptyList()); - try { - return methodCall.evaluate(template, context); - } catch (TemplateException e) { - if(ExceptionUtils.indexOfThrowable(e, InvocationTargetException.class) > -1){ - ExpressionError.error(String.format("在%s中调用方法get%s发生异常" - ,object.getClass() - ,methodName), getSpan(),e); - return null; - } - access = new MemberAccess(this.object, new Span("is" + methodName)); - methodCall = new MethodCall(getName(),access, Collections.emptyList()); - try { - return methodCall.evaluate(template, context); - } catch (TemplateException e1) { - if(ExceptionUtils.indexOfThrowable(e1, InvocationTargetException.class) > -1){ - ExpressionError.error(String.format("在%s中调用方法is%s发生异常" - ,object.getClass() - ,methodName), getSpan(),e); - return null; - } - ExpressionError.error(String.format("在%s中找不到属性%s或者方法get%s、方法is%s" - ,object.getClass() - ,getName().getText() - ,methodName - ,methodName), getSpan()); - } - } - } - setCachedMember(field); - return Reflection.getInstance().getFieldValue(object, field); - } - } - - /** Represents a call to a top-level function. A function may either be a {@link FunctionalInterface} stored in a - * {@link ExpressionTemplateContext}, or a {@link Macro} defined in a template. */ - public static class FunctionCall extends Expression { - private final Expression function; - private final List arguments; - private Object cachedFunction; - private final ThreadLocal cachedArguments; - - public FunctionCall (Span span, Expression function, List arguments) { - super(span); - this.function = function; - this.arguments = arguments; - this.cachedArguments = new ThreadLocal(); - } - - /** Return the expression that must evaluate to a {@link FunctionalInterface} or a {@link Macro}. **/ - public Expression getFunction () { - return function; - } - - /** Returns the list of expressions to be passed to the function as arguments. **/ - public List getArguments () { - return arguments; - } - - /** Returns the cached "function" descriptor as returned by {@link Reflection#getMethod(Object, String, Object...)} or the - * {@link Macro}. See {@link #setCachedFunction(Object)}. **/ - public Object getCachedFunction () { - return cachedFunction; - } - - /** Sets the "function" descriptor as returned by {@link Reflection#getMethod(Object, String, Object...)} for faster - * lookups, or the {@link Macro} to be called. Called by {@link AstInterpreter} the first time this node is evaluated. - * Subsequent evaluations can use the cached descriptor, avoiding a costly reflective lookup. **/ - public void setCachedFunction (Object cachedFunction) { - this.cachedFunction = cachedFunction; - } - - /** Returns a scratch buffer to store arguments in when calling the function in {@link AstInterpreter}. Avoids generating - * garbage. **/ - public Object[] getCachedArguments () { - Object[] args = cachedArguments.get(); - if (args == null) { - args = new Object[arguments.size()]; - cachedArguments.set(args); - } - return args; - } - - /** Must be invoked when this node is done evaluating so we don't leak memory **/ - public void clearCachedArguments () { - Object[] args = getCachedArguments(); - for (int i = 0; i < args.length; i++) { - args[i] = null; - } - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - try { - Object[] argumentValues = getCachedArguments(); - List arguments = getArguments(); - for (int i = 0, n = argumentValues.length; i < n; i++) { - Expression expr = arguments.get(i); - argumentValues[i] = expr.evaluate(template, context); - } - - // This is a special case to handle template level macros. If a call to a macro is - // made, evaluating the function expression will result in an exception, as the - // function name can't be found in the context. Instead we need to manually check - // if the function expression is a VariableAccess and if so, if it can be found - // in the context. - Object function = null; - if (getFunction() instanceof VariableAccess) { - VariableAccess varAccess = (VariableAccess)getFunction(); - function = context.get(varAccess.getVariableName().getText()); - } else { - function = getFunction().evaluate(template, context); - } - - if (function != null) { - Object method = getCachedFunction(); - if (method != null) { - try { - return Reflection.getInstance().callMethod(function, method, argumentValues); - } catch (Throwable t) { - // fall through - } - } - method = Reflection.getInstance().getMethod(function, null, argumentValues); - if (method == null) { - ExpressionError.error("Couldn't find function.", getSpan()); - } - setCachedFunction(method); - try { - return Reflection.getInstance().callMethod(function, method, argumentValues); - } catch (Throwable t) { - ExpressionError.error(t.getMessage(), getSpan(), t); - return null; // never reached - } - } else { - ExpressionError.error("Couldn't find function.", getSpan()); - return null; // never reached - } - } finally { - clearCachedArguments(); - } - } - } - - /** Represents a call to a method of the form object.method(a, b, c). **/ - public static class MethodCall extends Expression { - private final MemberAccess method; - private final List arguments; - private Object cachedMethod; - private final ThreadLocal cachedArguments; - - public MethodCall (Span span, MemberAccess method, List arguments) { - super(span); - this.method = method; - this.arguments = arguments; - this.cachedArguments = new ThreadLocal(); - } - - /** Returns the object on which to call the method. **/ - public Expression getObject () { - return method.getObject(); - } - - /** Returns the method to call. **/ - public MemberAccess getMethod () { - return method; - } - - /** Returns the list of expressions to be passed to the function as arguments. **/ - public List getArguments () { - return arguments; - } - - /** Returns the cached member descriptor as returned by {@link Reflection#getMethod(Object, String, Object...)}. See - * {@link #setCachedMember(Object)}. **/ - public Object getCachedMethod () { - return cachedMethod; - } - - /** Sets the method descriptor as returned by {@link Reflection#getMethod(Object, String, Object...)} for faster lookups. - * Called by {@link AstInterpreter} the first time this node is evaluated. Subsequent evaluations can use the cached - * descriptor, avoiding a costly reflective lookup. **/ - public void setCachedMethod (Object cachedMethod) { - this.cachedMethod = cachedMethod; - } - - /** Returns a scratch buffer to store arguments in when calling the function in {@link AstInterpreter}. Avoids generating - * garbage. **/ - public Object[] getCachedArguments () { - Object[] args = cachedArguments.get(); - if (args == null) { - args = new Object[arguments.size()]; - cachedArguments.set(args); - } - return args; - } - - /** Must be invoked when this node is done evaluating so we don't leak memory **/ - public void clearCachedArguments () { - Object[] args = getCachedArguments(); - for (int i = 0; i < args.length; i++) { - args[i] = null; - } - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - try { - Object object = getObject().evaluate(template, context); - if (object == null) { - return null; - } - - Object[] argumentValues = getCachedArguments(); - List arguments = getArguments(); - for (int i = 0, n = argumentValues.length; i < n; i++) { - Expression expr = arguments.get(i); - argumentValues[i] = expr.evaluate(template, context); - } - if(object instanceof DynamicMethod){ - try { - Object method = DynamicMethod.class.getDeclaredMethod("execute", String.class,List.class); - Object[] newArgumentValues = new Object[]{getMethod().getName().getText(),Arrays.asList(argumentValues)}; - return Reflection.getInstance().callMethod(object, method, newArgumentValues); - } catch (Throwable t) { - ExpressionError.error(t.getMessage(), getSpan(), t); - return null; // never reached - } - } - - // Otherwise try to find a corresponding method or field pointing to a lambda. - Object method = getCachedMethod(); - if (method != null) { - try { - return Reflection.getInstance().callMethod(object, method, argumentValues); - } catch (Throwable t) { - // fall through - } - } - - method = Reflection.getInstance().getMethod(object, getMethod().getName().getText(), argumentValues); - if (method != null) { - // found the method on the object, call it - setCachedMethod(method); - try { - return Reflection.getInstance().callMethod(object, method, argumentValues); - } catch (Throwable t) { - ExpressionError.error(t.getMessage(), getSpan(), t); - return null; // never reached - } - } - method = Reflection.getInstance().getExtensionMethod(object, getMethod().getName().getText(), argumentValues); - if(method != null){ - try { - int argumentLength = argumentValues == null ? 0 : argumentValues.length; - Object[] parameters = new Object[argumentLength + 1]; - if(argumentLength > 0){ - for (int i = 0; i < argumentLength; i++) { - parameters[i + 1] = argumentValues[i]; - } - } - parameters[0] = object; - if(object.getClass().isArray()){ - Object[] objs = new Object[Array.getLength(object)]; - for (int i = 0,len = objs.length; i < len; i++) { - Array.set(objs, i, Array.get(object, i)); - } - parameters[0] = objs; - } - return Reflection.getInstance().callMethod(object, method, parameters); - } catch (Throwable t) { - ExpressionError.error(t.getMessage(), getSpan(), t); - // fall through - return null; - } - }else { - // didn't find the method on the object, try to find a field pointing to a lambda - Object field = Reflection.getInstance().getField(object, getMethod().getName().getText()); - if (field == null){ - ExpressionError.error("在'" + object.getClass() + "'中找不到方法 " + getMethod().getName().getText() + "(" + StringUtils.join(JavaReflection.getStringTypes(argumentValues),",") + ")", - getSpan()); - } - Object function = Reflection.getInstance().getFieldValue(object, field); - method = Reflection.getInstance().getMethod(function, null, argumentValues); - if (method == null){ - ExpressionError.error("在'" + object.getClass() + "'中找不到方法 " + getMethod().getName().getText() + "("+ StringUtils.join(JavaReflection.getStringTypes(argumentValues),",") +")", - getSpan()); - } - try { - return Reflection.getInstance().callMethod(function, method, argumentValues); - } catch (Throwable t) { - ExpressionError.error(t.getMessage(), getSpan(), t); - return null; // never reached - } - } - } finally { - clearCachedArguments(); - } - } - } - - /** Represents a map literal of the form { key: value, key2: value, ... } which can be nested. */ - public static class MapLiteral extends Expression { - private final List keys; - private final List values; - - public MapLiteral (Span span, List keys, List values) { - super(span); - this.keys = keys; - this.values = values; - } - - public List getKeys () { - return keys; - } - - public List getValues () { - return values; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - Map map = new HashMap<>(); - for (int i = 0, n = keys.size(); i < n; i++) { - Object value = values.get(i).evaluate(template, context); - Token tokenKey = keys.get(i); - String key = tokenKey.getSpan().getText(); - if(tokenKey.getType() == TokenType.StringLiteral){ - key = (String) new StringLiteral(tokenKey.getSpan()).evaluate(template, context); - }else if(key != null && key.startsWith("$")){ - Object objKey = context.get(key.substring(1)); - if(objKey != null){ - key = objKey.toString(); - }else{ - key = null; - } - } - map.put(key, value); - } - return map; - } - } - - /** Represents a list literal of the form [ value, value2, value3, ...] which can be nested. */ - public static class ListLiteral extends Expression { - public final List values; - - public ListLiteral (Span span, List values) { - super(span); - this.values = values; - } - - public List getValues () { - return values; - } - - @Override - public Object evaluate (ExpressionTemplate template, ExpressionTemplateContext context) throws IOException { - List list = new ArrayList<>(); - for (int i = 0, n = values.size(); i < n; i++) { - list.add(values.get(i).evaluate(template, context)); - } - return list; - } - } - -} diff --git a/spider/spiderflow/core/expression/parsing/CharacterStream.java b/spider/spiderflow/core/expression/parsing/CharacterStream.java deleted file mode 100644 index d23c57c..0000000 --- a/spider/spiderflow/core/expression/parsing/CharacterStream.java +++ /dev/null @@ -1,129 +0,0 @@ - -package org.spiderflow.core.expression.parsing; - -import javax.xml.transform.Source; - -/** Wraps a the content of a {@link Source} and handles traversing the contained characters. Manages a current {@link Span} via - * the {@link #startSpan()} and {@link #endSpan()} methods. */ -public class CharacterStream { - private final String source; - private int index = 0; - private final int end; - - private int spanStart = 0; - - public CharacterStream (String source) { - this(source, 0, source.length()); - } - - public CharacterStream (String source, int start, int end) { - if (start > end) throw new IllegalArgumentException("Start must be <= end."); - if (start < 0) throw new IndexOutOfBoundsException("Start must be >= 0."); - if (start > Math.max(0, source.length() - 1)) throw new IndexOutOfBoundsException("Start outside of string."); - if (end > source.length()) throw new IndexOutOfBoundsException("End outside of string."); - - this.source = source; - this.index = start; - this.end = end; - } - - /** Returns whether there are more characters in the stream **/ - public boolean hasMore () { - return index < end; - } - - /** Returns the next character without advancing the stream **/ - public char peek () { - if (!hasMore()) throw new RuntimeException("No more characters in stream."); - return source.charAt(index++); - } - - /** Returns the next character and advance the stream **/ - public char consume () { - if (!hasMore()) throw new RuntimeException("No more characters in stream."); - return source.charAt(index++); - } - - /** Matches the given needle with the next characters. Returns true if the needle is matched, false otherwise. If there's a - * match and consume is true, the stream is advanced by the needle's length. */ - public boolean match (String needle, boolean consume) { - int needleLength = needle.length(); - if(needleLength + index >end){ - return false; - } - for (int i = 0, j = index; i < needleLength; i++, j++) { - if (index >= end) return false; - if (needle.charAt(i) != source.charAt(j)) return false; - } - if (consume) index += needleLength; - return true; - } - - /** Returns whether the next character is a digit and optionally consumes it. **/ - public boolean matchDigit (boolean consume) { - if (index >= end) return false; - char c = source.charAt(index); - if (Character.isDigit(c)) { - if (consume) index++; - return true; - } - return false; - } - - /** Returns whether the next character is the start of an identifier and optionally consumes it. Adheres to - * {@link Character#isJavaIdentifierStart(char)}. **/ - public boolean matchIdentifierStart (boolean consume) { - if (index >= end) return false; - char c = source.charAt(index); - if (Character.isJavaIdentifierStart(c) || c == '@') { - if (consume) index++; - return true; - } - return false; - } - - /** Returns whether the next character is the start of an identifier and optionally consumes it. Adheres to - * {@link Character#isJavaIdentifierPart(char)}. **/ - public boolean matchIdentifierPart (boolean consume) { - if (index >= end) return false; - char c = source.charAt(index); - if (Character.isJavaIdentifierPart(c)) { - if (consume) index++; - return true; - } - return false; - } - - /** Skips any number of successive whitespace characters. **/ - public void skipWhiteSpace () { - while (true) { - if (index >= end) return; - char c = source.charAt(index); - if (c == ' ' || c == '\n' || c == '\r' || c == '\t') { - index++; - continue; - } else { - break; - } - } - } - - /** Start a new Span at the current stream position. Call {@link #endSpan()} to complete the span. **/ - public void startSpan () { - spanStart = index; - } - - /** Completes the span started with {@link #startSpan()} at the current stream position. **/ - public Span endSpan () { - return new Span(source, spanStart, index); - } - - public boolean isSpanEmpty () { - return spanStart == this.index; - } - - /** Returns the current character position in the stream. **/ - public int getPosition () { - return index; - } -} diff --git a/spider/spiderflow/core/expression/parsing/Parser.java b/spider/spiderflow/core/expression/parsing/Parser.java deleted file mode 100644 index 100f9c9..0000000 --- a/spider/spiderflow/core/expression/parsing/Parser.java +++ /dev/null @@ -1,242 +0,0 @@ -package org.spiderflow.core.expression.parsing; - - - -import java.util.ArrayList; -import java.util.List; - -import javax.xml.transform.Source; - -import org.spiderflow.core.expression.ExpressionError; -import org.spiderflow.core.expression.ExpressionTemplate; -import org.spiderflow.core.expression.parsing.Ast.BinaryOperation; -import org.spiderflow.core.expression.parsing.Ast.BooleanLiteral; -import org.spiderflow.core.expression.parsing.Ast.ByteLiteral; -import org.spiderflow.core.expression.parsing.Ast.CharacterLiteral; -import org.spiderflow.core.expression.parsing.Ast.DoubleLiteral; -import org.spiderflow.core.expression.parsing.Ast.Expression; -import org.spiderflow.core.expression.parsing.Ast.FloatLiteral; -import org.spiderflow.core.expression.parsing.Ast.FunctionCall; -import org.spiderflow.core.expression.parsing.Ast.IntegerLiteral; -import org.spiderflow.core.expression.parsing.Ast.ListLiteral; -import org.spiderflow.core.expression.parsing.Ast.LongLiteral; -import org.spiderflow.core.expression.parsing.Ast.MapLiteral; -import org.spiderflow.core.expression.parsing.Ast.MapOrArrayAccess; -import org.spiderflow.core.expression.parsing.Ast.MemberAccess; -import org.spiderflow.core.expression.parsing.Ast.MethodCall; -import org.spiderflow.core.expression.parsing.Ast.Node; -import org.spiderflow.core.expression.parsing.Ast.NullLiteral; -import org.spiderflow.core.expression.parsing.Ast.ShortLiteral; -import org.spiderflow.core.expression.parsing.Ast.StringLiteral; -import org.spiderflow.core.expression.parsing.Ast.TernaryOperation; -import org.spiderflow.core.expression.parsing.Ast.Text; -import org.spiderflow.core.expression.parsing.Ast.UnaryOperation; -import org.spiderflow.core.expression.parsing.Ast.VariableAccess; - - -/** Parses a {@link Source} into a {@link ExpressionTemplate}. The implementation is a simple recursive descent parser with a lookahead of - * 1. **/ -public class Parser { - - /** Parses a {@link Source} into a {@link ExpressionTemplate}. **/ - public static List parse (String source) { - List nodes = new ArrayList(); - TokenStream stream = new TokenStream(new Tokenizer().tokenize(source)); - while (stream.hasMore()) { - nodes.add(parseStatement(stream)); - } - return nodes; - } - - /** Parse a statement, which may either be a text block, if statement, for statement, while statement, macro definition, - * include statement or an expression. **/ - private static Node parseStatement (TokenStream tokens) { - Node result = null; - - if (tokens.match(TokenType.TextBlock, false)) - result = new Text(tokens.consume().getSpan()); - else - result = parseExpression(tokens); - - // consume semi-colons as statement delimiters - while (tokens.match(";", true)) - ; - - return result; - } - - - private static Expression parseExpression (TokenStream stream) { - return parseTernaryOperator(stream); - } - - private static Expression parseTernaryOperator (TokenStream stream) { - Expression condition = parseBinaryOperator(stream, 0); - if (stream.match(TokenType.Questionmark, true)) { - Expression trueExpression = parseTernaryOperator(stream); - stream.expect(TokenType.Colon); - Expression falseExpression = parseTernaryOperator(stream); - return new TernaryOperation(condition, trueExpression, falseExpression); - } else { - return condition; - } - } - - private static final TokenType[][] binaryOperatorPrecedence = new TokenType[][] {new TokenType[] {TokenType.Assignment}, - new TokenType[] {TokenType.Or, TokenType.And, TokenType.Xor}, new TokenType[] {TokenType.Equal, TokenType.NotEqual}, - new TokenType[] {TokenType.Less, TokenType.LessEqual, TokenType.Greater, TokenType.GreaterEqual}, new TokenType[] {TokenType.Plus, TokenType.Minus}, - new TokenType[] {TokenType.ForwardSlash, TokenType.Asterisk, TokenType.Percentage}}; - - private static Expression parseBinaryOperator (TokenStream stream, int level) { - int nextLevel = level + 1; - Expression left = nextLevel == binaryOperatorPrecedence.length ? parseUnaryOperator(stream) : parseBinaryOperator(stream, nextLevel); - - TokenType[] operators = binaryOperatorPrecedence[level]; - while (stream.hasMore() && stream.match(false, operators)) { - Token operator = stream.consume(); - Expression right = nextLevel == binaryOperatorPrecedence.length ? parseUnaryOperator(stream) : parseBinaryOperator(stream, nextLevel); - left = new BinaryOperation(left, operator, right); - } - - return left; - } - - private static final TokenType[] unaryOperators = new TokenType[] {TokenType.Not, TokenType.Plus, TokenType.Minus}; - - private static Expression parseUnaryOperator (TokenStream stream) { - if (stream.match(false, unaryOperators)) { - return new UnaryOperation(stream.consume(), parseUnaryOperator(stream)); - } else { - if (stream.match(TokenType.LeftParantheses, true)) { - Expression expression = parseExpression(stream); - stream.expect(TokenType.RightParantheses); - return expression; - } else { - return parseAccessOrCallOrLiteral(stream); - } - } - } - - private static Expression parseAccessOrCallOrLiteral (TokenStream stream) { - if (stream.match(TokenType.Identifier, false)) { - return parseAccessOrCall(stream,TokenType.Identifier); - } else if (stream.match(TokenType.LeftCurly, false)) { - return parseMapLiteral(stream); - } else if (stream.match(TokenType.LeftBracket, false)) { - return parseListLiteral(stream); - } else if (stream.match(TokenType.StringLiteral, false)) { - if(stream.hasNext()){ - if(stream.next().getType() == TokenType.Period){ - stream.prev(); - return parseAccessOrCall(stream,TokenType.StringLiteral); - } - stream.prev(); - } - - return new StringLiteral(stream.expect(TokenType.StringLiteral).getSpan()); - } else if (stream.match(TokenType.BooleanLiteral, false)) { - return new BooleanLiteral(stream.expect(TokenType.BooleanLiteral).getSpan()); - } else if (stream.match(TokenType.DoubleLiteral, false)) { - return new DoubleLiteral(stream.expect(TokenType.DoubleLiteral).getSpan()); - } else if (stream.match(TokenType.FloatLiteral, false)) { - return new FloatLiteral(stream.expect(TokenType.FloatLiteral).getSpan()); - } else if (stream.match(TokenType.ByteLiteral, false)) { - return new ByteLiteral(stream.expect(TokenType.ByteLiteral).getSpan()); - } else if (stream.match(TokenType.ShortLiteral, false)) { - return new ShortLiteral(stream.expect(TokenType.ShortLiteral).getSpan()); - } else if (stream.match(TokenType.IntegerLiteral, false)) { - return new IntegerLiteral(stream.expect(TokenType.IntegerLiteral).getSpan()); - } else if (stream.match(TokenType.LongLiteral, false)) { - return new LongLiteral(stream.expect(TokenType.LongLiteral).getSpan()); - } else if (stream.match(TokenType.CharacterLiteral, false)) { - return new CharacterLiteral(stream.expect(TokenType.CharacterLiteral).getSpan()); - } else if (stream.match(TokenType.NullLiteral, false)) { - return new NullLiteral(stream.expect(TokenType.NullLiteral).getSpan()); - } else { - ExpressionError.error("Expected a variable, field, map, array, function or method call, or literal.", stream); - return null; // not reached - } - } - - private static Expression parseMapLiteral (TokenStream stream) { - Span openCurly = stream.expect(TokenType.LeftCurly).getSpan(); - - List keys = new ArrayList<>(); - List values = new ArrayList<>(); - while (stream.hasMore() && !stream.match("}", false)) { - if(stream.match(TokenType.StringLiteral, false)){ - keys.add(stream.expect(TokenType.StringLiteral)); - }else{ - keys.add(stream.expect(TokenType.Identifier)); - } - - stream.expect(":"); - values.add(parseExpression(stream)); - if (!stream.match("}", false)) stream.expect(TokenType.Comma); - } - Span closeCurly = stream.expect("}").getSpan(); - return new MapLiteral(new Span(openCurly, closeCurly), keys, values); - } - - private static Expression parseListLiteral (TokenStream stream) { - Span openBracket = stream.expect(TokenType.LeftBracket).getSpan(); - - List values = new ArrayList<>(); - while (stream.hasMore() && !stream.match(TokenType.RightBracket, false)) { - values.add(parseExpression(stream)); - if (!stream.match(TokenType.RightBracket, false)) stream.expect(TokenType.Comma); - } - - Span closeBracket = stream.expect(TokenType.RightBracket).getSpan(); - return new ListLiteral(new Span(openBracket, closeBracket), values); - } - - private static Expression parseAccessOrCall (TokenStream stream,TokenType tokenType) { - //Span identifier = stream.expect(TokenType.Identifier); - //Expression result = new VariableAccess(identifier); - Span identifier = stream.expect(tokenType).getSpan(); - Expression result = tokenType == TokenType.StringLiteral ? new StringLiteral(identifier) :new VariableAccess(identifier); - - while (stream.hasMore() && stream.match(false, TokenType.LeftParantheses, TokenType.LeftBracket, TokenType.Period)) { - - // function or method call - if (stream.match(TokenType.LeftParantheses, false)) { - List arguments = parseArguments(stream); - Span closingSpan = stream.expect(TokenType.RightParantheses).getSpan(); - if (result instanceof VariableAccess || result instanceof MapOrArrayAccess) - result = new FunctionCall(new Span(result.getSpan(), closingSpan), result, arguments); - else if (result instanceof MemberAccess) { - result = new MethodCall(new Span(result.getSpan(), closingSpan), (MemberAccess)result, arguments); - } else { - ExpressionError.error("Expected a variable, field or method.", stream); - } - } - - // map or array access - else if (stream.match(TokenType.LeftBracket, true)) { - Expression keyOrIndex = parseExpression(stream); - Span closingSpan = stream.expect(TokenType.RightBracket).getSpan(); - result = new MapOrArrayAccess(new Span(result.getSpan(), closingSpan), result, keyOrIndex); - } - - // field or method access - else if (stream.match(TokenType.Period, true)) { - identifier = stream.expect(TokenType.Identifier).getSpan(); - result = new MemberAccess(result, identifier); - } - } - - return result; - } - - /** Does not consume the closing parentheses. **/ - private static List parseArguments (TokenStream stream) { - stream.expect(TokenType.LeftParantheses); - List arguments = new ArrayList(); - while (stream.hasMore() && !stream.match(TokenType.RightParantheses, false)) { - arguments.add(parseExpression(stream)); - if (!stream.match(TokenType.RightParantheses, false)) stream.expect(TokenType.Comma); - } - return arguments; - } -} diff --git a/spider/spiderflow/core/expression/parsing/Span.java b/spider/spiderflow/core/expression/parsing/Span.java deleted file mode 100644 index 9646119..0000000 --- a/spider/spiderflow/core/expression/parsing/Span.java +++ /dev/null @@ -1,145 +0,0 @@ - -package org.spiderflow.core.expression.parsing; - -/** A span within a source string denoted by start and end index, with the latter being exclusive. */ -public class Span { - /** the source string this span refers to **/ - private final String source; - - /** start index in source string, starting at 0 **/ - private int start; - - /** end index in source string, exclusive, starting at 0 **/ - private int end; - - /** Cached String instance to reduce pressure on GC **/ - private final String cachedText; - - public Span (String source) { - this(source, 0, source.length()); - } - - public Span (String source, int start, int end) { - if (start > end) throw new IllegalArgumentException("Start must be <= end."); - if (start < 0) throw new IndexOutOfBoundsException("Start must be >= 0."); - if (start > source.length() - 1) - throw new IndexOutOfBoundsException("Start outside of string."); - if (end >source.length()) throw new IndexOutOfBoundsException("End outside of string."); - - this.source = source; - this.start = start; - this.end = end; - this.cachedText = source.substring(start, end); - } - - public Span (Span start, Span end) { - if (!start.source.equals(end.source)) throw new IllegalArgumentException("The two spans do not reference the same source."); - if (start.start > end.end) throw new IllegalArgumentException("Start must be <= end."); - if (start.start < 0) throw new IndexOutOfBoundsException("Start must be >= 0."); - if (start.start > start.source.length() - 1) throw new IndexOutOfBoundsException("Start outside of string."); - if (end.end > start.source.length()) throw new IndexOutOfBoundsException("End outside of string."); - - this.source = start.source; - this.start = start.start; - this.end = end.end; - this.cachedText = source.substring(this.start, this.end); - } - - /** Returns the text referenced by this span **/ - public String getText () { - return cachedText; - } - - /** Returns the index of the first character of this span. **/ - public int getStart () { - return start; - } - - /** Returns the index of the last character of this span plus 1. **/ - public int getEnd () { - return end; - } - - /** Returns the source string this span references. **/ - public String getSource () { - return source; - } - - @Override - public String toString () { - return "Span [text=" + getText() + ", start=" + start + ", end=" + end + "]"; - } - - /** Returns the line this span is on. Does not return a correct result for spans across multiple lines. **/ - public Line getLine () { - int lineStart = start; - while (true) { - if (lineStart < 0) break; - char c = source.charAt(lineStart); - if (c == '\n') { - lineStart = lineStart + 1; - break; - } - lineStart--; - } - if (lineStart < 0) lineStart = 0; - - int lineEnd = end; - while (true) { - if (lineEnd > source.length() - 1) break; - char c = source.charAt(lineEnd); - if (c == '\n') { - break; - } - lineEnd++; - } - - int lineNumber = 0; - int idx = lineStart; - while (idx > 0) { - char c = source.charAt(idx); - if (c == '\n') { - lineNumber++; - } - idx--; - } - lineNumber++; - - return new Line(source, lineStart, lineEnd, lineNumber); - } - - /** A line within a Source **/ - public static class Line { - private final String source; - private final int start; - private final int end; - private final int lineNumber; - - public Line (String source, int start, int end, int lineNumber) { - this.source = source; - this.start = start; - this.end = end; - this.lineNumber = lineNumber; - } - - public String getSource () { - return source; - } - - public int getStart () { - return start; - } - - public int getEnd () { - return end; - } - - public int getLineNumber () { - return lineNumber; - } - - public String getText () { - return source.substring(start, end); - } - } -} diff --git a/spider/spiderflow/core/expression/parsing/Token.java b/spider/spiderflow/core/expression/parsing/Token.java deleted file mode 100644 index e8ca065..0000000 --- a/spider/spiderflow/core/expression/parsing/Token.java +++ /dev/null @@ -1,30 +0,0 @@ - -package org.spiderflow.core.expression.parsing; - -/** A token produced by the {@link Tokenizer}. */ -public class Token { - private final TokenType type; - private final Span span; - - public Token (TokenType type, Span span) { - this.type = type; - this.span = span; - } - - public TokenType getType () { - return type; - } - - public Span getSpan () { - return span; - } - - public String getText () { - return span.getText(); - } - - @Override - public String toString () { - return "Token [type=" + type + ", span=" + span + "]"; - } -} diff --git a/spider/spiderflow/core/expression/parsing/TokenStream.java b/spider/spiderflow/core/expression/parsing/TokenStream.java deleted file mode 100644 index 9a59eae..0000000 --- a/spider/spiderflow/core/expression/parsing/TokenStream.java +++ /dev/null @@ -1,132 +0,0 @@ - -package org.spiderflow.core.expression.parsing; - -import java.util.List; - -import javax.xml.transform.Source; - -import org.spiderflow.core.expression.ExpressionError; - - -/** Iterates over a list of {@link Token} instances, provides methods to match expected tokens and throw errors in case of a - * mismatch. */ -public class TokenStream { - private final List tokens; - private int index; - private final int end; - - public TokenStream (List tokens) { - this.tokens = tokens; - this.index = 0; - this.end = tokens.size(); - } - - /** Returns whether there are more tokens in the stream. **/ - public boolean hasMore () { - return index < end; - } - - public boolean hasNext(){ - return index + 1 < end; - } - - public boolean hasPrev(){ - return index > 0; - } - - /** Consumes the next token and returns it. **/ - public Token consume () { - if (!hasMore()) throw new RuntimeException("Reached the end of the source."); - return tokens.get(index++); - } - - public Token next(){ - if (!hasMore()) throw new RuntimeException("Reached the end of the source."); - return tokens.get(++index); - } - - public Token prev(){ - if(index == 0){ - throw new RuntimeException("Reached the end of the source."); - } - return tokens.get(--index); - } - - /** Checks if the next token has the give type and optionally consumes, or throws an error if the next token did not match the - * type. */ - public Token expect (TokenType type) { - boolean result = match(type, true); - if (!result) { - Token token = index < tokens.size() ? tokens.get(index) : null; - Span span = token != null ? token.getSpan() : null; - if (span == null) - ExpressionError.error("Expected '" + type.getError() + "', but reached the end of the source.", this); - else - ExpressionError.error("Expected '" + type.getError() + "', but got '" + token.getText() + "'", span); - return null; // never reached - } else { - return tokens.get(index - 1); - } - } - - /** Checks if the next token matches the given text and optionally consumes, or throws an error if the next token did not match - * the text. */ - public Token expect (String text) { - boolean result = match(text, true); - if (!result) { - Token token = index < tokens.size() ? tokens.get(index) : null; - Span span = token != null ? token.getSpan() : null; - if (span == null) - ExpressionError.error("Expected '" + text + "', but reached the end of the source.", this); - else - ExpressionError.error("Expected '" + text + "', but got '" + token.getText() + "'", span); - return null; // never reached - } else { - return tokens.get(index - 1); - } - } - - /** Matches and optionally consumes the next token in case of a match. Returns whether the token matched. */ - public boolean match (TokenType type, boolean consume) { - if (index >= end) return false; - if (tokens.get(index).getType() == type) { - if (consume) index++; - return true; - } - return false; - } - - /** Matches and optionally consumes the next token in case of a match. Returns whether the token matched. */ - public boolean match (String text, boolean consume) { - if (index >= end) return false; - if (tokens.get(index).getText().equals(text)) { - if (consume) index++; - return true; - } - return false; - } - - /** Matches any of the token types and optionally consumes the next token in case of a match. Returns whether the token - * matched. */ - public boolean match (boolean consume, TokenType... types) { - for (TokenType type : types) { - if (match(type, consume)) return true; - } - return false; - } - - /** Matches any of the token texts and optionally consumes the next token in case of a match. Returns whether the token - * matched. */ - public boolean match (boolean consume, String... tokenTexts) { - for (String text : tokenTexts) { - if (match(text, consume)) return true; - } - return false; - } - - /** Returns the {@link Source} this stream wraps. */ - public String getSource () { - if (tokens.size() == 0) return null; - return tokens.get(0).getSpan().getSource(); - } -} diff --git a/spider/spiderflow/core/expression/parsing/TokenType.java b/spider/spiderflow/core/expression/parsing/TokenType.java deleted file mode 100644 index 1977f72..0000000 --- a/spider/spiderflow/core/expression/parsing/TokenType.java +++ /dev/null @@ -1,101 +0,0 @@ - -package org.spiderflow.core.expression.parsing; - -import java.util.Arrays; -import java.util.Comparator; - -/** Enumeration of token types. A token type consists of a representation for error messages, and may optionally specify a literal - * to be used by the {@link CharacterStream} to recognize the token. Token types are sorted by their literal length to easy - * matching of token types with common prefixes, e.g. "<" and "<=". Token types with longer literals are matched first. */ -public enum TokenType { - // @off - TextBlock("a text block"), - Period(".", "."), - Comma(",", ","), - Semicolon(";", ";"), - Colon(":", ":"), - Plus("+", "+"), - Minus("-", "-"), - Asterisk("*", "*"), - ForwardSlash("/", "/"), - PostSlash("\\", "\\"), - Percentage("%", "%"), - LeftParantheses("(", ")"), - RightParantheses(")", ")"), - LeftBracket("[", "["), - RightBracket("]", "]"), - LeftCurly("{", "{"), - RightCurly("}"), // special treatment! - Less("<", "<"), - Greater(">", ">"), - LessEqual("<=", "<="), - GreaterEqual(">=", ">="), - Equal("==", "=="), - NotEqual("!=", "!="), - Assignment("=", "="), - And("&&", "&&"), - Or("||", "||"), - Xor("^", "^"), - Not("!", "!"), - Questionmark("?", "?"), - DoubleQuote("\"", "\""), - SingleQuote("'", "'"), - BooleanLiteral("true or false"), - DoubleLiteral("a double floating point number"), - FloatLiteral("a floating point number"), - LongLiteral("a long integer number"), - IntegerLiteral("an integer number"), - ShortLiteral("a short integer number"), - ByteLiteral("a byte integer number"), - CharacterLiteral("a character"), - StringLiteral("a string"), - NullLiteral("null"), - Identifier("an identifier"); - // @on - - private static TokenType[] values; - - static { - // Sort the token types by their literal length. The character stream uses this - // this order to match tokens with the longest length first. - values = TokenType.values(); - Arrays.sort(values, new Comparator() { - @Override - public int compare (TokenType o1, TokenType o2) { - if (o1.literal == null && o2.literal == null) return 0; - if (o1.literal == null && o2.literal != null) return 1; - if (o1.literal != null && o2.literal == null) return -1; - return o2.literal.length() - o1.literal.length(); - } - }); - } - - private final String literal; - private final String error; - - TokenType (String error) { - this.literal = null; - this.error = error; - } - - TokenType (String literal, String error) { - this.literal = literal; - this.error = error; - } - - /** The literal to match, may be null. **/ - public String getLiteral () { - return literal; - } - - /** The error string to use when reporting this token type in an error message. **/ - public String getError () { - return error; - } - - /** Returns an array of token types, sorted in descending order based on their literal length. This is used by the - * {@link CharacterStream} to match token types with the longest literal first. E.g. "<=" will be matched before "<". **/ - public static TokenType[] getSortedValues () { - return values; - } -} diff --git a/spider/spiderflow/core/expression/parsing/Tokenizer.java b/spider/spiderflow/core/expression/parsing/Tokenizer.java deleted file mode 100644 index 6b222f5..0000000 --- a/spider/spiderflow/core/expression/parsing/Tokenizer.java +++ /dev/null @@ -1,192 +0,0 @@ - -package org.spiderflow.core.expression.parsing; - -import java.util.ArrayList; -import java.util.List; - -import org.spiderflow.core.expression.ExpressionError; -import org.spiderflow.core.expression.ExpressionError.StringLiteralException; -import org.spiderflow.core.expression.ExpressionError.TemplateException; - - -public class Tokenizer { - - /** Tokenizes the source into tokens with a {@link TokenType}. Text blocks not enclosed in {{ }} are returned as a single token - * of type {@link TokenType.TextBlock}. {{ and }} are not returned as individual tokens. See {@link TokenType} for the list of - * tokens this tokenizer understands. */ - public List tokenize (String source) { - List tokens = new ArrayList(); - if (source.length() == 0) return tokens; - CharacterStream stream = new CharacterStream(source); - stream.startSpan(); - - RuntimeException re = null; - // TODO: this will fall on its face if we have something like {{ "}}" }}. - while (stream.hasMore()) { - if (stream.match("${", false)) { - if (!stream.isSpanEmpty()) tokens.add(new Token(TokenType.TextBlock, stream.endSpan())); - stream.startSpan(); - boolean isContinue = false; - do{ - while (!stream.match("}", true)) { - if (!stream.hasMore()) ExpressionError.error("Did not find closing }.", stream.endSpan()); - stream.consume(); - } - try{ - tokens.addAll(tokenizeCodeSpan(stream.endSpan())); - isContinue = false; - re = null; - }catch(TemplateException e){ - re = e; - if(e.getCause() != null || stream.hasMore()){ - isContinue = true; - } - } - - }while(isContinue); - if(re != null){ - throw re; - } - stream.startSpan(); - } else { - stream.consume(); - } - } - if (!stream.isSpanEmpty()) tokens.add(new Token(TokenType.TextBlock, stream.endSpan())); - return tokens; - } - - private static List tokenizeCodeSpan (Span span) { - String source = span.getSource(); - CharacterStream stream = new CharacterStream(source, span.getStart(), span.getEnd()); - List tokens = new ArrayList(); - - // match opening tag and throw it away - if (!stream.match("${", true)) ExpressionError.error("Expected ${", new Span(source, stream.getPosition(), stream.getPosition() + 1)); - int leftCount = 0; - int rightCount = 0; - outer: - while (stream.hasMore()) { - // skip whitespace - stream.skipWhiteSpace(); - - // Number literal, both integers and floats. Number literals may be suffixed by a type identifier. - if (stream.matchDigit(false)) { - TokenType type = TokenType.IntegerLiteral; - stream.startSpan(); - while (stream.matchDigit(true)) - ; - if (stream.match(TokenType.Period.getLiteral(), true)) { - type = TokenType.FloatLiteral; - while (stream.matchDigit(true)) - ; - } - if (stream.match("b", true) || stream.match("B", true)) { - if (type == TokenType.FloatLiteral) ExpressionError.error("Byte literal can not have a decimal point.", stream.endSpan()); - type = TokenType.ByteLiteral; - } else if (stream.match("s", true) || stream.match("S", true)) { - if (type == TokenType.FloatLiteral) ExpressionError.error("Short literal can not have a decimal point.", stream.endSpan()); - type = TokenType.ShortLiteral; - } else if (stream.match("l", true) || stream.match("L", true)) { - if (type == TokenType.FloatLiteral) ExpressionError.error("Long literal can not have a decimal point.", stream.endSpan()); - type = TokenType.LongLiteral; - } else if (stream.match("f", true) || stream.match("F", true)) { - type = TokenType.FloatLiteral; - } else if (stream.match("d", true) || stream.match("D", true)) { - type = TokenType.DoubleLiteral; - } - Span numberSpan = stream.endSpan(); - tokens.add(new Token(type, numberSpan)); - continue; - } - - // String literal - if (stream.match(TokenType.SingleQuote.getLiteral(), true)) { - stream.startSpan(); - boolean matchedEndQuote = false; - while (stream.hasMore()) { - // Note: escape sequences like \n are parsed in StringLiteral - if (stream.match("\\", true)) { - stream.consume(); - } - if (stream.match(TokenType.SingleQuote.getLiteral(), true)) { - matchedEndQuote = true; - break; - } - stream.consume(); - } - if (!matchedEndQuote) ExpressionError.error("字符串没有结束符\'", stream.endSpan(),new StringLiteralException()); - Span stringSpan = stream.endSpan(); - stringSpan = new Span(stringSpan.getSource(), stringSpan.getStart() - 1, stringSpan.getEnd()); - tokens.add(new Token(TokenType.StringLiteral, stringSpan)); - continue; - } - - // String literal - if (stream.match(TokenType.DoubleQuote.getLiteral(), true)) { - stream.startSpan(); - boolean matchedEndQuote = false; - while (stream.hasMore()) { - // Note: escape sequences like \n are parsed in StringLiteral - if (stream.match("\\", true)) { - stream.consume(); - } - if (stream.match(TokenType.DoubleQuote.getLiteral(), true)) { - matchedEndQuote = true; - break; - } - stream.consume(); - } - if (!matchedEndQuote) ExpressionError.error("字符串没有结束符\"", stream.endSpan(),new StringLiteralException()); - Span stringSpan = stream.endSpan(); - stringSpan = new Span(stringSpan.getSource(), stringSpan.getStart() - 1, stringSpan.getEnd()); - tokens.add(new Token(TokenType.StringLiteral, stringSpan)); - continue; - } - - // Identifier, keyword, boolean literal, or null literal - if (stream.matchIdentifierStart(true)) { - stream.startSpan(); - while (stream.matchIdentifierPart(true)) - ; - Span identifierSpan = stream.endSpan(); - identifierSpan = new Span(identifierSpan.getSource(), identifierSpan.getStart() - 1, identifierSpan.getEnd()); - - if (identifierSpan.getText().equals("true") || identifierSpan.getText().equals("false")) { - tokens.add(new Token(TokenType.BooleanLiteral, identifierSpan)); - } else if (identifierSpan.getText().equals("null")) { - tokens.add(new Token(TokenType.NullLiteral, identifierSpan)); - } else { - tokens.add(new Token(TokenType.Identifier, identifierSpan)); - } - continue; - } - - // Simple tokens - for (TokenType t : TokenType.getSortedValues()) { - if (t.getLiteral() != null) { - if (stream.match(t.getLiteral(), true)) { - if(t == TokenType.LeftCurly){ - leftCount ++; - } - tokens.add(new Token(t, new Span(source, stream.getPosition() - t.getLiteral().length(), stream.getPosition()))); - continue outer; - } - } - } - if(leftCount!=rightCount&&stream.match("}", true)){ - rightCount++; - tokens.add(new Token(TokenType.RightCurly, new Span(source, stream.getPosition() - 1, stream.getPosition()))); - continue outer; - } - // match closing tag - if (stream.match("}", false)) break; - - ExpressionError.error("Unknown token", new Span(source, stream.getPosition(), stream.getPosition() + 1)); - } - - // code spans must end with } - if (!stream.match("}", true)) ExpressionError.error("Expected }", new Span(source, stream.getPosition(), stream.getPosition() + 1)); - return tokens; - } -} diff --git a/spider/spiderflow/core/io/HttpRequest.java b/spider/spiderflow/core/io/HttpRequest.java deleted file mode 100644 index f0c8ae1..0000000 --- a/spider/spiderflow/core/io/HttpRequest.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.spiderflow.core.io; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; - -import org.jsoup.Connection; -import org.jsoup.Connection.Method; -import org.jsoup.Connection.Response; -import org.jsoup.Jsoup; - -/** - * 请求对象包装类 - * @author Administrator - * - */ -public class HttpRequest { - - private Connection connection = null; - - public static HttpRequest create(){ - return new HttpRequest(); - } - - public HttpRequest url(String url){ - this.connection = Jsoup.connect(url); - this.connection.method(Method.GET); - this.connection.timeout(60000); - return this; - } - - public HttpRequest headers(Map headers){ - this.connection.headers(headers); - return this; - } - - public HttpRequest header(String key,String value){ - this.connection.header(key, value); - return this; - } - - public HttpRequest header(String key,Object value){ - if(value != null){ - this.connection.header(key,value.toString()); - } - return this; - } - - public HttpRequest cookies(Map cookies){ - this.connection.cookies(cookies); - return this; - } - - public HttpRequest cookie(String name, String value) { - if (value != null) { - this.connection.cookie(name, value); - } - return this; - } - - public HttpRequest contentType(String contentType){ - this.connection.header("Content-Type", contentType); - return this; - } - - public HttpRequest data(String key,String value){ - this.connection.data(key, value); - return this; - } - - public HttpRequest data(String key,Object value){ - if(value != null){ - this.connection.data(key, value.toString()); - } - return this; - } - - public HttpRequest data(String key,String filename,InputStream is){ - this.connection.data(key, filename, is); - return this; - } - - public HttpRequest data(Object body){ - if(body != null){ - this.connection.requestBody(body.toString()); - } - return this; - } - - public HttpRequest data(Map data){ - this.connection.data(data); - return this; - } - - public HttpRequest method(String method){ - this.connection.method(Method.valueOf(method)); - return this; - } - - public HttpRequest followRedirect(boolean followRedirects){ - this.connection.followRedirects(followRedirects); - return this; - } - - public HttpRequest timeout(int timeout){ - this.connection.timeout(timeout); - return this; - } - - public HttpRequest proxy(String host,int port){ - this.connection.proxy(host, port); - return this; - } - - @SuppressWarnings("deprecation") - public HttpRequest validateTLSCertificates(boolean value){ - this.connection.validateTLSCertificates(value); - return this; - } - - public HttpResponse execute() throws IOException{ - this.connection.ignoreContentType(true); - this.connection.ignoreHttpErrors(true); - this.connection.maxBodySize(0); - - Response response = connection.execute(); - return new HttpResponse(response); - } -} diff --git a/spider/spiderflow/core/io/HttpResponse.java b/spider/spiderflow/core/io/HttpResponse.java deleted file mode 100644 index 6933f2d..0000000 --- a/spider/spiderflow/core/io/HttpResponse.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.spiderflow.core.io; - -import com.alibaba.fastjson.JSON; -import org.jsoup.Connection.Response; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.spiderflow.io.SpiderResponse; - -import java.io.InputStream; -import java.util.Map; - -/** - * 响应对象包装类 - * @author Administrator - * - */ -public class HttpResponse implements SpiderResponse{ - - private Response response; - - private int statusCode; - - private String urlLink; - - private String htmlValue; - - private String titleName; - - private Object jsonValue; - - public HttpResponse(Response response){ - super(); - this.response = response; - this.statusCode = response.statusCode(); - this.urlLink = response.url().toExternalForm(); - } - - @Override - public int getStatusCode(){ - return statusCode; - } - - @Override - public String getTitle() { - if (titleName == null) { - synchronized (this){ - titleName = Jsoup.parse(getHtml()).title(); - } - } - return titleName; - } - - @Override - public String getHtml(){ - if(htmlValue == null){ - synchronized (this){ - htmlValue = response.body(); - } - } - return htmlValue; - } - - @Override - public Object getJson(){ - if(jsonValue == null){ - jsonValue = JSON.parse(getHtml()); - } - return jsonValue; - } - - @Override - public Map getCookies(){ - return response.cookies(); - } - - @Override - public Map getHeaders(){ - return response.headers(); - } - - @Override - public byte[] getBytes(){ - return response.bodyAsBytes(); - } - - @Override - public String getContentType(){ - return response.contentType(); - } - - @Override - public void setCharset(String charset) { - this.response.charset(charset); - } - - @Override - public String getUrl() { - return urlLink; - } - - @Override - public InputStream getStream() { - return response.bodyStream(); - } -} diff --git a/spider/spiderflow/core/job/SpiderJob.java b/spider/spiderflow/core/job/SpiderJob.java deleted file mode 100644 index 495f722..0000000 --- a/spider/spiderflow/core/job/SpiderJob.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.spiderflow.core.job; - -import org.apache.commons.lang3.time.DateFormatUtils; -import org.quartz.JobDataMap; -import org.quartz.JobExecutionContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.context.SpiderContextHolder; -import org.spiderflow.core.Spider; -import org.spiderflow.core.model.SpiderFlow; -import org.spiderflow.core.model.Task; -import org.spiderflow.core.service.SpiderFlowService; -import org.spiderflow.core.service.TaskService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.scheduling.quartz.QuartzJobBean; -import org.springframework.stereotype.Component; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * 爬虫定时执行 - * - * @author Administrator - */ -@Component -public class SpiderJob extends QuartzJobBean { - - @Autowired - private Spider spider; - - @Autowired - private SpiderFlowService spiderFlowService; - - @Autowired - private TaskService taskService; - - private static Map contextMap = new HashMap<>(); - - @Value("${spider.job.enable:true}") - private boolean spiderJobEnable; - - @Value("${spider.job.log.path:./}") - private String spiderLogPath; - - private static Logger logger = LoggerFactory.getLogger(SpiderJob.class); - - @Override - protected void executeInternal(JobExecutionContext context) { - if (!spiderJobEnable) { - return; - } - JobDataMap dataMap = context.getMergedJobDataMap(); - SpiderFlow spiderFlow = (SpiderFlow) dataMap.get(SpiderJobManager.JOB_PARAM_NAME); - run(spiderFlow, context.getNextFireTime()); - } - - public void run(String id) { - run(spiderFlowService.getById(id), null); - } - - public void run(SpiderFlow spiderFlow, Date nextExecuteTime) { - SpiderJobContext context = null; - Date now = new Date(); - Task task = new Task(); - task.setFlowId(spiderFlow.getId()); - task.setBeginTime(new Date()); - try { - taskService.save(task); - context = SpiderJobContext.create(this.spiderLogPath, spiderFlow.getId() + task.getId() + ".log"); - SpiderContextHolder.set(context); - contextMap.put(task.getId(), context); - logger.info("开始执行任务{}", spiderFlow.getName()); - spider.run(spiderFlow, context); - logger.info("执行任务{}完毕,下次执行时间:{}", spiderFlow.getName(), nextExecuteTime == null ? null : DateFormatUtils.format(nextExecuteTime, "yyyy-MM-dd HH:mm:ss")); - } catch (Exception e) { - logger.error("执行任务{}出错", spiderFlow.getName(), e); - } finally { - if (context != null) { - context.close(); - } - task.setEndTime(new Date()); - taskService.saveOrUpdate(task); - contextMap.remove(task.getId()); - SpiderContextHolder.remove(); - } - spiderFlowService.executeCountIncrement(spiderFlow.getId(), now, nextExecuteTime); - } - - public static SpiderContext getSpiderContext(Integer taskId) { - return contextMap.get(taskId); - } -} diff --git a/spider/spiderflow/core/job/SpiderJobContext.java b/spider/spiderflow/core/job/SpiderJobContext.java deleted file mode 100644 index 30de375..0000000 --- a/spider/spiderflow/core/job/SpiderJobContext.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.spiderflow.core.job; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.OutputStream; -import java.util.Date; - -import org.apache.commons.lang3.time.DateFormatUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.helpers.MessageFormatter; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.model.SpiderLog; - -public class SpiderJobContext extends SpiderContext{ - - private static final long serialVersionUID = 9099787449108938453L; - - private static Logger logger = LoggerFactory.getLogger(SpiderJobContext.class); - - private OutputStream outputstream; - - public SpiderJobContext(OutputStream outputstream) { - super(); - this.outputstream = outputstream; - } - - public void close(){ - try { - this.outputstream.close(); - } catch (Exception e) { - } - } - - public OutputStream getOutputstream(){ - return this.outputstream; - } - - public static SpiderJobContext create(String directory,String file){ - OutputStream os = null; - try { - File dirFile = new File(directory); - if(!dirFile.exists()){ - dirFile.mkdirs(); - } - os = new FileOutputStream(new File(directory,file), true); - } catch (Exception e) { - logger.error("创建日志文件出错",e); - } - return new SpiderJobContext(os); - } -} diff --git a/spider/spiderflow/core/job/SpiderJobManager.java b/spider/spiderflow/core/job/SpiderJobManager.java deleted file mode 100644 index 2b64cda..0000000 --- a/spider/spiderflow/core/job/SpiderJobManager.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.spiderflow.core.job; - -import org.quartz.CronScheduleBuilder; -import org.quartz.CronTrigger; -import org.quartz.JobBuilder; -import org.quartz.JobDetail; -import org.quartz.JobKey; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.TriggerBuilder; -import org.quartz.TriggerKey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spiderflow.core.model.SpiderFlow; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.Date; - -/** - * 爬虫定时执行管理 - * @author Administrator - * - */ -@Component -public class SpiderJobManager { - - private static Logger logger = LoggerFactory.getLogger(SpiderJobManager.class); - - private final static String JOB_NAME = "SPIDER_TASK_"; - - public final static String JOB_PARAM_NAME = "SPIDER_FLOW"; - - @Autowired - private SpiderJob spiderJob; - - /** - * 调度器 - */ - @Autowired - private Scheduler scheduler; - - private JobKey getJobKey(String id){ - return JobKey.jobKey(JOB_NAME + id); - } - - private TriggerKey getTriggerKey(String id){ - return TriggerKey.triggerKey(JOB_NAME + id); - } - - /** - * 新建定时任务 - * @param spiderFlow 爬虫流程图 - * @return boolean true/false - */ - public Date addJob(SpiderFlow spiderFlow){ - try { - JobDetail job = JobBuilder.newJob(SpiderJob.class).withIdentity(getJobKey(spiderFlow.getId())).build(); - job.getJobDataMap().put(JOB_PARAM_NAME, spiderFlow); - - CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(spiderFlow.getCron()).withMisfireHandlingInstructionDoNothing(); - - CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(spiderFlow.getId())).withSchedule(cronScheduleBuilder).build(); - - return scheduler.scheduleJob(job,trigger); - } catch (SchedulerException e) { - logger.error("创建定时任务出错",e); - return null; - } - } - - public void run(String id){ - new Thread(()->{ - spiderJob.run(id); - }).start(); - } - - public boolean remove(String id){ - try { - scheduler.deleteJob(getJobKey(id)); - return true; - } catch (SchedulerException e) { - logger.error("删除定时任务失败",e); - return false; - } - } - -} diff --git a/spider/spiderflow/core/mapper/DataSourceMapper.java b/spider/spiderflow/core/mapper/DataSourceMapper.java deleted file mode 100644 index 9c86072..0000000 --- a/spider/spiderflow/core/mapper/DataSourceMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.spiderflow.core.mapper; - -import java.util.List; - -import org.apache.ibatis.annotations.Select; -import org.spiderflow.core.model.DataSource; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -public interface DataSourceMapper extends BaseMapper{ - - @Select("select id,name from sp_datasource") - List selectAll(); - -} diff --git a/spider/spiderflow/core/mapper/SpiderFlowMapper.java b/spider/spiderflow/core/mapper/SpiderFlowMapper.java deleted file mode 100644 index aaa3735..0000000 --- a/spider/spiderflow/core/mapper/SpiderFlowMapper.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.spiderflow.core.mapper; - -import java.util.Date; -import java.util.List; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; -import org.apache.ibatis.annotations.Update; -import org.spiderflow.core.model.SpiderFlow; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - * 爬虫资源库 实现爬虫的入库 - * @author Administrator - * - */ -public interface SpiderFlowMapper extends BaseMapper{ - - @Select({ - "" - }) - IPage selectSpiderPage(Page page,@Param("name") String name); - - @Insert("insert into sp_flow(id,name,xml,enabled) values(#{id},#{name},#{xml},'0')") - int insertSpiderFlow(@Param("id") String id, @Param("name") String name, @Param("xml") String xml); - - @Update("update sp_flow set name = #{name},xml = #{xml} where id = #{id}") - int updateSpiderFlow(@Param("id") String id, @Param("name") String name, @Param("xml") String xml); - - @Update("update sp_flow set execute_count = 0 where id = #{id}") - int resetExecuteCount(@Param("id") String id); - - @Update("update sp_flow set execute_count = ifnull(execute_count,0) + 1,last_execute_time = #{lastExecuteTime},next_execute_time = #{nextExecuteTime} where id = #{id}") - int executeCountIncrementAndExecuteTime(@Param("id") String id, @Param("lastExecuteTime") Date lastExecuteTime, @Param("nextExecuteTime") Date nextExecuteTime); - - @Update("update sp_flow set execute_count = ifnull(execute_count,0) + 1,last_execute_time = #{lastExecuteTime} where id = #{id}") - int executeCountIncrement(@Param("id") String id, @Param("lastExecuteTime") Date lastExecuteTime); - - @Update("update sp_flow set cron = #{cron},next_execute_time = #{nextExecuteTime} where id = #{id}") - int resetCornExpression(@Param("id") String id, @Param("cron") String cron, @Param("nextExecuteTime") Date nextExecuteTime); - - @Update("update sp_flow set enabled = #{enabled} where id = #{id}") - int resetSpiderStatus(@Param("id") String id, @Param("enabled") String enabled); - - @Update("update sp_flow set next_execute_time = null where id = #{id}") - int resetNextExecuteTime(@Param("id") String id); - - @Update("update sp_flow set next_execute_time = null") - int resetNextExecuteTime(); - - @Select("select id,name from sp_flow") - List selectFlows(); - - @Select("select id,name from sp_flow where id != #{id}") - List selectOtherFlows(@Param("id") String id); - - @Select("select max(a.id) from `sp_task` a left join sp_flow b on a.flow_id = b.id where b.id = #{id}") - Integer getFlowMaxTaskId(@Param("id")String id); -} diff --git a/spider/spiderflow/core/mapper/TaskMapper.java b/spider/spiderflow/core/mapper/TaskMapper.java deleted file mode 100644 index dba1b29..0000000 --- a/spider/spiderflow/core/mapper/TaskMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.spiderflow.core.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.spiderflow.core.model.Task; - -@Mapper -public interface TaskMapper extends BaseMapper { -} diff --git a/spider/spiderflow/core/mapper/VariableMapper.java b/spider/spiderflow/core/mapper/VariableMapper.java deleted file mode 100644 index 123ad9f..0000000 --- a/spider/spiderflow/core/mapper/VariableMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.spiderflow.core.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.spiderflow.core.model.Variable; - -public interface VariableMapper extends BaseMapper { -} diff --git a/spider/spiderflow/core/model/DataSource.java b/spider/spiderflow/core/model/DataSource.java deleted file mode 100644 index 8d444bd..0000000 --- a/spider/spiderflow/core/model/DataSource.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.spiderflow.core.model; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; - -import java.util.Date; - -@TableName("sp_datasource") -public class DataSource { - - @TableId(type = IdType.UUID) - private String id; - - private String name; - - private String driverClassName; - - private String jdbcUrl; - - private String username; - - private String password; - - private Date createDate; - - public DataSource() { - } - - public DataSource(String id, String name) { - this.id = id; - this.name = name; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDriverClassName() { - return driverClassName; - } - - public void setDriverClassName(String driverClassName) { - this.driverClassName = driverClassName; - } - - public String getJdbcUrl() { - return jdbcUrl; - } - - public void setJdbcUrl(String jdbcUrl) { - this.jdbcUrl = jdbcUrl; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public Date getCreateDate() { - return createDate; - } - - public void setCreateDate(Date createDate) { - this.createDate = createDate; - } - -} diff --git a/spider/spiderflow/core/model/SpiderFlow.java b/spider/spiderflow/core/model/SpiderFlow.java deleted file mode 100644 index 47ed114..0000000 --- a/spider/spiderflow/core/model/SpiderFlow.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.spiderflow.core.model; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; - -import java.util.Date; - -/** - * 爬虫持久化实体类 - */ -@TableName("sp_flow") -public class SpiderFlow { - - @TableId(type = IdType.UUID) - private String id; - - /** - * 定时任务表达式 - */ - private String cron; - - private String name; - - /** - * xml流程图 - */ - private String xml; - - private String enabled; - - private Date createDate; - - private Date lastExecuteTime; - - private Date nextExecuteTime; - - /** - * 定时执行的执行次数 - */ - private Integer executeCount; - - @TableField(exist = false) - private Integer running; - - - public SpiderFlow() { - } - - public SpiderFlow(String id, String name) { - this.id = id; - this.name = name; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getXml() { - return xml; - } - - public void setXml(String xml) { - this.xml = xml; - } - - public String getCron() { - return cron; - } - - public void setCron(String cron) { - this.cron = cron; - } - - public String getEnabled() { - return enabled; - } - - public void setEnabled(String enabled) { - this.enabled = enabled; - } - - public Date getCreateDate() { - return createDate; - } - - public void setCreateDate(Date createDate) { - this.createDate = createDate; - } - - public Date getLastExecuteTime() { - return lastExecuteTime; - } - - public void setLastExecuteTime(Date lastExecuteTime) { - this.lastExecuteTime = lastExecuteTime; - } - - public Date getNextExecuteTime() { - return nextExecuteTime; - } - - public void setNextExecuteTime(Date nextExecuteTime) { - this.nextExecuteTime = nextExecuteTime; - } - - public Integer getExecuteCount() { - return executeCount; - } - - public void setExecuteCount(Integer executeCount) { - this.executeCount = executeCount; - } - - public Integer getRunning() { - return running; - } - - public void setRunning(Integer running) { - this.running = running; - } -} diff --git a/spider/spiderflow/core/model/Task.java b/spider/spiderflow/core/model/Task.java deleted file mode 100644 index 0dd8817..0000000 --- a/spider/spiderflow/core/model/Task.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.spiderflow.core.model; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; - -import java.util.Date; - -@TableName("sp_task") -public class Task { - - @TableId(type = IdType.AUTO) - private Integer id; - - private String flowId; - - private Date beginTime; - - private Date endTime; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getFlowId() { - return flowId; - } - - public void setFlowId(String flowId) { - this.flowId = flowId; - } - - public Date getBeginTime() { - return beginTime; - } - - public void setBeginTime(Date beginTime) { - this.beginTime = beginTime; - } - - public Date getEndTime() { - return endTime; - } - - public void setEndTime(Date endTime) { - this.endTime = endTime; - } -} diff --git a/spider/spiderflow/core/model/Variable.java b/spider/spiderflow/core/model/Variable.java deleted file mode 100644 index bdeead3..0000000 --- a/spider/spiderflow/core/model/Variable.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.spiderflow.core.model; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; - -import java.util.Date; - -@TableName("sp_variable") -public class Variable { - - @TableId(type = IdType.AUTO) - private Integer id; - - private String name; - - private String value; - - private String description; - - private Date createDate; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getCreateDate() { - return createDate; - } - - public void setCreateDate(Date createDate) { - this.createDate = createDate; - } -} diff --git a/spider/spiderflow/core/serializer/FastJsonSerializer.java b/spider/spiderflow/core/serializer/FastJsonSerializer.java deleted file mode 100644 index e1ff974..0000000 --- a/spider/spiderflow/core/serializer/FastJsonSerializer.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.spiderflow.core.serializer; - -import com.alibaba.fastjson.serializer.JSONSerializer; -import com.alibaba.fastjson.serializer.ObjectSerializer; -import com.alibaba.fastjson.serializer.SerializeConfig; -import com.alibaba.fastjson.serializer.SerializerFeature; - -import java.io.IOException; -import java.lang.reflect.Type; -import java.math.BigDecimal; -import java.math.BigInteger; - -/** - * Created on 2019-12-23 - */ -public class FastJsonSerializer implements ObjectSerializer { - - public static SerializeConfig serializeConfig; - - static { - serializeConfig = new SerializeConfig(); - FastJsonSerializer serializer = new FastJsonSerializer(); - serializeConfig.put(Long.TYPE, serializer); - serializeConfig.put(Long.class, serializer); - serializeConfig.put(BigDecimal.class, serializer); - serializeConfig.put(BigInteger.class, serializer); - } - - @Override - public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { - if(object == null){ - if(serializer.isEnabled(SerializerFeature.WriteNullNumberAsZero)){ - serializer.out.write("0"); - }else{ - serializer.out.writeNull(); - } - return; - } - serializer.out.writeString(object.toString()); - } -} diff --git a/spider/spiderflow/core/service/DataSourceService.java b/spider/spiderflow/core/service/DataSourceService.java deleted file mode 100644 index 5a78087..0000000 --- a/spider/spiderflow/core/service/DataSourceService.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.spiderflow.core.service; - -import org.spiderflow.core.mapper.DataSourceMapper; -import org.spiderflow.core.model.DataSource; -import org.springframework.stereotype.Service; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - - -@Service -public class DataSourceService extends ServiceImpl { - -} diff --git a/spider/spiderflow/core/service/SpiderFlowService.java b/spider/spiderflow/core/service/SpiderFlowService.java deleted file mode 100644 index 18c2b2c..0000000 --- a/spider/spiderflow/core/service/SpiderFlowService.java +++ /dev/null @@ -1,183 +0,0 @@ -package org.spiderflow.core.service; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.UUID; - -import javax.annotation.PostConstruct; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.commons.lang3.StringUtils; -import org.quartz.CronScheduleBuilder; -import org.quartz.CronTrigger; -import org.quartz.TriggerBuilder; -import org.quartz.TriggerUtils; -import org.quartz.spi.OperableTrigger; -import org.spiderflow.core.job.SpiderJobManager; -import org.spiderflow.core.mapper.SpiderFlowMapper; -import org.spiderflow.core.model.SpiderFlow; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - -/** - * 爬虫流程执行服务 - * @author Administrator - * - */ -@Service -public class SpiderFlowService extends ServiceImpl { - - @Autowired - private SpiderFlowMapper sfMapper; - - @Autowired - private SpiderJobManager spiderJobManager; - - //项目启动后自动查询需要执行的任务进行爬取 - @PostConstruct - private void initJobs(){ - //清空所有任务下次执行时间 - sfMapper.resetNextExecuteTime(); - //获取启用corn的任务 - List spiderFlows = sfMapper.selectList(new QueryWrapper().eq("enabled", "1")); - if(spiderFlows != null && !spiderFlows.isEmpty()){ - for (SpiderFlow sf : spiderFlows) { - if(StringUtils.isNotEmpty(sf.getCron())){ - Date nextExecuteTimt = spiderJobManager.addJob(sf); - if (nextExecuteTimt != null) { - sf.setNextExecuteTime(nextExecuteTimt); - sfMapper.updateById(sf); - } - } - } - } - } - - public IPage selectSpiderPage(Page page, String name){ - return sfMapper.selectSpiderPage(page,name); - } - - public int executeCountIncrement(String id, Date lastExecuteTime, Date nextExecuteTime){ - if(nextExecuteTime == null){ - return sfMapper.executeCountIncrement(id, lastExecuteTime); - } - return sfMapper.executeCountIncrementAndExecuteTime(id, lastExecuteTime, nextExecuteTime); - - } - - /** - * 重置定时任务 - * @param id 爬虫的ID - * @param cron 定时器 - */ - public void resetCornExpression(String id, String cron){ - CronTrigger trigger = TriggerBuilder.newTrigger() - .withIdentity("Caclulate Next Execute Date") - .withSchedule(CronScheduleBuilder.cronSchedule(cron)) - .build(); - sfMapper.resetCornExpression(id, cron, trigger.getFireTimeAfter(null)); - spiderJobManager.remove(id); - SpiderFlow spiderFlow = getById(id); - if("1".equals(spiderFlow.getEnabled()) && StringUtils.isNotEmpty(spiderFlow.getCron())){ - spiderJobManager.addJob(spiderFlow); - } - } - - @Override - public boolean save(SpiderFlow spiderFlow){ - //解析corn,获取并设置任务的开始时间 - if(StringUtils.isNotEmpty(spiderFlow.getCron())){ - CronTrigger trigger = TriggerBuilder.newTrigger() - .withIdentity("Caclulate Next Execute Date") - .withSchedule(CronScheduleBuilder.cronSchedule(spiderFlow.getCron())) - .build(); - spiderFlow.setNextExecuteTime(trigger.getStartTime()); - } - // - if(StringUtils.isNotEmpty(spiderFlow.getId())){ //update 任务 - sfMapper.updateSpiderFlow(spiderFlow.getId(), spiderFlow.getName(), spiderFlow.getXml()); - spiderJobManager.remove(spiderFlow.getId()); - spiderFlow = getById(spiderFlow.getId()); - if("1".equals(spiderFlow.getEnabled()) && StringUtils.isNotEmpty(spiderFlow.getCron())){ - spiderJobManager.addJob(spiderFlow); - } - }else{//insert 任务 - String id = UUID.randomUUID().toString().replace("-", ""); - sfMapper.insertSpiderFlow(id, spiderFlow.getName(), spiderFlow.getXml()); - spiderFlow.setId(id); - } - return true; - } - - public void stop(String id){ - sfMapper.resetSpiderStatus(id,"0"); - sfMapper.resetNextExecuteTime(id); - spiderJobManager.remove(id); - } - - public void start(String id){ - spiderJobManager.remove(id); - SpiderFlow spiderFlow = getById(id); - Date nextExecuteTime = spiderJobManager.addJob(spiderFlow); - if (nextExecuteTime != null) { - spiderFlow.setNextExecuteTime(nextExecuteTime); - sfMapper.updateById(spiderFlow); - sfMapper.resetSpiderStatus(id, "1"); - } - } - - public void run(String id){ - spiderJobManager.run(id); - } - - public void resetExecuteCount(String id){ - sfMapper.resetExecuteCount(id); - } - public void remove(String id){ - sfMapper.deleteById(id); - spiderJobManager.remove(id); - } - - public List selectOtherFlows(String id){ - return sfMapper.selectOtherFlows(id); - } - - public List selectFlows(){ - return sfMapper.selectFlows(); - } - - /** - * 根据表达式获取最近几次运行时间 - * @param cron 表达式 - * @param numTimes 几次 - * @return - */ - public List getRecentTriggerTime(String cron,int numTimes) { - List list = new ArrayList<>(); - CronTrigger trigger; - try { - trigger = TriggerBuilder.newTrigger() - .withSchedule(CronScheduleBuilder.cronSchedule(cron)) - .build(); - }catch (Exception e) { - list.add("cron表达式 "+cron+" 有误:" + e.getCause()); - return list; - } - List dates = TriggerUtils.computeFireTimes((OperableTrigger) trigger, null, numTimes); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (Date date : dates) { - list.add(dateFormat.format(date)); - } - return list; - } - - public Integer getFlowMaxTaskId(String flowId){ - return sfMapper.getFlowMaxTaskId(flowId); - } -} diff --git a/spider/spiderflow/core/service/TaskService.java b/spider/spiderflow/core/service/TaskService.java deleted file mode 100644 index cd2515b..0000000 --- a/spider/spiderflow/core/service/TaskService.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.spiderflow.core.service; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.spiderflow.core.mapper.TaskMapper; -import org.spiderflow.core.model.Task; -import org.springframework.stereotype.Service; - -@Service -public class TaskService extends ServiceImpl { - -} diff --git a/spider/spiderflow/core/service/VariableService.java b/spider/spiderflow/core/service/VariableService.java deleted file mode 100644 index 24671b6..0000000 --- a/spider/spiderflow/core/service/VariableService.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.spiderflow.core.service; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.spiderflow.core.expression.ExpressionGlobalVariables; -import org.spiderflow.core.mapper.VariableMapper; -import org.spiderflow.core.model.Variable; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import java.io.Serializable; -import java.util.Map; -import java.util.stream.Collectors; - -@Service -public class VariableService extends ServiceImpl { - - @Override - public boolean removeById(Serializable id) { - boolean ret = super.removeById(id); - this.resetGlobalVariables(); - return ret; - } - - @Override - public boolean saveOrUpdate(Variable entity) { - boolean ret = super.saveOrUpdate(entity); - this.resetGlobalVariables(); - return ret; - } - - @PostConstruct - private void resetGlobalVariables(){ - Map variables = this.list().stream().collect(Collectors.toMap(Variable::getName, Variable::getValue)); - ExpressionGlobalVariables.reset(variables); - } -} diff --git a/spider/spiderflow/core/utils/DataSourceUtils.java b/spider/spiderflow/core/utils/DataSourceUtils.java deleted file mode 100644 index 1f4dc87..0000000 --- a/spider/spiderflow/core/utils/DataSourceUtils.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.spiderflow.core.utils; - -import java.util.HashMap; -import java.util.Map; - -import javax.sql.DataSource; - -import org.spiderflow.core.service.DataSourceService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.alibaba.druid.pool.DruidDataSource; - -/** - * 数据库连接工具类 - * @author jmxd - * - */ -@Component -public class DataSourceUtils { - - private static final Map datasources = new HashMap<>(); - - private static DataSourceService dataSourceService; - - public static DataSource createDataSource(String className,String url,String username,String password){ - DruidDataSource datasource = new DruidDataSource(); - datasource.setDriverClassName(className); - datasource.setUrl(url); - datasource.setUsername(username); - datasource.setPassword(password); - datasource.setDefaultAutoCommit(true); - datasource.setMinIdle(1); - datasource.setInitialSize(2); - return datasource; - } - - public static void remove(String dataSourceId){ - DataSource dataSource = datasources.get(dataSourceId); - if(dataSource != null){ - DruidDataSource ds = (DruidDataSource) dataSource; - ds.close(); - datasources.remove(dataSourceId); - } - } - - public synchronized static DataSource getDataSource(String dataSourceId){ - DataSource dataSource = datasources.get(dataSourceId); - if(dataSource == null){ - org.spiderflow.core.model.DataSource ds = dataSourceService.getById(dataSourceId); - if(ds != null){ - dataSource = createDataSource(ds.getDriverClassName(), ds.getJdbcUrl(), ds.getUsername(), ds.getPassword()); - datasources.put(dataSourceId, dataSource); - } - } - return dataSource; - } - - @Autowired - public void setDataSourceService(DataSourceService dataSourceService) { - DataSourceUtils.dataSourceService = dataSourceService; - } - -} diff --git a/spider/spiderflow/core/utils/ExtractUtils.java b/spider/spiderflow/core/utils/ExtractUtils.java deleted file mode 100644 index 2f6f8c3..0000000 --- a/spider/spiderflow/core/utils/ExtractUtils.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.spiderflow.core.utils; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.jsoup.Connection; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import com.alibaba.fastjson.JSONPath; -import us.codecraft.xsoup.Xsoup; - -/** - * 抽取数据工具类 - * @author jmxd - * - */ -public class ExtractUtils { - - private static Map patterns = new HashMap<>(); - - private static Pattern compile(String regx){ - Pattern pattern = patterns.get(regx); - if(pattern == null){ - pattern = Pattern.compile(regx,Pattern.DOTALL); - patterns.put(regx, pattern); - } - return pattern; - } - - public static List getMatchers(String content,String regx,boolean isGroup){ - return getMatchers(content,regx,isGroup ? 1: 0); - } - - public static List getMatchers(String content,String regx,int groupIndex){ - Matcher matcher = compile(regx).matcher(content); - List results = new ArrayList<>(); - while(matcher.find()){ - results.add(matcher.group(groupIndex)); - } - return results; - } - - public static List> getMatchers(String content,String regx,List groups){ - Matcher matcher = compile(regx).matcher(content); - List> results = new ArrayList<>(); - while(matcher.find()){ - List matches = new ArrayList<>(); - for (Integer groupIndex : groups) { - matches.add(matcher.group(groupIndex)); - } - results.add(matches); - } - return results; - } - - public static String getFirstMatcher(String content,String regx,boolean isGroup){ - - return getFirstMatcher(content,regx,isGroup ? 1 : 0); - } - - public static String getFirstMatcher(String content,String regx,int groupIndex){ - Matcher matcher = compile(regx).matcher(content); - if(matcher.find()){ - return matcher.group(groupIndex); - } - return null; - } - - public static List getFirstMatcher(String content,String regx,List groups){ - Matcher matcher = compile(regx).matcher(content); - List matches = new ArrayList<>(); - if(matcher.find()){ - for (Integer groupIndex : groups) { - matches.add(matcher.group(groupIndex)); - } - } - return matches; - } - - public static String getHostFromURL(String url){ - return getFirstMatcher(url, "(?<=//|)((\\w)+\\.)+\\w+", false); - } - - public static String getFirstHTMLBySelector(Element element,String selector){ - element = getFirstElement(element,selector); - return element == null ? null : element.html(); - } - - public static String getFirstOuterHTMLBySelector(Element element,String selector){ - element = getFirstElement(element,selector); - return element == null ? null : element.outerHtml(); - } - - public static String getFirstTextBySelector(Element element,String selector){ - element = getFirstElement(element,selector); - return element == null ? null : element.text(); - } - - public static String getFirstAttrBySelector(Element element,String selector,String attr){ - element = getFirstElement(element,selector); - return element == null ? null : element.attr(attr); - } - - public static Element getFirstElement(Element element,String selector){ - return element.selectFirst(selector); - } - - public static List getElements(Element element,String selector){ - return element.select(selector); - } - - public static List getHTMLBySelector(Element element,String selector){ - Elements elements = element.select(selector); - List result = new ArrayList<>(); - for (Element elem : elements) { - result.add(elem.html()); - } - return result; - } - - public static List getOuterHTMLBySelector(Element element,String selector){ - Elements elements = element.select(selector); - List result = new ArrayList<>(); - for (Element elem : elements) { - result.add(elem.outerHtml()); - } - return result; - } - - public static List getTextBySelector(Element element,String selector){ - Elements elements = element.select(selector); - List result = new ArrayList<>(); - for (Element elem : elements) { - result.add(elem.text()); - } - return result; - } - - public static List getAttrBySelector(Element element,String selector,String attr){ - Elements elements = element.select(selector); - List result = new ArrayList<>(); - for (Element elem : elements) { - result.add(elem.attr(attr)); - } - return result; - } - - public static Object getValueByJsonPath(Object root,String jsonPath){ - return JSONPath.eval(root, jsonPath); - } - - public static List getValuesByXPath(Element element,String xpath){ - return Xsoup.select(element,xpath).list(); - } - - public static List getValuesByXPath(Elements elements,String xpath){ - return Xsoup.select(elements.html(),xpath).list(); - } - - public static String getValueByXPath(Element element,String xpath){ - return Xsoup.select(element,xpath).get(); - } - - public static String getValueByXPath(Elements elements,String xpath){ - return Xsoup.select(elements.html(),xpath).get(); - } - - public static String getElementByXPath(Element element,String xpath){ - return Xsoup.select(element,xpath).get(); - } - - public static boolean isNumber(String str) { - return compile("^(\\-|\\+)?\\d+(\\.\\d+)?$").matcher(str).matches(); - } - -} diff --git a/spider/spiderflow/core/utils/FileUtils.java b/spider/spiderflow/core/utils/FileUtils.java deleted file mode 100644 index 74c7f8a..0000000 --- a/spider/spiderflow/core/utils/FileUtils.java +++ /dev/null @@ -1,249 +0,0 @@ -package org.spiderflow.core.utils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.http.HttpServletRequest; -import java.io.*; -import java.net.*; - -/** - * 文件处理工具类 - * - * @author ruoyi - */ -public class FileUtils -{ - private static Logger logger = LoggerFactory.getLogger(FileUtils.class); - - public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; - - /** - * 输出指定文件的byte数组 - * - * @param filePath 文件路径 - * @param os 输出流 - * @return - */ - public static void writeBytes(String filePath, OutputStream os) throws IOException - { - FileInputStream fis = null; - try - { - File file = new File(filePath); - if (!file.exists()) - { - throw new FileNotFoundException(filePath); - } - fis = new FileInputStream(file); - byte[] b = new byte[1024]; - int length; - while ((length = fis.read(b)) > 0) - { - os.write(b, 0, length); - } - } - catch (IOException e) - { - throw e; - } - finally - { - if (os != null) - { - try - { - os.close(); - } - catch (IOException e1) - { - e1.printStackTrace(); - } - } - if (fis != null) - { - try - { - fis.close(); - } - catch (IOException e1) - { - e1.printStackTrace(); - } - } - } - } - - /** - * 删除文件 - * - * @param filePath 文件 - * @return - */ - public static boolean deleteFile(String filePath) - { - boolean flag = false; - File file = new File(filePath); - // 路径为文件且不为空则进行删除 - if (file.isFile() && file.exists()) - { - file.delete(); - flag = true; - } - return flag; - } - - /** - * 文件名称验证 - * - * @param filename 文件名称 - * @return true 正常 false 非法 - */ - public static boolean isValidFilename(String filename) - { - return filename.matches(FILENAME_PATTERN); - } - - /** - * 下载文件名重新编码 - * - * @param request 请求对象 - * @param fileName 文件名 - * @return 编码后的文件名 - */ - public static String setFileDownloadHeader(HttpServletRequest request, String fileName) - throws UnsupportedEncodingException - { - final String agent = request.getHeader("USER-AGENT"); - String filename = fileName; - if (agent.contains("MSIE")) - { - // IE浏览器 - filename = URLEncoder.encode(filename, "utf-8"); - filename = filename.replace("+", " "); - } - else if (agent.contains("Firefox")) - { - // 火狐浏览器 - filename = new String(fileName.getBytes(), "ISO8859-1"); - } - else if (agent.contains("Chrome")) - { - // google浏览器 - filename = URLEncoder.encode(filename, "utf-8"); - } - else - { - // 其它浏览器 - filename = URLEncoder.encode(filename, "utf-8"); - } - return filename; - } - - /** - * 文件下载状态 - */ - public enum DownloadStatus { - URL_ERROR(1, "URL错误"), - FILE_EXIST(2,"文件存在"), - TIME_OUT(3,"连接超时"), - DOWNLOAD_FAIL(4,"下载失败"), - DOWNLOAD_SUCCESS(5,"下载成功"); - - private int code; - - private String name; - - DownloadStatus(int code, String name){ - this.code = code; - this.name = name; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - public static DownloadStatus downloadFile(String savePath, String fileUrl, boolean downNew) { - URL urlfile = null; - HttpURLConnection httpUrl = null; - BufferedInputStream bis = null; - BufferedOutputStream bos = null; - if (fileUrl.startsWith("//")) { - fileUrl = "http:" + fileUrl; - } - String fileName; - try { - urlfile = new URL(fileUrl); - String urlPath = urlfile.getPath(); - fileName = urlPath.substring(urlPath.lastIndexOf("/") + 1); - } catch (MalformedURLException e) { - logger.error("URL异常", e); - return DownloadStatus.URL_ERROR; - } - File path = new File(savePath); - if (!path.exists()) { - path.mkdirs(); - } - File file = new File(savePath + File.separator + fileName); - if (file.exists()) { - if (downNew) { - file.delete(); - } else { - logger.info("文件已存在不重新下载!"); - return DownloadStatus.FILE_EXIST; - } - } - try { - httpUrl = (HttpURLConnection) urlfile.openConnection(); - httpUrl.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0"); - //读取超时时间 - httpUrl.setReadTimeout(60000); - //连接超时时间 - httpUrl.setConnectTimeout(60000); - httpUrl.connect(); - bis = new BufferedInputStream(httpUrl.getInputStream()); - bos = new BufferedOutputStream(new FileOutputStream(file)); - int len = 2048; - byte[] b = new byte[len]; - long readLen = 0; - while ((len = bis.read(b)) != -1) { - bos.write(b, 0, len); - } - logger.info("远程文件下载成功:" + fileUrl); - bos.flush(); - bis.close(); - httpUrl.disconnect(); - return DownloadStatus.DOWNLOAD_SUCCESS; - } catch (SocketTimeoutException e) { - logger.error("读取文件超时", e); - return DownloadStatus.TIME_OUT; - } catch (Exception e) { - logger.error("远程文件下载失败", e); - return DownloadStatus.DOWNLOAD_FAIL; - } finally { - try { - if (bis != null) { - bis.close(); - } - if (bos != null) { - bos.close(); - } - } catch (Exception e) { - logger.error("下载出错", e); - } - } - } -} diff --git a/spider/spiderflow/core/utils/SpiderFlowUtils.java b/spider/spiderflow/core/utils/SpiderFlowUtils.java deleted file mode 100644 index 9b6b04a..0000000 --- a/spider/spiderflow/core/utils/SpiderFlowUtils.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.spiderflow.core.utils; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.spiderflow.core.executor.shape.LoopJoinExecutor; -import org.spiderflow.model.SpiderNode; -import org.springframework.util.CollectionUtils; - -import com.alibaba.fastjson.JSON; - -/** - * 爬虫流程图工具类 - * @author jmxd - * - */ -public class SpiderFlowUtils { - - /** - * 加载流程图 - * @param xmlString string类型保存的XML流程图 - * @return SpiderNode 爬虫的开始节点 - */ - public static SpiderNode loadXMLFromString(String xmlString){ - Document document = Jsoup.parse(xmlString); - Elements cells = document.getElementsByTag("mxCell"); - Map nodeMap = new HashMap<>(); - SpiderNode root = null; - SpiderNode firstNode = null; - Map> edgeMap = new HashMap<>(); - for (Element element : cells) { - Map jsonProperty = getSpiderFlowJsonProperty(element); - SpiderNode node = new SpiderNode(); - node.setJsonProperty(jsonProperty); - String nodeId = element.attr("id"); - node.setNodeName(element.attr("value")); - node.setNodeId(nodeId); - nodeMap.put(nodeId, node); - if(element.hasAttr("edge")){ //判断是否是连线 - edgeMap.put(nodeId, Collections.singletonMap(element.attr("source"), element.attr("target"))); - } else if (jsonProperty != null && node.getStringJsonValue("shape") != null) { - if ("start".equals(node.getStringJsonValue("shape"))) { - root = node; - } else if ("loopJoin".equals(node.getStringJsonValue("shape"))) { - String joinNodeId = node.getStringJsonValue(LoopJoinExecutor.JOIN_NODE_ID); - node.setSync(true); - nodeMap.get(joinNodeId).setSync(true); - } - } - if("0".equals(nodeId)){ - firstNode = node; - } - } - //处理连线 - Set edges = edgeMap.keySet(); - for (String edgeId : edges) { - Set> entries = edgeMap.get(edgeId).entrySet(); - SpiderNode edgeNode = nodeMap.get(edgeId); - for (Entry edge : entries) { - SpiderNode sourceNode = nodeMap.get(edge.getKey()); - SpiderNode targetNode = nodeMap.get(edge.getValue()); - //设置流转条件 - targetNode.setCondition(sourceNode.getNodeId(),edgeNode.getStringJsonValue("condition")); - sourceNode.addNextNode(targetNode); - } - } - firstNode.addNextNode(root); - return firstNode; - } - - /** - * 提取配置的json属性 - */ - @SuppressWarnings("unchecked") - private static Map getSpiderFlowJsonProperty(Element element){ - Elements elements = element.getElementsByTag("JsonProperty"); - if(!CollectionUtils.isEmpty(elements)){ - return JSON.parseObject(elements.get(0).html(),Map.class); - } - return null; - } - - public static SpiderNode loadXMLFromBytes(byte[] bytes){ - return loadXMLFromString(new String(bytes)); - } -} diff --git a/spider/spiderflow/executor/FunctionExecutor.java b/spider/spiderflow/executor/FunctionExecutor.java deleted file mode 100644 index f16b220..0000000 --- a/spider/spiderflow/executor/FunctionExecutor.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.spiderflow.executor; - -public interface FunctionExecutor { - - String getFunctionPrefix(); - -} diff --git a/spider/spiderflow/executor/FunctionExtension.java b/spider/spiderflow/executor/FunctionExtension.java deleted file mode 100644 index e60a2d0..0000000 --- a/spider/spiderflow/executor/FunctionExtension.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.spiderflow.executor; - -public interface FunctionExtension { - - Class support(); -} diff --git a/spider/spiderflow/executor/PluginConfig.java b/spider/spiderflow/executor/PluginConfig.java deleted file mode 100644 index a2b662b..0000000 --- a/spider/spiderflow/executor/PluginConfig.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.spiderflow.executor; - -import org.spiderflow.model.Plugin; - -public interface PluginConfig { - - Plugin plugin(); - -} \ No newline at end of file diff --git a/spider/spiderflow/executor/ShapeExecutor.java b/spider/spiderflow/executor/ShapeExecutor.java deleted file mode 100644 index 99ad126..0000000 --- a/spider/spiderflow/executor/ShapeExecutor.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.spiderflow.executor; - -import java.util.Map; - -import org.spiderflow.context.SpiderContext; -import org.spiderflow.model.Shape; -import org.spiderflow.model.SpiderNode; -/** - * 执行器接口 - * @author jmxd - * - */ -public interface ShapeExecutor { - - String LOOP_VARIABLE_NAME = "loopVariableName"; - - String LOOP_COUNT = "loopCount"; - - String THREAD_COUNT = "threadCount"; - - default Shape shape(){ - return null; - } - - /** - * 节点形状 - * @return 节点形状名称 - */ - String supportShape(); - - /** - * 执行器具体的功能实现 - * @param node 当前要执行的爬虫节点 - * @param context 爬虫上下文 - * @param variables 节点流程的全部变量的集合 - */ - void execute(SpiderNode node, SpiderContext context, Map variables); - - default boolean allowExecuteNext(SpiderNode node, SpiderContext context, Map variables){ - return true; - } - - default boolean isThread(){ - return true; - } -} diff --git a/spider/spiderflow/expression/DynamicMethod.java b/spider/spiderflow/expression/DynamicMethod.java deleted file mode 100644 index b3e6eb2..0000000 --- a/spider/spiderflow/expression/DynamicMethod.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.spiderflow.expression; - -import java.util.List; - -public interface DynamicMethod { - - Object execute(String methodName, List parameters); - -} diff --git a/spider/spiderflow/io/Line.java b/spider/spiderflow/io/Line.java deleted file mode 100644 index 9ef0ec1..0000000 --- a/spider/spiderflow/io/Line.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.spiderflow.io; - -public class Line { - - private long from; - - private String text; - - private long to; - - public Line(long from, String text, long to) { - this.from = from; - this.text = text; - this.to = to; - } - - public long getFrom() { - return from; - } - - public void setFrom(long from) { - this.from = from; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public long getTo() { - return to; - } - - public void setTo(long to) { - this.to = to; - } - - @Override - public String toString() { - return "Line{" + - "from=" + from + - ", text='" + text + '\'' + - ", to=" + to + - '}'; - } -} diff --git a/spider/spiderflow/io/RandomAccessFileReader.java b/spider/spiderflow/io/RandomAccessFileReader.java deleted file mode 100644 index e586c6c..0000000 --- a/spider/spiderflow/io/RandomAccessFileReader.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.spiderflow.io; - -import java.io.Closeable; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; - -public class RandomAccessFileReader implements Closeable { - - private RandomAccessFile raf; - - /** - * 从index位置开始读取 - */ - private long index; - - /** - * 读取顺序,默认倒叙 - */ - private boolean reversed; - - /** - * 缓冲区大小 - */ - private int bufSize; - - public RandomAccessFileReader(RandomAccessFile raf, long index, boolean reversed) throws IOException { - this(raf, index, 1024, reversed); - } - - public RandomAccessFileReader(RandomAccessFile raf, long index, int bufSize, boolean reversed) throws IOException { - if (raf == null) { - throw new NullPointerException("file is null"); - } - this.raf = raf; - this.reversed = reversed; - this.bufSize = bufSize; - this.index = index; - this.init(); - } - - private void init() throws IOException { - if (reversed) { - this.index = this.index == -1 ? this.raf.length() : Math.min(this.index, this.raf.length()); - } else { - this.index = Math.min(Math.max(this.index, 0), this.raf.length()); - } - if (this.index > 0) { - this.raf.seek(this.index); - } - } - - /** - * 读取n行 - * - * @param n 要读取的行数 - * @param keywords 搜索的关键词 - * @param matchcase 是否区分大小写 - * @param regx 是否是正则搜索 - * @return 返回Line对象,包含行的起始位置与终止位置 - */ - public List readLine(int n, String keywords, boolean matchcase, boolean regx) throws IOException { - List lines = new ArrayList<>(n); - long lastCRLFIndex = reversed ? this.index : (this.index > 0 ? this.index + 1 : -1); - boolean find = keywords == null || keywords.isEmpty(); - Pattern pattern = regx && !find ? Pattern.compile(keywords) : null; - while (n > 0) { - byte[] buf = reversed ? new byte[(int) Math.min(this.bufSize, this.index)] : new byte[this.bufSize]; - if (this.reversed) { - if (this.index == 0) { - break; - } - this.raf.seek(this.index -= buf.length); - } - int len = this.raf.read(buf, 0, buf.length); - if (len == -1) { //已读完 - break; - } - for (int i = 0; i < len && n > 0; i++) { - int readIndex = reversed ? len - i - 1 : i; - if (isCRLF(buf[readIndex])) { //如果读取到\r或\n - if (Math.abs(this.index + readIndex - lastCRLFIndex) > 1) { //两行之间的间距,当=1时则代表有\r\n,\n\r,\r\r,\n\n四种情况之一 - long fromIndex = reversed ? this.index + readIndex : lastCRLFIndex; //计算起止位置 - long endIndex = reversed ? lastCRLFIndex : this.index + readIndex; //计算终止位置 - Line line = readLine(fromIndex + 1, endIndex); //取出文本 - if (find || (find = (pattern == null ? find(line.getText(), keywords, matchcase) : find(line.getText(), pattern)))) { //定位查找,使被查找的行始终在第一行 - if (reversed) { - lines.add(0, line); //反向查找时,插入到List头部 - } else { - lines.add(line); - } - n--; - } - } - lastCRLFIndex = this.index + readIndex; //记录上次读取到的\r或\n位置 - } - } - if (!reversed) { - this.index += buf.length; - } - } - if (reversed && n > 0 && lastCRLFIndex > 1 && (find || lines.size() > 0)) { - lines.add(0, readLine(0, lastCRLFIndex)); - } - return lines; - } - - private boolean find(String text, String keywords, boolean matchcase) { - return matchcase ? text.contains(keywords) : text.toLowerCase().contains(keywords.toLowerCase()); - } - - private boolean find(String text, Pattern pattern) { - return pattern.matcher(text).find(); - } - - /** - * 从指定位置读取一行 - * - * @param fromIndex 开始位置 - * @param endIndex 结束位置 - * @return 返回Line对象 - * @throws IOException - */ - private Line readLine(long fromIndex, long endIndex) throws IOException { - long index = this.raf.getFilePointer(); - this.raf.seek(fromIndex); - byte[] buf = new byte[(int) (endIndex - fromIndex)]; - this.raf.read(buf, 0, buf.length); - Line line = new Line(fromIndex, new String(buf), endIndex); - this.raf.seek(index); - return line; - } - - private boolean isCRLF(byte b) { - return b == 13 || b == 10; - } - - @Override - public void close() throws IOException { - if (this.raf != null) { - this.raf.close(); - } - } -} diff --git a/spider/spiderflow/io/SpiderResponse.java b/spider/spiderflow/io/SpiderResponse.java deleted file mode 100644 index e1760ca..0000000 --- a/spider/spiderflow/io/SpiderResponse.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.spiderflow.io; - -import java.io.InputStream; -import java.util.Map; - -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; - -import com.alibaba.fastjson.JSON; - -public interface SpiderResponse { - - @Comment("获取返回状态码") - @Example("${resp.statusCode}") - int getStatusCode(); - - @Comment("获取网页标题") - @Example("${resp.title}") - String getTitle(); - - @Comment("获取网页html") - @Example("${resp.html}") - String getHtml(); - - @Comment("获取json") - @Example("${resp.json}") - default Object getJson(){ - return JSON.parse(getHtml()); - } - @Comment("获取cookies") - @Example("${resp.cookies}") - Map getCookies(); - - @Comment("获取headers") - @Example("${resp.headers}") - Map getHeaders(); - - @Comment("获取byte[]") - @Example("${resp.bytes}") - byte[] getBytes(); - - @Comment("获取ContentType") - @Example("${resp.contentType}") - String getContentType(); - - @Comment("获取当前url") - @Example("${resp.url}") - String getUrl(); - - @Example("${resp.setCharset('UTF-8')}") - default void setCharset(String charset){ - - } - @Example("${resp.stream}") - default InputStream getStream(){ - return null; - } -} diff --git a/spider/spiderflow/listener/SpiderListener.java b/spider/spiderflow/listener/SpiderListener.java deleted file mode 100644 index ffbbc56..0000000 --- a/spider/spiderflow/listener/SpiderListener.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.spiderflow.listener; - -import org.spiderflow.context.SpiderContext; - -public interface SpiderListener { - - /** - * 开始执行之前 - */ - void beforeStart(SpiderContext context); - - /** - * 执行完毕之后 - */ - void afterEnd(SpiderContext context); - -} diff --git a/spider/spiderflow/logback/SpiderFlowFileAppender.java b/spider/spiderflow/logback/SpiderFlowFileAppender.java deleted file mode 100644 index e5eff88..0000000 --- a/spider/spiderflow/logback/SpiderFlowFileAppender.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.spiderflow.logback; - -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.FileAppender; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.context.SpiderContextHolder; -import org.spiderflow.core.job.SpiderJobContext; - -import java.io.OutputStream; - -public class SpiderFlowFileAppender extends FileAppender { - - private OutputStream baseOutputStream; - - @Override - protected void subAppend(ILoggingEvent event) { - SpiderContext context = SpiderContextHolder.get(); - if(context instanceof SpiderJobContext){ - SpiderJobContext jobContext = (SpiderJobContext) context; - if(jobContext.getOutputstream() != getOutputStream()){ - super.setOutputStream(jobContext.getOutputstream()); - } - }else if(baseOutputStream != getOutputStream()){ - super.setOutputStream(baseOutputStream); - } - super.subAppend(event); - } - - @Override - public void setOutputStream(OutputStream outputStream) { - if(baseOutputStream == null){ - baseOutputStream = outputStream; - } - super.setOutputStream(outputStream); - } -} diff --git a/spider/spiderflow/logback/SpiderFlowWebSocketAppender.java b/spider/spiderflow/logback/SpiderFlowWebSocketAppender.java deleted file mode 100644 index 8fde974..0000000 --- a/spider/spiderflow/logback/SpiderFlowWebSocketAppender.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.spiderflow.logback; - -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.classic.spi.ThrowableProxy; -import ch.qos.logback.core.UnsynchronizedAppenderBase; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.context.SpiderContextHolder; -import org.spiderflow.model.SpiderLog; -import org.spiderflow.model.SpiderWebSocketContext; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class SpiderFlowWebSocketAppender extends UnsynchronizedAppenderBase { - - @Override - protected void append(ILoggingEvent event) { - SpiderContext context = SpiderContextHolder.get(); - if(context instanceof SpiderWebSocketContext){ - SpiderWebSocketContext socketContext = (SpiderWebSocketContext) context; - Object[] argumentArray = event.getArgumentArray(); - List arguments = argumentArray == null ? Collections.emptyList() : new ArrayList<>(Arrays.asList(argumentArray)); - ThrowableProxy throwableProxy = (ThrowableProxy) event.getThrowableProxy(); - if(throwableProxy != null){ - arguments.add(throwableProxy.getThrowable()); - } - socketContext.log(new SpiderLog(event.getLevel().levelStr.toLowerCase(),event.getMessage(),arguments)); - } - } -} diff --git a/spider/spiderflow/model/Grammer.java b/spider/spiderflow/model/Grammer.java deleted file mode 100644 index bb4474a..0000000 --- a/spider/spiderflow/model/Grammer.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.spiderflow.model; - -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.spiderflow.annotation.Comment; -import org.spiderflow.annotation.Example; -import org.spiderflow.annotation.Return; - -public class Grammer { - - private String owner; - - private String method; - - private String comment; - - private String example; - - private String function; - - private List returns; - - public String getOwner() { - return owner; - } - - public void setOwner(String owner) { - this.owner = owner; - } - - public String getMethod() { - return method; - } - - public void setMethod(String method) { - this.method = method; - } - - public String getFunction() { - return function; - } - - public void setFunction(String function) { - this.function = function; - } - - public String getComment() { - return comment; - } - - public void setComment(String comment) { - this.comment = comment; - } - - public String getExample() { - return example; - } - - public void setExample(String example) { - this.example = example; - } - - public List getReturns() { - return returns; - } - - public void setReturns(List returns) { - this.returns = returns; - } - - public static List findGrammers(Class clazz,String function,String owner,boolean mustStatic){ - Method[] methods = clazz.getDeclaredMethods(); - List grammers = new ArrayList<>(); - for (Method method : methods) { - if(Modifier.isPublic(method.getModifiers()) && (Modifier.isStatic(method.getModifiers())||!mustStatic)){ - Grammer grammer = new Grammer(); - grammer.setMethod(method.getName()); - Comment comment = method.getAnnotation(Comment.class); - if(comment != null){ - grammer.setComment(comment.value()); - } - Example example = method.getAnnotation(Example.class); - if(example != null){ - grammer.setExample(example.value()); - } - Return returns = method.getAnnotation(Return.class); - if(returns != null){ - Class[] clazzs = returns.value(); - List returnTypes = new ArrayList<>(); - for (int i = 0; i < clazzs.length; i++) { - returnTypes.add(clazzs[i].getSimpleName()); - } - grammer.setReturns(returnTypes); - }else{ - grammer.setReturns(Collections.singletonList(method.getReturnType().getSimpleName())); - } - grammer.setFunction(function); - grammer.setOwner(owner); - grammers.add(grammer); - } - } - return grammers; - } -} diff --git a/spider/spiderflow/model/JsonBean.java b/spider/spiderflow/model/JsonBean.java deleted file mode 100644 index bc13966..0000000 --- a/spider/spiderflow/model/JsonBean.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.spiderflow.model; - -public class JsonBean { - - private Integer code = 1; - - private String message = "执行成功"; - - private T data; - - public JsonBean(Integer code, String message, T data) { - this.code = code; - this.message = message; - this.data = data; - } - - public JsonBean(Integer code, String message) { - this.code = code; - this.message = message; - } - - public JsonBean(T data) { - this.data = data; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public T getData() { - return data; - } - - public void setData(T data) { - this.data = data; - } -} diff --git a/spider/spiderflow/model/Plugin.java b/spider/spiderflow/model/Plugin.java deleted file mode 100644 index 488f7fb..0000000 --- a/spider/spiderflow/model/Plugin.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.spiderflow.model; - -public class Plugin { - - private String name; - - private String url; - - public Plugin(String name, String url) { - this.name = name; - this.url = url; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - -} diff --git a/spider/spiderflow/model/Shape.java b/spider/spiderflow/model/Shape.java deleted file mode 100644 index 5d8ac04..0000000 --- a/spider/spiderflow/model/Shape.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.spiderflow.model; - -public class Shape { - - private String name; - - private String label; - - private String title; - - private String image; - - private String desc; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getImage() { - return image; - } - - public void setImage(String image) { - this.image = image; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } -} diff --git a/spider/spiderflow/model/SpiderLog.java b/spider/spiderflow/model/SpiderLog.java deleted file mode 100644 index 8fc976f..0000000 --- a/spider/spiderflow/model/SpiderLog.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.spiderflow.model; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.apache.commons.lang3.exception.ExceptionUtils; - -public class SpiderLog { - - private String level; - - private String message; - - private List variables; - - public SpiderLog(String level,String message, List variables) { - if(variables != null && variables.size() > 0){ - List nVariables = new ArrayList<>(variables.size()); - for (Object object : variables) { - if(object instanceof Throwable){ - nVariables.add(ExceptionUtils.getStackTrace((Throwable) object)); - }else{ - nVariables.add(object); - } - } - this.variables = nVariables; - } - this.level = level; - this.message = message; - } - - public SpiderLog(String level,String message, Object ... variables) { - this(level,message,variables == null ? Collections.emptyList() : Arrays.asList(variables)); - } - - public String getLevel() { - return level; - } - - public void setLevel(String level) { - this.level = level; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public List getVariables() { - return variables; - } - - public void setVariables(List variables) { - this.variables = variables; - } -} diff --git a/spider/spiderflow/model/SpiderNameValue.java b/spider/spiderflow/model/SpiderNameValue.java deleted file mode 100644 index 1cd64ee..0000000 --- a/spider/spiderflow/model/SpiderNameValue.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.spiderflow.model; -/** - * 参数NV对 - * @author jmxd - * - */ -public class SpiderNameValue { - /** - * 参数名称 - */ - private String name; - /** - * 参数值 - */ - private String value; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - @Override - public String toString() { - return "SpiderFlowNodeVariable [name=" + name + ", value=" + value + "]"; - } -} diff --git a/spider/spiderflow/model/SpiderNode.java b/spider/spiderflow/model/SpiderNode.java deleted file mode 100644 index d6d3de6..0000000 --- a/spider/spiderflow/model/SpiderNode.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.spiderflow.model; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.text.StringEscapeUtils; - -import com.alibaba.fastjson.JSONArray; - - -/** - * 爬虫节点 - * @author jmxd - * - */ -public class SpiderNode { - /** - * 节点的Json属性 - */ - private Map jsonProperty = new HashMap<>(); - /** - * 节点列表中的下一个节点 - */ - private List nextNodes = new ArrayList<>(); - /** - * 节点流转条件 - */ - private Map condition = new HashMap<>(); - /** - * 节点名称 - */ - private String nodeName; - /** - * 节点ID - */ - private String nodeId; - - private boolean sync = false; - - public String getNodeId() { - return nodeId; - } - - public void setNodeId(String nodeId) { - this.nodeId = nodeId; - } - - public String getNodeName() { - return nodeName; - } - - public void setNodeName(String nodeName) { - this.nodeName = nodeName; - } - - public String getStringJsonValue(String key){ - String value = (String) this.jsonProperty.get(key); - if(value != null){ - value = StringEscapeUtils.unescapeHtml4(value); - } - return value; - } - - public List> getListJsonValue(String ... keys){ - List arrays = new ArrayList<>(); - int size = -1; - List> result = new ArrayList<>(); - for (int i = 0; i < keys.length; i++) { - JSONArray jsonArray = (JSONArray) this.jsonProperty.get(keys[i]); - if(jsonArray != null){ - if(size == -1){ - size = jsonArray.size(); - }else if(size != jsonArray.size()){ - throw new ArrayIndexOutOfBoundsException(); - } - arrays.add(jsonArray); - } - } - for (int i = 0;i < size;i++) { - Map item = new HashMap<>(); - for (int j = 0; j < keys.length; j++) { - String val = arrays.get(j).getString(i); - if(val != null){ - val = StringEscapeUtils.unescapeHtml4(val); - } - item.put(keys[j],val); - } - result.add(item); - } - return result; - } - public void setJsonProperty(Map jsonProperty) { - this.jsonProperty = jsonProperty; - } - - public void addNextNode(SpiderNode nextNode){ - this.nextNodes.add(nextNode); - } - - public List getNextNodes() { - return nextNodes; - } - - public String getCondition(String fromNodeId) { - return condition.get(fromNodeId); - } - - public void setCondition(String fromNodeId,String condition) { - this.condition.put(fromNodeId, condition); - } - - public boolean isSync() { - return sync; - } - - public void setSync(boolean sync) { - this.sync = sync; - } - - @Override - public String toString() { - return "SpiderNode [jsonProperty=" + jsonProperty + ", nextNodes=" + nextNodes + ", condition=" + condition - + ", nodeName=" + nodeName + ", nodeId=" + nodeId + "]"; - } -} diff --git a/spider/spiderflow/model/SpiderOutput.java b/spider/spiderflow/model/SpiderOutput.java deleted file mode 100644 index d0a287d..0000000 --- a/spider/spiderflow/model/SpiderOutput.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.spiderflow.model; - -import java.util.ArrayList; -import java.util.List; - -public class SpiderOutput { - - /** - * 节点名称 - */ - private String nodeName; - - /** - * 节点Id - */ - private String nodeId; - - /** - * 输出项的名 - */ - private List outputNames = new ArrayList<>(); - - /** - * 输出项的值 - */ - private List values = new ArrayList<>(); - - public String getNodeName() { - return nodeName; - } - - public void setNodeName(String nodeName) { - this.nodeName = nodeName; - } - - public List getOutputNames() { - return outputNames; - } - - public void setOutputNames(List outputNames) { - this.outputNames = outputNames; - } - - public List getValues() { - return values; - } - - public void setValues(List values) { - this.values = values; - } - - public void addOutput(String name,Object value){ - this.outputNames.add(name); - this.values.add(value); - } - - public String getNodeId() { - return nodeId; - } - - public void setNodeId(String nodeId) { - this.nodeId = nodeId; - } - - @Override - public String toString() { - return "SpiderOutput [nodeName=" + nodeName + ", nodeId=" + nodeId + ", outputNames=" + outputNames - + ", values=" + values + "]"; - } -} diff --git a/spider/spiderflow/model/SpiderWebSocketContext.java b/spider/spiderflow/model/SpiderWebSocketContext.java deleted file mode 100644 index 07f84b5..0000000 --- a/spider/spiderflow/model/SpiderWebSocketContext.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.spiderflow.model; - -import com.alibaba.fastjson.JSON; -import org.apache.commons.lang3.time.DateFormatUtils; -import org.spiderflow.context.SpiderContext; -import org.spiderflow.core.serializer.FastJsonSerializer; - -import javax.websocket.Session; -import java.util.Date; - -/** - * WebSocket通讯中爬虫的上下文域 - * - * @author Administrator - */ -public class SpiderWebSocketContext extends SpiderContext { - - private static final long serialVersionUID = -1205530535069540245L; - - private Session session; - - public SpiderWebSocketContext(Session session) { - this.session = session; - } - - @Override - public void addOutput(SpiderOutput output) { - super.addOutput(output); - this.write(new WebSocketEvent<>("output", output)); - } - - public void log(SpiderLog log) { - write(new WebSocketEvent<>("log", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"), log)); - } - - public void write(WebSocketEvent event) { - try { - String message = JSON.toJSONString(event, FastJsonSerializer.serializeConfig); - if(session.isOpen()){ - synchronized (session){ - session.getBasicRemote().sendText(message); - } - }else{ - System.out.println("close:" + session.getId() + ":"+message); - } - } catch (Throwable ignored) { - } - } -} diff --git a/spider/spiderflow/model/WebSocketEvent.java b/spider/spiderflow/model/WebSocketEvent.java deleted file mode 100644 index 0fcd44a..0000000 --- a/spider/spiderflow/model/WebSocketEvent.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.spiderflow.model; - -/** - * WebSocket事件 - * @author Administrator - * - * @param - */ -public class WebSocketEvent { - - private String eventType; - - private String timestamp; - - private T message; - - public String getTimestamp() { - return timestamp; - } - - public void setTimestamp(String timestamp) { - this.timestamp = timestamp; - } - - public WebSocketEvent(String eventType, T message) { - this.eventType = eventType; - this.message = message; - } - - public WebSocketEvent(String eventType, String timestamp, T message) { - this.eventType = eventType; - this.timestamp = timestamp; - this.message = message; - } - - public String getEventType() { - return eventType; - } - - public void setEventType(String eventType) { - this.eventType = eventType; - } - - public T getMessage() { - return message; - } - - public void setMessage(T message) { - this.message = message; - } -} diff --git a/spider/spiderflow/utils/Maps.java b/spider/spiderflow/utils/Maps.java deleted file mode 100644 index 8fa3b49..0000000 --- a/spider/spiderflow/utils/Maps.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.spiderflow.utils; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Maps { - - public static Map add(Map srcMap,K k,V v){ - HashMap destMap = new HashMap<>(srcMap); - destMap.put(k, v); - return destMap; - } - - public static Map newMap(K key,V value){ - HashMap map = new HashMap<>(); - map.put(key, value); - return map; - } - - public static Map add(Map srcMap,List ks,List vs){ - HashMap destMap = new HashMap<>(srcMap); - if(ks != null && vs != null && ks.size() == vs.size()){ - int size = ks.size(); - for (int i = 0; i < size; i++) { - destMap.put(ks.get(0), vs.get(0)); - } - } - return destMap; - } -} diff --git a/spider/spiderflow/websocket/WebSocketEditorServer.java b/spider/spiderflow/websocket/WebSocketEditorServer.java deleted file mode 100644 index 167c350..0000000 --- a/spider/spiderflow/websocket/WebSocketEditorServer.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.spiderflow.websocket; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import org.spiderflow.core.Spider; -import org.spiderflow.core.utils.SpiderFlowUtils; -import org.spiderflow.model.SpiderWebSocketContext; -import org.spiderflow.model.WebSocketEvent; -import org.springframework.stereotype.Component; - -import javax.websocket.OnClose; -import javax.websocket.OnMessage; -import javax.websocket.Session; -import javax.websocket.server.ServerEndpoint; - -/** - * WebSocket通讯编辑服务 - * - * @author Administrator - */ -@ServerEndpoint("/ws") -@Component -public class WebSocketEditorServer { - - public static Spider spider; - - private SpiderWebSocketContext context; - - @OnMessage - public void onMessage(String message, Session session) { - JSONObject event = JSON.parseObject(message); - String eventType = event.getString("eventType"); - if ("test".equals(eventType)) { - context = new SpiderWebSocketContext(session); - context.setRunning(true); - new Thread(() -> { - String xml = event.getString("message"); - if (xml != null) { - spider.runWithTest(SpiderFlowUtils.loadXMLFromString(xml), context); - context.write(new WebSocketEvent<>("finish", null)); - } else { - context.write(new WebSocketEvent<>("error", "xml不正确!")); - } - context.setRunning(false); - }).start(); - } else if ("stop".equals(eventType) && context != null) { - context.setRunning(false); - } - } - - @OnClose - public void onClose(Session session) { - System.out.println("close"); - context.setRunning(false); - } - -} diff --git a/src/Test_1.java b/src/Test_1.java index 9af7a93..035b2f4 100644 --- a/src/Test_1.java +++ b/src/Test_1.java @@ -7,16 +7,7 @@ public class Test_1 { public static void main(String[] args) throws IOException { - // TODO Auto-generated method stub - byte[] arr = new byte[4]; - arr[0] = 0x78; - arr[1] = 0x56; - arr[2] = 0x34; - arr[3] = 0x12; - ByteArrayInputStream bais = new ByteArrayInputStream(arr); - DataInputStream dis = new DataInputStream(bais); - System.out.println(Integer.toHexString(dis.readInt())); } From 8c360a1e5223437cf8dc6c3aadbc8fe0c7525a7c Mon Sep 17 00:00:00 2001 From: vunited Date: Mon, 6 Jan 2020 17:12:59 +0800 Subject: [PATCH 7/8] 2020-1-7 last --- .classpath | 35 +- .settings/org.eclipse.core.resources.prefs | 3 - .settings/org.eclipse.jdt.core.prefs | 6 +- APITest/Constants.java | 33 + APITest/Demo.java | 166 +++ APITest/FileItem.java | 102 ++ APITest/ShowapiRequest.java | 254 ++++ .../src/main/java/com/aliyuncs/AcsError.java | 59 - .../com/aliyuncs/AcsErrorUnmarshaller.java | 17 - .../main/java/com/aliyuncs/AcsRequest.java | 404 ------ .../main/java/com/aliyuncs/AcsResponse.java | 14 - .../main/java/com/aliyuncs/CommonRequest.java | 492 -------- .../java/com/aliyuncs/CommonResponse.java | 44 - .../java/com/aliyuncs/CommonRoaRequest.java | 32 - .../java/com/aliyuncs/CommonRpcRequest.java | 33 - .../java/com/aliyuncs/DefaultAcsClient.java | 475 ------- .../main/java/com/aliyuncs/IAcsClient.java | 71 -- .../main/java/com/aliyuncs/RoaAcsRequest.java | 176 --- .../main/java/com/aliyuncs/RpcAcsRequest.java | 166 --- .../java/com/aliyuncs/auth/AcsURLEncoder.java | 35 - .../auth/AlibabaCloudCredentials.java | 8 - .../auth/AlibabaCloudCredentialsProvider.java | 9 - .../java/com/aliyuncs/auth/AuthConstant.java | 26 - .../com/aliyuncs/auth/BasicCredentials.java | 30 - .../auth/BasicSessionCredentials.java | 53 - .../aliyuncs/auth/BearerTokenCredentials.java | 29 - .../com/aliyuncs/auth/BearerTokenSigner.java | 30 - .../java/com/aliyuncs/auth/Credential.java | 94 -- ...CredentialsBackupCompatibilityAdaptor.java | 48 - .../auth/CredentialsProviderFactory.java | 7 - .../auth/DefaultCredentialsProvider.java | 63 - .../ECSMetadataServiceCredentialsFetcher.java | 113 -- ...nvironmentVariableCredentialsProvider.java | 26 - .../com/aliyuncs/auth/HmacSHA1Signer.java | 51 - .../aliyuncs/auth/ICredentialProvider.java | 8 - .../com/aliyuncs/auth/ISignatureComposer.java | 15 - .../main/java/com/aliyuncs/auth/ISigner.java | 14 - .../auth/InstanceProfileCredentials.java | 48 - .../InstanceProfileCredentialsProvider.java | 48 - .../com/aliyuncs/auth/KeyPairCredentials.java | 27 - .../com/aliyuncs/auth/LegacyCredentials.java | 22 - .../aliyuncs/auth/OssSignatureComposer.java | 70 -- .../auth/ProfileCredentialsProvider.java | 142 --- .../aliyuncs/auth/RoaSignatureComposer.java | 138 -- .../aliyuncs/auth/RpcSignatureComposer.java | 94 -- .../aliyuncs/auth/SHA256withRSASigner.java | 81 -- ...SAssumeRoleSessionCredentialsProvider.java | 130 -- ...etSessionAccessKeyCredentialsProvider.java | 73 -- .../main/java/com/aliyuncs/auth/Signer.java | 51 - .../auth/StaticCredentialsProvider.java | 29 - .../SystemPropertiesCredentialsProvider.java | 22 - .../aliyuncs/auth/sts/AssumeRoleRequest.java | 85 -- .../aliyuncs/auth/sts/AssumeRoleResponse.java | 108 -- .../sts/AssumeRoleResponseUnmarshaller.java | 28 - .../sts/GenerateSessionAccessKeyResponse.java | 80 -- .../auth/sts/GetSessionAccessKeyRequest.java | 59 - ...tSessionAccessKeyResponseUnmarshaller.java | 22 - .../endpoint/ChainedEndpointResolver.java | 78 -- .../endpoint/DefaultEndpointResolver.java | 65 - .../aliyuncs/endpoint/EndpointResolver.java | 7 - .../endpoint/EndpointResolverBase.java | 44 - .../endpoint/EndpointResolverRules.java | 82 -- ...ternalLocationServiceEndpointResolver.java | 34 - .../LocalConfigGlobalEndpointResolver.java | 62 - .../LocalConfigRegionalEndpointResolver.java | 149 --- .../LocationServiceEndpointResolver.java | 161 --- .../endpoint/ResolveEndpointRequest.java | 55 - .../UserCustomizedEndpointResolver.java | 37 - .../endpoint/UserVpcEndpointResolver.java | 28 - .../v20150612/DescribeEndpointsRequest.java | 47 - .../v20150612/DescribeEndpointsResponse.java | 108 -- ...DescribeEndpointsResponseUnmarshaller.java | 60 - .../aliyuncs/exceptions/ClientException.java | 81 -- .../exceptions/ErrorCodeConstant.java | 26 - .../exceptions/ErrorMessageConstant.java | 44 - .../com/aliyuncs/exceptions/ErrorType.java | 33 - .../aliyuncs/exceptions/ServerException.java | 34 - .../main/java/com/aliyuncs/http/CallBack.java | 26 - .../http/CompositeX509TrustManager.java | 60 - .../java/com/aliyuncs/http/FormatType.java | 36 - .../com/aliyuncs/http/HttpClientConfig.java | 307 ----- .../com/aliyuncs/http/HttpClientFactory.java | 52 - .../com/aliyuncs/http/HttpClientType.java | 24 - .../java/com/aliyuncs/http/HttpMessage.java | 276 ---- .../java/com/aliyuncs/http/HttpRequest.java | 20 - .../java/com/aliyuncs/http/HttpResponse.java | 54 - .../main/java/com/aliyuncs/http/HttpUtil.java | 172 --- .../java/com/aliyuncs/http/IHttpClient.java | 40 - .../java/com/aliyuncs/http/MethodType.java | 26 - .../java/com/aliyuncs/http/ProtocolType.java | 22 - .../com/aliyuncs/http/UserAgentConfig.java | 74 -- .../java/com/aliyuncs/http/X509TrustAll.java | 28 - .../http/clients/ApacheHttpClient.java | 383 ------ .../clients/ApacheIdleConnectionCleaner.java | 86 -- .../http/clients/CompatibleUrlConnClient.java | 364 ------ .../com/aliyuncs/profile/DefaultProfile.java | 195 --- .../com/aliyuncs/profile/IClientProfile.java | 78 -- .../java/com/aliyuncs/reader/JsonReader.java | 372 ------ .../main/java/com/aliyuncs/reader/Reader.java | 13 - .../com/aliyuncs/reader/ReaderFactory.java | 18 - .../java/com/aliyuncs/reader/XmlReader.java | 76 -- .../com/aliyuncs/regions/ProductDomain.java | 29 - .../transform/UnmarshallerContext.java | 98 -- .../unmarshaller/JsonUnmashaller.java | 23 - .../aliyuncs/unmarshaller/Unmarshaller.java | 9 - .../unmarshaller/UnmarshallerFactory.java | 17 - .../aliyuncs/unmarshaller/XmlUnmashaller.java | 27 - .../java/com/aliyuncs/utils/AuthUtils.java | 108 -- .../java/com/aliyuncs/utils/Base64Helper.java | 117 -- .../com/aliyuncs/utils/EnvironmentUtils.java | 48 - .../com/aliyuncs/utils/FlattenMapUtil.java | 189 --- .../main/java/com/aliyuncs/utils/IOUtils.java | 17 - .../java/com/aliyuncs/utils/LogUtils.java | 190 --- .../java/com/aliyuncs/utils/MapUtils.java | 81 -- .../com/aliyuncs/utils/ParameterHelper.java | 123 -- .../java/com/aliyuncs/utils/StringUtils.java | 8 - .../java/com/aliyuncs/utils/XmlUtils.java | 85 -- .../main/resources/com/aliyuncs/sdk/info.xml | 5 - .../src/main/resources/endpoints.json | 1111 ----------------- .../src/main/resources/project.properties | 1 - .../src/main/resources/regions.txt | 18 - APITest/com/show/api/util/.svn/entries | 273 ---- Base/com/baseType/TestByte.java | 31 - GUI/javaFx/Test.java | 10 + GUI/swing/Test.java | 10 + .../com/show/api/util => Utils}/Base64.java | 0 .../com/show/api/util => Utils}/ResData.java | 0 .../api/util => Utils}/ShowApiLogger.java | 0 .../show/api/util => Utils}/ShowApiUtils.java | 0 .../show/api/util => Utils}/StringUtils.java | 0 .../com/show/api/util => Utils}/WebUtils.java | 0 .../com/show/api/util => Utils}/ZipUtils.java | 0 WebStudy/CSS3/action/Test.java | 10 + WebStudy/HTML5/action/Test.java | 10 + WebStudy/js-es5/bootstrap/grib/Test.java | 10 + WebStudy/js-es5/bootstrap/model/Test.java | 10 + WebStudy/js-es5/extjs/Ejax/Test.java | 10 + WebStudy/js-es5/jquery/Ajax/Test.java | 10 + WebStudy/js-es6/Vue/Test.java | 10 + WebStudy/js-es6/angular/Test.java | 10 + WebStudy/js-es6/react/Test.java | 10 + WebStudy/js-typescript/new_vue/Test.java | 10 + WebStudy/socket/Test.java | 10 + WebStudy/webpack/Test.java | 10 + fastjson-1.2.9.jar | Bin 393517 -> 0 bytes src/hamcrest-2.1.jar => hamcrest-2.1.jar | Bin jsoup-1.12.1.jar | Bin 397112 -> 0 bytes lib/airec.jar | Bin 0 -> 201059 bytes lib/ccc.jar | Bin 0 -> 1018039 bytes lib/cdn.jar | Bin 0 -> 1072311 bytes lib/cloudapi.jar | Bin 0 -> 482489 bytes lib/core.jar | Bin 0 -> 189221 bytes lib/ecs.jar | Bin 0 -> 1251782 bytes lib/green.jar | Bin 0 -> 451326 bytes lib/ram.jar | Bin 0 -> 220854 bytes lib/rds.jar | Bin 0 -> 744293 bytes lib/ros.jar | Bin 0 -> 182422 bytes lib/slb.jar | Bin 0 -> 355210 bytes lib/vpc.jar | Bin 0 -> 926539 bytes mysql-connector-java-5.1.39-bin.jar | Bin 989497 -> 0 bytes pom.xml | 419 ++----- src/Test_1.java | 16 - src/Test_2.java | 64 - src/Test_3.java | 22 - src/Test_4.java | 16 - src/{ => main/java}/apiDay01/ApiDay01.java | 0 src/{ => main/java}/apiDay01/Member.java | 0 src/{ => main/java}/apiDay02/ApiDay02.java | 0 src/{ => main/java}/apiDay02/Person.java | 0 .../java}/apiDay03/AgeException.java | 0 src/{ => main/java}/apiDay03/ApiDay03.java | 0 src/{ => main/java}/apiDay03/Person.java | 0 src/{ => main/java}/apiDay04/ApiDay04.java | 0 src/{ => main/java}/apiDay05/ApiDay05.java | 0 src/{ => main/java}/apiDay05/Student.java | 0 src/{ => main/java}/apiDay06/Animal.java | 0 src/{ => main/java}/apiDay06/AnimalCat.java | 0 src/{ => main/java}/apiDay06/AnimalDog.java | 0 .../java}/apiDay06/AnimalInterface.java | 0 src/{ => main/java}/apiDay06/ApiDay06.java | 0 src/{ => main/java}/apiDay06/Audi.java | 0 src/{ => main/java}/apiDay06/Benz.java | 0 src/{ => main/java}/apiDay06/Car.java | 0 src/{ => main/java}/apiDay06/Cat.java | 0 src/{ => main/java}/apiDay06/Dog.java | 0 src/{ => main/java}/apiDay06/Factory.java | 0 src/{ => main/java}/apiDay06/FactoryAudi.java | 0 src/{ => main/java}/apiDay06/FactoryBenz.java | 0 .../java}/apiDay06/FactoryInterface.java | 0 .../java}/apiDay06/FactoryMazda.java | 0 src/{ => main/java}/apiDay06/Fruit.java | 0 src/{ => main/java}/apiDay06/Mazda.java | 0 src/{ => main/java}/apiDay06/Outer1.java | 0 src/{ => main/java}/apiDay06/Outer2.java | 0 src/{ => main/java}/apiDay06/Outer3.java | 0 src/{ => main/java}/apiDay06/Player.java | 0 src/{ => main/java}/apiDay06/Single.java | 0 src/{ => main/java}/apiDay07/Account.java | 0 src/{ => main/java}/apiDay07/ApiDay07.java | 0 src/{ => main/java}/apiDay07/Customer.java | 0 src/{ => main/java}/apiDay07/Desk.java | 0 src/{ => main/java}/apiDay07/GreatThread.java | 0 src/{ => main/java}/apiDay07/LeftHand.java | 0 .../com/DesignPatternsand/Assistant.java | 0 .../java}/com/DesignPatternsand/Car.java | 0 .../java}/com/DesignPatternsand/CarDao.java | 0 .../java}/com/DesignPatternsand/ICar.java | 0 .../com/DesignPatternsand/IRepairable.java | 0 .../com/DesignPatternsand/ISellable.java | 0 .../java}/com/DesignPatternsand/Key.java | 0 .../java}/com/DesignPatternsand/Mechanic.java | 0 .../java}/com/DesignPatternsand/UML.java | 0 .../java}/com/DesignPatternsand/Vehicle.java | 0 .../com/DesignPatternsand/VehicleService.java | 0 src/{ => main/java}/com/annotation/MyIOC.java | 0 .../java}/com/annotation/OrginAnnotation.java | 0 .../java}/com/annotation/Person.java | 0 src/{ => main/java}/com/annotation/Test.java | 0 .../java}/com/annotation/Test.properties | 0 .../java}/com/annotation/TestAnnotation.java | 0 src/{ => main/java}/com/array/LeetCode.java | 0 src/{ => main/java}/com/array/Solution.java | 0 src/{ => main/java}/com/enums/SeasonEnum.java | 0 src/{ => main/java}/com/image/ImageIO2.java | 0 src/{ => main/java}/com/io/TestScanner.java | 0 src/{ => main/java}/com/math/Coin.java | 0 .../java}/com/numeber/TestNumbers.java | 0 .../java}/com/polymorphism/MainClass.java | 0 .../java}/com/polymorphism/Shape.java | 0 .../java}/com/polymorphism/StaticTest.java | 0 .../java}/com/polymorphism/SunClass.java | 0 .../java}/com/polymorphism/SupperClass.java | 0 .../com/polymorphism/TestPolymorphism.java | 0 src/{ => main/java}/com/reflection/A.java | 0 src/{ => main/java}/com/reflection/B.java | 0 src/{ => main/java}/com/reflection/IOC.java | 0 .../java}/com/reflection/MySpring.java | 0 .../java}/com/reflection/Person.java | 0 .../java}/com/reflection/Reflection.java | 0 src/{ => main/java}/com/singleton/Test.java | 0 .../java}/com/singleton/TestSingleton1.java | 0 .../java}/com/singleton/TestSingleton2.java | 0 .../java}/com/singleton/TestSingleton3.java | 0 .../java}/com/singleton/TestSingleton4.java | 0 src/{ => main/java}/com/spider/News.java | 0 src/{ => main/java}/com/spider/Test.java | 0 src/{ => main/java}/com/spider/TestWS.java | 0 .../java}/com/spider/WebSocketClient.java | 0 .../java}/com/stack/package-info.java | 0 .../java}/com/test/javaBasic/JavaDay04.java | 0 .../java}/com/thread/CallableAndFuture.java | 0 src/{ => main/java}/com/thread/School.java | 0 src/{ => main/java}/com/thread/Student.java | 0 src/{ => main/java}/com/thread/Teacher.java | 0 src/{ => main/java}/com/thread/Test.java | 0 src/{ => main/java}/com/thread/TestSleep.java | 0 .../java}/com/thread/TestThread.java | 0 .../java}/com/thread/ThreadMain.java | 0 src/{ => main/java}/com/wrapper/Test.java | 0 src/{ => main/java}/javaBasic/JavaDay01.java | 0 src/{ => main/java}/javaBasic/JavaDay02.java | 0 src/{ => main/java}/javaBasic/JavaDay03.java | 0 src/{ => main/java}/javaBasic/JavaDay05.java | 0 src/{ => main/java}/oopDay01/Car.java | 0 src/{ => main/java}/oopDay01/Company.java | 0 src/{ => main/java}/oopDay01/Cube.java | 0 src/{ => main/java}/oopDay01/Member.java | 0 src/{ => main/java}/oopDay01/OopDay01.java | 0 src/{ => main/java}/oopDay01/Student.java | 0 src/{ => main/java}/oopDay02/Birthday.java | 0 src/{ => main/java}/oopDay02/OopDay02.java | 0 src/{ => main/java}/oopDay02/OppDay0202.java | 0 src/{ => main/java}/oopDay02/Person.java | 0 src/{ => main/java}/oopDay03/Animal.java | 0 src/{ => main/java}/oopDay03/Cat.java | 0 src/{ => main/java}/oopDay03/Dog.java | 0 src/{ => main/java}/oopDay03/OopDay03.java | 0 src/{ => main/java}/oopDay03/Person.java | 0 src/{ => main/java}/oopDay03/Student.java | 0 src/{ => main/java}/oopDay03/Student02.java | 0 src/{ => main/java}/oopDay04/OopDay04.java | 0 src/{ => main/java}/oopDay05/AlarmCar.java | 0 src/{ => main/java}/oopDay05/AlarmSound.java | 0 .../java}/oopDay05/AlarmSound01.java | 0 .../java}/oopDay05/AlarmSound02.java | 0 src/{ => main/java}/oopDay05/FireEngine.java | 0 src/{ => main/java}/oopDay05/OopDay05.java | 0 src/{ => main/java}/oopDay05/PoliceCar.java | 0 src/{ => main/java}/oopDay05/TestC.java | 0 src/{ => main/java}/oopDay05/TestI.java | 0 src/{ => main/java}/oopDay06/Animal.java | 0 src/{ => main/java}/oopDay06/Member.java | 0 src/{ => main/java}/oopDay06/OopDay06.java | 0 src/{ => main/java}/oopDay06/TestFoo.java | 0 294 files changed, 847 insertions(+), 11073 deletions(-) delete mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 APITest/Constants.java create mode 100644 APITest/Demo.java create mode 100644 APITest/FileItem.java create mode 100644 APITest/ShowapiRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsError.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsErrorUnmarshaller.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsResponse.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonResponse.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRoaRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRpcRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/DefaultAcsClient.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/IAcsClient.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/RoaAcsRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/RpcAcsRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AcsURLEncoder.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AlibabaCloudCredentials.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AlibabaCloudCredentialsProvider.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AuthConstant.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BasicCredentials.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BasicSessionCredentials.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BearerTokenCredentials.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BearerTokenSigner.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/Credential.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/CredentialsBackupCompatibilityAdaptor.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/CredentialsProviderFactory.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/DefaultCredentialsProvider.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ECSMetadataServiceCredentialsFetcher.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/EnvironmentVariableCredentialsProvider.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/HmacSHA1Signer.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ICredentialProvider.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ISignatureComposer.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ISigner.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/InstanceProfileCredentials.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/InstanceProfileCredentialsProvider.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/KeyPairCredentials.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/LegacyCredentials.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/OssSignatureComposer.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ProfileCredentialsProvider.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/RoaSignatureComposer.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/RpcSignatureComposer.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/SHA256withRSASigner.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/STSAssumeRoleSessionCredentialsProvider.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/STSGetSessionAccessKeyCredentialsProvider.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/Signer.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/StaticCredentialsProvider.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/SystemPropertiesCredentialsProvider.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleResponse.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleResponseUnmarshaller.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GenerateSessionAccessKeyResponse.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GetSessionAccessKeyRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GetSessionAccessKeyResponseUnmarshaller.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/ChainedEndpointResolver.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/DefaultEndpointResolver.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolver.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolverBase.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolverRules.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/InternalLocationServiceEndpointResolver.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocalConfigGlobalEndpointResolver.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocalConfigRegionalEndpointResolver.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocationServiceEndpointResolver.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/ResolveEndpointRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/UserCustomizedEndpointResolver.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/UserVpcEndpointResolver.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/model/v20150612/DescribeEndpointsRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/model/v20150612/DescribeEndpointsResponse.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/transform/v20150612/DescribeEndpointsResponseUnmarshaller.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ClientException.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorCodeConstant.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorMessageConstant.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorType.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ServerException.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/CallBack.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/CompositeX509TrustManager.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/FormatType.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientConfig.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientFactory.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientType.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpMessage.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpRequest.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpResponse.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpUtil.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/IHttpClient.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/MethodType.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/ProtocolType.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/UserAgentConfig.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/X509TrustAll.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/ApacheHttpClient.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/ApacheIdleConnectionCleaner.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/CompatibleUrlConnClient.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/profile/DefaultProfile.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/profile/IClientProfile.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/JsonReader.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/Reader.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/ReaderFactory.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/XmlReader.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/regions/ProductDomain.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/transform/UnmarshallerContext.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/JsonUnmashaller.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/Unmarshaller.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/UnmarshallerFactory.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/XmlUnmashaller.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/AuthUtils.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/Base64Helper.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/EnvironmentUtils.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/FlattenMapUtil.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/IOUtils.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/LogUtils.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/MapUtils.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/ParameterHelper.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/StringUtils.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/XmlUtils.java delete mode 100644 APITest/aliyun-java-sdk-core/src/main/resources/com/aliyuncs/sdk/info.xml delete mode 100644 APITest/aliyun-java-sdk-core/src/main/resources/endpoints.json delete mode 100644 APITest/aliyun-java-sdk-core/src/main/resources/project.properties delete mode 100644 APITest/aliyun-java-sdk-core/src/main/resources/regions.txt delete mode 100644 APITest/com/show/api/util/.svn/entries delete mode 100644 Base/com/baseType/TestByte.java create mode 100644 GUI/javaFx/Test.java create mode 100644 GUI/swing/Test.java rename {APITest/com/show/api/util => Utils}/Base64.java (100%) rename {APITest/com/show/api/util => Utils}/ResData.java (100%) rename {APITest/com/show/api/util => Utils}/ShowApiLogger.java (100%) rename {APITest/com/show/api/util => Utils}/ShowApiUtils.java (100%) rename {APITest/com/show/api/util => Utils}/StringUtils.java (100%) rename {APITest/com/show/api/util => Utils}/WebUtils.java (100%) rename {APITest/com/show/api/util => Utils}/ZipUtils.java (100%) create mode 100644 WebStudy/CSS3/action/Test.java create mode 100644 WebStudy/HTML5/action/Test.java create mode 100644 WebStudy/js-es5/bootstrap/grib/Test.java create mode 100644 WebStudy/js-es5/bootstrap/model/Test.java create mode 100644 WebStudy/js-es5/extjs/Ejax/Test.java create mode 100644 WebStudy/js-es5/jquery/Ajax/Test.java create mode 100644 WebStudy/js-es6/Vue/Test.java create mode 100644 WebStudy/js-es6/angular/Test.java create mode 100644 WebStudy/js-es6/react/Test.java create mode 100644 WebStudy/js-typescript/new_vue/Test.java create mode 100644 WebStudy/socket/Test.java create mode 100644 WebStudy/webpack/Test.java delete mode 100644 fastjson-1.2.9.jar rename src/hamcrest-2.1.jar => hamcrest-2.1.jar (100%) delete mode 100644 jsoup-1.12.1.jar create mode 100644 lib/airec.jar create mode 100644 lib/ccc.jar create mode 100644 lib/cdn.jar create mode 100644 lib/cloudapi.jar create mode 100644 lib/core.jar create mode 100644 lib/ecs.jar create mode 100644 lib/green.jar create mode 100644 lib/ram.jar create mode 100644 lib/rds.jar create mode 100644 lib/ros.jar create mode 100644 lib/slb.jar create mode 100644 lib/vpc.jar delete mode 100644 mysql-connector-java-5.1.39-bin.jar delete mode 100644 src/Test_1.java delete mode 100644 src/Test_2.java delete mode 100644 src/Test_3.java delete mode 100644 src/Test_4.java rename src/{ => main/java}/apiDay01/ApiDay01.java (100%) rename src/{ => main/java}/apiDay01/Member.java (100%) rename src/{ => main/java}/apiDay02/ApiDay02.java (100%) rename src/{ => main/java}/apiDay02/Person.java (100%) rename src/{ => main/java}/apiDay03/AgeException.java (100%) rename src/{ => main/java}/apiDay03/ApiDay03.java (100%) rename src/{ => main/java}/apiDay03/Person.java (100%) rename src/{ => main/java}/apiDay04/ApiDay04.java (100%) rename src/{ => main/java}/apiDay05/ApiDay05.java (100%) rename src/{ => main/java}/apiDay05/Student.java (100%) rename src/{ => main/java}/apiDay06/Animal.java (100%) rename src/{ => main/java}/apiDay06/AnimalCat.java (100%) rename src/{ => main/java}/apiDay06/AnimalDog.java (100%) rename src/{ => main/java}/apiDay06/AnimalInterface.java (100%) rename src/{ => main/java}/apiDay06/ApiDay06.java (100%) rename src/{ => main/java}/apiDay06/Audi.java (100%) rename src/{ => main/java}/apiDay06/Benz.java (100%) rename src/{ => main/java}/apiDay06/Car.java (100%) rename src/{ => main/java}/apiDay06/Cat.java (100%) rename src/{ => main/java}/apiDay06/Dog.java (100%) rename src/{ => main/java}/apiDay06/Factory.java (100%) rename src/{ => main/java}/apiDay06/FactoryAudi.java (100%) rename src/{ => main/java}/apiDay06/FactoryBenz.java (100%) rename src/{ => main/java}/apiDay06/FactoryInterface.java (100%) rename src/{ => main/java}/apiDay06/FactoryMazda.java (100%) rename src/{ => main/java}/apiDay06/Fruit.java (100%) rename src/{ => main/java}/apiDay06/Mazda.java (100%) rename src/{ => main/java}/apiDay06/Outer1.java (100%) rename src/{ => main/java}/apiDay06/Outer2.java (100%) rename src/{ => main/java}/apiDay06/Outer3.java (100%) rename src/{ => main/java}/apiDay06/Player.java (100%) rename src/{ => main/java}/apiDay06/Single.java (100%) rename src/{ => main/java}/apiDay07/Account.java (100%) rename src/{ => main/java}/apiDay07/ApiDay07.java (100%) rename src/{ => main/java}/apiDay07/Customer.java (100%) rename src/{ => main/java}/apiDay07/Desk.java (100%) rename src/{ => main/java}/apiDay07/GreatThread.java (100%) rename src/{ => main/java}/apiDay07/LeftHand.java (100%) rename src/{ => main/java}/com/DesignPatternsand/Assistant.java (100%) rename src/{ => main/java}/com/DesignPatternsand/Car.java (100%) rename src/{ => main/java}/com/DesignPatternsand/CarDao.java (100%) rename src/{ => main/java}/com/DesignPatternsand/ICar.java (100%) rename src/{ => main/java}/com/DesignPatternsand/IRepairable.java (100%) rename src/{ => main/java}/com/DesignPatternsand/ISellable.java (100%) rename src/{ => main/java}/com/DesignPatternsand/Key.java (100%) rename src/{ => main/java}/com/DesignPatternsand/Mechanic.java (100%) rename src/{ => main/java}/com/DesignPatternsand/UML.java (100%) rename src/{ => main/java}/com/DesignPatternsand/Vehicle.java (100%) rename src/{ => main/java}/com/DesignPatternsand/VehicleService.java (100%) rename src/{ => main/java}/com/annotation/MyIOC.java (100%) rename src/{ => main/java}/com/annotation/OrginAnnotation.java (100%) rename src/{ => main/java}/com/annotation/Person.java (100%) rename src/{ => main/java}/com/annotation/Test.java (100%) rename src/{ => main/java}/com/annotation/Test.properties (100%) rename src/{ => main/java}/com/annotation/TestAnnotation.java (100%) rename src/{ => main/java}/com/array/LeetCode.java (100%) rename src/{ => main/java}/com/array/Solution.java (100%) rename src/{ => main/java}/com/enums/SeasonEnum.java (100%) rename src/{ => main/java}/com/image/ImageIO2.java (100%) rename src/{ => main/java}/com/io/TestScanner.java (100%) rename src/{ => main/java}/com/math/Coin.java (100%) rename src/{ => main/java}/com/numeber/TestNumbers.java (100%) rename src/{ => main/java}/com/polymorphism/MainClass.java (100%) rename src/{ => main/java}/com/polymorphism/Shape.java (100%) rename src/{ => main/java}/com/polymorphism/StaticTest.java (100%) rename src/{ => main/java}/com/polymorphism/SunClass.java (100%) rename src/{ => main/java}/com/polymorphism/SupperClass.java (100%) rename src/{ => main/java}/com/polymorphism/TestPolymorphism.java (100%) rename src/{ => main/java}/com/reflection/A.java (100%) rename src/{ => main/java}/com/reflection/B.java (100%) rename src/{ => main/java}/com/reflection/IOC.java (100%) rename src/{ => main/java}/com/reflection/MySpring.java (100%) rename src/{ => main/java}/com/reflection/Person.java (100%) rename src/{ => main/java}/com/reflection/Reflection.java (100%) rename src/{ => main/java}/com/singleton/Test.java (100%) rename src/{ => main/java}/com/singleton/TestSingleton1.java (100%) rename src/{ => main/java}/com/singleton/TestSingleton2.java (100%) rename src/{ => main/java}/com/singleton/TestSingleton3.java (100%) rename src/{ => main/java}/com/singleton/TestSingleton4.java (100%) rename src/{ => main/java}/com/spider/News.java (100%) rename src/{ => main/java}/com/spider/Test.java (100%) rename src/{ => main/java}/com/spider/TestWS.java (100%) rename src/{ => main/java}/com/spider/WebSocketClient.java (100%) rename src/{ => main/java}/com/stack/package-info.java (100%) rename src/{ => main/java}/com/test/javaBasic/JavaDay04.java (100%) rename src/{ => main/java}/com/thread/CallableAndFuture.java (100%) rename src/{ => main/java}/com/thread/School.java (100%) rename src/{ => main/java}/com/thread/Student.java (100%) rename src/{ => main/java}/com/thread/Teacher.java (100%) rename src/{ => main/java}/com/thread/Test.java (100%) rename src/{ => main/java}/com/thread/TestSleep.java (100%) rename src/{ => main/java}/com/thread/TestThread.java (100%) rename src/{ => main/java}/com/thread/ThreadMain.java (100%) rename src/{ => main/java}/com/wrapper/Test.java (100%) rename src/{ => main/java}/javaBasic/JavaDay01.java (100%) rename src/{ => main/java}/javaBasic/JavaDay02.java (100%) rename src/{ => main/java}/javaBasic/JavaDay03.java (100%) rename src/{ => main/java}/javaBasic/JavaDay05.java (100%) rename src/{ => main/java}/oopDay01/Car.java (100%) rename src/{ => main/java}/oopDay01/Company.java (100%) rename src/{ => main/java}/oopDay01/Cube.java (100%) rename src/{ => main/java}/oopDay01/Member.java (100%) rename src/{ => main/java}/oopDay01/OopDay01.java (100%) rename src/{ => main/java}/oopDay01/Student.java (100%) rename src/{ => main/java}/oopDay02/Birthday.java (100%) rename src/{ => main/java}/oopDay02/OopDay02.java (100%) rename src/{ => main/java}/oopDay02/OppDay0202.java (100%) rename src/{ => main/java}/oopDay02/Person.java (100%) rename src/{ => main/java}/oopDay03/Animal.java (100%) rename src/{ => main/java}/oopDay03/Cat.java (100%) rename src/{ => main/java}/oopDay03/Dog.java (100%) rename src/{ => main/java}/oopDay03/OopDay03.java (100%) rename src/{ => main/java}/oopDay03/Person.java (100%) rename src/{ => main/java}/oopDay03/Student.java (100%) rename src/{ => main/java}/oopDay03/Student02.java (100%) rename src/{ => main/java}/oopDay04/OopDay04.java (100%) rename src/{ => main/java}/oopDay05/AlarmCar.java (100%) rename src/{ => main/java}/oopDay05/AlarmSound.java (100%) rename src/{ => main/java}/oopDay05/AlarmSound01.java (100%) rename src/{ => main/java}/oopDay05/AlarmSound02.java (100%) rename src/{ => main/java}/oopDay05/FireEngine.java (100%) rename src/{ => main/java}/oopDay05/OopDay05.java (100%) rename src/{ => main/java}/oopDay05/PoliceCar.java (100%) rename src/{ => main/java}/oopDay05/TestC.java (100%) rename src/{ => main/java}/oopDay05/TestI.java (100%) rename src/{ => main/java}/oopDay06/Animal.java (100%) rename src/{ => main/java}/oopDay06/Member.java (100%) rename src/{ => main/java}/oopDay06/OopDay06.java (100%) rename src/{ => main/java}/oopDay06/TestFoo.java (100%) diff --git a/.classpath b/.classpath index b2b208e..10e23b8 100644 --- a/.classpath +++ b/.classpath @@ -1,27 +1,40 @@ - + - - - - + + + + + - - - - - + + + + - + + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 8dd9b1d..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,3 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 57188dd..b1a6e50 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,9 +1,9 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.compliance=1.5 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate @@ -11,4 +11,4 @@ org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/APITest/Constants.java b/APITest/Constants.java new file mode 100644 index 0000000..d37ee39 --- /dev/null +++ b/APITest/Constants.java @@ -0,0 +1,33 @@ +package com.show.api; + +/** + * 公用常量类。 + */ +public class Constants { + + /** 默认时间格式 **/ + public static final String DATE_TIME_FORMAT = "yyyyMMddHHmmss"; + + /** Date默认时区 **/ + public static final String DATE_TIMEZONE = "GMT+8"; + + /** UTF-8字符集 **/ + public static final String CHARSET_UTF8 = "UTF-8"; + + /** GBK字符集 **/ + public static final String CHARSET_GBK = "GBK"; + + /** JSON 应格式 */ + public static final String FORMAT_JSON = "json"; + /** XML 应格式 */ + public static final String FORMAT_XML = "xml"; + + /** MD5签名方式 */ + public static final String SIGN_METHOD_MD5 = "md5"; + /** HMAC签名方式 */ + public static final String SIGN_METHOD_HMAC = "hmac"; + + + + +} diff --git a/APITest/Demo.java b/APITest/Demo.java new file mode 100644 index 0000000..a55e22a --- /dev/null +++ b/APITest/Demo.java @@ -0,0 +1,166 @@ + +import java.io.File; +import java.io.FileInputStream; +import java.util.Iterator; +import java.util.Map; + +import com.show.api.util.Base64; +import com.show.api.util.WebUtils; + +public class Demo { + public static void 今日油价(String adfas[]) throws Exception { + byte b[] = new ShowapiRequest("http://ali-todayoil.showapi.com/todayoil", "appcode").addTextPara("prov", "北京") + .getAsByte(); + String str = new String(b, "utf-8"); + System.out.println(str); + } + + public static void ip(String adfas[]) throws Exception { + byte b[] = new ShowapiRequest("https://ali-ip.showapi.com/ip", "appcode").addTextPara("ip", "223.5.5.5") + .getAsByte(); + String str = new String(b, "utf-8"); + System.out.println(str); + } + + public static void 三网手机认证() throws Exception { + ShowapiRequest req = new ShowapiRequest("https://auditphone.showapi.com/phoneAudit", "appcode"); + byte b[] = req.addTextPara("typeId", "1").addTextPara("page", "1").getAsByte(); + String str = new String(b, "utf-8"); + Map map = req.getRes_headMap(); + Iterator it = map.keySet().iterator(); + while (it.hasNext()) { + Object k = it.next(); + System.out.println(k + " " + map.get(k)); + } + System.out.println(str); + + } + + public static void 银行卡归属地() throws Exception { + ShowapiRequest req = new ShowapiRequest("https://ali-bankcard4.showapi.com/bank4", "appcode"); + byte b[] = req.addTextPara("typeId", "1").addTextPara("page", "1").getAsByte(); + String str = new String(b, "utf-8"); + Map map = req.getRes_headMap(); + Iterator it = map.keySet().iterator(); + while (it.hasNext()) { + Object k = it.next(); + System.out.println(k + " " + map.get(k)); + } + System.out.println(str); + + } + + public static void 发送短信() throws Exception { + ShowapiRequest req = new ShowapiRequest("http://ali-sms.showapi.com/sendSms", "appcode"); + byte b[] = req.addTextPara("content", "1").addTextPara("mobile", "1").addTextPara("tNum", "1").getAsByte(); + String str = new String(b, "utf-8"); + Map map = req.getRes_headMap(); + Iterator it = map.keySet().iterator(); + while (it.hasNext()) { + Object k = it.next(); + System.out.println(k + " " + map.get(k)); + } + System.out.println(str); + + } + + public static void main(String adfas[]) throws Exception { + 图片验证(); + } + + public static void 虾米音乐(String adfas[]) throws Exception { + ShowapiRequest req = new ShowapiRequest("http://ali-music.showapi.com/xiamimusic-top", "appcode"); + byte b[] = req.addTextPara("typeId", "1").addTextPara("page", "1").getAsByte(); + String str = new String(b, "utf-8"); + Map map = req.getRes_headMap(); + Iterator it = map.keySet().iterator(); + while (it.hasNext()) { + Object k = it.next(); + System.out.println(k + " " + map.get(k)); + } + System.out.println(str); + } + + public static void 违章(String adfas[]) throws Exception { + ShowapiRequest req = new ShowapiRequest("https://ali-shanxi-car.showapi.com/sxwz_info", "appcode") + .addTextPara("carEngineCode", "BA40335").addTextPara("carNumber", "陕AF426G") + .addTextPara("carType", "02"); + byte b[] = req.getAsByte(); + String str = new String(b, "utf-8"); + System.out.println(str); + Map map = req.getRes_headMap(); + Iterator it = map.keySet().iterator(); + while (it.hasNext()) { + Object k = it.next(); + System.out.println(k + " " + map.get(k)); + } + } + + public static void 微信查询(String adfas[]) throws Exception { + ShowapiRequest req = new ShowapiRequest("http://ali-weixin.showapi.com/582-9", "appcode").addTextPara("url", + " "); + + byte b[] = req.getAsByte(); + String str = new String(b, "utf-8"); + System.out.println(str); + Map map = req.getRes_headMap(); + Iterator it = map.keySet().iterator(); + while (it.hasNext()) { + Object k = it.next(); + System.out.println(k + " " + map.get(k)); + } + } + + public static void ip查询天气(String adfas[]) throws Exception { + ShowapiRequest req = new ShowapiRequest("https://ali-weather.showapi.com/ip-to-weather", "appcode") + .addTextPara("ip", "223.5.5.5"); + byte b[] = req.getAsByte(); + String str = new String(b, "utf-8"); + System.out.println(str); + Map map = req.getRes_headMap(); + Iterator it = map.keySet().iterator(); + while (it.hasNext()) { + Object k = it.next(); + System.out.println(k + " " + map.get(k)); + } + } + + public static void 快递(String adfas[]) throws Exception { + ShowapiRequest req = new ShowapiRequest("http://ali-deliver.showapi.com/showapi_expInfo", "appcode") + .addTextPara("paraname", "xxxxx").addTextPara("paraname", "xxxxx").addTextPara("paraname", "xxxxx"); + byte b[] = req.postAsByte(); + String str = new String(b, "utf-8"); + System.out.println("aaaaaaaaaaaa"); + System.out.println(str); + Map map = req.getRes_headMap(); + Iterator it = map.keySet().iterator(); + System.out.println("bbbbbbbbbbb"); + while (it.hasNext()) { + Object k = it.next(); + System.out.println(k + " " + map.get(k)); + } + } + + public static void 图片验证() throws Exception { + ShowapiRequest req = new ShowapiRequest("http://ali-checkcode2.showapi.com/checkcode", "appcode"); + byte img[] = WebUtils.readByteFromStream(new FileInputStream(new File("c:/g86pm.jpg"))); + String base64string = new String(Base64.encode(img)); + System.out.println(base64string); + byte b[] = req.addTextPara("typeId", "3000").addTextPara("convert_to_jpg", "0") + .addTextPara("img_base64", base64string).postAsByte(); + // 打印返回头 + Map map = req.getRes_headMap(); + Iterator it = map.keySet().iterator(); + while (it.hasNext()) { + Object k = it.next(); + System.out.println(k + " " + map.get(k)); + } + // 打印返回体 + String res = new String(b, "utf-8"); + System.out.println(res); + + // 下面是使用阿里的fastjson包解析。如果不需要,请使用自己的解析包 +// JSONObject json=JSONObject.parseObject(res); +// System.out.println(json.getJSONObject("showapi_res_body")); + } +} diff --git a/APITest/FileItem.java b/APITest/FileItem.java new file mode 100644 index 0000000..21636c1 --- /dev/null +++ b/APITest/FileItem.java @@ -0,0 +1,102 @@ +package com.show.api; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.show.api.util.ShowApiUtils; + + +/** + * 文件元数据。 + */ +public class FileItem { + + private String fileName; + private String mimeType; + private byte[] content; + private File file; + + /** + * 基于本地文件的构造器。 + * + * @param file 本地文件 + */ + public FileItem(File file) { + this.file = file; + } + + /** + * 基于文件绝对路径的构造器。 + * + * @param filePath 文件绝对路径 + */ + public FileItem(String filePath) { + this(new File(filePath)); + } + + /** + * 基于文件名和字节流的构造器。 + * + * @param fileName 文件名 + * @param content 文件字节流 + */ + public FileItem(String fileName, byte[] content) { + this.fileName = fileName; + this.content = content; + } + + /** + * 基于文件名、字节流和媒体类型的构造器。 + * + * @param fileName 文件名 + * @param content 文件字节流 + * @param mimeType 媒体类型 + */ + public FileItem(String fileName, byte[] content, String mimeType) { + this(fileName, content); + this.mimeType = mimeType; + } + + public String getFileName() { + if (this.fileName == null && this.file != null && this.file.exists()) { + this.fileName = file.getName(); + } + return this.fileName; + } + + public String getMimeType() throws IOException { + if (this.mimeType == null) { + this.mimeType = ShowApiUtils.getMimeType(getContent()); + } + return this.mimeType; + } + + public byte[] getContent() throws IOException { + if (this.content == null && this.file != null && this.file.exists()) { + InputStream in = null; + ByteArrayOutputStream out = null; + + try { + in = new FileInputStream(this.file); + out = new ByteArrayOutputStream(); + int ch; + while ((ch = in.read()) != -1) { + out.write(ch); + } + this.content = out.toByteArray(); + } finally { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } + } + return this.content; + } + +} diff --git a/APITest/ShowapiRequest.java b/APITest/ShowapiRequest.java new file mode 100644 index 0000000..c726c95 --- /dev/null +++ b/APITest/ShowapiRequest.java @@ -0,0 +1,254 @@ + +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.show.api.util.WebUtils; + +/** + * 通用的客户端。 + */ +public class ShowapiRequest { + protected int connectTimeout = 3000;// 3秒 + protected int readTimeout = 15000;// 15秒 + protected String charset = "utf-8"; // 出去时的编码 + protected String charset_out = "utf-8"; // 读入时的编码,本来读入时编码可以程序自动识别,但有些网站输出头定义的是utf,但实际是gbk,此时就需要定义字段 + protected Proxy proxy = null; + protected boolean printException = true; // 是否输出异常 + protected boolean allowRedirect = true; // 是否允许重定向 + protected int responseCode = 200;// 返回的状态码 + + public int getResponseCode() { + return responseCode; + } + + public void setResponseCode(int responseCode) { + this.responseCode = responseCode; + } + + private String appcode; + static { + System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); + } + + public String getAppcode() { + return appcode; + } + + public void setAppcode(String appcode) { + this.appcode = appcode; + } + + public boolean isAllowRedirect() { + return allowRedirect; + } + + public ShowapiRequest setAllowRedirect(boolean allowRedirect) { + this.allowRedirect = allowRedirect; + return this; + } + + public boolean isPrintException() { + return printException; + } + + public ShowapiRequest setPrintException(boolean printException) { + this.printException = printException; + return this; + } + + public ShowapiRequest setProxy(String proxyIp, int proxyPort) { + this.proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, proxyPort)); + return this; + } + + public Proxy getProxy() { + return this.proxy; + } + + public String getCharset_out() { + return charset_out; + } + + public ShowapiRequest setCharset_out(String charset_out) { + this.charset_out = charset_out; + return this; + } + + protected String url; + + protected Map textMap = new HashMap(); + protected Map uploadMap = new HashMap(); + protected Map headMap = new HashMap(); + protected Map> res_headMap = new HashMap>();// 返回时的Map + + public Map> getRes_headMap() { + return res_headMap; + } + + public void setRes_headMap(Map> res_headtMap) { + this.res_headMap = res_headtMap; + } + + public ShowapiRequest(String url, String appcode) { + this.url = url.trim(); + this.appcode = appcode.trim(); + // 先设置一个默认的头 + this.addHeadPara("User-Agent", "showapi_sdk_ali"); + this.addHeadPara("Authorization", "APPCODE " + appcode); + } + + public Map getTextMap() { + return textMap; + } + + public void setTextMap(Map textMap) { + this.textMap = textMap; + } + + public String getUrl() { + return url; + } + + public String getCharset() { + return charset; + } + + public Map getUploadMap() { + return uploadMap; + } + + public void setUploadMap(Map uploadMap) { + this.uploadMap = uploadMap; + } + + public Map getHeadMap() { + return headMap; + } + + public void setHeadMap(Map headMap) { + this.headMap = headMap; + } + + public int getConnectTimeout() { + return connectTimeout; + } + + public int getReadTimeout() { + return readTimeout; + } + + public ShowapiRequest setConnectTimeout(int connectTimeout) { + this.connectTimeout = connectTimeout; + return this; + } + + public ShowapiRequest setReadTimeout(int readTimeout) { + this.readTimeout = readTimeout; + return this; + } + + public ShowapiRequest setCharset(String charset) { + this.charset = charset; + return this; + } +// DEFAULT_CHARSET + + /** + * 设置客户端与showapi网关的最大长连接数量。 + */ + public ShowapiRequest setUrl(String url) { + this.url = url; + return this; + } + + /** + * 添加post体的字符串参数 + */ + public ShowapiRequest addTextPara(String key, String value) { + this.textMap.put(key, value); + return this; + } + + /** + * 添加post体的上传文件参数 + */ + public ShowapiRequest addFilePara(String key, File item) { + this.uploadMap.put(key, item); + return this; + } + + /** + * 添加head头的字符串参数 + */ + public ShowapiRequest addHeadPara(String key, String value) { + this.headMap.put(key, value); + return this; + } + + public String post() { + String res = ""; + try { + res = WebUtils.doPost(this); + } catch (Exception e) { + if (printException) + e.printStackTrace(); + res = "{ret_code:-1,error:\"" + e.toString() + "\"}"; + } + return res; + } + + public byte[] postAsByte() { + byte res[] = null; + try { + res = WebUtils.doPostAsByte(this); + } catch (Exception e) { + if (printException) + e.printStackTrace(); + try { + res = ("{ret_code:-1,error:\"" + e.toString() + "\"}").getBytes("utf-8"); + } catch (UnsupportedEncodingException e1) { + if (printException) + e1.printStackTrace(); + } + } + return res; + } + + public String get() { + String res = ""; + try { + res = WebUtils.doGet(this); + } catch (Exception e) { + if (printException) + e.printStackTrace(); + res = "{ret_code:-1,error:\"" + e.toString() + "\"}"; + } + return res; + } + + public byte[] getAsByte() { + byte[] res = null; + try { + res = WebUtils.doGetAsByte(this); + } catch (Exception e) { + if (printException) + e.printStackTrace(); + try { + res = ("{ret_code:-1,error:\"" + e.toString() + "\"}").getBytes("utf-8"); + } catch (UnsupportedEncodingException e1) { + if (printException) + e1.printStackTrace(); + } + } + return res; + } + + public static void main(String adfas[]) throws Exception { + } + +} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsError.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsError.java deleted file mode 100644 index f5832f9..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsError.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.transform.UnmarshallerContext; - -public class AcsError extends AcsResponse { - - private int statusCode; - private String errorCode; - private String errorMessage; - private String requestId; - - public String getErrorCode() { - return errorCode; - } - - public void setErrorCode(String errorCode) { - this.errorCode = errorCode; - } - - public String getErrorMessage() { - return errorMessage; - } - - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - } - - public int getStatusCode() { - return statusCode; - } - - public void setStatusCode(int statusCode) { - this.statusCode = statusCode; - } - - @Override - public AcsError getInstance(UnmarshallerContext context) { - return AcsErrorUnmarshaller.unmarshall(this, context); - } - - public String getRequestId() { - return requestId; - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - @Override - public String toString() { - final StringBuffer sb = new StringBuffer("AcsError{"); - sb.append("statusCode=").append(statusCode); - sb.append(", errorCode='").append(errorCode).append('\''); - sb.append(", errorMessage='").append(errorMessage).append('\''); - sb.append(", requestId='").append(requestId).append('\''); - sb.append('}'); - return sb.toString(); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsErrorUnmarshaller.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsErrorUnmarshaller.java deleted file mode 100644 index 6395c2e..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsErrorUnmarshaller.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.transform.UnmarshallerContext; - -import java.util.Map; - -public class AcsErrorUnmarshaller { - public static AcsError unmarshall(AcsError error, UnmarshallerContext context) { - Map map = context.getResponseMap(); - error.setStatusCode(context.getHttpStatus()); - error.setRequestId(map.get("Error.RequestId") == null ? map.get("Error.requestId") : map.get("Error.RequestId")); - error.setErrorCode(map.get("Error.Code") == null ? map.get("Error.code") : map.get("Error.Code")); - error.setErrorMessage(map.get("Error.Message") == null ? map.get("Error.message") : map.get("Error.Message")); - - return error; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsRequest.java deleted file mode 100644 index f3f08d8..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsRequest.java +++ /dev/null @@ -1,404 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.auth.*; -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.HttpRequest; -import com.aliyuncs.http.ProtocolType; -import com.aliyuncs.http.UserAgentConfig; -import com.aliyuncs.regions.ProductDomain; - -import java.io.UnsupportedEncodingException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -@SuppressWarnings("deprecation") -public abstract class AcsRequest extends HttpRequest { - - private final Map queryParameters = new HashMap(); - private final Map domainParameters = new HashMap(); - private final Map bodyParameters = new HashMap(); - private UserAgentConfig userAgentConfig; - protected ISignatureComposer composer = null; - private String version = null; - private String product = null; - private String actionName = null; - private String regionId = null; - private String securityToken = null; - private FormatType acceptFormat = null; - private ProtocolType protocol = null; - private String locationProduct; - private String endpointType; - private ProductDomain productDomain = null; - protected String strToSign; - public HashMap productEndpointMap = null; - public String productEndpointRegional = null; - public String productNetwork = "public"; - public String productSuffix = ""; - - public AcsRequest(String product) { - super(null); - this.headers.put("x-sdk-client", "Java/2.0.0"); - this.headers.put("x-sdk-invoke-type", "normal"); - this.product = product; - } - - public static String concatQueryString(Map parameters) throws UnsupportedEncodingException { - if (null == parameters) { - return null; - } - - StringBuilder urlBuilder = new StringBuilder(""); - for (Entry entry : parameters.entrySet()) { - String key = entry.getKey(); - String val = entry.getValue(); - urlBuilder.append(AcsURLEncoder.encode(key)); - if (val != null) { - urlBuilder.append("=").append(AcsURLEncoder.encode(val)); - } - urlBuilder.append("&"); - } - - int strIndex = urlBuilder.length(); - if (parameters.size() > 0) { - urlBuilder.deleteCharAt(strIndex - 1); - } - - return urlBuilder.toString(); - } - - /** - * @deprecated : Use setSysEndpoint instead of this - */ - @Deprecated - public void setEndpoint(String endpoint) { - ProductDomain productDomain = new ProductDomain(product, endpoint); - setProductDomain(productDomain); - } - - /** - * @deprecated : Use getSysVersion instead of this - */ - @Deprecated - public String getVersion() { - return version; - } - - /** - * @deprecated : Use setSysVersion instead of this - */ - @Deprecated - public void setVersion(String version) { - this.version = version; - } - - /** - * @deprecated : Use getSysProduct instead of this - */ - @Deprecated - public String getProduct() { - return product; - } - - /** - * @deprecated : Use getSysActionName instead of this - */ - @Deprecated - public String getActionName() { - return actionName; - } - - /** - * @deprecated : Use setSysActionName instead of this - */ - @Deprecated - public void setActionName(String actionName) { - this.actionName = actionName; - } - - /** - * @deprecated : Use getSysRegionId instead of this - */ - @Deprecated - public String getRegionId() { - return regionId; - } - - /** - * @deprecated : Use setSysRegionId instead of this - */ - @Deprecated - public void setRegionId(String regionId) { - this.regionId = regionId; - } - - /** - * @deprecated : Use getSysSecurityToken instead of this - */ - @Deprecated - public String getSecurityToken() { - return securityToken; - } - - /** - * @deprecated : Use setSysSecurityToken instead of this - */ - @Deprecated - public void setSecurityToken(String securityToken) { - this.securityToken = securityToken; - putQueryParameter("SecurityToken", securityToken); - } - - /** - * @deprecated : Use getSysAcceptFormat instead of this - */ - @Deprecated - public FormatType getAcceptFormat() { - return acceptFormat; - } - - /** - * @deprecated : Use setSysAcceptFormat instead of this - */ - @Deprecated - public void setAcceptFormat(FormatType acceptFormat) { - this.acceptFormat = acceptFormat; - this.putHeaderParameter("Accept", FormatType.mapFormatToAccept(acceptFormat)); - } - - /** - * @deprecated : Use getSysProtocol instead of this - */ - @Deprecated - public ProtocolType getProtocol() { - return protocol; - } - - /** - * @deprecated : Use setSysProtocol instead of this - */ - @Deprecated - public void setProtocol(ProtocolType protocol) { - this.protocol = protocol; - } - - /** - * @deprecated : Use getSysQueryParameters instead of this - */ - @Deprecated - public Map getQueryParameters() { - return Collections.unmodifiableMap(queryParameters); - } - - public Map getSysQueryParameters() { - return Collections.unmodifiableMap(queryParameters); - } - - public void putQueryParameter(String name, K value) { - setParameter(this.queryParameters, name, value); - } - - protected void putQueryParameter(String name, String value) { - setParameter(this.queryParameters, name, value); - } - - /** - * @deprecated : Use getSysDomainParameters instead of this - */ - @Deprecated - public Map getDomainParameters() { - return Collections.unmodifiableMap(domainParameters); - } - - public Map getSysDomainParameters() { - return Collections.unmodifiableMap(domainParameters); - } - - protected void putDomainParameter(String name, Object value) { - setParameter(this.domainParameters, name, value); - } - - /** - * @deprecated : Use getSysBodyParameters instead of this - */ - @Deprecated - public Map getBodyParameters() { - return Collections.unmodifiableMap(bodyParameters); - } - - public Map getSysBodyParameters() { - return Collections.unmodifiableMap(bodyParameters); - } - - protected void putDomainParameter(String name, String value) { - setParameter(this.domainParameters, name, value); - } - - protected void putBodyParameter(String name, Object value) { - setParameter(this.bodyParameters, name, value); - } - - protected void setParameter(Map map, String name, Object value) { - if (null == map || name == null || value == null) { - return; - } - map.put(name, String.valueOf(value)); - } - - /** - * @deprecated : Use getSysLocationProduct instead of this - */ - @Deprecated - public String getLocationProduct() { - return locationProduct; - } - - /** - * @deprecated : Use setSysLocationProduct instead of this - */ - @Deprecated - public void setLocationProduct(String locationProduct) { - this.locationProduct = locationProduct; - putQueryParameter("ServiceCode", locationProduct); - } - - /** - * @deprecated : Use getSysEndpointType instead of this - */ - @Deprecated - public String getEndpointType() { - return endpointType; - } - - /** - * @deprecated : Use setSysEndpointType instead of this - */ - @Deprecated - public void setEndpointType(String endpointType) { - this.endpointType = endpointType; - putQueryParameter("Type", endpointType); - } - - /** - * @deprecated : Use getSysProductDomain instead of this - */ - @Deprecated - public ProductDomain getProductDomain() { - return productDomain; - } - - /** - * @deprecated : Use setSysProductDomain instead of this - */ - @Deprecated - public void setProductDomain(ProductDomain productDomain) { - this.productDomain = productDomain; - } - - public abstract HttpRequest signRequest(Signer signer, AlibabaCloudCredentials credentials, FormatType format, - ProductDomain domain) - throws InvalidKeyException, IllegalStateException, UnsupportedEncodingException, NoSuchAlgorithmException; - - public abstract String composeUrl(String endpoint, Map queries) throws UnsupportedEncodingException; - - public abstract Class getResponseClass(); - - public String getSysVersion() { - return version; - } - - public void setSysVersion(String version) { - this.version = version; - } - - public String getSysProduct() { - return product; - } - - public String getSysActionName() { - return actionName; - } - - public void setSysActionName(String actionName) { - this.actionName = actionName; - } - - public String getSysRegionId() { - return regionId; - } - - public void setSysRegionId(String regionId) { - this.regionId = regionId; - } - - public String getSysSecurityToken() { - return securityToken; - } - - public void setSysSecurityToken(String securityToken) { - this.securityToken = securityToken; - putQueryParameter("SecurityToken", securityToken); - } - - public FormatType getSysAcceptFormat() { - return acceptFormat; - } - - public void setSysAcceptFormat(FormatType acceptFormat) { - this.acceptFormat = acceptFormat; - this.putHeaderParameter("Accept", FormatType.mapFormatToAccept(acceptFormat)); - } - - public ProtocolType getSysProtocol() { - return protocol; - } - - public void setSysProtocol(ProtocolType protocol) { - this.protocol = protocol; - } - - public void setSysEndpoint(String endpoint) { - ProductDomain productDomain = new ProductDomain(product, endpoint); - setSysProductDomain(productDomain); - } - - public String getSysLocationProduct() { - return locationProduct; - } - - public void setSysLocationProduct(String locationProduct) { - this.locationProduct = locationProduct; - putQueryParameter("ServiceCode", locationProduct); - } - - public String getSysEndpointType() { - return endpointType; - } - - public void setSysEndpointType(String endpointType) { - this.endpointType = endpointType; - putQueryParameter("Type", endpointType); - } - - public ProductDomain getSysProductDomain() { - return productDomain; - } - - public void setSysProductDomain(ProductDomain productDomain) { - this.productDomain = productDomain; - } - - public UserAgentConfig getSysUserAgentConfig() { - return userAgentConfig; - } - - public void appendUserAgent(String key, String value) { - if (this.userAgentConfig == null) { - this.userAgentConfig = new UserAgentConfig(); - } - this.userAgentConfig.append(key, value); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsResponse.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsResponse.java deleted file mode 100644 index dbf952d..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/AcsResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.exceptions.ServerException; -import com.aliyuncs.transform.UnmarshallerContext; - -public abstract class AcsResponse { - - public abstract AcsResponse getInstance(UnmarshallerContext context) throws ClientException, ServerException; - - public boolean checkShowJsonItemName() { - return true; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRequest.java deleted file mode 100644 index d1eaa76..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRequest.java +++ /dev/null @@ -1,492 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.MethodType; -import com.aliyuncs.http.ProtocolType; -import com.aliyuncs.regions.ProductDomain; - -import java.util.HashMap; -import java.util.Map; - -public class CommonRequest { - - private final Map queryParameters = new HashMap(); - private final Map bodyParameters = new HashMap(); - private final Map headParameters = new HashMap(); - private String version = null; - private String product = null; - private String action = null; - private String locationProduct = null; - private String endpointType = null; - private String regionId = null; - private ProtocolType protocol = null; - private Integer connectTimeout = null; - private Integer readTimeout = null; - private MethodType method = null; - private FormatType httpContentType = null; - private byte[] httpContent = null; - private String encoding = null; - - private String uriPattern = null; - private Map pathParameters = new HashMap(); - - private String domain = null; - - @SuppressWarnings("rawtypes") - public AcsRequest buildRequest() { - if (uriPattern != null) { - CommonRoaRequest request = new CommonRoaRequest(product); - request.setSysUriPattern(uriPattern); - for (String pathParamKey : pathParameters.keySet()) { - request.putPathParameter(pathParamKey, pathParameters.get(pathParamKey)); - } - fillParams(request); - - return request; - } else { - CommonRpcRequest request = new CommonRpcRequest(product); - fillParams(request); - - return request; - } - } - - @SuppressWarnings("rawtypes") - private void fillParams(AcsRequest request) { - request.putHeaderParameter("x-sdk-invoke-type", "common"); - - if (version != null) { - request.setSysVersion(version); - } - if (action != null) { - request.setSysActionName(action); - } - if (regionId != null) { - request.setSysRegionId(regionId); - } - if (locationProduct != null) { - request.setSysLocationProduct(locationProduct); - } - if (endpointType != null) { - request.setSysEndpointType(endpointType); - } - if (connectTimeout != null) { - request.setSysConnectTimeout(connectTimeout); - } - if (readTimeout != null) { - request.setSysReadTimeout(readTimeout); - } - if (method != null) { - request.setSysMethod(method); - } - if (protocol != null) { - request.setSysProtocol(protocol); - } - if (domain != null) { - ProductDomain productDomain = new ProductDomain(product, domain); - request.setSysProductDomain(productDomain); - } - if (httpContent != null) { - request.setHttpContent(httpContent, encoding, httpContentType); - } - for (String queryParamKey : queryParameters.keySet()) { - request.putQueryParameter(queryParamKey, queryParameters.get(queryParamKey)); - } - for (String bodyParamKey : bodyParameters.keySet()) { - request.putBodyParameter(bodyParamKey, bodyParameters.get(bodyParamKey)); - } - for (String headParamKey : headParameters.keySet()) { - request.putHeaderParameter(headParamKey, headParameters.get(headParamKey)); - } - } - - /** - * @Deprecated : Use getSysVersion instead of this - */ - @Deprecated - public String getVersion() { - return version; - } - - /** - * @Deprecated : Use setSysVersion instead of this - */ - @Deprecated - public void setVersion(String version) { - this.version = version; - } - - /** - * @Deprecated : Use getSysProduct instead of this - */ - @Deprecated - public String getProduct() { - return product; - } - - /** - * @Deprecated : Use setSysProduct instead of this - */ - @Deprecated - public void setProduct(String product) { - this.product = product; - } - - /** - * @Deprecated : Use getSysAction instead of this - */ - @Deprecated - public String getAction() { - return action; - } - - /** - * @Deprecated : Use setSysAction instead of this - */ - @Deprecated - public void setAction(String action) { - this.action = action; - } - - /** - * @Deprecated : Use getSysLocationProduct instead of this - */ - @Deprecated - public String getLocationProduct() { - return locationProduct; - } - - /** - * @Deprecated : Use setSysLocationProduct instead of this - */ - @Deprecated - public void setLocationProduct(String locationProduct) { - this.locationProduct = locationProduct; - } - - /** - * @Deprecated : Use getSysEndpointType instead of this - */ - @Deprecated - public String getEndpointType() { - return endpointType; - } - - /** - * @Deprecated : Use setSysEndpointType instead of this - */ - @Deprecated - public void setEndpointType(String endpointType) { - this.endpointType = endpointType; - } - - /** - * @Deprecated : Use getSysRegionId instead of this - */ - @Deprecated - public String getRegionId() { - return regionId; - } - - /** - * @Deprecated : Use setSysRegionId instead of this - */ - @Deprecated - public void setRegionId(String regionId) { - this.regionId = regionId; - } - - /** - * @Deprecated : Use getSysProtocol instead of this - */ - @Deprecated - public ProtocolType getProtocol() { - return protocol; - } - - /** - * @Deprecated : Use setSysProtocol instead of this - */ - @Deprecated - public void setProtocol(ProtocolType protocol) { - this.protocol = protocol; - } - - public void putBodyParameter(String name, Object value) { - setParameter(this.bodyParameters, name, value); - } - - public void putQueryParameter(String name, String value) { - setParameter(this.queryParameters, name, value); - } - - public void putHeadParameter(String name, String value) { - setParameter(this.headParameters, name, value); - } - - private void setParameter(Map map, String name, Object value) { - if (null == map || name == null || value == null) { - return; - } - map.put(name, String.valueOf(value)); - } - - /** - * @Deprecated : Use getSysConnectTimeout instead of this - */ - @Deprecated - public Integer getConnectTimeout() { - return connectTimeout; - } - - /** - * @Deprecated : Use setSysConnectTimeout instead of this - */ - @Deprecated - public void setConnectTimeout(Integer connectTimeout) { - this.connectTimeout = connectTimeout; - } - - /** - * @Deprecated : Use getSysReadTimeout instead of this - */ - @Deprecated - public Integer getReadTimeout() { - return readTimeout; - } - - /** - * @Deprecated : Use setSysReadTimeout instead of this - */ - @Deprecated - public void setReadTimeout(Integer readTimeout) { - this.readTimeout = readTimeout; - } - - /** - * @Deprecated : Use getSysMethod instead of this - */ - @Deprecated - public MethodType getMethod() { - return method; - } - - /** - * @Deprecated : Use setSysMethod instead of this - */ - @Deprecated - public void setMethod(MethodType method) { - this.method = method; - } - - /** - * @Deprecated : Use getSysUriPattern instead of this - */ - @Deprecated - public String getUriPattern() { - return uriPattern; - } - - /** - * @Deprecated : Use setSysUriPattern instead of this - */ - @Deprecated - public void setUriPattern(String uriPattern) { - this.uriPattern = uriPattern; - } - - public void putPathParameter(String name, String value) { - setParameter(this.pathParameters, name, value); - } - - /** - * @Deprecated : Use getSysDomain instead of this - */ - @Deprecated - public String getDomain() { - return domain; - } - - /** - * @Deprecated : Use setSysDomain instead of this - */ - @Deprecated - public void setDomain(String domain) { - this.domain = domain; - } - - public FormatType getHttpContentType() { - return httpContentType; - } - - public byte[] getHttpContent() { - return httpContent; - } - - /** - * @Deprecated : Use getSysEncoding instead of this - */ - @Deprecated - public String getEncoding() { - return encoding; - } - - /** - * @Deprecated : Use getSysQueryParameters instead of this - */ - @Deprecated - public Map getQueryParameters() { - return queryParameters; - } - - /** - * @Deprecated : Use getSysBodyParameters instead of this - */ - @Deprecated - public Map getBodyParameters() { - return bodyParameters; - } - - /** - * @Deprecated : Use getSysHeadParameters instead of this - */ - @Deprecated - public Map getHeadParameters() { - return headParameters; - } - - /** - * @Deprecated : Use getSysPathParameters instead of this - */ - @Deprecated - public Map getPathParameters() { - return pathParameters; - } - - public void setHttpContent(byte[] content, String encoding, FormatType format) { - if (content == null || encoding == null || format == null) { - return; - } - this.httpContent = content; - this.httpContentType = format; - this.encoding = encoding; - } - - public String getSysVersion() { - return version; - } - - public void setSysVersion(String version) { - this.version = version; - } - - public String getSysProduct() { - return product; - } - - public void setSysProduct(String product) { - this.product = product; - } - - public String getSysAction() { - return action; - } - - public void setSysAction(String action) { - this.action = action; - } - - public String getSysLocationProduct() { - return locationProduct; - } - - public void setSysLocationProduct(String locationProduct) { - this.locationProduct = locationProduct; - } - - public String getSysEndpointType() { - return endpointType; - } - - public void setSysEndpointType(String endpointType) { - this.endpointType = endpointType; - } - - public String getSysRegionId() { - return regionId; - } - - public void setSysRegionId(String regionId) { - this.regionId = regionId; - } - - public ProtocolType getSysProtocol() { - return protocol; - } - - public void setSysProtocol(ProtocolType protocol) { - this.protocol = protocol; - } - - - public Integer getSysConnectTimeout() { - return connectTimeout; - } - - public void setSysConnectTimeout(Integer connectTimeout) { - this.connectTimeout = connectTimeout; - } - - public Integer getSysReadTimeout() { - return readTimeout; - } - - public void setSysReadTimeout(Integer readTimeout) { - this.readTimeout = readTimeout; - } - - public MethodType getSysMethod() { - return method; - } - - public void setSysMethod(MethodType method) { - this.method = method; - } - - public String getSysUriPattern() { - return uriPattern; - } - - public void setSysUriPattern(String uriPattern) { - this.uriPattern = uriPattern; - } - - public String getSysDomain() { - return domain; - } - - public void setSysDomain(String domain) { - this.domain = domain; - } - - public String getSysEncoding() { - return encoding; - } - - public Map getSysQueryParameters() { - return queryParameters; - } - - public Map getSysBodyParameters() { - return bodyParameters; - } - - public Map getSysHeadParameters() { - return headParameters; - } - - public Map getSysPathParameters() { - return pathParameters; - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonResponse.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonResponse.java deleted file mode 100644 index 42af188..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonResponse.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.exceptions.ServerException; -import com.aliyuncs.http.HttpResponse; -import com.aliyuncs.transform.UnmarshallerContext; - -public class CommonResponse extends AcsResponse { - - private String data; - - private int httpStatus; - - private HttpResponse httpResponse; - - @Override - public AcsResponse getInstance(UnmarshallerContext context) throws ClientException, ServerException { - return null; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public int getHttpStatus() { - return httpStatus; - } - - public void setHttpStatus(int httpStatus) { - this.httpStatus = httpStatus; - } - - public HttpResponse getHttpResponse() { - return httpResponse; - } - - public void setHttpResponse(HttpResponse httpResponse) { - this.httpResponse = httpResponse; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRoaRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRoaRequest.java deleted file mode 100644 index a5ea0c8..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRoaRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.http.FormatType; - -public class CommonRoaRequest extends RoaAcsRequest { - - public CommonRoaRequest(String product) { - super(product); - setSysAcceptFormat(FormatType.JSON); - } - - public CommonRoaRequest(String product, String version, String action) { - super(product, version, action); - setSysAcceptFormat(FormatType.JSON); - } - - public CommonRoaRequest(String product, String version, String action, String locationProduct) { - super(product, version, action, locationProduct); - setSysAcceptFormat(FormatType.JSON); - } - - public CommonRoaRequest(String product, String version, String action, String locationProduct, - String endpointType) { - super(product, version, action, locationProduct, endpointType); - setSysAcceptFormat(FormatType.JSON); - } - - @Override - public Class getResponseClass() { - return CommonResponse.class; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRpcRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRpcRequest.java deleted file mode 100644 index 389eb0c..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/CommonRpcRequest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.http.FormatType; - -public class CommonRpcRequest extends RpcAcsRequest { - - public CommonRpcRequest(String product) { - super(product); - setAcceptFormat(FormatType.JSON); - } - - public CommonRpcRequest(String product, String version, String action) { - super(product, version, action); - setAcceptFormat(FormatType.JSON); - } - - public CommonRpcRequest(String product, String version, String action, String locationProduct) { - super(product, version, action, locationProduct); - setAcceptFormat(FormatType.JSON); - } - - public CommonRpcRequest(String product, String version, String action, String locationProduct, - String endpointType) { - super(product, version, action, locationProduct, endpointType); - setAcceptFormat(FormatType.JSON); - } - - @Override - public Class getResponseClass() { - return CommonResponse.class; - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/DefaultAcsClient.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/DefaultAcsClient.java deleted file mode 100644 index eb6f5b5..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/DefaultAcsClient.java +++ /dev/null @@ -1,475 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.auth.*; -import com.aliyuncs.endpoint.DefaultEndpointResolver; -import com.aliyuncs.endpoint.EndpointResolver; -import com.aliyuncs.endpoint.ResolveEndpointRequest; -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.exceptions.ErrorCodeConstant; -import com.aliyuncs.exceptions.ErrorMessageConstant; -import com.aliyuncs.exceptions.ServerException; -import com.aliyuncs.http.*; -import com.aliyuncs.profile.DefaultProfile; -import com.aliyuncs.profile.IClientProfile; -import com.aliyuncs.reader.Reader; -import com.aliyuncs.reader.ReaderFactory; -import com.aliyuncs.regions.ProductDomain; -import com.aliyuncs.transform.UnmarshallerContext; -import com.aliyuncs.unmarshaller.Unmarshaller; -import com.aliyuncs.unmarshaller.UnmarshallerFactory; -import com.aliyuncs.utils.IOUtils; -import com.aliyuncs.utils.LogUtils; -import org.slf4j.Logger; - -import javax.xml.bind.annotation.XmlRootElement; -import java.io.IOException; -import java.net.SocketTimeoutException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -@SuppressWarnings("deprecation") -public class DefaultAcsClient implements IAcsClient { - - /* - Now maxRetryNumber and autoRetry has no effect. - */ - private int maxRetryNumber = 3; - private boolean autoRetry = true; - private IClientProfile clientProfile = null; - private AlibabaCloudCredentialsProvider credentialsProvider; - private DefaultCredentialsProvider defaultCredentialsProvider; - - private IHttpClient httpClient; - private EndpointResolver endpointResolver; - private static final String SIGNATURE_BEGIN = "string to sign is:"; - private final UserAgentConfig userAgentConfig = new UserAgentConfig(); - - /** - * @Deprecated : Use DefaultAcsClient(String regionId) instead of this - */ - @Deprecated - public DefaultAcsClient() throws ClientException { - this.clientProfile = DefaultProfile.getProfile(); - this.httpClient = HttpClientFactory.buildClient(this.clientProfile); - } - - public DefaultAcsClient(String regionId) throws ClientException { - this.clientProfile = DefaultProfile.getProfile(regionId); - this.httpClient = HttpClientFactory.buildClient(this.clientProfile); - this.defaultCredentialsProvider = new DefaultCredentialsProvider(); - this.endpointResolver = new DefaultEndpointResolver(this); - this.appendUserAgent("HTTPClient", this.httpClient.getClass().getSimpleName()); - } - - public DefaultAcsClient(IClientProfile profile) { - this(profile, new StaticCredentialsProvider(profile)); - } - - public DefaultAcsClient(IClientProfile profile, AlibabaCloudCredentials credentials) { - this(profile, new StaticCredentialsProvider(credentials)); - } - - public DefaultAcsClient(IClientProfile profile, AlibabaCloudCredentialsProvider credentialsProvider) { - this.clientProfile = profile; - this.credentialsProvider = credentialsProvider; - this.clientProfile.setCredentialsProvider(this.credentialsProvider); - this.httpClient = HttpClientFactory.buildClient(this.clientProfile); - this.endpointResolver = new DefaultEndpointResolver(this, profile); - this.appendUserAgent("HTTPClient", this.httpClient.getClass().getSimpleName()); - } - - @Override - public HttpResponse doAction(AcsRequest request) - throws ClientException, ServerException { - return this.doAction(request, autoRetry, maxRetryNumber, this.clientProfile); - } - - @Override - public HttpResponse doAction(AcsRequest request, boolean autoRetry, int maxRetryCounts) - throws ClientException, ServerException { - return this.doAction(request, autoRetry, maxRetryCounts, this.clientProfile); - } - - @Override - public HttpResponse doAction(AcsRequest request, IClientProfile profile) - throws ClientException, ServerException { - return this.doAction(request, this.autoRetry, this.maxRetryNumber, profile); - } - - @Override - public HttpResponse doAction(AcsRequest request, String regionId, Credential credential) - throws ClientException, ServerException { - Signer signer = Signer.getSigner(new LegacyCredentials(credential)); - FormatType format = null; - if (null == request.getSysRegionId()) { - request.setSysRegionId(regionId); - } - return doAction(request, autoRetry, maxRetryNumber, regionId, new LegacyCredentials(credential), signer, - format); - } - - @Override - public T getAcsResponse(AcsRequest request) throws ServerException, ClientException { - HttpResponse baseResponse = this.doAction(request); - return parseAcsResponse(request, baseResponse); - } - - @Override - public T getAcsResponse(AcsRequest request, boolean autoRetry, int maxRetryCounts) - throws ServerException, ClientException { - HttpResponse baseResponse = this.doAction(request, autoRetry, maxRetryCounts); - return parseAcsResponse(request, baseResponse); - } - - @Override - public T getAcsResponse(AcsRequest request, IClientProfile profile) - throws ServerException, ClientException { - HttpResponse baseResponse = this.doAction(request, profile); - return parseAcsResponse(request, baseResponse); - } - - @Override - public T getAcsResponse(AcsRequest request, String regionId, Credential credential) - throws ServerException, ClientException { - HttpResponse baseResponse = this.doAction(request, regionId, credential); - return parseAcsResponse(request, baseResponse); - } - - @Override - public T getAcsResponse(AcsRequest request, String regionId) - throws ServerException, ClientException { - if (null == request.getSysRegionId()) { - request.setSysRegionId(regionId); - } - HttpResponse baseResponse = this.doAction(request); - return parseAcsResponse(request, baseResponse); - } - - @SuppressWarnings("unchecked") - @Override - public CommonResponse getCommonResponse(CommonRequest request) throws ServerException, ClientException { - HttpResponse baseResponse = this.doAction(request.buildRequest()); - if (baseResponse.isSuccess()) { - String stringContent = baseResponse.getHttpContentString(); - CommonResponse response = new CommonResponse(); - response.setData(stringContent); - response.setHttpStatus(baseResponse.getStatus()); - response.setHttpResponse(baseResponse); - return response; - } else { - FormatType format = baseResponse.getHttpContentType(); - AcsError error = readError(baseResponse, format); - if (500 <= baseResponse.getStatus()) { - throw new ServerException(error.getErrorCode(), error.getErrorMessage(), error.getRequestId()); - } else { - throw new ClientException(error.getErrorCode(), error.getErrorMessage(), error.getRequestId()); - } - } - } - - @Override - public HttpResponse doAction(AcsRequest request, boolean autoRetry, int maxRetryCounts, - IClientProfile profile) throws ClientException, ServerException { - if (null == profile) { - throw new ClientException("SDK.InvalidProfile", "No active profile found."); - } - boolean retry = autoRetry; - int retryNumber = maxRetryCounts; - String region = profile.getRegionId(); - if (null == request.getSysRegionId()) { - request.setSysRegionId(region); - } - AlibabaCloudCredentials credentials; - if (null == credentialsProvider) { - credentials = this.defaultCredentialsProvider.getCredentials(); - } else { - credentials = this.credentialsProvider.getCredentials(); - } - Signer signer = Signer.getSigner(credentials); - FormatType format = profile.getFormat(); - - return this.doAction(request, retry, retryNumber, request.getSysRegionId(), credentials, signer, format); - } - - private T parseAcsResponse(AcsRequest request, HttpResponse baseResponse) - throws ServerException, ClientException { - FormatType format = baseResponse.getHttpContentType(); - if (baseResponse.isSuccess()) { - return readResponse(request.getResponseClass(), baseResponse, format); - } else { - AcsError error = readError(baseResponse, format); - if (500 <= baseResponse.getStatus()) { - throw new ServerException(error.getErrorCode(), error.getErrorMessage(), error.getRequestId()); - } else if (400 == baseResponse.getStatus() && ("IncompleteSignature".equals(error.getErrorCode()) - || "SignatureDoesNotMatch".equals(error.getErrorCode()))) { - String errorMessage = error.getErrorMessage(); - Pattern startPattern = Pattern.compile(SIGNATURE_BEGIN); - Matcher startMatcher = startPattern.matcher(errorMessage); - if (startMatcher.find()) { - int start = startMatcher.end(); - String errorStrToSign = errorMessage.substring(start); - if (request.strToSign.equals(errorStrToSign)) { - throw new ClientException("SDK.InvalidAccessKeySecret", - "Specified Access Key Secret is not valid.", error.getRequestId()); - } - } - } - throw new ClientException(error.getErrorCode(), error.getErrorMessage(), error.getRequestId()); - } - } - - /** - * @Deprecated : Use other overload methods - */ - @Deprecated - public HttpResponse doAction(AcsRequest request, boolean autoRetry, int maxRetryNumber, - String regionId, Credential credential, Signer signer, FormatType format) - throws ClientException, ServerException { - return doAction(request, autoRetry, maxRetryNumber, regionId, new LegacyCredentials(credential), signer, - format); - } - - public ProductDomain getDomain(AcsRequest request, String regionId) - throws ClientException { - ProductDomain domain = null; - if (request.getSysProductDomain() != null) { - domain = request.getSysProductDomain(); - } else { - ResolveEndpointRequest resolveEndpointRequest = new ResolveEndpointRequest(regionId, - request.getSysProduct(), request.getSysLocationProduct(), request.getSysEndpointType()); - resolveEndpointRequest.setProductEndpointMap(request.productEndpointMap); - resolveEndpointRequest.setProductEndpointRegional(request.productEndpointRegional); - resolveEndpointRequest.setProductNetwork(request.productNetwork); - resolveEndpointRequest.setProductSuffix(request.productSuffix); - String endpoint = endpointResolver.resolve(resolveEndpointRequest); - domain = new ProductDomain(request.getSysProduct(), endpoint); - - if (endpoint.endsWith("endpoint-test.exception.com")) { - // For endpoint testability, if the endpoint is xxxx.endpoint-test.special.com - // throw a client exception with this endpoint - throw new ClientException(ErrorCodeConstant.SDK_ENDPOINT_TESTABILITY, endpoint); - } - } - - return domain; - } - - private HttpResponse doAction(AcsRequest request, boolean autoRetry, int maxRetryNumber, - String regionId, AlibabaCloudCredentials credentials, Signer signer, FormatType format) - throws ClientException, ServerException { - - doActionWithProxy(request.getSysProtocol(), System.getenv("HTTPS_PROXY"), System.getenv("HTTP_PROXY")); - doActionWithIgnoreSSL(request, X509TrustAll.ignoreSSLCerts); - - Logger logger = clientProfile.getLogger(); - String startTime = ""; - String timeCost = ""; - HttpResponse response = null; - String errorMessage = ""; - try { - FormatType requestFormatType = request.getSysAcceptFormat(); - if (null != requestFormatType) { - format = requestFormatType; - } - - ProductDomain domain = getDomain(request, regionId); - - if (request.getSysProtocol() == null) { - request.setSysProtocol(this.clientProfile.getHttpClientConfig().getProtocolType()); - } - request.putHeaderParameter("User-Agent", - UserAgentConfig.resolve(request.getSysUserAgentConfig(), this.userAgentConfig)); - try { - HttpRequest httpRequest = request.signRequest(signer, credentials, format, domain); - HttpUtil.debugHttpRequest(request); - startTime = LogUtils.localeNow(); - long start = System.nanoTime(); - response = this.httpClient.syncInvoke(httpRequest); - long end = System.nanoTime(); - timeCost = TimeUnit.NANOSECONDS.toMillis(end - start) + "ms"; - HttpUtil.debugHttpResponse(response); - return response; - } catch (SocketTimeoutException exp) { - errorMessage = exp.getMessage(); - throw new ClientException("SDK.ReadTimeout", - "SocketTimeoutException has occurred on a socket read or accept.The url is " + - request.getSysUrl(), exp); - } catch (IOException exp) { - errorMessage = exp.getMessage(); - throw new ClientException("SDK.ServerUnreachable", - "Server unreachable: connection " + request.getSysUrl() + " failed", exp); - } - } catch (InvalidKeyException exp) { - errorMessage = exp.getMessage(); - throw new ClientException("SDK.InvalidAccessSecret", "Specified access secret is not valid.", exp); - } catch (NoSuchAlgorithmException exp) { - errorMessage = exp.getMessage(); - throw new ClientException("SDK.InvalidMD5Algorithm", "MD5 hash is not supported by client side.", exp); - } finally { - if (null != logger) { - try { - LogUtils.LogUnit logUnit = LogUtils.createLogUnit(request, response); - logUnit.setStartTime(startTime); - logUnit.setCost(timeCost); - logUnit.setError(errorMessage); - String logContent = LogUtils.fillContent(clientProfile.getLogFormat(), logUnit); - logger.info(logContent); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - } - - /** - * 2019-01-03 change access control from private to protected, then subClass can - * override it and rewrite httpResponse processing - */ - protected T readResponse(Class clasz, HttpResponse httpResponse, FormatType format) - throws ClientException { - // new version response contains "@XmlRootElement" annotation - if (clasz.isAnnotationPresent(XmlRootElement.class) - && !clientProfile.getHttpClientConfig().isCompatibleMode()) { - Unmarshaller unmarshaller = UnmarshallerFactory.getUnmarshaller(format); - return unmarshaller.unmarshal(clasz, httpResponse.getHttpContentString()); - } else { - Reader reader = ReaderFactory.createInstance(format); - UnmarshallerContext context = new UnmarshallerContext(); - T response = null; - String stringContent = httpResponse.getHttpContentString(); - - if (stringContent == null) { - throw new ClientException(ErrorCodeConstant.SDK_INVALID_SERVER_RESPONSE, - ErrorMessageConstant.SERVER_RESPONSE_HTTP_BODY_EMPTY); - } - - try { - response = clasz.newInstance(); - } catch (Exception e) { - throw new ClientException("SDK.InvalidResponseClass", - "Unable to allocate " + clasz.getName() + " class"); - } - - String responseEndpoint = clasz.getName().substring(clasz.getName().lastIndexOf(".") + 1); - if (response.checkShowJsonItemName()) { - context.setResponseMap(reader.read(stringContent, responseEndpoint)); - } else { - context.setResponseMap(reader.readForHideArrayItem(stringContent, responseEndpoint)); - } - - context.setHttpResponse(httpResponse); - response.getInstance(context); - return response; - } - } - - private AcsError readError(HttpResponse httpResponse, FormatType format) throws ClientException { - AcsError error = new AcsError(); - String responseEndpoint = "Error"; - Reader reader = ReaderFactory.createInstance(format); - UnmarshallerContext context = new UnmarshallerContext(); - String stringContent = httpResponse.getHttpContentString(); - - if (stringContent == null) { - error.setErrorCode("(null)"); - error.setErrorMessage("(null)"); - error.setRequestId("(null)"); - error.setStatusCode(httpResponse.getStatus()); - return error; - } else { - context.setResponseMap(reader.read(stringContent, responseEndpoint)); - return error.getInstance(context); - } - } - - /** - * Compatible with previous versions of proxy Settings - */ - public void doActionWithProxy(ProtocolType protocolType, String httpsProxy, String httpProxy) { - HttpClientConfig config = this.clientProfile.getHttpClientConfig(); - if (protocolType == ProtocolType.HTTP && httpProxy != null) { - config.setHttpProxy(httpProxy); - return; - } - if (protocolType == ProtocolType.HTTPS && httpsProxy != null) { - config.setHttpsProxy(httpsProxy); - return; - } - } - - /** - * Compatible with previous versions of SSL Settings - */ - public void doActionWithIgnoreSSL(AcsRequest request, boolean isIgnore) { - if (isIgnore) { - request.setIgnoreSSLCerts(true); - } - } - - @Deprecated - public boolean isAutoRetry() { - return autoRetry; - } - - @Deprecated - public void setAutoRetry(boolean autoRetry) { - this.autoRetry = autoRetry; - } - - @Deprecated - public int getMaxRetryNumber() { - return maxRetryNumber; - } - - @Deprecated - public void setMaxRetryNumber(int maxRetryNumber) { - this.maxRetryNumber = maxRetryNumber; - } - - @Override - public void restoreSSLCertificate() { - this.httpClient.restoreSSLCertificate(); - } - - @Override - public void ignoreSSLCertificate() { - this.httpClient.ignoreSSLCertificate(); - } - - public void setEndpointResolver(EndpointResolver resolver) { - endpointResolver = resolver; - } - - @Override - public void shutdown() { - if (!this.httpClient.isSingleton()) { - IOUtils.closeQuietly(this.httpClient); - this.httpClient = null; - } - - } - - public DefaultProfile getProfile() { - return (DefaultProfile) clientProfile; - } - - public void appendUserAgent(String key, String value) { - this.userAgentConfig.append(key, value); - } - - public UserAgentConfig getUserAgentConfig() { - return userAgentConfig; - } - - public IHttpClient getHttpClient() { - return httpClient; - } - - public void setHttpClient(IHttpClient httpClient) { - this.httpClient = httpClient; - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/IAcsClient.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/IAcsClient.java deleted file mode 100644 index 6a8b297..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/IAcsClient.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package com.aliyuncs; - -import com.aliyuncs.auth.Credential; -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.exceptions.ServerException; -import com.aliyuncs.http.HttpResponse; -import com.aliyuncs.profile.IClientProfile; - -public interface IAcsClient { - - HttpResponse doAction(AcsRequest request) - throws ClientException, ServerException; - - HttpResponse doAction(AcsRequest request, - boolean autoRetry, int maxRetryCounts) - throws ClientException, ServerException; - - HttpResponse doAction(AcsRequest request, IClientProfile profile) - throws ClientException, ServerException; - - HttpResponse doAction(AcsRequest request, String regionId, - Credential credential) throws ClientException, ServerException; - - T getAcsResponse(AcsRequest request) - throws ServerException, ClientException; - - T getAcsResponse(AcsRequest request, - boolean autoRetry, int maxRetryCounts) - throws ServerException, ClientException; - - T getAcsResponse(AcsRequest request, - IClientProfile profile) throws ServerException, ClientException; - - T getAcsResponse(AcsRequest request, - String regionId, Credential credential) - throws ServerException, ClientException; - - T getAcsResponse(AcsRequest request, - String regionId) - throws ServerException, ClientException; - - CommonResponse getCommonResponse(CommonRequest request) throws ServerException, ClientException; - - HttpResponse doAction(AcsRequest request, boolean autoRetry, - int maxRetryCounts, IClientProfile profile) - throws ClientException, ServerException; - - void restoreSSLCertificate(); - - void ignoreSSLCertificate(); - - void shutdown(); -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/RoaAcsRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/RoaAcsRequest.java deleted file mode 100644 index d79a09b..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/RoaAcsRequest.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.auth.*; -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.HttpRequest; -import com.aliyuncs.regions.ProductDomain; -import com.aliyuncs.utils.ParameterHelper; - -import java.io.UnsupportedEncodingException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -public abstract class RoaAcsRequest extends AcsRequest { - - protected String uriPattern = null; - private Map pathParameters = new HashMap(); - - public RoaAcsRequest(String product) { - super(product); - initialize(); - } - - public RoaAcsRequest(String product, String version, String action) { - super(product); - this.setSysVersion(version); - this.setSysActionName(action); - initialize(); - } - - public RoaAcsRequest(String product, String version, String action, String locationProduct) { - super(product); - this.setSysVersion(version); - this.setSysActionName(action); - this.setSysLocationProduct(locationProduct); - initialize(); - } - - public RoaAcsRequest(String product, String version, String action, String locationProduct, String endpointType) { - super(product); - this.setSysVersion(version); - this.setSysActionName(action); - this.setSysLocationProduct(locationProduct); - this.setSysEndpointType(endpointType); - initialize(); - } - - private void initialize() { - this.composer = RoaSignatureComposer.getComposer(); - this.setHttpContentType(FormatType.FORM); - this.setHttpContent(new byte[0], "utf-8", null); - } - - @Override - public void setVersion(String version) { - super.setVersion(version); - this.putHeaderParameter("x-acs-version", version); - } - - @Override - public void setSecurityToken(String securityToken) { - super.setSecurityToken(securityToken); - this.putHeaderParameter("x-acs-security-token", securityToken); - } - - @Override - public void setSysVersion(String version) { - super.setSysVersion(version); - this.putHeaderParameter("x-acs-version", version); - } - - public Map getPathParameters() { - return Collections.unmodifiableMap(pathParameters); - } - - protected void putPathParameter(String name, Object value) { - setParameter(this.pathParameters, name, value); - } - - protected void putPathParameter(String name, String value) { - setParameter(this.pathParameters, name, value); - } - - @Override - public String composeUrl(String endpoint, Map queries) throws UnsupportedEncodingException { - Map mapQueries = (queries == null) ? this.getSysQueryParameters() : queries; - StringBuilder urlBuilder = new StringBuilder(""); - urlBuilder.append(this.getSysProtocol().toString()); - urlBuilder.append("://").append(endpoint); - if (null != this.uriPattern) { - urlBuilder.append(RoaSignatureComposer.replaceOccupiedParameters(uriPattern, this.getPathParameters())); - } - if (-1 == urlBuilder.indexOf("?")) { - urlBuilder.append("?"); - } else if (!urlBuilder.toString().endsWith("?")) { - urlBuilder.append("&"); - } - String query = concatQueryString(mapQueries); - String url = urlBuilder.append(query).toString(); - if (url.endsWith("?") || url.endsWith("&")) { - url = url.substring(0, url.length() - 1); - } - return url; - } - - /** - * @Deprecated : Use getSysUriPattern instead of this - */ - @Deprecated - public String getUriPattern() { - return uriPattern; - } - - /** - * @Deprecated : Use setSysUriPattern instead of this - */ - @Deprecated - public void setUriPattern(String uriPattern) { - this.uriPattern = uriPattern; - } - - public String getSysUriPattern() { - return uriPattern; - } - - public void setSysUriPattern(String uriPattern) { - this.uriPattern = uriPattern; - } - - @Override - public HttpRequest signRequest(Signer signer, AlibabaCloudCredentials credentials, FormatType format, - ProductDomain domain) throws InvalidKeyException, IllegalStateException, - UnsupportedEncodingException, NoSuchAlgorithmException { - Map bodyParams = this.getSysBodyParameters(); - if (bodyParams != null && !bodyParams.isEmpty()) { - byte[] data; - if (FormatType.JSON == this.getHttpContentType()) { - data = ParameterHelper.getJsonData(bodyParams); - } else if (FormatType.XML == this.getHttpContentType()) { - data = ParameterHelper.getXmlData(bodyParams); - } else { - // For contentType RAW and Form, the actual data format will be form - data = ParameterHelper.getFormData(bodyParams); - } - this.setHttpContent(data, "UTF-8", null); - } - - Map imutableMap = new HashMap(this.getSysHeaders()); - if (null != signer && null != credentials) { - String accessKeyId = credentials.getAccessKeyId(); - imutableMap = this.composer.refreshSignParameters(this.getSysHeaders(), signer, accessKeyId, format); - imutableMap.put("RegionId", this.getSysRegionId()); - if (credentials instanceof BasicSessionCredentials) { - String sessionToken = ((BasicSessionCredentials) credentials).getSessionToken(); - if (null != sessionToken) { - imutableMap.put("x-acs-security-token", sessionToken); - } - } - if (credentials instanceof BearerTokenCredentials) { - String bearerToken = ((BearerTokenCredentials) credentials).getBearerToken(); - if (null != ((BearerTokenCredentials) credentials).getBearerToken()) { - imutableMap.put("x-acs-bearer-token", bearerToken); - } - } - String strToSign = this.composer.composeStringToSign(this.getSysMethod(), this.getSysUriPattern(), signer, - this.getSysQueryParameters(), imutableMap, this.getPathParameters()); - String signature = signer.signString(strToSign, credentials); - imutableMap.put("Authorization", "acs " + accessKeyId + ":" + signature); - } - this.setSysUrl(this.composeUrl(domain.getDomainName(), this.getSysQueryParameters())); - this.headers = imutableMap; - return this; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/RpcAcsRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/RpcAcsRequest.java deleted file mode 100644 index 354c099..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/RpcAcsRequest.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.aliyuncs; - -import com.aliyuncs.auth.*; -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.HttpRequest; -import com.aliyuncs.http.MethodType; -import com.aliyuncs.regions.ProductDomain; -import com.aliyuncs.utils.ParameterHelper; - -import java.io.UnsupportedEncodingException; -import java.security.InvalidKeyException; -import java.util.HashMap; -import java.util.Map; - -public abstract class RpcAcsRequest extends AcsRequest { - - public RpcAcsRequest(String product) { - super(product); - initialize(); - } - - public RpcAcsRequest(String product, String version, String action) { - super(product); - this.setSysVersion(version); - this.setSysActionName(action); - initialize(); - } - - public RpcAcsRequest(String product, String version, String action, String locationProduct) { - super(product); - this.setSysVersion(version); - this.setSysActionName(action); - this.setSysLocationProduct(locationProduct); - initialize(); - } - - public RpcAcsRequest(String product, String version, String action, String locationProduct, String endpointType) { - super(product); - this.setSysVersion(version); - this.setSysActionName(action); - this.setSysLocationProduct(locationProduct); - this.setSysEndpointType(endpointType); - initialize(); - } - - private void initialize() { - this.setSysMethod(MethodType.GET); - this.setSysAcceptFormat(FormatType.JSON); - this.setHttpContentType(FormatType.FORM); - this.composer = RpcSignatureComposer.getComposer(); - } - - @Override - public void setActionName(String actionName) { - super.setActionName(actionName); - this.putQueryParameter("Action", actionName); - } - - @Override - public void setVersion(String version) { - super.setVersion(version); - this.putQueryParameter("Version", version); - } - - @Override - public void setSecurityToken(String securityToken) { - super.setSecurityToken(securityToken); - this.putQueryParameter("SecurityToken", securityToken); - } - - @Override - public void setAcceptFormat(FormatType acceptFormat) { - super.setAcceptFormat(acceptFormat); - this.putQueryParameter("Format", acceptFormat.toString()); - } - - @Override - public void setSysActionName(String actionName) { - super.setSysActionName(actionName); - this.putQueryParameter("Action", actionName); - } - - @Override - public void setSysVersion(String version) { - super.setSysVersion(version); - this.putQueryParameter("Version", version); - } - - @Override - public void setSysAcceptFormat(FormatType acceptFormat) { - super.setSysAcceptFormat(acceptFormat); - this.putQueryParameter("Format", acceptFormat.toString()); - } - - @Override - public void setSysSecurityToken(String securityToken) { - super.setSysSecurityToken(securityToken); - this.putQueryParameter("SecurityToken", securityToken); - } - - @Override - public String composeUrl(String endpoint, Map queries) throws UnsupportedEncodingException { - Map mapQueries = (queries == null) ? this.getSysQueryParameters() : queries; - StringBuilder urlBuilder = new StringBuilder(""); - urlBuilder.append(this.getSysProtocol().toString()); - urlBuilder.append("://").append(endpoint); - if (-1 == urlBuilder.indexOf("?")) { - urlBuilder.append("/?"); - } - String query = concatQueryString(mapQueries); - return urlBuilder.append(query).toString(); - } - - @Override - public HttpRequest signRequest(Signer signer, AlibabaCloudCredentials credentials, FormatType format, - ProductDomain domain) throws InvalidKeyException, IllegalStateException, UnsupportedEncodingException { - - Map imutableMap = new HashMap(this.getSysQueryParameters()); - if (null != signer && null != credentials) { - String accessKeyId = credentials.getAccessKeyId(); - String accessSecret = credentials.getAccessKeySecret(); - if (credentials instanceof BasicSessionCredentials) { - String sessionToken = ((BasicSessionCredentials) credentials).getSessionToken(); - if (null != sessionToken) { - this.putQueryParameter("SecurityToken", sessionToken); - } - } - if (credentials instanceof BearerTokenCredentials) { - String bearerToken = ((BearerTokenCredentials) credentials).getBearerToken(); - if (null != ((BearerTokenCredentials) credentials).getBearerToken()) { - this.putQueryParameter("BearerToken", bearerToken); - } - } - imutableMap = this.composer.refreshSignParameters(this.getSysQueryParameters(), signer, accessKeyId, format); - imutableMap.put("RegionId", getSysRegionId()); - - Map paramsToSign = new HashMap(imutableMap); - Map bodyParams = this.getSysBodyParameters(); - if (bodyParams != null && !bodyParams.isEmpty()) { - byte[] data; - if (FormatType.JSON == this.getHttpContentType()) { - data = ParameterHelper.getJsonData(bodyParams); - } else if (FormatType.XML == this.getHttpContentType()) { - data = ParameterHelper.getXmlData(bodyParams); - } else { - // For contentType RAW and Form, the actual data format will be form - data = ParameterHelper.getFormData(bodyParams); - } - this.setHttpContent(data, "UTF-8", null); - paramsToSign.putAll(bodyParams); - } - String strToSign = this.composer.composeStringToSign( - this.getSysMethod(), null, signer, paramsToSign, null, null); - String signature; - if (credentials instanceof KeyPairCredentials) { - signature = signer.signString(strToSign, credentials); - } else { - signature = signer.signString(strToSign, accessSecret + "&"); - } - imutableMap.put("Signature", signature); - this.strToSign = strToSign; - } - setSysUrl(this.composeUrl(domain.getDomainName(), imutableMap)); - return this; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AcsURLEncoder.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AcsURLEncoder.java deleted file mode 100644 index 5334793..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AcsURLEncoder.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package com.aliyuncs.auth; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; - -public class AcsURLEncoder { - public final static String URL_ENCODING = "UTF-8"; - - public static String encode(String value) throws UnsupportedEncodingException { - return URLEncoder.encode(value, URL_ENCODING); - } - - public static String percentEncode(String value) throws UnsupportedEncodingException { - return value != null ? URLEncoder.encode(value, URL_ENCODING).replace("+", "%20") - .replace("*", "%2A").replace("%7E", "~") : null; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AlibabaCloudCredentials.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AlibabaCloudCredentials.java deleted file mode 100644 index 83be410..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AlibabaCloudCredentials.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.aliyuncs.auth; - -public interface AlibabaCloudCredentials { - - String getAccessKeyId(); - - String getAccessKeySecret(); -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AlibabaCloudCredentialsProvider.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AlibabaCloudCredentialsProvider.java deleted file mode 100644 index 09c4f8e..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AlibabaCloudCredentialsProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.exceptions.ServerException; - -public interface AlibabaCloudCredentialsProvider { - - AlibabaCloudCredentials getCredentials() throws ClientException, ServerException; -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AuthConstant.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AuthConstant.java deleted file mode 100644 index 364929a..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/AuthConstant.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.aliyuncs.auth; - -public class AuthConstant { - public static final String SYSTEM_ACCESSKEYID = "alibabacloud.accessKeyId"; - public static final String SYSTEM_ACCESSKEYSECRET = "alibabacloud.accessKeyIdSecret"; - - public static final String DEFAULT_CREDENTIALS_FILE_PATH = System.getProperty("user.home") + - "/.alibabacloud/credentials.ini"; - public static final String INI_ACCESS_KEY_ID = "access_key_id"; - public static final String INI_ACCESS_KEY_IDSECRET = "access_key_secret"; - public static final String INI_TYPE = "type"; - public static final String INI_TYPE_RAM = "ecs_ram_role"; - public static final String INI_TYPE_ARN = "ram_role_arn"; - public static final String INI_TYPE_KEY_PAIR = "rsa_key_pair"; - public static final String INI_PUBLIC_KEY_ID = "public_key_id"; - public static final String INI_PRIVATE_KEY_FILE = "private_key_file"; - public static final String INI_PRIVATE_KEY = "private_key"; - public static final String INI_ROLE_NAME = "role_name"; - public static final String INI_ROLE_SESSION_NAME = "role_session_name"; - public static final String INI_ROLE_ARN = "role_arn"; - public static final String INI_POLICY = "policy"; - public static final long TSC_VALID_TIME_SECONDS = 3600L; - public static final String DEFAULT_REGION = "region_id"; - public static final String INI_ENABLE = "enable"; - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BasicCredentials.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BasicCredentials.java deleted file mode 100644 index 18ec1f4..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BasicCredentials.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.aliyuncs.auth; - -public class BasicCredentials implements AlibabaCloudCredentials { - - private final String accessKeyId; - private final String accessKeySecret; - - public BasicCredentials(String accessKeyId, String accessKeySecret) { - if (accessKeyId == null) { - throw new IllegalArgumentException("Access key ID cannot be null."); - } - if (accessKeySecret == null) { - throw new IllegalArgumentException("Access key secret cannot be null."); - } - - this.accessKeyId = accessKeyId; - this.accessKeySecret = accessKeySecret; - } - - @Override - public String getAccessKeyId() { - return accessKeyId; - } - - @Override - public String getAccessKeySecret() { - return accessKeySecret; - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BasicSessionCredentials.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BasicSessionCredentials.java deleted file mode 100644 index d42b35b..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BasicSessionCredentials.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.aliyuncs.auth; - -public class BasicSessionCredentials implements AlibabaCloudCredentials { - - protected final long roleSessionDurationSeconds; - private final String accessKeyId; - private final String accessKeySecret; - private final String sessionToken; - private long sessionStartedTimeInMilliSeconds = 0; - - public BasicSessionCredentials(String accessKeyId, String accessKeySecret, String sessionToken) { - this(accessKeyId, accessKeySecret, sessionToken, 0); - } - - public BasicSessionCredentials(String accessKeyId, String accessKeySecret, String sessionToken, - long roleSessionDurationSeconds) { - if (accessKeyId == null) { - throw new IllegalArgumentException("Access key ID cannot be null."); - } - if (accessKeySecret == null) { - throw new IllegalArgumentException("Access key secret cannot be null."); - } - - this.accessKeyId = accessKeyId; - this.accessKeySecret = accessKeySecret; - this.sessionToken = sessionToken; - this.roleSessionDurationSeconds = roleSessionDurationSeconds; - this.sessionStartedTimeInMilliSeconds = System.currentTimeMillis(); - } - - @Override - public String getAccessKeyId() { - return accessKeyId; - } - - @Override - public String getAccessKeySecret() { - return accessKeySecret; - } - - public String getSessionToken() { - return sessionToken; - } - - public boolean willSoonExpire() { - if (roleSessionDurationSeconds == 0) { - return false; - } - long now = System.currentTimeMillis(); - double expireFact = 0.95; - return roleSessionDurationSeconds * expireFact < (now - sessionStartedTimeInMilliSeconds) / 1000.0; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BearerTokenCredentials.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BearerTokenCredentials.java deleted file mode 100644 index 11f2901..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BearerTokenCredentials.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.aliyuncs.auth; - -public class BearerTokenCredentials implements AlibabaCloudCredentials { - - private String bearerToken; - - public BearerTokenCredentials(String bearerToken) { - this.bearerToken = bearerToken; - } - - @Override - public String getAccessKeyId() { - return null; - } - - @Override - public String getAccessKeySecret() { - return null; - } - - public String getBearerToken() { - return bearerToken; - } - - public void setBearerToken(String bearerToken) { - this.bearerToken = bearerToken; - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BearerTokenSigner.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BearerTokenSigner.java deleted file mode 100644 index f4a89c5..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/BearerTokenSigner.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.aliyuncs.auth; - -public class BearerTokenSigner extends Signer { - - @Override - public String signString(String stringToSign, AlibabaCloudCredentials credentials) { - return null; - } - - @Override - public String signString(String stringToSign, String accessKeySecret) { - return null; - } - - @Override - public String getSignerName() { - return null; - } - - @Override - public String getSignerVersion() { - return null; - } - - @Override - public String getSignerType() { - return "BEARERTOKEN"; - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/Credential.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/Credential.java deleted file mode 100644 index 6018c89..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/Credential.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.aliyuncs.auth; - -import java.util.Calendar; -import java.util.Date; - -@Deprecated -public class Credential { - - private final Date refreshDate; - private Date expiredDate; - private String accessKeyId; - private String accessSecret; - private String securityToken; - - public Credential() { - this.refreshDate = new Date(); - } - - public Credential(String keyId, String secret) { - this.accessKeyId = keyId; - this.accessSecret = secret; - this.refreshDate = new Date(); - } - - public Credential(String keyId, String secret, String securityToken) { - this.accessKeyId = keyId; - this.accessSecret = secret; - this.securityToken = securityToken; - this.refreshDate = new Date(); - } - - public Credential(String keyId, String secret, int expiredHours) { - this.accessKeyId = keyId; - this.accessSecret = secret; - this.refreshDate = new Date(); - - setExpiredDate(expiredHours); - } - - public Credential(String keyId, String secret, String securityToken, int expiredHours) { - this.accessKeyId = keyId; - this.accessSecret = secret; - this.securityToken = securityToken; - this.refreshDate = new Date(); - - setExpiredDate(expiredHours); - } - - public String getAccessKeyId() { - return accessKeyId; - } - - public void setAccessKeyId(String accessKeyId) { - this.accessKeyId = accessKeyId; - } - - public String getAccessSecret() { - return accessSecret; - } - - public void setAccessSecret(String accessSecret) { - this.accessSecret = accessSecret; - } - - public boolean isExpired() { - return this.expiredDate == null || this.expiredDate.after(new Date()); - } - - public String getSecurityToken() { - return securityToken; - } - - public void setSecurityToken(String securityToken) { - this.securityToken = securityToken; - } - - public Date getRefreshDate() { - return refreshDate; - } - - public Date getExpiredDate() { - return expiredDate; - } - - private void setExpiredDate(int expiredHours) { - if (expiredHours > 0) { - Calendar cal = Calendar.getInstance(); - cal.setTime(new Date()); - cal.add(Calendar.HOUR, expiredHours); - expiredDate = cal.getTime(); - } - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/CredentialsBackupCompatibilityAdaptor.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/CredentialsBackupCompatibilityAdaptor.java deleted file mode 100644 index 53afb0b..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/CredentialsBackupCompatibilityAdaptor.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.exceptions.ClientException; - -@Deprecated -public class CredentialsBackupCompatibilityAdaptor extends Credential { - - private final AlibabaCloudCredentialsProvider provider; - - public CredentialsBackupCompatibilityAdaptor(AlibabaCloudCredentialsProvider provider) { - this.provider = provider; - } - - private AlibabaCloudCredentials getCredentials() { - try { - AlibabaCloudCredentials credentials = this.provider.getCredentials(); - return credentials; - } catch (ClientException e) { - throw new RuntimeException(e.toString()); - } - } - - @Override - public String getAccessKeyId() { - return getCredentials().getAccessKeyId(); - } - - @Override - public String getAccessSecret() { - return getCredentials().getAccessKeySecret(); - } - - @Override - public boolean isExpired() { - return false; - } - - @Override - public String getSecurityToken() { - AlibabaCloudCredentials credentials = getCredentials(); - if (credentials instanceof BasicSessionCredentials) { - return ((BasicSessionCredentials) credentials).getSessionToken(); - } else { - return null; - } - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/CredentialsProviderFactory.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/CredentialsProviderFactory.java deleted file mode 100644 index ed052c9..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/CredentialsProviderFactory.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.aliyuncs.auth; - -public class CredentialsProviderFactory { - public T createCredentialsProvider(T classInstance) { - return classInstance; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/DefaultCredentialsProvider.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/DefaultCredentialsProvider.java deleted file mode 100644 index 0407ef2..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/DefaultCredentialsProvider.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.utils.AuthUtils; - -import java.util.ArrayList; -import java.util.List; -import java.util.Vector; - -public class DefaultCredentialsProvider implements AlibabaCloudCredentialsProvider { - private List defaultProviders = new ArrayList(); - private static final List USER_CONFIGURATION_PROVIDERS = - new Vector(); - - public DefaultCredentialsProvider() throws ClientException { - defaultProviders.add(new SystemPropertiesCredentialsProvider()); - defaultProviders.add(new EnvironmentVariableCredentialsProvider()); - defaultProviders.add(new ProfileCredentialsProvider()); - String roleName = AuthUtils.getEnvironmentECSMetaData(); - if (roleName != null) { - if (roleName.length() == 0) { - throw new ClientException("Environment variable roleName('ALIBABA_CLOUD_ECS_METADATA') cannot be empty"); - } - defaultProviders.add(new InstanceProfileCredentialsProvider(roleName)); - } - } - - @Override - public AlibabaCloudCredentials getCredentials() throws ClientException { - AlibabaCloudCredentials credential; - if (USER_CONFIGURATION_PROVIDERS.size() > 0) { - for (AlibabaCloudCredentialsProvider provider : USER_CONFIGURATION_PROVIDERS) { - credential = provider.getCredentials(); - if (null != credential) { - return credential; - } - } - } - for (AlibabaCloudCredentialsProvider provider : defaultProviders) { - credential = provider.getCredentials(); - if (null != credential) { - return credential; - } - } - throw new ClientException("not found credentials"); - } - - public static boolean addCredentialsProvider(AlibabaCloudCredentialsProvider provider) { - return DefaultCredentialsProvider.USER_CONFIGURATION_PROVIDERS.add(provider); - } - - public static boolean removeCredentialsProvider(AlibabaCloudCredentialsProvider provider) { - return DefaultCredentialsProvider.USER_CONFIGURATION_PROVIDERS.remove(provider); - } - - public static boolean containsCredentialsProvider(AlibabaCloudCredentialsProvider provider) { - return DefaultCredentialsProvider.USER_CONFIGURATION_PROVIDERS.contains(provider); - } - - public static void clearCredentialsProvider() { - DefaultCredentialsProvider.USER_CONFIGURATION_PROVIDERS.clear(); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ECSMetadataServiceCredentialsFetcher.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ECSMetadataServiceCredentialsFetcher.java deleted file mode 100644 index 18e3eb5..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ECSMetadataServiceCredentialsFetcher.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.aliyuncs.auth; - -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; - -/** - * Created by haowei.yao on 2017/9/12. - */ - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.http.HttpRequest; -import com.aliyuncs.http.HttpResponse; -import com.aliyuncs.http.MethodType; -import com.aliyuncs.http.clients.CompatibleUrlConnClient; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class ECSMetadataServiceCredentialsFetcher { - private static final String URL_IN_ECS_METADATA = "/latest/meta-data/ram/security-credentials/"; - private static final int DEFAULT_TIMEOUT_IN_MILLISECONDS = 1000; - private static final String ECS_METADAT_FETCH_ERROR_MSG = "Failed to get RAM session credentials from ECS metadata service."; - private static final int DEFAULT_ECS_SESSION_TOKEN_DURATION_SECONDS = 3600 * 6; - private URL credentialUrl; - private String roleName; - private String metadataServiceHost = "100.100.100.200"; - private int connectionTimeoutInMilliseconds; - - public ECSMetadataServiceCredentialsFetcher() { - this.connectionTimeoutInMilliseconds = DEFAULT_TIMEOUT_IN_MILLISECONDS; - } - - public void setRoleName(String roleName) { - if (null == roleName) { - throw new NullPointerException("You must specifiy a valid role name."); - } - this.roleName = roleName; - setCredentialUrl(); - } - - private void setCredentialUrl() { - try { - this.credentialUrl = new URL("http://" + metadataServiceHost + URL_IN_ECS_METADATA + roleName); - } catch (MalformedURLException e) { - throw new IllegalArgumentException(e.toString()); - } - } - - public ECSMetadataServiceCredentialsFetcher withECSMetadataServiceHost(String host) { - System.err.println("withECSMetadataServiceHost() method is only for testing, please don't use it"); - this.metadataServiceHost = host; - setCredentialUrl(); - return this; - } - - public ECSMetadataServiceCredentialsFetcher withConnectionTimeout(int milliseconds) { - this.connectionTimeoutInMilliseconds = milliseconds; - return this; - } - - public String getMetadata() throws ClientException { - HttpRequest request = new HttpRequest(credentialUrl.toString()); - request.setSysMethod(MethodType.GET); - request.setSysConnectTimeout(connectionTimeoutInMilliseconds); - request.setSysReadTimeout(connectionTimeoutInMilliseconds); - HttpResponse response; - - try { - response = CompatibleUrlConnClient.compatibleGetResponse(request); - } catch (Exception e) { - throw new ClientException("Failed to connect ECS Metadata Service: " + e.toString()); - } - - if (response.getStatus() != HttpURLConnection.HTTP_OK) { - throw new ClientException(ECS_METADAT_FETCH_ERROR_MSG + " HttpCode=" + response.getStatus()); - } - - return new String(response.getHttpContent()); - } - - public InstanceProfileCredentials fetch() throws ClientException { - String jsonContent = getMetadata(); - JsonObject jsonObject = null; - jsonObject = new JsonParser().parse(jsonContent).getAsJsonObject(); - - if (jsonObject.has("Code") && jsonObject.has("AccessKeyId") && jsonObject.has("AccessKeySecret") && jsonObject - .has("SecurityToken") && jsonObject.has("Expiration")) { - - } else { - throw new ClientException("Invalid json got from ECS Metadata service."); - } - - if (!"Success".equals(jsonObject.get("Code").getAsString())) { - throw new ClientException(ECS_METADAT_FETCH_ERROR_MSG); - } - return new InstanceProfileCredentials(jsonObject.get("AccessKeyId").getAsString(), jsonObject.get( - "AccessKeySecret").getAsString(), jsonObject.get("SecurityToken").getAsString(), jsonObject.get( - "Expiration").getAsString(), DEFAULT_ECS_SESSION_TOKEN_DURATION_SECONDS); - } - - public InstanceProfileCredentials fetch(int retryTimes) throws ClientException { - for (int i = 0; i <= retryTimes; i++) { - try { - return fetch(); - } catch (ClientException e) { - if (i == retryTimes) { - throw e; - } - } - } - throw new ClientException("Failed to connect ECS Metadata Service: Max retry times exceeded."); - } -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/EnvironmentVariableCredentialsProvider.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/EnvironmentVariableCredentialsProvider.java deleted file mode 100644 index b50503c..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/EnvironmentVariableCredentialsProvider.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.utils.AuthUtils; - -public class EnvironmentVariableCredentialsProvider implements AlibabaCloudCredentialsProvider { - @Override - public AlibabaCloudCredentials getCredentials() throws ClientException { - if (!"default".equals(AuthUtils.getClientType())) { - return null; - } - - String accessKeyId = AuthUtils.getEnvironmentAccessKeyId(); - String accessKeySecret = AuthUtils.getEnvironmentAccessKeySecret(); - if (accessKeyId == null || accessKeySecret == null) { - return null; - } - if (accessKeyId.length() == 0) { - throw new ClientException("Environment variable accessKeyId cannot be empty"); - } - if (accessKeySecret.length() == 0) { - throw new ClientException("Environment variable accessKeySecret cannot be empty"); - } - return new BasicCredentials(accessKeyId, accessKeySecret); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/HmacSHA1Signer.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/HmacSHA1Signer.java deleted file mode 100644 index 249b064..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/HmacSHA1Signer.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.aliyuncs.auth; - -import java.io.UnsupportedEncodingException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import javax.xml.bind.DatatypeConverter; - -public class HmacSHA1Signer extends Signer { - - public static final String ENCODING = "UTF-8"; - private static final String ALGORITHM_NAME = "HmacSHA1"; - - @Override - public String signString(String stringToSign, String accessKeySecret) { - try { - Mac mac = Mac.getInstance(ALGORITHM_NAME); - mac.init(new SecretKeySpec(accessKeySecret.getBytes(ENCODING), ALGORITHM_NAME)); - byte[] signData = mac.doFinal(stringToSign.getBytes(ENCODING)); - return DatatypeConverter.printBase64Binary(signData); - } catch (NoSuchAlgorithmException e) { - throw new IllegalArgumentException(e.toString()); - } catch (UnsupportedEncodingException e) { - throw new IllegalArgumentException(e.toString()); - } catch (InvalidKeyException e) { - throw new IllegalArgumentException(e.toString()); - } - } - - @Override - public String signString(String stringToSign, AlibabaCloudCredentials credentials) { - return signString(stringToSign, credentials.getAccessKeySecret()); - } - - @Override - public String getSignerName() { - return "HMAC-SHA1"; - } - - @Override - public String getSignerVersion() { - return "1.0"; - } - - @Override - public String getSignerType() { - return null; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ICredentialProvider.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ICredentialProvider.java deleted file mode 100644 index 45ce468..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ICredentialProvider.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.aliyuncs.auth; - -@Deprecated -public interface ICredentialProvider { - - Credential fresh(); - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ISignatureComposer.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ISignatureComposer.java deleted file mode 100644 index 483685f..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ISignatureComposer.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.MethodType; - -import java.util.Map; - -public interface ISignatureComposer { - - Map refreshSignParameters(Map parameters, Signer signer, String accessKeyId, - FormatType format); - - String composeStringToSign(MethodType method, String uriPattern, Signer signer, Map queries, - Map headers, Map paths); -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ISigner.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ISigner.java deleted file mode 100644 index fd60748..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ISigner.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.aliyuncs.auth; - -import java.security.InvalidKeyException; - -@Deprecated -public interface ISigner { - - String getSignerName(); - - String getSignerVersion(); - - String signString(String source, String accessSecret) throws InvalidKeyException, IllegalStateException; - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/InstanceProfileCredentials.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/InstanceProfileCredentials.java deleted file mode 100644 index dbd6261..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/InstanceProfileCredentials.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.aliyuncs.auth; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; - -public class InstanceProfileCredentials extends BasicSessionCredentials { - - private final long expiration; - private final double expireFact = 0.95; - private final long refreshIntervalInMillSeconds = 180000; - private long lastFailedRefreshTime = 0; - - public InstanceProfileCredentials(String accessKeyId, String accessKeySecret, String sessionToken, - String expiration, long roleSessionDurationSeconds) { - super(accessKeyId, accessKeySecret, sessionToken, roleSessionDurationSeconds); - - SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - parser.setTimeZone(TimeZone.getTimeZone("GMT")); - try { - Date date = parser.parse(expiration.replace('T', ' ').replace('Z', ' ')); - this.expiration = date.getTime(); - } catch (ParseException e) { - throw new IllegalArgumentException("Failed to get valid expiration time from ECS Metadata service."); - } - } - - @Override - public boolean willSoonExpire() { - long now = System.currentTimeMillis(); - return this.roleSessionDurationSeconds * (1 - expireFact) > (expiration - now) / 1000; - } - - public boolean isExpired() { - long now = System.currentTimeMillis(); - return now >= expiration - refreshIntervalInMillSeconds; - } - - public boolean shouldRefresh() { - long now = System.currentTimeMillis(); - return now - lastFailedRefreshTime > refreshIntervalInMillSeconds; - } - - public void setLastFailedRefreshTime() { - lastFailedRefreshTime = System.currentTimeMillis(); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/InstanceProfileCredentialsProvider.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/InstanceProfileCredentialsProvider.java deleted file mode 100644 index 4bd1072..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/InstanceProfileCredentialsProvider.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.exceptions.ClientException; - -public class InstanceProfileCredentialsProvider implements AlibabaCloudCredentialsProvider { - - private static final int MAX_ECS_METADATA_FETCH_RETRY_TIMES = 3; - private final String roleName; - public int ecsMetadataServiceFetchCount = 0; - private InstanceProfileCredentials credentials = null; - private ECSMetadataServiceCredentialsFetcher fetcher; - - public InstanceProfileCredentialsProvider(String roleName) { - if (null == roleName) { - throw new NullPointerException("You must specifiy a valid role name."); - } - this.roleName = roleName; - this.fetcher = new ECSMetadataServiceCredentialsFetcher(); - this.fetcher.setRoleName(this.roleName); - } - - public InstanceProfileCredentialsProvider withFetcher(ECSMetadataServiceCredentialsFetcher fetcher) { - this.fetcher = fetcher; - this.fetcher.setRoleName(roleName); - return this; - } - - @Override - public AlibabaCloudCredentials getCredentials() throws ClientException { - if (credentials == null || credentials.isExpired()) { - ecsMetadataServiceFetchCount += 1; - int maxRetryTimes = MAX_ECS_METADATA_FETCH_RETRY_TIMES; - credentials = fetcher.fetch(maxRetryTimes); - // } else if (credentials.isExpired()) { - // throw new ClientException("SDK.SessionTokenExpired", "Current session token - // has expired."); - } else if (credentials.willSoonExpire() && credentials.shouldRefresh()) { - try { - ecsMetadataServiceFetchCount += 1; - credentials = fetcher.fetch(); - } catch (ClientException e) { - // Use the current expiring session token and wait for next round - credentials.setLastFailedRefreshTime(); - } - } - return credentials; - } -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/KeyPairCredentials.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/KeyPairCredentials.java deleted file mode 100644 index 9721f94..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/KeyPairCredentials.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.aliyuncs.auth; - -public class KeyPairCredentials implements AlibabaCloudCredentials { - - private String privateKeySecret; - private String publicKeyId; - - public KeyPairCredentials(String publicKeyId, String privateKeySecret) { - if (publicKeyId == null || privateKeySecret == null) { - throw new IllegalArgumentException( - "You must provide a valid pair of Public Key ID and Private Key Secret."); - } - - this.publicKeyId = publicKeyId; - this.privateKeySecret = privateKeySecret; - } - - @Override - public String getAccessKeyId() { - return publicKeyId; - } - - @Override - public String getAccessKeySecret() { - return privateKeySecret; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/LegacyCredentials.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/LegacyCredentials.java deleted file mode 100644 index 8ad5a72..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/LegacyCredentials.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.aliyuncs.auth; - -@SuppressWarnings("deprecation") -public class LegacyCredentials implements AlibabaCloudCredentials { - - private final Credential legacyCredential; - - public LegacyCredentials(Credential legacyCrendential) { - this.legacyCredential = legacyCrendential; - } - - @Override - public String getAccessKeyId() { - return legacyCredential.getAccessKeyId(); - } - - @Override - public String getAccessKeySecret() { - return legacyCredential.getAccessSecret(); - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/OssSignatureComposer.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/OssSignatureComposer.java deleted file mode 100644 index a3c2b0e..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/OssSignatureComposer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.MethodType; -import com.aliyuncs.utils.ParameterHelper; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -public class OssSignatureComposer extends RoaSignatureComposer { - private static ISignatureComposer composer = null; - - public static ISignatureComposer getComposer() { - if (null == composer) { - composer = new OssSignatureComposer(); - } - return composer; - } - - @Override - public Map refreshSignParameters(Map parameters, Signer signer, String accessKeyId, - FormatType format) { - Map immutableMap = new HashMap(parameters); - immutableMap.put("Date", ParameterHelper.getRFC2616Date(new Date())); - return immutableMap; - } - - private String buildQueryString(String uri, Map queries) { - StringBuilder queryBuilder = new StringBuilder(uri); - if (0 < queries.size()) { - queryBuilder.append("?"); - } - for (Map.Entry e : queries.entrySet()) { - queryBuilder.append(e.getKey()); - if (null != e.getValue()) { - queryBuilder.append("=").append(e.getValue()); - } - queryBuilder.append(QUERY_SEPARATOR); - } - String queryString = queryBuilder.toString(); - if (queryString.endsWith(QUERY_SEPARATOR)) { - queryString = queryString.substring(0, queryString.length() - 1); - } - - return queryString; - } - - @Override - public String composeStringToSign(MethodType method, String uriPattern, Signer signer, Map queries, - Map headers, Map paths) { - StringBuilder sb = new StringBuilder(); - sb.append(method).append(HEADER_SEPARATOR); - if (headers.get("Content-MD5") != null) { - sb.append(headers.get("Content-MD5")); - } - sb.append(HEADER_SEPARATOR); - if (headers.get("Content-Type") != null) { - sb.append(headers.get("Content-Type")); - } - sb.append(HEADER_SEPARATOR); - if (headers.get("Date") != null) { - sb.append(headers.get("Date")); - } - sb.append(HEADER_SEPARATOR); - sb.append(buildCanonicalHeaders(headers, "x-oss-")); - sb.append(buildQueryString(uriPattern, queries)); - return sb.toString(); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ProfileCredentialsProvider.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ProfileCredentialsProvider.java deleted file mode 100644 index cd6594b..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/ProfileCredentialsProvider.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.utils.AuthUtils; -import com.aliyuncs.utils.StringUtils; -import org.ini4j.Profile; -import org.ini4j.Wini; - -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -public class ProfileCredentialsProvider implements AlibabaCloudCredentialsProvider { - private static volatile Wini ini; - - private static Wini getIni(String filePath) throws IOException { - if (null == ini) { - synchronized (ProfileCredentialsProvider.class) { - if (null == ini) { - ini = new Wini(new File(filePath)); - } - } - } - return ini; - } - - @Override - public AlibabaCloudCredentials getCredentials() throws ClientException { - String filePath = AuthUtils.getEnvironmentCredentialsFile(); - if (filePath == null) { - filePath = AuthConstant.DEFAULT_CREDENTIALS_FILE_PATH; - } - if (filePath.length() == 0) { - throw new ClientException("The specified credentials file is empty"); - } - Wini ini; - try { - ini = getIni(filePath); - } catch (IOException e) { - return null; - } - Map> client = loadIni(ini); - Map clientConfig = client.get(AuthUtils.getClientType()); - if (clientConfig == null) { - throw new ClientException("Client is not open in the specified credentials file"); - } - CredentialsProviderFactory credentialsProviderFactory = new CredentialsProviderFactory(); - return createCredential(clientConfig, credentialsProviderFactory); - } - - private Map> loadIni(Wini ini) { - Map> client = new HashMap>(); - boolean enable; - for (Map.Entry clientType : ini.entrySet()) { - enable = clientType.getValue().get(AuthConstant.INI_ENABLE, boolean.class); - if (enable) { - Map clientConfig = new HashMap(); - for (Map.Entry enabledClient : clientType.getValue().entrySet()) { - clientConfig.put(enabledClient.getKey(), enabledClient.getValue()); - } - client.put(clientType.getKey(), clientConfig); - } - } - return client; - } - - private AlibabaCloudCredentials createCredential(Map clientConfig, - CredentialsProviderFactory factory) throws ClientException { - String configType = clientConfig.get(AuthConstant.INI_TYPE); - if (StringUtils.isEmpty(configType)) { - throw new ClientException("The configured client type is empty"); - } - if (AuthConstant.INI_TYPE_ARN.equals(configType)) { - return getSTSAssumeRoleSessionCredentials(clientConfig, factory); - } - if (AuthConstant.INI_TYPE_KEY_PAIR.equals(configType)) { - return getSTSGetSessionAccessKeyCredentials(clientConfig, factory); - } - if (AuthConstant.INI_TYPE_RAM.equals(configType)) { - return getInstanceProfileCredentials(clientConfig, factory); - } - String accessKeyId = clientConfig.get(AuthConstant.INI_ACCESS_KEY_ID); - String accessKeySecret = clientConfig.get(AuthConstant.INI_ACCESS_KEY_IDSECRET); - if (StringUtils.isEmpty(accessKeyId) || StringUtils.isEmpty(accessKeySecret)) { - return null; - } - return new BasicCredentials(accessKeyId, accessKeySecret); - } - - private AlibabaCloudCredentials getSTSAssumeRoleSessionCredentials(Map clientConfig, - CredentialsProviderFactory factory) - throws ClientException { - String accessKeyId = clientConfig.get(AuthConstant.INI_ACCESS_KEY_ID); - String accessKeySecret = clientConfig.get(AuthConstant.INI_ACCESS_KEY_IDSECRET); - String roleSessionName = clientConfig.get(AuthConstant.INI_ROLE_SESSION_NAME); - String roleArn = clientConfig.get(AuthConstant.INI_ROLE_ARN); - String regionId = clientConfig.get(AuthConstant.DEFAULT_REGION); - String policy = clientConfig.get(AuthConstant.INI_POLICY); - if (StringUtils.isEmpty(accessKeyId) || StringUtils.isEmpty(accessKeySecret)) { - throw new ClientException("The configured access_key_id or access_key_secret is empty"); - } - if (StringUtils.isEmpty(roleSessionName) || StringUtils.isEmpty(roleArn)) { - throw new ClientException("The configured role_session_name or role_arn is empty"); - } - STSAssumeRoleSessionCredentialsProvider provider = - factory.createCredentialsProvider(new STSAssumeRoleSessionCredentialsProvider(accessKeyId, - accessKeySecret, roleSessionName, roleArn, regionId, policy)); - return provider.getCredentials(); - } - - private AlibabaCloudCredentials getSTSGetSessionAccessKeyCredentials(Map clientConfig, - CredentialsProviderFactory factory) - throws ClientException { - String publicKeyId = clientConfig.get(AuthConstant.INI_PUBLIC_KEY_ID); - String privateKeyFile = clientConfig.get(AuthConstant.INI_PRIVATE_KEY_FILE); - if (StringUtils.isEmpty(privateKeyFile)) { - throw new ClientException("The configured private_key_file is empty"); - } - String privateKey = AuthUtils.getPrivateKey(privateKeyFile); - if (StringUtils.isEmpty(publicKeyId) || StringUtils.isEmpty(privateKey)) { - throw new ClientException("The configured public_key_id or private_key_file content is empty"); - } - STSGetSessionAccessKeyCredentialsProvider provider = - factory.createCredentialsProvider(new STSGetSessionAccessKeyCredentialsProvider(publicKeyId, privateKey)); - return provider.getCredentials(); - } - - private AlibabaCloudCredentials getInstanceProfileCredentials(Map clientConfig, - CredentialsProviderFactory factory) - throws ClientException { - String roleName = clientConfig.get(AuthConstant.INI_ROLE_NAME); - if (StringUtils.isEmpty(roleName)) { - throw new ClientException("The configured role_name is empty"); - } - InstanceProfileCredentialsProvider provider = - factory.createCredentialsProvider(new InstanceProfileCredentialsProvider(roleName)); - return provider.getCredentials(); - } - - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/RoaSignatureComposer.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/RoaSignatureComposer.java deleted file mode 100644 index 0afcd99..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/RoaSignatureComposer.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.MethodType; -import com.aliyuncs.utils.ParameterHelper; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.TreeMap; - -public class RoaSignatureComposer implements ISignatureComposer { - - protected final static String QUERY_SEPARATOR = "&"; - protected final static String HEADER_SEPARATOR = "\n"; - private static ISignatureComposer composer = null; - - public static String replaceOccupiedParameters(String url, Map paths) { - String result = url; - for (Map.Entry entry : paths.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - String target = "[" + key + "]"; - result = result.replace(target, value); - } - - return result; - } - - public static ISignatureComposer getComposer() { - if (null == composer) { - composer = new RoaSignatureComposer(); - } - return composer; - } - - @Override - public Map refreshSignParameters(Map parameters, Signer signer, String accessKeyId, - FormatType format) { - Map immutableMap = new HashMap(parameters); - immutableMap.put("Date", ParameterHelper.getRFC2616Date(new Date())); - if (null == format) { - format = FormatType.JSON; - } - immutableMap.put("Accept", FormatType.mapFormatToAccept(format)); - immutableMap.put("x-acs-signature-method", signer.getSignerName()); - immutableMap.put("x-acs-signature-version", signer.getSignerVersion()); - if (signer.getSignerType() != null) { - immutableMap.put("x-acs-signature-type", signer.getSignerType()); - } - return immutableMap; - } - - private String[] splitSubResource(String uri) { - int queIndex = uri.indexOf("?"); - String[] uriParts = new String[2]; - if (-1 != queIndex) { - uriParts[0] = uri.substring(0, queIndex); - uriParts[1] = uri.substring(queIndex + 1); - } else { - uriParts[0] = uri; - } - return uriParts; - } - - private String buildQueryString(String uri, Map queries) { - String[] uriParts = splitSubResource(uri); - Map sortMap = new TreeMap(queries); - if (null != uriParts[1]) { - sortMap.put(uriParts[1], null); - } - StringBuilder queryBuilder = new StringBuilder(uriParts[0]); - if (0 < sortMap.size()) { - queryBuilder.append("?"); - } - for (Map.Entry e : sortMap.entrySet()) { - queryBuilder.append(e.getKey()); - - String value = e.getValue(); - if (value == null || value.isEmpty()) { - queryBuilder.append(QUERY_SEPARATOR); - continue; - } - queryBuilder.append("=").append(e.getValue()).append(QUERY_SEPARATOR); - } - String queryString = queryBuilder.toString(); - if (queryString.endsWith(QUERY_SEPARATOR)) { - queryString = queryString.substring(0, queryString.length() - 1); - } - return queryString; - - } - - protected String buildCanonicalHeaders(Map headers, String headerBegin) { - Map sortMap = new TreeMap(); - for (Map.Entry e : headers.entrySet()) { - String key = e.getKey().toLowerCase(); - String val = e.getValue(); - if (key.startsWith(headerBegin)) { - sortMap.put(key, val); - } - } - StringBuilder headerBuilder = new StringBuilder(); - for (Map.Entry e : sortMap.entrySet()) { - headerBuilder.append(e.getKey()); - headerBuilder.append(':').append(e.getValue()); - headerBuilder.append(HEADER_SEPARATOR); - } - return headerBuilder.toString(); - } - - @Override - public String composeStringToSign(MethodType method, String uriPattern, Signer signer, Map queries, - Map headers, Map paths) { - StringBuilder sb = new StringBuilder(); - sb.append(method).append(HEADER_SEPARATOR); - if (headers.get("Accept") != null) { - sb.append(headers.get("Accept")); - } - sb.append(HEADER_SEPARATOR); - if (headers.get("Content-MD5") != null) { - sb.append(headers.get("Content-MD5")); - } - sb.append(HEADER_SEPARATOR); - if (headers.get("Content-Type") != null) { - sb.append(headers.get("Content-Type")); - } - sb.append(HEADER_SEPARATOR); - if (headers.get("Date") != null) { - sb.append(headers.get("Date")); - } - sb.append(HEADER_SEPARATOR); - String uri = replaceOccupiedParameters(uriPattern, paths); - sb.append(buildCanonicalHeaders(headers, "x-acs-")); - sb.append(buildQueryString(uri, queries)); - return sb.toString(); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/RpcSignatureComposer.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/RpcSignatureComposer.java deleted file mode 100644 index b987494..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/RpcSignatureComposer.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package com.aliyuncs.auth; - -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.MethodType; -import com.aliyuncs.utils.ParameterHelper; - -import java.io.UnsupportedEncodingException; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -public class RpcSignatureComposer implements ISignatureComposer { - - private final static String SEPARATOR = "&"; - private static ISignatureComposer composer = null; - - private RpcSignatureComposer() { - - } - - public static ISignatureComposer getComposer() { - if (null == composer) { - composer = new RpcSignatureComposer(); - } - return composer; - } - - @Override - public Map refreshSignParameters(Map parameters, - Signer signer, String accessKeyId, FormatType format) { - Map immutableMap = new HashMap(parameters); - immutableMap.put("Timestamp", ParameterHelper.getISO8601Time(new Date())); - immutableMap.put("SignatureMethod", signer.getSignerName()); - immutableMap.put("SignatureVersion", signer.getSignerVersion()); - immutableMap.put("SignatureNonce", ParameterHelper.getUniqueNonce()); - immutableMap.put("AccessKeyId", accessKeyId); - if (null != format) { - immutableMap.put("Format", format.toString()); - } - if (signer.getSignerType() != null) { - immutableMap.put("SignatureType", signer.getSignerType()); - } - return immutableMap; - } - - @Override - public String composeStringToSign(MethodType method, String uriPattern, - Signer signer, Map queries, - Map headers, Map paths) { - - String[] sortedKeys = queries.keySet().toArray(new String[]{}); - Arrays.sort(sortedKeys); - StringBuilder canonicalizedQueryString = new StringBuilder(); - try { - for (String key : sortedKeys) { - canonicalizedQueryString.append("&") - .append(AcsURLEncoder.percentEncode(key)).append("=") - .append(AcsURLEncoder.percentEncode(queries.get(key))); - } - - StringBuilder stringToSign = new StringBuilder(); - stringToSign.append(method.toString()); - stringToSign.append(SEPARATOR); - stringToSign.append(AcsURLEncoder.percentEncode("/")); - stringToSign.append(SEPARATOR); - stringToSign.append(AcsURLEncoder.percentEncode( - canonicalizedQueryString.toString().substring(1))); - - return stringToSign.toString(); - } catch (UnsupportedEncodingException exp) { - throw new RuntimeException("UTF-8 encoding is not supported."); - } - - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/SHA256withRSASigner.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/SHA256withRSASigner.java deleted file mode 100644 index ba92c06..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/SHA256withRSASigner.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package com.aliyuncs.auth; - -import javax.xml.bind.DatatypeConverter; -import java.io.UnsupportedEncodingException; -import java.security.*; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.PKCS8EncodedKeySpec; - -/** - * Created by haowei.yao on 2017/9/28. - */ - -public class SHA256withRSASigner extends Signer { - - public static final String ENCODING = "UTF-8"; - private static final String ALGORITHM_NAME = "SHA256withRSA"; - - @Override - public String signString(String stringToSign, String accessKeySecret) { - try { - Signature rsaSign = Signature.getInstance("SHA256withRSA"); - KeyFactory kf = KeyFactory.getInstance("RSA"); - byte[] keySpec = DatatypeConverter.parseBase64Binary(accessKeySecret); - PrivateKey privateKey = kf.generatePrivate(new PKCS8EncodedKeySpec(keySpec)); - rsaSign.initSign(privateKey); - rsaSign.update(stringToSign.getBytes(ENCODING)); - byte[] sign = rsaSign.sign(); - String signature = new String(DatatypeConverter.printBase64Binary(sign)); - return signature; - } catch (NoSuchAlgorithmException e) { - throw new IllegalArgumentException(e.toString()); - } catch (InvalidKeySpecException e) { - throw new IllegalArgumentException(e.toString()); - } catch (InvalidKeyException e) { - throw new IllegalArgumentException(e.toString()); - } catch (SignatureException e) { - throw new IllegalArgumentException(e.toString()); - } catch (UnsupportedEncodingException e) { - throw new IllegalArgumentException(e.toString()); - } - } - - @Override - public String signString(String stringToSign, AlibabaCloudCredentials credentials) { - return signString(stringToSign, credentials.getAccessKeySecret()); - } - - @Override - public String getSignerName() { - return ALGORITHM_NAME; - } - - @Override - public String getSignerVersion() { - return "1.0"; - } - - @Override - public String getSignerType() { - return "PRIVATEKEY"; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/STSAssumeRoleSessionCredentialsProvider.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/STSAssumeRoleSessionCredentialsProvider.java deleted file mode 100644 index 075128e..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/STSAssumeRoleSessionCredentialsProvider.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.DefaultAcsClient; -import com.aliyuncs.IAcsClient; -import com.aliyuncs.auth.sts.AssumeRoleRequest; -import com.aliyuncs.auth.sts.AssumeRoleResponse; -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.exceptions.ServerException; -import com.aliyuncs.profile.DefaultProfile; -import com.aliyuncs.profile.IClientProfile; - -/** - * This implementation of AlibabaCloudCredentialsProvider accesses Alibaba Cloud STS service to assume a Role and get - * back a temporary session for authentication. - */ -public class STSAssumeRoleSessionCredentialsProvider implements AlibabaCloudCredentialsProvider { - - /** - * Default duration for started sessions. - */ - public static final int DEFAULT_DURATION_SECONDS = 3600; - /** - * The arn of the role to be assumed. - */ - private final String roleArn; - /** - * For test - * To know how many rounds AssumeRole has been called - */ - public long assumeRoleRound = 0; - /** - * The client for starting STS sessions. - */ - private IAcsClient stsClient; - /** - * An identifier for the assumed role session. - */ - private String roleSessionName; - /** - * The Duration for assume role sessions. - */ - private long roleSessionDurationSeconds; - - private String policy; - private BasicSessionCredentials credentials = null; - - - public STSAssumeRoleSessionCredentialsProvider(AlibabaCloudCredentials longLivedCredentials, - String roleArn, IClientProfile clientProfile) { - this(new StaticCredentialsProvider(longLivedCredentials), roleArn, clientProfile); - } - - public STSAssumeRoleSessionCredentialsProvider(AlibabaCloudCredentialsProvider longLivedCredentialsProvider, - String roleArn, IClientProfile clientProfile) { - if (roleArn == null) { - throw new NullPointerException( - "You must specify a value for roleArn."); - } - this.roleArn = roleArn; - this.roleSessionName = getNewRoleSessionName(); - this.stsClient = new DefaultAcsClient(clientProfile, longLivedCredentialsProvider); - this.roleSessionDurationSeconds = DEFAULT_DURATION_SECONDS; - } - - public STSAssumeRoleSessionCredentialsProvider(String accessKeyId, String accessKeySecret, String roleSessionName, - String roleArn, String regionId) { - this.roleArn = roleArn; - this.roleSessionName = roleSessionName; - DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); - this.stsClient = new DefaultAcsClient(profile); - this.roleSessionDurationSeconds = AuthConstant.TSC_VALID_TIME_SECONDS; - } - - public STSAssumeRoleSessionCredentialsProvider(String accessKeyId, String accessKeySecret, String roleSessionName, - String roleArn, String regionId, String policy) { - this(accessKeyId, accessKeySecret, roleSessionName, roleArn, regionId); - this.policy = policy; - } - - public static String getNewRoleSessionName() { - return "aliyun-java-sdk-" + System.currentTimeMillis(); - } - - public STSAssumeRoleSessionCredentialsProvider withRoleSessionName(String roleSessionName) { - this.roleSessionName = roleSessionName; - return this; - } - - public STSAssumeRoleSessionCredentialsProvider withRoleSessionDurationSeconds(long roleSessionDurationSeconds) { - if (roleSessionDurationSeconds < 900 || roleSessionDurationSeconds > 3600) { - throw new IllegalArgumentException( - "Assume Role session duration should be in the range of 15min - 1Hr"); - } - this.roleSessionDurationSeconds = roleSessionDurationSeconds; - return this; - } - - public STSAssumeRoleSessionCredentialsProvider withSTSClient(IAcsClient client) { - this.stsClient = client; - return this; - } - - @Override - public AlibabaCloudCredentials getCredentials() throws ClientException, ServerException { - if (credentials == null || credentials.willSoonExpire()) { - credentials = getNewSessionCredentials(); - } - return credentials; - } - - private BasicSessionCredentials getNewSessionCredentials() throws ClientException, ServerException { - - assumeRoleRound += 1; - - AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest(); - assumeRoleRequest.setRoleArn(roleArn); - assumeRoleRequest.setRoleSessionName(roleSessionName); - assumeRoleRequest.setDurationSeconds(roleSessionDurationSeconds); - if (null != policy){ - assumeRoleRequest.setPolicy(policy); - } - AssumeRoleResponse response = stsClient.getAcsResponse(assumeRoleRequest); - return new BasicSessionCredentials( - response.getCredentials().getAccessKeyId(), - response.getCredentials().getAccessKeySecret(), - response.getCredentials().getSecurityToken(), - roleSessionDurationSeconds - ); - } -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/STSGetSessionAccessKeyCredentialsProvider.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/STSGetSessionAccessKeyCredentialsProvider.java deleted file mode 100644 index 49d15e7..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/STSGetSessionAccessKeyCredentialsProvider.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.aliyuncs.auth; - - -import com.aliyuncs.DefaultAcsClient; -import com.aliyuncs.IAcsClient; -import com.aliyuncs.auth.sts.GenerateSessionAccessKeyResponse; -import com.aliyuncs.auth.sts.GetSessionAccessKeyRequest; -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.exceptions.ServerException; -import com.aliyuncs.http.ProtocolType; -import com.aliyuncs.profile.DefaultProfile; -import com.aliyuncs.profile.IClientProfile; - -public class STSGetSessionAccessKeyCredentialsProvider implements AlibabaCloudCredentialsProvider { - - public static final int DEFAULT_DURATION_SECONDS = 3600; - private KeyPairCredentials keyPairCredentials; - private String publicKeyId; - private IAcsClient stsClient; - private long sessionDurationSeconds = DEFAULT_DURATION_SECONDS; - private BasicSessionCredentials sessionCredentials = null; - - public STSGetSessionAccessKeyCredentialsProvider(KeyPairCredentials keyPairCredentials, - IClientProfile profile) { - this.keyPairCredentials = keyPairCredentials; - this.stsClient = new DefaultAcsClient(profile, keyPairCredentials); - } - - public STSGetSessionAccessKeyCredentialsProvider(String publicKeyId, String privateKey) { - this.publicKeyId = publicKeyId; - DefaultProfile profile = DefaultProfile.getProfile("ap-northeast-1", publicKeyId, privateKey); - this.stsClient = new DefaultAcsClient(profile); - } - - - public STSGetSessionAccessKeyCredentialsProvider withDurationSeconds(long seconds) { - this.sessionDurationSeconds = seconds; - return this; - } - - public STSGetSessionAccessKeyCredentialsProvider withSTSClient(IAcsClient client) { - this.stsClient = client; - return this; - } - - @Override - public AlibabaCloudCredentials getCredentials() throws ClientException, ServerException { - if (sessionCredentials == null || sessionCredentials.willSoonExpire()) { - sessionCredentials = getNewSessionCredentials(); - } - return sessionCredentials; - } - - private BasicSessionCredentials getNewSessionCredentials() throws ClientException, ServerException { - GetSessionAccessKeyRequest request = new GetSessionAccessKeyRequest(); - if (null != publicKeyId) { - request.setPublicKeyId(publicKeyId); - } else { - request.setPublicKeyId(keyPairCredentials.getAccessKeyId()); - } - request.setDurationSeconds((int) sessionDurationSeconds); - request.setSysProtocol(ProtocolType.HTTPS); - - GenerateSessionAccessKeyResponse response = this.stsClient.getAcsResponse(request); - - return new BasicSessionCredentials( - response.getSessionAccessKey().getSessionAccessKeyId(), - response.getSessionAccessKey().getSessionAccessKeySecert(), - null, - sessionDurationSeconds - ); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/Signer.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/Signer.java deleted file mode 100644 index 9da5d1c..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/Signer.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package com.aliyuncs.auth; - -/** - * Created by haowei.yao on 2017/9/28. - */ - -public abstract class Signer { - - private final static Signer HMACSHA1_SIGNER = new HmacSHA1Signer(); - private final static Signer SHA256_WITH_RSA_SIGNER = new SHA256withRSASigner(); - private final static Signer BEARER_TOKEN_SIGNER = new BearerTokenSigner(); - - public static Signer getSigner(AlibabaCloudCredentials credentials) { - if (credentials instanceof KeyPairCredentials) { - return SHA256_WITH_RSA_SIGNER; - } else if (credentials instanceof BearerTokenCredentials) { - return BEARER_TOKEN_SIGNER; - } else { - return HMACSHA1_SIGNER; - } - } - - public abstract String signString(String stringToSign, AlibabaCloudCredentials credentials); - - public abstract String signString(String stringToSign, String accessKeySecret); - - public abstract String getSignerName(); - - public abstract String getSignerVersion(); - - public abstract String getSignerType(); -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/StaticCredentialsProvider.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/StaticCredentialsProvider.java deleted file mode 100644 index 4048bff..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/StaticCredentialsProvider.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.profile.IClientProfile; - -public class StaticCredentialsProvider implements AlibabaCloudCredentialsProvider { - - private AlibabaCloudCredentials credentials = null; - - public StaticCredentialsProvider(AlibabaCloudCredentials credentials) { - this.credentials = credentials; - } - - @SuppressWarnings("deprecation") - public StaticCredentialsProvider(IClientProfile clientProfile) { - IClientProfile clientProfile1 = clientProfile; - Credential legacyCredential = clientProfile1.getCredential(); - if (null != legacyCredential.getSecurityToken()) { - this.credentials = new BasicSessionCredentials(legacyCredential.getAccessKeyId(), legacyCredential - .getAccessSecret(), legacyCredential.getSecurityToken()); - } else { - this.credentials = new LegacyCredentials(legacyCredential); - } - } - - @Override - public AlibabaCloudCredentials getCredentials() { - return this.credentials; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/SystemPropertiesCredentialsProvider.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/SystemPropertiesCredentialsProvider.java deleted file mode 100644 index fc38d52..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/SystemPropertiesCredentialsProvider.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.aliyuncs.auth; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.exceptions.ServerException; -import com.aliyuncs.utils.AuthUtils; -import com.aliyuncs.utils.StringUtils; - - -public class SystemPropertiesCredentialsProvider implements AlibabaCloudCredentialsProvider { - @Override - public AlibabaCloudCredentials getCredentials() throws ClientException, ServerException { - if (!"default".equals(AuthUtils.getClientType())) { - return null; - } - String accessKeyId = System.getProperty(AuthConstant.SYSTEM_ACCESSKEYID); - String accessKeySecret = System.getProperty(AuthConstant.SYSTEM_ACCESSKEYSECRET); - if (StringUtils.isEmpty(accessKeyId) || StringUtils.isEmpty(accessKeySecret)) { - return null; - } - return new BasicCredentials(accessKeyId, accessKeySecret); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleRequest.java deleted file mode 100644 index 1b7e4dd..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleRequest.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package com.aliyuncs.auth.sts; - -/** - * Created by haowei.yao on 2017/9/14. - */ - -import com.aliyuncs.RpcAcsRequest; -import com.aliyuncs.http.ProtocolType; - -/** - * @author auto create - */ -public class AssumeRoleRequest extends RpcAcsRequest { - - private Long durationSeconds; - private String policy; - private String roleArn; - private String roleSessionName; - - public AssumeRoleRequest() { - super("Sts", "2015-04-01", "AssumeRole"); - setSysProtocol(ProtocolType.HTTPS); - } - - public Long getDurationSeconds() { - return this.durationSeconds; - } - - public void setDurationSeconds(Long durationSeconds) { - this.durationSeconds = durationSeconds; - putQueryParameter("DurationSeconds", String.valueOf(durationSeconds)); - } - - public String getPolicy() { - return this.policy; - } - - public void setPolicy(String policy) { - this.policy = policy; - putQueryParameter("Policy", policy); - } - - public String getRoleArn() { - return this.roleArn; - } - - public void setRoleArn(String roleArn) { - this.roleArn = roleArn; - putQueryParameter("RoleArn", roleArn); - } - - public String getRoleSessionName() { - return this.roleSessionName; - } - - public void setRoleSessionName(String roleSessionName) { - this.roleSessionName = roleSessionName; - putQueryParameter("RoleSessionName", roleSessionName); - } - - @Override - public Class getResponseClass() { - return AssumeRoleResponse.class; - } - -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleResponse.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleResponse.java deleted file mode 100644 index 50d718d..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleResponse.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.aliyuncs.auth.sts; - -import com.aliyuncs.AcsResponse; -import com.aliyuncs.transform.UnmarshallerContext; - -public class AssumeRoleResponse extends AcsResponse { - - private String requestId; - - private Credentials credentials; - - private AssumedRoleUser assumedRoleUser; - - public String getRequestId() { - return this.requestId; - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public Credentials getCredentials() { - return this.credentials; - } - - public void setCredentials(Credentials credentials) { - this.credentials = credentials; - } - - public AssumedRoleUser getAssumedRoleUser() { - return this.assumedRoleUser; - } - - public void setAssumedRoleUser(AssumedRoleUser assumedRoleUser) { - this.assumedRoleUser = assumedRoleUser; - } - - @Override - public AssumeRoleResponse getInstance(UnmarshallerContext context) { - return AssumeRoleResponseUnmarshaller.unmarshall(this, context); - } - - public static class Credentials { - - private String securityToken; - - private String accessKeySecret; - - private String accessKeyId; - - private String expiration; - - public String getSecurityToken() { - return this.securityToken; - } - - public void setSecurityToken(String securityToken) { - this.securityToken = securityToken; - } - - public String getAccessKeySecret() { - return this.accessKeySecret; - } - - public void setAccessKeySecret(String accessKeySecret) { - this.accessKeySecret = accessKeySecret; - } - - public String getAccessKeyId() { - return this.accessKeyId; - } - - public void setAccessKeyId(String accessKeyId) { - this.accessKeyId = accessKeyId; - } - - public String getExpiration() { - return this.expiration; - } - - public void setExpiration(String expiration) { - this.expiration = expiration; - } - } - - public static class AssumedRoleUser { - - private String arn; - - private String assumedRoleId; - - public String getArn() { - return this.arn; - } - - public void setArn(String arn) { - this.arn = arn; - } - - public String getAssumedRoleId() { - return this.assumedRoleId; - } - - public void setAssumedRoleId(String assumedRoleId) { - this.assumedRoleId = assumedRoleId; - } - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleResponseUnmarshaller.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleResponseUnmarshaller.java deleted file mode 100644 index afbae21..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/AssumeRoleResponseUnmarshaller.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.aliyuncs.auth.sts; - -import com.aliyuncs.auth.sts.AssumeRoleResponse.AssumedRoleUser; -import com.aliyuncs.auth.sts.AssumeRoleResponse.Credentials; -import com.aliyuncs.transform.UnmarshallerContext; - - -public class AssumeRoleResponseUnmarshaller { - - public static AssumeRoleResponse unmarshall(AssumeRoleResponse assumeRoleResponse, UnmarshallerContext context) { - - assumeRoleResponse.setRequestId(context.stringValue("AssumeRoleResponse.RequestId")); - - Credentials credentials = new Credentials(); - credentials.setSecurityToken(context.stringValue("AssumeRoleResponse.Credentials.SecurityToken")); - credentials.setAccessKeySecret(context.stringValue("AssumeRoleResponse.Credentials.AccessKeySecret")); - credentials.setAccessKeyId(context.stringValue("AssumeRoleResponse.Credentials.AccessKeyId")); - credentials.setExpiration(context.stringValue("AssumeRoleResponse.Credentials.Expiration")); - assumeRoleResponse.setCredentials(credentials); - - AssumedRoleUser assumedRoleUser = new AssumedRoleUser(); - assumedRoleUser.setArn(context.stringValue("AssumeRoleResponse.AssumedRoleUser.Arn")); - assumedRoleUser.setAssumedRoleId(context.stringValue("AssumeRoleResponse.AssumedRoleUser.AssumedRoleId")); - assumeRoleResponse.setAssumedRoleUser(assumedRoleUser); - - return assumeRoleResponse; - } -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GenerateSessionAccessKeyResponse.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GenerateSessionAccessKeyResponse.java deleted file mode 100644 index 5eb366c..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GenerateSessionAccessKeyResponse.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.aliyuncs.auth.sts; - -import com.aliyuncs.AcsResponse; -import com.aliyuncs.transform.UnmarshallerContext; -import com.google.gson.annotations.SerializedName; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "GenerateSessionAccessKeyResponse") -public class GenerateSessionAccessKeyResponse extends AcsResponse { - - @SerializedName("RequestId") - private String requestId; - - @SerializedName("SessionAccessKey") - private SessionAccessKey sessionAccessKey; - - public String getRequestId() { - return requestId; - } - - @XmlElement(name = "RequestId") - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - @XmlElement(name = "SessionAccessKey") - public SessionAccessKey getSessionAccessKey() { - return sessionAccessKey; - } - - public void setSessionAccessKey(SessionAccessKey sessionAccessKey) { - this.sessionAccessKey = sessionAccessKey; - } - - @Override - public GenerateSessionAccessKeyResponse getInstance(UnmarshallerContext context) { - return GetSessionAccessKeyResponseUnmarshaller.unmarshall(this, context); - } - - public static class SessionAccessKey { - - @SerializedName("SessionAccessKeyId") - private String sessionAccessKeyId; - - @SerializedName("SessionAccessKeySecret") - private String sessionAccessKeySecret; - - @SerializedName("Expiration") - private String expiration; - - public String getSessionAccessKeyId() { - return sessionAccessKeyId; - } - - @XmlElement(name = "SessionAccessKeyId") - public void setSessionAccessKeyId(String sessionAccessKeyId) { - this.sessionAccessKeyId = sessionAccessKeyId; - } - - public String getSessionAccessKeySecert() { - return sessionAccessKeySecret; - } - - @XmlElement(name = "SessionAccessKeySecret") - public void setSessionAccessKeySecert(String sessionAccessKeySecert) { - this.sessionAccessKeySecret = sessionAccessKeySecert; - } - - public String getExpiration() { - return expiration; - } - - @XmlElement(name = "Expiration") - public void setExpiration(String expiration) { - this.expiration = expiration; - } - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GetSessionAccessKeyRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GetSessionAccessKeyRequest.java deleted file mode 100644 index 36979dc..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GetSessionAccessKeyRequest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package com.aliyuncs.auth.sts; - -import com.aliyuncs.RpcAcsRequest; - -public class GetSessionAccessKeyRequest extends RpcAcsRequest { - - private static String version = "2015-04-01"; - - private static String product = "Sts"; - - private static String action = "GenerateSessionAccessKey"; - private int durationSeconds = 3600; - private String publicKeyId; - - public GetSessionAccessKeyRequest() { - super(product, version, action); - } - - public int getDurationSeconds() { - return durationSeconds; - } - - public void setDurationSeconds(int durationSeconds) { - this.durationSeconds = durationSeconds; - putQueryParameter("DurationSeconds", durationSeconds); - } - - public String getPublicKeyId() { - return publicKeyId; - } - - public void setPublicKeyId(String publicKeyId) { - this.publicKeyId = publicKeyId; - putQueryParameter("PublicKeyId", publicKeyId); - } - - @Override - public Class getResponseClass() { - return GenerateSessionAccessKeyResponse.class; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GetSessionAccessKeyResponseUnmarshaller.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GetSessionAccessKeyResponseUnmarshaller.java deleted file mode 100644 index 16f3dd7..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/sts/GetSessionAccessKeyResponseUnmarshaller.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.aliyuncs.auth.sts; - -import com.aliyuncs.auth.sts.GenerateSessionAccessKeyResponse.SessionAccessKey; -import com.aliyuncs.transform.UnmarshallerContext; - -public class GetSessionAccessKeyResponseUnmarshaller { - - public static GenerateSessionAccessKeyResponse unmarshall(GenerateSessionAccessKeyResponse getSessionAccessKeyResponse, - UnmarshallerContext context) { - - getSessionAccessKeyResponse.setRequestId(context.stringValue("GenerateSessionAccessKeyResponse.RequestId")); - - SessionAccessKey credentials = new SessionAccessKey(); - credentials.setSessionAccessKeyId(context.stringValue("GenerateSessionAccessKeyResponse.SessionAccessKey.SessionAccessKeyId")); - credentials.setSessionAccessKeySecert(context.stringValue("GenerateSessionAccessKeyResponse.SessionAccessKey.SessionAccessKeySecret")); - credentials.setExpiration(context.stringValue("GenerateSessionAccessKeyResponse.SessionAccessKey.Expiration")); - - getSessionAccessKeyResponse.setSessionAccessKey(credentials); - - return getSessionAccessKeyResponse; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/ChainedEndpointResolver.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/ChainedEndpointResolver.java deleted file mode 100644 index 2083c96..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/ChainedEndpointResolver.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.aliyuncs.endpoint; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.exceptions.ErrorCodeConstant; -import com.aliyuncs.exceptions.ErrorMessageConstant; - -import java.util.List; -import java.util.Set; - -@SuppressWarnings({"ALL", "AlibabaClassMustHaveAuthor"}) -public class ChainedEndpointResolver implements EndpointResolver { - protected List endpointResolvers; - - public ChainedEndpointResolver(List resolverChain) { - this.endpointResolvers = resolverChain; - } - - private void checkProductCode(ResolveEndpointRequest request) throws ClientException { - boolean productCodeValid = false; - for (EndpointResolverBase resolver : endpointResolvers) { - if (resolver.isProductCodeValid(request)) { - productCodeValid = true; - } - } - - if (!productCodeValid) { - throw new ClientException(ErrorCodeConstant.SDK_ENDPOINT_RESOLVING_ERROR, - String.format(ErrorMessageConstant.ENDPOINT_NO_PRODUCT, request.productCode)); - } - } - - private void checkRegionId(ResolveEndpointRequest request) throws ClientException { - boolean regionIdValid = false; - for (EndpointResolverBase resolver : endpointResolvers) { - if (resolver.isRegionIdValid(request)) { - regionIdValid = true; - } - } - - if (!regionIdValid) { - throw new ClientException(ErrorCodeConstant.SDK_ENDPOINT_RESOLVING_ERROR, - String.format(ErrorMessageConstant.INVALID_REGION_ID, request.regionId)); - } - } - - private String getAvailableRegionsHint(String productCode) { - Set availabeRegions = null; - String availabeRegionsHint = ""; - for (EndpointResolverBase resolver : endpointResolvers) { - availabeRegions = resolver.getValidRegionIdsByProduct(productCode); - if (availabeRegions != null) { - availabeRegionsHint = "\nOr you can use the other available regions:"; - for (String availabeRegion : availabeRegions) { - availabeRegionsHint += " " + availabeRegion; - } - break; - } - } - return availabeRegionsHint; - } - - @Override - public String resolve(ResolveEndpointRequest request) throws ClientException { - for (EndpointResolverBase resolver : endpointResolvers) { - String endpoint = resolver.resolve(request); - if (endpoint != null) { - return endpoint; - } - } - - checkProductCode(request); - checkRegionId(request); - - throw new ClientException(ErrorCodeConstant.SDK_ENDPOINT_RESOLVING_ERROR, - String.format(ErrorMessageConstant.ENDPOINT_NO_REGION, request.regionId, request.productCode, - getAvailableRegionsHint(request.productCode))); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/DefaultEndpointResolver.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/DefaultEndpointResolver.java deleted file mode 100644 index 6d55dde..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/DefaultEndpointResolver.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.aliyuncs.endpoint; - -import com.aliyuncs.DefaultAcsClient; -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.profile.DefaultProfile; -import com.aliyuncs.profile.IClientProfile; - -import java.util.ArrayList; -import java.util.List; - -public class DefaultEndpointResolver implements EndpointResolver { - - public static UserCustomizedEndpointResolver predefinedEndpointResolver = new UserCustomizedEndpointResolver(); - private UserCustomizedEndpointResolver userCustomizedEndpointResolver; - private EndpointResolver insideEndpointResolver; - - public DefaultEndpointResolver( - DefaultAcsClient client, - String userConfig, - IClientProfile profile) { - userCustomizedEndpointResolver = new UserCustomizedEndpointResolver(); - EndpointResolverRules endpointResolverRules = new EndpointResolverRules(); - List resolverChain = new ArrayList(); - - // The order is very IMPORTANT! - resolverChain.add(predefinedEndpointResolver); - resolverChain.add(userCustomizedEndpointResolver); - if (profile.isUsingVpcEndpoint()) { - resolverChain.add(new UserVpcEndpointResolver()); - } - resolverChain.add(endpointResolverRules); - if (userConfig == null) { - resolverChain.add(new LocalConfigRegionalEndpointResolver()); - resolverChain.add(new LocalConfigGlobalEndpointResolver()); - } else { - resolverChain.add(new LocalConfigRegionalEndpointResolver(userConfig)); - resolverChain.add(new LocalConfigGlobalEndpointResolver(userConfig)); - } - - if (profile.isUsingInternalLocationService()) { - resolverChain.add(new InternalLocationServiceEndpointResolver(client)); - } else { - resolverChain.add(new LocationServiceEndpointResolver(client)); - } - - insideEndpointResolver = new ChainedEndpointResolver(resolverChain); - } - - public DefaultEndpointResolver(DefaultAcsClient client) { - this(client, null, DefaultProfile.getProfile(null)); - } - - public DefaultEndpointResolver(DefaultAcsClient client, IClientProfile profile) { - this(client, null, profile); - } - - @Override - public String resolve(ResolveEndpointRequest request) throws ClientException { - return this.insideEndpointResolver.resolve(request); - } - - public void putEndpointEntry(String regionId, String productCode, String endpoint) { - this.userCustomizedEndpointResolver.putEndpointEntry(regionId, productCode, endpoint); - } -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolver.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolver.java deleted file mode 100644 index c66abfc..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolver.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.aliyuncs.endpoint; - -import com.aliyuncs.exceptions.ClientException; - -public interface EndpointResolver { - String resolve(ResolveEndpointRequest request) throws ClientException; -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolverBase.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolverBase.java deleted file mode 100644 index d182f54..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolverBase.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.aliyuncs.endpoint; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -public abstract class EndpointResolverBase implements EndpointResolver { - Map endpointsData; - - public EndpointResolverBase() { - endpointsData = new HashMap(); - } - - public String fetchEndpointEntry(ResolveEndpointRequest request) { - String key = makeEndpointKey(request); - if (endpointsData.containsKey(key)) { - return endpointsData.get(key); - } else { - return null; - } - } - - public void putEndpointEntry(String key, String endpoint) { - endpointsData.put(key, endpoint); - } - - public boolean isProductCodeValid(ResolveEndpointRequest request) { - for (String key : endpointsData.keySet()) { - if (key.startsWith(request.productCodeLower)) { - return true; - } - } - return false; - } - - abstract public boolean isRegionIdValid(ResolveEndpointRequest request); - - abstract String makeEndpointKey(ResolveEndpointRequest request); - - public Set getValidRegionIdsByProduct(String productCode) { - // Only local config can tell - return null; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolverRules.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolverRules.java deleted file mode 100644 index 404d5d0..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/EndpointResolverRules.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.aliyuncs.endpoint; - -import java.util.HashMap; - -public class EndpointResolverRules extends EndpointResolverBase { - private Boolean validRegionId = false; - private Boolean validProductId = false; - private HashMap productEndpointMap = null; - private String productEndpointRegional = null; - private String productNetwork = "public"; - private String productSuffix = ""; - - @Override - public String resolve(ResolveEndpointRequest request) { - this.productEndpointMap = request.productEndpointMap; - this.productEndpointRegional = request.productEndpointRegional; - this.productNetwork = request.productNetwork; - this.productSuffix = request.productSuffix; - if (this.productEndpointMap == null || this.productEndpointRegional == null) { - return null; - } - return getEndpoint(request.productCode, request.regionId); - } - - @Override - public String makeEndpointKey(ResolveEndpointRequest request) { - return makeEndpointKey(request.productCode, request.regionId); - } - - public String makeEndpointKey(String productCode, String regionId) { - return productCode.toLowerCase() + "." + regionId.toLowerCase(); - } - - private String getEndpoint(String productCode, String regionId) { - if (this.productEndpointRegional != null && this.productEndpointMap != null) { - if ("".equals(this.productNetwork) || this.productNetwork == null) { - this.productNetwork = "public"; - } - - if ("public".equals(this.productNetwork)) { - if (this.productEndpointMap.containsKey(regionId)) { - return this.productEndpointMap.get(regionId); - } - } - - String endpoint = ""; - if ("regional".equals(this.productEndpointRegional)) { - endpoint = "..aliyuncs.com"; - endpoint = endpoint.replace("", regionId.toLowerCase()); - } else { - endpoint = ".aliyuncs.com"; - } - if (this.productSuffix == null || "".equals(this.productSuffix)) { - endpoint = endpoint.replace("", ""); - } else { - endpoint = endpoint.replace("", "-" + this.productSuffix.toLowerCase()); - } - if ("public".equals(this.productNetwork)) { - endpoint = endpoint.replace("", ""); - } else { - endpoint = endpoint.replace("", "-" + this.productNetwork.toLowerCase()); - } - - endpoint = endpoint.replace("", productCode.toLowerCase()); - this.validRegionId = true; - this.validProductId = true; - return endpoint; - } - return null; - - } - - @Override - public boolean isProductCodeValid(ResolveEndpointRequest request) { - return this.validProductId; - } - - @Override - public boolean isRegionIdValid(ResolveEndpointRequest request) { - return this.validRegionId; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/InternalLocationServiceEndpointResolver.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/InternalLocationServiceEndpointResolver.java deleted file mode 100644 index 1ec4243..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/InternalLocationServiceEndpointResolver.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package com.aliyuncs.endpoint; - -import com.aliyuncs.DefaultAcsClient; - -public class InternalLocationServiceEndpointResolver extends LocationServiceEndpointResolver { - - private final static String INNER_LOCATION_SERVICE_ENDPOINT = "location-inner.aliyuncs.com"; - private final static String INNER_LOCATION_SERVICE_API_VERSION = "2015-12-25"; - - public InternalLocationServiceEndpointResolver(DefaultAcsClient client) { - super(client); - this.locationServiceEndpoint = INNER_LOCATION_SERVICE_ENDPOINT; - this.locationServiceApiVersion = INNER_LOCATION_SERVICE_API_VERSION; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocalConfigGlobalEndpointResolver.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocalConfigGlobalEndpointResolver.java deleted file mode 100644 index 2e9a781..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocalConfigGlobalEndpointResolver.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.aliyuncs.endpoint; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -public class LocalConfigGlobalEndpointResolver extends LocalConfigRegionalEndpointResolver { - - public LocalConfigGlobalEndpointResolver() { - JsonObject obj = readLocalConfigAsJsonObject(); - initLocalConfig(obj); - } - - public LocalConfigGlobalEndpointResolver(String configJsonStr) { - // For testability - JsonObject obj = (new JsonParser()).parse(configJsonStr).getAsJsonObject(); - initLocalConfig(obj); - } - - protected void initLocalConfig(JsonObject obj) { - initGlobalEndpointData(obj); - initRegionIds(obj); - initLocationCodeMapping(obj); - } - - private void initGlobalEndpointData(JsonObject obj) { - if (!obj.has("global_endpoints")) { - return; - } - JsonObject globalEndpoints = obj.get("global_endpoints").getAsJsonObject(); - Set globalEndpointsKeySet = new HashSet(); - for (Map.Entry entry : globalEndpoints.entrySet()) { - globalEndpointsKeySet.add(entry.getKey()); - } - for (String locationServiceCode : globalEndpointsKeySet) { - String endpoint = globalEndpoints.get(locationServiceCode).getAsString(); - putEndpointEntry(makeEndpointKey(locationServiceCode), endpoint); - } - } - - @Override - public String resolve(ResolveEndpointRequest request) { - if (request.isOpenApiEndpoint() && isRegionIdValid(request)) { - return fetchEndpointEntry(request); - } else { - return null; - } - } - - @Override - public String makeEndpointKey(ResolveEndpointRequest request) { - return makeEndpointKey(request.productCodeLower); - } - - public String makeEndpointKey(String productCodeLower) { - return getNormalizedProductCode(productCodeLower); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocalConfigRegionalEndpointResolver.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocalConfigRegionalEndpointResolver.java deleted file mode 100644 index 8c50637..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocalConfigRegionalEndpointResolver.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.aliyuncs.endpoint; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -import java.io.InputStream; -import java.util.*; - -public class LocalConfigRegionalEndpointResolver extends EndpointResolverBase { - - protected static final String ENDPOINT_JSON = "endpoints.json"; - private Set validRegionIds = new HashSet(); - private Map locationCodeMapping = new HashMap(); - private JsonObject regionalEndpointData; - - public LocalConfigRegionalEndpointResolver() { - JsonObject obj = readLocalConfigAsJsonObject(); - initLocalConfig(obj); - } - - public LocalConfigRegionalEndpointResolver(String configJsonStr) { - // For testability - JsonObject obj = (new JsonParser()).parse(configJsonStr).getAsJsonObject(); - initLocalConfig(obj); - } - - private void initLocalConfig(JsonObject obj) { - initRegionalEndpointData(obj); - initRegionIds(obj); - initLocationCodeMapping(obj); - } - - private void initRegionalEndpointData(JsonObject obj) { - if (!obj.has("regional_endpoints")) { - return; - } - regionalEndpointData = obj.get("regional_endpoints").getAsJsonObject(); - JsonObject regionalEndpoints = obj.get("regional_endpoints").getAsJsonObject(); - Set regionalEndpointsKeySet = new HashSet(); - for (Map.Entry entry : regionalEndpoints.entrySet()) { - regionalEndpointsKeySet.add(entry.getKey()); - } - for (String normalizedProductCode : regionalEndpointsKeySet) { - JsonObject productData = regionalEndpoints.get(normalizedProductCode).getAsJsonObject(); - Set productDataKeySet = new HashSet(); - for (Map.Entry entry : productData.entrySet()) { - productDataKeySet.add(entry.getKey()); - } - for (String regionId : productDataKeySet) { - String endpoint = productData.get(regionId).getAsString(); - putEndpointEntry(makeEndpointKey(normalizedProductCode, regionId), endpoint); - } - } - } - - protected void initRegionIds(JsonObject obj) { - if (!obj.has("regions")) { - return; - } - JsonArray regions = obj.get("regions").getAsJsonArray(); - for (JsonElement regionData : regions) { - validRegionIds.add(regionData.getAsString()); - } - } - - protected void initLocationCodeMapping(JsonObject obj) { - if (!obj.has("location_code_mapping")) { - return; - } - JsonObject mappingData = obj.get("location_code_mapping").getAsJsonObject(); - Set keySet = new HashSet(); - for (Map.Entry entry : mappingData.entrySet()) { - keySet.add(entry.getKey()); - } - for (String productCode : keySet) { - String locationServiceCode = mappingData.get(productCode).getAsString(); - locationCodeMapping.put(productCode, locationServiceCode); - } - } - - protected String getNormalizedProductCode(String productCode) { - String productCodeLower = productCode.toLowerCase(); - if (locationCodeMapping.containsKey(productCodeLower)) { - return locationCodeMapping.get(productCodeLower); - } - return productCodeLower; - } - - protected JsonObject readLocalConfigAsJsonObject() { - ClassLoader classLoader = getClass().getClassLoader(); - InputStream is = classLoader.getResourceAsStream(ENDPOINT_JSON); - Scanner scanner = new Scanner(is, "UTF-8"); - scanner.useDelimiter("\0"); - String jsonStr = scanner.hasNext() ? scanner.next() : ""; - scanner.close(); - JsonObject endpointData = (new JsonParser()).parse(jsonStr).getAsJsonObject(); - return endpointData; - } - - @Override - public String resolve(ResolveEndpointRequest request) { - if (request.isOpenApiEndpoint()) { - return fetchEndpointEntry(request); - } else { - return null; - } - } - - @Override - public String makeEndpointKey(ResolveEndpointRequest request) { - return makeEndpointKey(request.productCodeLower, request.regionId); - } - - public String makeEndpointKey(String productCodeLower, String regionId) { - return getNormalizedProductCode(productCodeLower) + "." + regionId.toLowerCase(); - } - - @Override - public boolean isRegionIdValid(ResolveEndpointRequest request) { - return validRegionIds.contains(request.regionId); - } - - @Override - public Set getValidRegionIdsByProduct(String productCodeLower) { - String code = getNormalizedProductCode(productCodeLower); - if (regionalEndpointData != null && regionalEndpointData.has(code)) { - JsonObject regionalEndpoints = regionalEndpointData.get(code).getAsJsonObject(); - Set validRegionIdsByProduct = new HashSet(); - for (Map.Entry entry : regionalEndpoints.entrySet()) { - validRegionIdsByProduct.add(entry.getKey()); - } - return validRegionIdsByProduct; - } - return null; - } - - @Override - public boolean isProductCodeValid(ResolveEndpointRequest request) { - ResolveEndpointRequest request2 = new ResolveEndpointRequest( - request.regionId, - getNormalizedProductCode(request.productCode), - null, - null - ); - return super.isProductCodeValid(request2); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocationServiceEndpointResolver.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocationServiceEndpointResolver.java deleted file mode 100644 index 2919d24..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/LocationServiceEndpointResolver.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.aliyuncs.endpoint; - -import com.aliyuncs.DefaultAcsClient; -import com.aliyuncs.endpoint.location.model.v20150612.DescribeEndpointsRequest; -import com.aliyuncs.endpoint.location.model.v20150612.DescribeEndpointsResponse; -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.ProtocolType; - -import java.util.HashSet; -import java.util.Set; - -public class LocationServiceEndpointResolver extends EndpointResolverBase { - - private final static String DEFAULT_LOCATION_SERVICE_ENDPOINT = "location-readonly.aliyuncs.com"; - private final static String DEFAULT_LOCATION_SERVICE_API_VERSION = "2015-06-12"; - /** - * For test use - */ - public int locationServiceCallCounter = 0; - protected String locationServiceEndpoint = DEFAULT_LOCATION_SERVICE_ENDPOINT; - protected String locationServiceApiVersion = DEFAULT_LOCATION_SERVICE_API_VERSION; - private DefaultAcsClient client; - private Set invalidProductCodes; - private Set validProductCodes; - private Set invalidRegionIds; - private Set validRegionIds; - - public LocationServiceEndpointResolver(DefaultAcsClient client) { - this.client = client; - invalidProductCodes = new HashSet(); - invalidRegionIds = new HashSet(); - validProductCodes = new HashSet(); - validRegionIds = new HashSet(); - } - - public void setLocationServiceEndpoint(String endpoint) { - locationServiceEndpoint = endpoint; - } - - @Override - public String resolve(ResolveEndpointRequest request) throws ClientException { - if (request.locationServiceCode == null || request.locationServiceCode.length() == 0) { - return null; - } - - if (invalidProductCodes.contains(request.productCodeLower)) { - return null; - } - - if (invalidRegionIds.contains(request.regionId)) { - return null; - } - - String key = makeEndpointKey(request); - if (endpointsData.containsKey(key)) { - // The endpoint can be null when last fetch is failed - return endpointsData.get(key); - } - return getEndpointFromLocationService(key, request); - } - - synchronized private String getEndpointFromLocationService(String key, ResolveEndpointRequest request) - throws ClientException { - if (endpointsData.containsKey(key)) { - return endpointsData.get(key); - } - - callLocationService(key, request); - locationServiceCallCounter += 1; - - if (endpointsData.containsKey(key)) { - return endpointsData.get(key); - } - - return null; - } - - private void callLocationService(String key, ResolveEndpointRequest request) throws ClientException { - DescribeEndpointsRequest describeEndpointsRequest = new DescribeEndpointsRequest(); - describeEndpointsRequest.setSysProtocol(ProtocolType.HTTPS); - describeEndpointsRequest.setAcceptFormat(FormatType.JSON); - describeEndpointsRequest.setId(request.regionId); - describeEndpointsRequest.setServiceCode(request.locationServiceCode); - describeEndpointsRequest.setType(request.endpointType); - describeEndpointsRequest.setSysEndpoint(locationServiceEndpoint); - describeEndpointsRequest.setVersion(locationServiceApiVersion); - - DescribeEndpointsResponse response; - try { - response = client.getAcsResponse(describeEndpointsRequest); - } catch (ClientException e) { - if ("InvalidRegionId".equals(e.getErrCode()) - && "The specified region does not exist.".equals(e.getErrMsg())) { - // No such region - invalidRegionIds.add(request.regionId); - putEndpointEntry(key, null); - return; - } else if ("Illegal Parameter".equals(e.getErrCode()) - && "Please check the parameters".equals(e.getErrMsg())) { - // No such product - invalidProductCodes.add(request.productCodeLower); - putEndpointEntry(key, null); - return; - } else { - throw e; - } - } - - // As long as code gets here - // the product code and the region id is valid - // the endpoint can be still not found - validProductCodes.add(request.productCodeLower); - validRegionIds.add(request.regionId); - - - boolean foundFlag = false; - for (DescribeEndpointsResponse.Endpoint endpoint : response.getEndpoints()) { - if (endpoint.getSerivceCode().equals(request.locationServiceCode) - && endpoint.getType().equals(request.endpointType)) { - foundFlag = true; - putEndpointEntry(key, endpoint.getEndpoint()); - break; - } - } - - if (!foundFlag) { - putEndpointEntry(key, null); - } - } - - @Override - public boolean isProductCodeValid(ResolveEndpointRequest request) { - if (request.locationServiceCode != null) { - return !invalidProductCodes.contains(request.productCodeLower); - } - return false; - } - - @Override - public boolean isRegionIdValid(ResolveEndpointRequest request) { - if (request.locationServiceCode != null) { - return !invalidRegionIds.contains(request.regionId); - } - return false; - } - - @Override - public String makeEndpointKey(ResolveEndpointRequest request) { - return makeEndpointKey( - request.productCode, request.locationServiceCode, - request.regionId, request.endpointType - ); - } - - public String makeEndpointKey(String productCode, String locationServiceCode, String regionId, - String endpointType) { - return productCode.toLowerCase() + "." + locationServiceCode + "." - + regionId.toLowerCase() + "." + endpointType; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/ResolveEndpointRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/ResolveEndpointRequest.java deleted file mode 100644 index cec8536..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/ResolveEndpointRequest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.aliyuncs.endpoint; - -import java.util.HashMap; - -public class ResolveEndpointRequest { - - public static final String ENDPOINT_TYPE_INNER = "innerAPI"; - public static final String ENDPOINT_TYPE_OPEN = "openAPI"; - - public String productCode = null; - public String regionId = null; - public String endpointType = null; - public String locationServiceCode = null; - public String productCodeLower = null; - public HashMap productEndpointMap = null; - public String productEndpointRegional = null; - public String productNetwork = "public"; - public String productSuffix = ""; - - public ResolveEndpointRequest(String regionId, String productCode, - String locationServiceCode, String endpointType) { - - this.regionId = regionId; - this.productCode = productCode; - this.productCodeLower = productCode.toLowerCase(); - - if (endpointType == null || endpointType.length() == 0) { - endpointType = ENDPOINT_TYPE_OPEN; - } - - this.endpointType = endpointType; - this.locationServiceCode = locationServiceCode; - - } - - public boolean isOpenApiEndpoint() { - return ENDPOINT_TYPE_OPEN.equals(endpointType); - } - - public void setProductEndpointMap(HashMap productEndpointMap) { - this.productEndpointMap = productEndpointMap; - } - - public void setProductEndpointRegional(String productEndpointRegional) { - this.productEndpointRegional = productEndpointRegional; - } - - public void setProductNetwork(String productNetwork) { - this.productNetwork = productNetwork; - } - - public void setProductSuffix(String suffix) { - this.productSuffix = suffix; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/UserCustomizedEndpointResolver.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/UserCustomizedEndpointResolver.java deleted file mode 100644 index 9a85bac..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/UserCustomizedEndpointResolver.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.aliyuncs.endpoint; - -import java.util.HashSet; -import java.util.Set; - -public class UserCustomizedEndpointResolver extends EndpointResolverBase { - - private Set validRegionIds; - - public UserCustomizedEndpointResolver() { - validRegionIds = new HashSet(); - } - - public void putEndpointEntry(String regionId, String productCode, String endpoint) { - putEndpointEntry(makeEndpointKey(productCode, regionId), endpoint); - validRegionIds.add(regionId); - } - - @Override - public String resolve(ResolveEndpointRequest request) { - return fetchEndpointEntry(request); - } - - @Override - public String makeEndpointKey(ResolveEndpointRequest request) { - return makeEndpointKey(request.productCode, request.regionId); - } - - public String makeEndpointKey(String productCode, String regionId) { - return productCode.toLowerCase() + "." + regionId.toLowerCase(); - } - - @Override - public boolean isRegionIdValid(ResolveEndpointRequest request) { - return validRegionIds.contains(request.regionId); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/UserVpcEndpointResolver.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/UserVpcEndpointResolver.java deleted file mode 100644 index e61e4ec..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/UserVpcEndpointResolver.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.aliyuncs.endpoint; - -import com.aliyuncs.exceptions.ClientException; - -public class UserVpcEndpointResolver extends EndpointResolverBase { - - @Override - public boolean isRegionIdValid(ResolveEndpointRequest request) { - return request.regionId != null; - } - - @Override - public boolean isProductCodeValid(ResolveEndpointRequest request) { - return request.productCode != null; - } - - @Override - String makeEndpointKey(ResolveEndpointRequest request) { - return null; - } - - @Override - public String resolve(ResolveEndpointRequest request) throws ClientException { - String productCode = request.productCode.toLowerCase(); - String regionId = request.regionId.toLowerCase(); - return String.format("%s-vpc.%s.aliyuncs.com", productCode, regionId); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/model/v20150612/DescribeEndpointsRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/model/v20150612/DescribeEndpointsRequest.java deleted file mode 100644 index 3014d55..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/model/v20150612/DescribeEndpointsRequest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.aliyuncs.endpoint.location.model.v20150612; - -import com.aliyuncs.RpcAcsRequest; - -public class DescribeEndpointsRequest extends RpcAcsRequest { - - private String id; - private String serviceCode; - private String type; - - public DescribeEndpointsRequest() { - super("Location", "2015-06-12", "DescribeEndpoints"); - } - - public String getId() { - return this.id; - } - - public void setId(String id) { - this.id = id; - putQueryParameter("Id", id); - } - - public String getServiceCode() { - return this.serviceCode; - } - - public void setServiceCode(String serviceCode) { - this.serviceCode = serviceCode; - putQueryParameter("ServiceCode", serviceCode); - } - - public String getType() { - return this.type; - } - - public void setType(String type) { - this.type = type; - putQueryParameter("Type", type); - } - - @Override - public Class getResponseClass() { - return DescribeEndpointsResponse.class; - } - -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/model/v20150612/DescribeEndpointsResponse.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/model/v20150612/DescribeEndpointsResponse.java deleted file mode 100644 index ff9a636..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/model/v20150612/DescribeEndpointsResponse.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.aliyuncs.endpoint.location.model.v20150612; - -import com.aliyuncs.AcsResponse; -import com.aliyuncs.endpoint.location.transform.v20150612.DescribeEndpointsResponseUnmarshaller; -import com.aliyuncs.transform.UnmarshallerContext; - -import java.util.List; - -public class DescribeEndpointsResponse extends AcsResponse { - - private String requestId; - - private Boolean success; - - private List endpoints; - - public String getRequestId() { - return this.requestId; - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public Boolean getSuccess() { - return this.success; - } - - public void setSuccess(Boolean success) { - this.success = success; - } - - public List getEndpoints() { - return this.endpoints; - } - - public void setEndpoints(List endpoints) { - this.endpoints = endpoints; - } - - @Override - public DescribeEndpointsResponse getInstance(UnmarshallerContext context) { - return DescribeEndpointsResponseUnmarshaller.unmarshall(this, context); - } - - public static class Endpoint { - - private String endpoint; - - private String id; - - private String namespace; - - private String serivceCode; - - private String type; - - private List protocols; - - public String getEndpoint() { - return this.endpoint; - } - - public void setEndpoint(String endpoint) { - this.endpoint = endpoint; - } - - public String getId() { - return this.id; - } - - public void setId(String id) { - this.id = id; - } - - public String getNamespace() { - return this.namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - public String getSerivceCode() { - return this.serivceCode; - } - - public void setSerivceCode(String serivceCode) { - this.serivceCode = serivceCode; - } - - public String getType() { - return this.type; - } - - public void setType(String type) { - this.type = type; - } - - public List getProtocols() { - return this.protocols; - } - - public void setProtocols(List protocols) { - this.protocols = protocols; - } - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/transform/v20150612/DescribeEndpointsResponseUnmarshaller.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/transform/v20150612/DescribeEndpointsResponseUnmarshaller.java deleted file mode 100644 index b265b01..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/endpoint/location/transform/v20150612/DescribeEndpointsResponseUnmarshaller.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package com.aliyuncs.endpoint.location.transform.v20150612; - -import com.aliyuncs.endpoint.location.model.v20150612.DescribeEndpointsResponse; -import com.aliyuncs.endpoint.location.model.v20150612.DescribeEndpointsResponse.Endpoint; -import com.aliyuncs.transform.UnmarshallerContext; - -import java.util.ArrayList; -import java.util.List; - -public class DescribeEndpointsResponseUnmarshaller { - - public static DescribeEndpointsResponse unmarshall(DescribeEndpointsResponse describeEndpointsResponse, - UnmarshallerContext context) { - - describeEndpointsResponse.setRequestId(context.stringValue("DescribeEndpointsResponse.RequestId")); - describeEndpointsResponse.setSuccess(context.booleanValue("DescribeEndpointsResponse.Success")); - - List endpoints = new ArrayList(); - for (int i = 0; i < context.lengthValue("DescribeEndpointsResponse.Endpoints.Length"); i++) { - Endpoint endpoint = new Endpoint(); - endpoint.setEndpoint(context.stringValue("DescribeEndpointsResponse.Endpoints[" + i + "].Endpoint")); - endpoint.setId(context.stringValue("DescribeEndpointsResponse.Endpoints[" + i + "].Id")); - endpoint.setNamespace(context.stringValue("DescribeEndpointsResponse.Endpoints[" + i + "].Namespace")); - endpoint.setSerivceCode(context.stringValue("DescribeEndpointsResponse.Endpoints[" + i + "].SerivceCode")); - endpoint.setType(context.stringValue("DescribeEndpointsResponse.Endpoints[" + i + "].Type")); - - List protocols = new ArrayList(); - for (int j = 0; j < context - .lengthValue("DescribeEndpointsResponse.Endpoints[" + i + "].Protocols.Length"); j++) { - protocols.add( - context.stringValue("DescribeEndpointsResponse.Endpoints[" + i + "].Protocols[" + j + "]")); - } - endpoint.setProtocols(protocols); - - endpoints.add(endpoint); - } - describeEndpointsResponse.setEndpoints(endpoints); - - return describeEndpointsResponse; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ClientException.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ClientException.java deleted file mode 100644 index f4c7cae..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ClientException.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.aliyuncs.exceptions; - -public class ClientException extends Exception { - - private static final long serialVersionUID = 534996425110290578L; - - private String requestId; - - private String errCode; - - private String errMsg; - - private ErrorType errorType; - - public ClientException(String errCode, String errMsg, String requestId) { - this(errCode, errMsg); - this.requestId = requestId; - this.setErrorType(ErrorType.Client); - } - - public ClientException(String errCode, String errMsg, Throwable cause) { - super(errCode + " : " + errMsg, cause); - this.errCode = errCode; - this.errMsg = errMsg; - this.setErrorType(ErrorType.Client); - } - - public ClientException(String errCode, String errMsg) { - super(errCode + " : " + errMsg); - this.errCode = errCode; - this.errMsg = errMsg; - this.setErrorType(ErrorType.Client); - } - - public ClientException(String message) { - super(message); - this.setErrorType(ErrorType.Client); - } - - public ClientException(Throwable cause) { - super(cause); - this.setErrorType(ErrorType.Client); - } - - public String getRequestId() { - return requestId; - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public String getErrCode() { - return errCode; - } - - public void setErrCode(String errCode) { - this.errCode = errCode; - } - - public String getErrMsg() { - return errMsg; - } - - public void setErrMsg(String errMsg) { - this.errMsg = errMsg; - } - - public ErrorType getErrorType() { - return errorType; - } - - public void setErrorType(ErrorType errorType) { - this.errorType = errorType; - } - - @Override - public String getMessage() { - return super.getMessage() + (null == getRequestId() ? "" : "\r\nRequestId : " + getRequestId()); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorCodeConstant.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorCodeConstant.java deleted file mode 100644 index 5383a81..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorCodeConstant.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package com.aliyuncs.exceptions; - -public class ErrorCodeConstant { - public static final String SDK_ENDPOINT_RESOLVING_ERROR = "SDK.EndpointResolvingError"; - public static final String SDK_ENDPOINT_TESTABILITY = "SDK.EndpointTestability"; - public static final String SDK_INVALID_SERVER_RESPONSE = "SDK.InvalidServerResponse"; -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorMessageConstant.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorMessageConstant.java deleted file mode 100644 index 1a51507..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorMessageConstant.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package com.aliyuncs.exceptions; - -public class ErrorMessageConstant { - - public static final String SDK_ENDPOINT_MANAGEMENT_DOC_HTML = - "https://www.alibabacloud.com/help/zh/doc-detail/92049.htm"; - - public static final String INVALID_REGION_ID = - "No such region '%s'. Please check your region ID."; - public static final String ENDPOINT_NO_REGION = - "No endpoint in the region '%s' for product '%s'. \n" + - "You can set an endpoint for your request explicitly.%s\n" + - "See " + SDK_ENDPOINT_MANAGEMENT_DOC_HTML + "\n"; - - /** - * Or use available regions: - */ - public static final String ENDPOINT_NO_PRODUCT = - "No endpoint for product '%s'. \n" + - "Please check the product code, or set an endpoint for your request explicitly.\n" + - "See " + SDK_ENDPOINT_MANAGEMENT_DOC_HTML + "\n"; - - public static final String SERVER_RESPONSE_HTTP_BODY_EMPTY = - "Failed to parse the response. The request was succeeded, but the server returned an empty HTTP body."; -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorType.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorType.java deleted file mode 100644 index 6b46df3..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ErrorType.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package com.aliyuncs.exceptions; - -public enum ErrorType { - // 客户端异常 - Client, - - // 服务端异常 - Server, - - // 限流 - Throttling, - - // default - Unknown, -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ServerException.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ServerException.java deleted file mode 100644 index c2cb66e..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/exceptions/ServerException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package com.aliyuncs.exceptions; - -public class ServerException extends ClientException { - - private static final long serialVersionUID = -7345371390798165336L; - - public ServerException(String errorCode, String errorMessage) { - super(errorCode, errorMessage); - this.setErrorType(ErrorType.Server); - } - - public ServerException(String errCode, String errMsg, String requestId) { - this(errCode, errMsg); - this.setRequestId(requestId); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/CallBack.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/CallBack.java deleted file mode 100644 index 3e367d8..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/CallBack.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.aliyuncs.http; - -/** - * 用于异步调用时的回调逻辑 - * - * @author VK.Gao - * @date 2017/03/02 - */ -public interface CallBack { - - /** - * 请求失败 - * - * @param request 封装后的请求对象,包含部分http相关信息 - * @param e 导致失败的异常 - */ - void onFailure(HttpRequest request, Exception e); - - /** - * 收到应答 - * - * @param request 封装后的请求对象,包含部分http相关信息 - * @param response 封装后的应答对象,包含部分http相关信息,可以调用.getBody()获取content - */ - void onResponse(HttpRequest request, HttpResponse response); -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/CompositeX509TrustManager.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/CompositeX509TrustManager.java deleted file mode 100644 index 2720750..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/CompositeX509TrustManager.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.aliyuncs.http; - -import javax.net.ssl.X509TrustManager; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - - -public class CompositeX509TrustManager implements X509TrustManager { - - private final List trustManagers; - - private boolean ignoreSSLCert = false; - - public boolean isIgnoreSSLCert() { - return ignoreSSLCert; - } - - public void setIgnoreSSLCert(boolean ignoreSSLCert) { - this.ignoreSSLCert = ignoreSSLCert; - } - - public CompositeX509TrustManager(List trustManagers) { - this.trustManagers = trustManagers; - } - - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { - // do nothing - } - - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { - if (ignoreSSLCert) { - return; - } - for (X509TrustManager trustManager : trustManagers) { - try { - trustManager.checkServerTrusted(chain, authType); - return; // someone trusts them. success! - } catch (CertificateException e) { - // maybe someone else will trust them - } - } - throw new CertificateException("None of the TrustManagers trust this certificate chain"); - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - List certificates = new ArrayList(); - for (X509TrustManager trustManager : trustManagers) { - certificates.addAll(Arrays.asList(trustManager.getAcceptedIssuers())); - } - X509Certificate[] certificatesArray = new X509Certificate[certificates.size()]; - return certificates.toArray(certificatesArray); - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/FormatType.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/FormatType.java deleted file mode 100644 index 06e2cab..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/FormatType.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.aliyuncs.http; - -import java.util.Arrays; - -public enum FormatType { - /** - * XML("application/xml","text/xml") - * JSON:("application/json", "text/json") - * RAW:("application/octet-stream") - * FORM:("application/x-www-form-urlencoded") - */ - - XML("application/xml", "text/xml"), - JSON("application/json", "text/json"), - RAW("application/octet-stream"), - FORM("application/x-www-form-urlencoded"); - - private String[] formats; - - FormatType(String... formats) { - this.formats = formats; - } - - public static String mapFormatToAccept(FormatType format) { - return format.formats[0]; - } - - public static FormatType mapAcceptToFormat(String accept) { - for (FormatType value : values()) { - if (Arrays.asList(value.formats).contains(accept)) { - return value; - } - } - return FormatType.RAW; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientConfig.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientConfig.java deleted file mode 100644 index f459e18..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientConfig.java +++ /dev/null @@ -1,307 +0,0 @@ -package com.aliyuncs.http; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.KeyManager; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.X509TrustManager; -import java.security.SecureRandom; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutorService; - -public class HttpClientConfig { - - public static final long DEFAULT_CONNECTION_TIMEOUT = 5000; - - public static final long DEFAULT_READ_TIMEOUT = 10000; - /** - * client type - */ - private HttpClientType clientType = null; - private String customClientClassName = null; - - /** - * connectionPool - **/ - private int maxIdleConnections = 5; - private long maxIdleTimeMillis = 60 * 1000L; - private long keepAliveDurationMillis = 5000L; - - /** - * timeout - **/ - private long connectionTimeoutMillis = DEFAULT_CONNECTION_TIMEOUT; - private long readTimeoutMillis = DEFAULT_READ_TIMEOUT; - private long writeTimeoutMillis = 15000L; - - /** - * global protocolType - **/ - private ProtocolType protocolType = ProtocolType.HTTP; - - /** - * https - **/ - private boolean ignoreSSLCerts = false; - @Deprecated - private SSLSocketFactory sslSocketFactory = null; - private KeyManager[] keyManagers = null; - private X509TrustManager[] x509TrustManagers = null; - private SecureRandom secureRandom = null; - private HostnameVerifier hostnameVerifier = null; - @Deprecated - private String certPath = null; - - /** - * dispatcher - **/ - private int maxRequests = 64; - private int maxRequestsPerHost = 5; - private Runnable idleCallback = null; - private ExecutorService executorService = null; - - - /** - * proxy configurations - */ - - private String httpProxy = null; - private String httpsProxy = null; - private String noProxy = null; - - /** - * extra params - */ - private Map extParams = new HashMap(); - - private boolean compatibleMode = false; - - public static HttpClientConfig getDefault() { - HttpClientConfig config = new HttpClientConfig(); - config.setClientType(HttpClientType.ApacheHttpClient); - return config; - } - - public HttpClientType getClientType() { - return clientType; - } - - public void setClientType(HttpClientType clientType) { - this.clientType = clientType; - } - - - @Deprecated - public String getCertPath() { - return certPath; - } - - /** - * use HttpClientConfig.setX509TrustManagers() and HttpClientConfig.setKeyManagers() instead - */ - @Deprecated - public void setCertPath(String certPath) { - this.certPath = certPath; - } - - public int getMaxIdleConnections() { - return maxIdleConnections; - } - - public void setMaxIdleConnections(int maxIdleConnections) { - this.maxIdleConnections = maxIdleConnections; - } - - public long getMaxIdleTimeMillis() { - return maxIdleTimeMillis; - } - - public void setMaxIdleTimeMillis(long maxIdleTimeMillis) { - this.maxIdleTimeMillis = maxIdleTimeMillis; - } - - public long getKeepAliveDurationMillis() { - return keepAliveDurationMillis; - } - - public void setKeepAliveDurationMillis(long keepAliveDurationMillis) { - this.keepAliveDurationMillis = keepAliveDurationMillis; - } - - public long getConnectionTimeoutMillis() { - return connectionTimeoutMillis; - } - - public void setConnectionTimeoutMillis(long connectionTimeoutMillis) { - this.connectionTimeoutMillis = connectionTimeoutMillis; - } - - public long getReadTimeoutMillis() { - return readTimeoutMillis; - } - - public void setReadTimeoutMillis(long readTimeoutMillis) { - this.readTimeoutMillis = readTimeoutMillis; - } - - public long getWriteTimeoutMillis() { - return writeTimeoutMillis; - } - - public void setWriteTimeoutMillis(long writeTimeoutMillis) { - this.writeTimeoutMillis = writeTimeoutMillis; - } - - @Deprecated - public SSLSocketFactory getSslSocketFactory() { - return this.sslSocketFactory; - } - - /** - * use HttpClientConfig.setX509TrustManagers() and HttpClientConfig.setKeyManagers() instead - */ - @Deprecated - public void setSslSocketFactory(SSLSocketFactory sslSocketFactory) { - this.sslSocketFactory = sslSocketFactory; - } - - public KeyManager[] getKeyManagers() { - return keyManagers; - } - - public void setKeyManagers(KeyManager[] keyManagers) { - this.keyManagers = keyManagers; - } - - public X509TrustManager[] getX509TrustManagers() { - return x509TrustManagers; - } - - public void setX509TrustManagers(X509TrustManager[] x509TrustManagers) { - this.x509TrustManagers = x509TrustManagers; - } - - public SecureRandom getSecureRandom() { - return secureRandom; - } - - public void setSecureRandom(SecureRandom secureRandom) { - this.secureRandom = secureRandom; - } - - public HostnameVerifier getHostnameVerifier() { - return hostnameVerifier; - } - - public void setHostnameVerifier(HostnameVerifier hostnameVerifier) { - this.hostnameVerifier = hostnameVerifier; - } - - public int getMaxRequests() { - return maxRequests; - } - - public void setMaxRequests(int maxRequests) { - this.maxRequests = maxRequests; - } - - public int getMaxRequestsPerHost() { - return maxRequestsPerHost; - } - - public void setMaxRequestsPerHost(int maxRequestsPerHost) { - this.maxRequestsPerHost = maxRequestsPerHost; - } - - public Runnable getIdleCallback() { - return idleCallback; - } - - public void setIdleCallback(Runnable idleCallback) { - this.idleCallback = idleCallback; - } - - public ExecutorService getExecutorService() { - return executorService; - } - - public void setExecutorService(ExecutorService executorService) { - this.executorService = executorService; - } - - public Map getExtParams() { - return extParams; - } - - public void setExtParams(Map extParams) { - this.extParams = extParams; - } - - public String getCustomClientClassName() { - return customClientClassName; - } - - public void setCustomClientClassName(String customClientClassName) { - this.customClientClassName = customClientClassName; - } - - public Object getExtParam(Object key) { - return extParams.get(key); - } - - public Object setExtParam(String key, Object value) { - return extParams.put(key, value); - } - - public boolean containsExtParam(Object key) { - return extParams.containsKey(key); - } - - public boolean isIgnoreSSLCerts() { - return ignoreSSLCerts; - } - - public void setIgnoreSSLCerts(boolean ignoreSSLCerts) { - this.ignoreSSLCerts = ignoreSSLCerts; - } - - public boolean isCompatibleMode() { - return compatibleMode; - } - - public void setCompatibleMode(boolean compatibleMode) { - this.compatibleMode = compatibleMode; - } - - public ProtocolType getProtocolType() { - return protocolType; - } - - public void setProtocolType(ProtocolType protocolType) { - this.protocolType = protocolType; - } - - public String getHttpProxy() { - return httpProxy; - } - - public void setHttpProxy(String httpProxy) { - this.httpProxy = httpProxy; - } - - public String getHttpsProxy() { - return httpsProxy; - } - - public void setHttpsProxy(String httpsProxy) { - this.httpsProxy = httpsProxy; - } - - public String getNoProxy() { - return noProxy; - } - - public void setNoProxy(String noProxy) { - this.noProxy = noProxy; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientFactory.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientFactory.java deleted file mode 100644 index edd6db6..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.aliyuncs.http; - -import com.aliyuncs.http.clients.ApacheHttpClient; -import com.aliyuncs.http.clients.CompatibleUrlConnClient; -import com.aliyuncs.profile.IClientProfile; -import com.aliyuncs.utils.StringUtils; - -import java.lang.reflect.Constructor; - -public class HttpClientFactory { - - public static String HTTP_CLIENT_IMPL_KEY = "aliyuncs.sdk.httpclient"; - public static String COMPATIBLE_HTTP_CLIENT_CLASS_NAME = CompatibleUrlConnClient.class.getName(); - - public static IHttpClient buildClient(IClientProfile profile) { - try { - HttpClientConfig clientConfig = profile.getHttpClientConfig(); - if (clientConfig == null) { - clientConfig = HttpClientConfig.getDefault(); - profile.setHttpClientConfig(clientConfig); - } - - String customClientClassName = null; - if (clientConfig.isCompatibleMode()) { - customClientClassName = COMPATIBLE_HTTP_CLIENT_CLASS_NAME; - } else if (clientConfig.getClientType() == HttpClientType.Custom && !StringUtils.isEmpty(clientConfig.getCustomClientClassName())) { - customClientClassName = clientConfig.getCustomClientClassName(); - } else { - customClientClassName = System.getProperty(HTTP_CLIENT_IMPL_KEY); - } - if (StringUtils.isEmpty(customClientClassName)) { - customClientClassName = clientConfig.getClientType().getImplClass().getName(); - } - - Class httpClientClass = Class.forName(customClientClassName); - if (!IHttpClient.class.isAssignableFrom(httpClientClass)) { - throw new IllegalStateException(String.format("%s is not assignable from com.aliyuncs.http.IHttpClient", customClientClassName)); - } - if (ApacheHttpClient.class.equals(httpClientClass)) { - IHttpClient client = ApacheHttpClient.getInstance(); - client.init(clientConfig); - return client; - } - Constructor constructor = httpClientClass.getConstructor(HttpClientConfig.class); - return constructor.newInstance(clientConfig); - } catch (Exception e) { - // keep compatibility - throw new IllegalStateException("HttpClientFactory buildClient failed", e); - } - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientType.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientType.java deleted file mode 100644 index cdabb15..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpClientType.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.aliyuncs.http; - -import com.aliyuncs.http.clients.CompatibleUrlConnClient; - -public enum HttpClientType { - /** - * define Compatiblen,HttpClient,okHttp,Custom - */ - - Compatible(CompatibleUrlConnClient.class), - ApacheHttpClient(com.aliyuncs.http.clients.ApacheHttpClient.class), - OkHttp(null), - Custom(null),; - - private Class implClass; - - HttpClientType(Class implClass) { - this.implClass = implClass; - } - - public Class getImplClass() { - return implClass; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpMessage.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpMessage.java deleted file mode 100644 index 83c3ebc..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpMessage.java +++ /dev/null @@ -1,276 +0,0 @@ -package com.aliyuncs.http; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.utils.ParameterHelper; -import lombok.ToString; - -import javax.net.ssl.KeyManager; -import javax.net.ssl.X509TrustManager; -import java.io.UnsupportedEncodingException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -@ToString -public abstract class HttpMessage { - - protected static final String CONTENT_TYPE = "Content-Type"; - protected static final String CONTENT_MD5 = "Content-MD5"; - protected static final String CONTENT_LENGTH = "Content-Length"; - protected FormatType httpContentType = null; - protected byte[] httpContent = null; - protected String encoding = null; - protected Map headers = new HashMap(); - protected Integer connectTimeout = null; - protected Integer readTimeout = null; - private String url = null; - private MethodType method = null; - protected boolean ignoreSSLCerts = false; - private KeyManager[] keyManagers = null; - private X509TrustManager[] x509TrustManagers = null; - - public KeyManager[] getKeyManagers() { - return keyManagers; - } - - public void setKeyManagers(KeyManager[] keyManagers) { - this.keyManagers = keyManagers; - } - - public X509TrustManager[] getX509TrustManagers() { - return x509TrustManagers; - } - - public void setX509TrustManagers(X509TrustManager[] x509TrustManagers) { - this.x509TrustManagers = x509TrustManagers; - } - - public boolean isIgnoreSSLCerts() { - return ignoreSSLCerts; - } - - public void setIgnoreSSLCerts(boolean ignoreSSLCerts) { - this.ignoreSSLCerts = ignoreSSLCerts; - } - - public HttpMessage(String strUrl) { - this.url = strUrl; - } - - public HttpMessage() { - } - - /** - * @Deprecated : Use getSysUrl instead of this - */ - @Deprecated - public String getUrl() { - return url; - } - - /** - * @Deprecated : Use setSysUrl instead of this - */ - @Deprecated - protected void setUrl(String url) { - this.url = url; - } - - /** - * @Deprecated : Use getSysMethod instead of this - */ - @Deprecated - public MethodType getMethod() { - return method; - } - - /** - * @Deprecated : Use setSysMethod instead of this - */ - @Deprecated - public void setMethod(MethodType method) { - this.method = method; - } - - public FormatType getHttpContentType() { - return httpContentType; - } - - public void setHttpContentType(FormatType httpContentType) { - this.httpContentType = httpContentType; - if (null != this.httpContent || null != httpContentType) { - this.headers.put(CONTENT_TYPE, getContentTypeValue(this.httpContentType, this.encoding)); - } else { - this.headers.remove(CONTENT_TYPE); - } - } - - public byte[] getHttpContent() { - return httpContent; - } - - public void setHttpContent(byte[] content, String encoding, FormatType format) { - if (null == content) { - this.headers.remove(CONTENT_MD5); - this.headers.put(CONTENT_LENGTH, "0"); - this.headers.remove(CONTENT_TYPE); - this.httpContentType = null; - this.httpContent = null; - this.encoding = null; - return; - } - - // for GET HEADER DELETE OPTION method, sdk should ignore the content - if (getSysMethod() != null && !getSysMethod().hasContent()) { - content = new byte[0]; - } - - this.httpContent = content; - this.encoding = encoding; - String contentLen = String.valueOf(content.length); - String strMd5 = ParameterHelper.md5Sum(content); - this.headers.put(CONTENT_MD5, strMd5); - this.headers.put(CONTENT_LENGTH, contentLen); - if (null != format) { - this.headers.put(CONTENT_TYPE, FormatType.mapFormatToAccept(format)); - } - } - - /** - * @Deprecated : Use getSysEncoding instead of this - */ - @Deprecated - public String getEncoding() { - return encoding; - } - - /** - * @Deprecated : Use setSysEncoding instead of this - */ - @Deprecated - public void setEncoding(String encoding) { - this.encoding = encoding; - } - - public void putHeaderParameter(String name, String value) { - if (null != name && null != value) { - this.headers.put(name, value); - } - } - - public String getHeaderValue(String name) { - return this.headers.get(name); - } - - /** - * @Deprecated : Use getSysConnectTimeout instead of this - */ - @Deprecated - public Integer getConnectTimeout() { - return connectTimeout; - } - - /** - * @Deprecated : Use setSysConnectTimeout instead of this - */ - @Deprecated - public void setConnectTimeout(Integer connectTimeout) { - this.connectTimeout = connectTimeout; - } - - /** - * @Deprecated : Use getSysReadTimeout instead of this - */ - @Deprecated - public Integer getReadTimeout() { - return readTimeout; - } - - /** - * @Deprecated : Use setSysReadTimeout instead of this - */ - @Deprecated - public void setReadTimeout(Integer readTimeout) { - this.readTimeout = readTimeout; - } - - /** - * @Deprecated : Use getSysHeaders instead of this - */ - @Deprecated - public Map getHeaders() { - return Collections.unmodifiableMap(headers); - } - - public String getContentTypeValue(FormatType contentType, String encoding) { - if (null != contentType && null != encoding) { - return FormatType.mapFormatToAccept(contentType) + - ";charset=" + encoding.toLowerCase(); - } else if (null != contentType) { - return FormatType.mapFormatToAccept(contentType); - } - return null; - } - - public String getHttpContentString() throws ClientException { - String stringContent = ""; - if (this.httpContent != null) { - try { - if (this.encoding == null) { - stringContent = new String(this.httpContent); - } else { - stringContent = new String(this.httpContent, this.encoding); - } - } catch (UnsupportedEncodingException exp) { - throw new ClientException("SDK.UnsupportedEncoding", "Can not parse response due to unsupported encoding."); - } - } - - return stringContent; - } - - - public String getSysUrl() { - return url; - } - - protected void setSysUrl(String url) { - this.url = url; - } - - public MethodType getSysMethod() { - return method; - } - - public void setSysMethod(MethodType method) { - this.method = method; - } - - public String getSysEncoding() { - return encoding; - } - - public void setSysEncoding(String encoding) { - this.encoding = encoding; - } - - public Integer getSysConnectTimeout() { - return connectTimeout; - } - - public void setSysConnectTimeout(Integer connectTimeout) { - this.connectTimeout = connectTimeout; - } - - public Integer getSysReadTimeout() { - return readTimeout; - } - - public void setSysReadTimeout(Integer readTimeout) { - this.readTimeout = readTimeout; - } - - public Map getSysHeaders() { - return Collections.unmodifiableMap(headers); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpRequest.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpRequest.java deleted file mode 100644 index ecebd4a..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.aliyuncs.http; - -import lombok.ToString; - -import java.util.Map; - -@ToString(callSuper = true) -public class HttpRequest extends HttpMessage { - - public HttpRequest(String strUrl) { - super(strUrl); - } - - public HttpRequest(String strUrl, Map tmpHeaders) { - super(strUrl); - if (null != tmpHeaders) { - this.headers = tmpHeaders; - } - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpResponse.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpResponse.java deleted file mode 100644 index 1c3c209..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpResponse.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.aliyuncs.http; - -import lombok.ToString; - -@ToString(callSuper = true) -public class HttpResponse extends HttpMessage { - - private int status; - - private String reasonPhrase; - - public HttpResponse(String strUrl) { - super(strUrl); - } - - public HttpResponse() { - } - - @Override - public void setHttpContent(byte[] content, String encoding, FormatType format) { - this.httpContent = content; - this.encoding = encoding; - this.httpContentType = format; - } - - @Override - public String getHeaderValue(String name) { - String value = this.headers.get(name); - if (null == value) { - value = this.headers.get(name.toLowerCase()); - } - return value; - } - - public int getStatus() { - return status; - } - - public void setStatus(int status) { - this.status = status; - } - - public boolean isSuccess() { - return 200 <= this.status && this.status < 300; - } - - public String getReasonPhrase() { - return reasonPhrase; - } - - public void setReasonPhrase(String reasonPhrase) { - this.reasonPhrase = reasonPhrase; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpUtil.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpUtil.java deleted file mode 100644 index 7a92438..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/HttpUtil.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.aliyuncs.http; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.net.SocketAddress; -import java.net.URL; -import java.util.Map; -import java.util.Map.Entry; - -import javax.xml.bind.DatatypeConverter; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.http.HttpHost; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.utils.StringUtils; - -public class HttpUtil { - - private final static Log log = LogFactory.getLog(HttpUtil.class); - - private static Boolean isHttpDebug; - - private static Boolean isHttpContentDebug; - - static { - Boolean flag = "sdk".equalsIgnoreCase(System.getenv("DEBUG")); - isHttpDebug = flag; - isHttpContentDebug = flag; - } - - public static Boolean getIsHttpDebug() { - return isHttpDebug; - } - - public static void setIsHttpDebug(Boolean isHttpDebug) { - HttpUtil.isHttpDebug = isHttpDebug; - } - - public static Boolean getIsHttpContentDebug() { - return isHttpContentDebug; - } - - public static void setIsHttpContentDebug(Boolean isHttpContentDebug) { - HttpUtil.isHttpContentDebug = isHttpContentDebug; - } - - public static String debugHttpRequest(HttpRequest request) { - if (isHttpDebug) { - StringBuilder debugString = new StringBuilder(); - - String sysUrl = request.getSysUrl(); - URL url = null; - try { - url = new URL(sysUrl); - debugString.append("> " + request.getSysMethod() + " " + url.getProtocol().toUpperCase() + "/1.1\n> "); - debugString.append("Host : " + url.getHost() + "\n> "); - } catch (MalformedURLException e) { - debugString.append("> " + request.getSysMethod() + " " + sysUrl + "\n> "); - debugString.append("Host : " + sysUrl + "\n> "); - } - Map requestHeaders = request.getSysHeaders(); - for (Entry entry : requestHeaders.entrySet()) { - debugString.append(entry.getKey() + " : " + entry.getValue() + "\n> "); - } - debugString.append("Request URL : " + sysUrl + "\n> "); - if (isHttpContentDebug) { - try { - debugString.append("\n" + request.getHttpContentString()); - } catch (ClientException e) { - debugString.append("\n" + "Can not parse response due to unsupported encoding : " + request - .getSysEncoding()); - } - } - log.info("\n" + debugString); - return debugString.toString(); - } else { - return null; - } - } - - public static String debugHttpResponse(HttpResponse response) { - if (isHttpDebug) { - StringBuilder debugString = new StringBuilder(); - String protocol = "HTTP/1.1"; - debugString.append("< " + protocol + " " + response.getStatus() + "\n< "); - Map responseHeaders = response.getSysHeaders(); - for (Entry entry : responseHeaders.entrySet()) { - debugString.append(entry.getKey() + " : " + entry.getValue() + "\n< "); - } - if (isHttpContentDebug) { - try { - debugString.append("\n" + response.getHttpContentString()); - } catch (ClientException e) { - debugString.append("\n" + "Can not parse response due to unsupported encoding : " + response - .getSysEncoding()); - } - } - log.info("\n" + debugString); - return debugString.toString(); - } else { - return null; - } - } - - public static Proxy getJDKProxy(String clientProxy, String envProxy, HttpRequest request) throws ClientException { - Proxy proxy = Proxy.NO_PROXY; - try { - String proxyStr = (!StringUtils.isEmpty(clientProxy) ? clientProxy : envProxy); - if (StringUtils.isEmpty(proxyStr)) { - return proxy; - } - URL proxyUrl = new URL(proxyStr); - - String userInfo = proxyUrl.getUserInfo(); - if (userInfo != null) { - byte[] bytes = userInfo.getBytes("UTF-8"); - String auth = DatatypeConverter.printBase64Binary(bytes); - request.putHeaderParameter("Proxy-Authorization", "Basic " + auth); - } - String hostname = proxyUrl.getHost(); - int port = proxyUrl.getPort(); - if (port == -1) { - port = proxyUrl.getDefaultPort(); - } - SocketAddress addr = new InetSocketAddress(hostname, port); - proxy = new Proxy(Proxy.Type.HTTP, addr); - - } catch (IOException e) { - throw new ClientException("SDK.InvalidProxy", "proxy url is invalid"); - } - return proxy; - } - - public static HttpHost getApacheProxy(String clientProxy, String envProxy, HttpRequest request) - throws ClientException { - try { - String proxyStr = (!StringUtils.isEmpty(clientProxy) ? clientProxy : envProxy); - if (StringUtils.isEmpty(proxyStr)) { - return null; - } - URL proxyUrl = new URL(proxyStr); - String userInfo = proxyUrl.getUserInfo(); - if (userInfo != null) { - byte[] bytes = userInfo.getBytes("UTF-8"); - String auth = DatatypeConverter.printBase64Binary(bytes); - request.putHeaderParameter("Proxy-Authorization", "Basic " + auth); - } - return new HttpHost(proxyUrl.getHost(), proxyUrl.getPort(), proxyUrl.getProtocol()); - - } catch (IOException e) { - throw new ClientException("SDK.InvalidProxy", "proxy url is invalid"); - } - } - - public static boolean needProxy(String targetHost, String clientNoProxyList, String envNoProxyList) { - String noProxyList = (!StringUtils.isEmpty(clientNoProxyList) ? clientNoProxyList : envNoProxyList); - if (StringUtils.isEmpty(noProxyList)) { - return true; - } - String[] noProxyArr = noProxyList.split(","); - for (String host : noProxyArr) { - if (host.equals(targetHost)) { - return false; - } - } - return true; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/IHttpClient.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/IHttpClient.java deleted file mode 100644 index 026949d..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/IHttpClient.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.aliyuncs.http; - -import com.aliyuncs.exceptions.ClientException; - -import java.io.Closeable; -import java.io.IOException; -import java.util.concurrent.Future; - -public abstract class IHttpClient implements Closeable { - - protected HttpClientConfig clientConfig; - - public IHttpClient(HttpClientConfig clientConfig) throws ClientException { - if (clientConfig == null) { - clientConfig = HttpClientConfig.getDefault(); - } - this.clientConfig = clientConfig; - init(clientConfig); - - } - - public IHttpClient() { - // do nothing - } - - protected abstract void init(HttpClientConfig clientConfig) throws ClientException; - - public abstract HttpResponse syncInvoke(HttpRequest apiRequest) throws IOException, ClientException; - - public abstract Future asyncInvoke(final HttpRequest apiRequest, final CallBack callback) - throws IOException; - - @Deprecated - public abstract void ignoreSSLCertificate(); - - @Deprecated - public abstract void restoreSSLCertificate(); - - public abstract boolean isSingleton(); -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/MethodType.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/MethodType.java deleted file mode 100644 index 3ee5cdf..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/MethodType.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.aliyuncs.http; - -public enum MethodType { - /** - * GET - * PUT - * POST - * DELETE - */ - GET(false), - PUT(true), - POST(true), - DELETE(false), - HEAD(false), - OPTIONS(false); - - private boolean hasContent; - - MethodType(boolean hasContent) { - this.hasContent = hasContent; - } - - public boolean hasContent() { - return hasContent; - } -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/ProtocolType.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/ProtocolType.java deleted file mode 100644 index accce6b..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/ProtocolType.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.aliyuncs.http; - -public enum ProtocolType { - /** - * Define HTTP、HTTPS - */ - - HTTP("http"), - - HTTPS("https"); - - private final String protocol; - - ProtocolType(String protocol) { - this.protocol = protocol; - } - - @Override - public String toString() { - return protocol; - } -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/UserAgentConfig.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/UserAgentConfig.java deleted file mode 100644 index c6e2b18..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/UserAgentConfig.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.aliyuncs.http; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import com.aliyuncs.utils.StringUtils; - -public class UserAgentConfig { - - static { - Properties sysProps = System.getProperties(); - String coreVersion = ""; - Properties props = new Properties(); - try { - props.load(UserAgentConfig.class.getClassLoader().getResourceAsStream("project.properties")); - coreVersion = props.getProperty("sdk.project.version"); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - DEFAULT_MESSAGE = String.format("AlibabaCloud (%s; %s) Java/%s %s/%s", sysProps.getProperty("os.name"), sysProps - .getProperty("os.arch"), sysProps.getProperty("java.runtime.version"), "Core", coreVersion); - } - - private static String DEFAULT_MESSAGE; - private List excludeList = new ArrayList(); - private final Map userAgents = new LinkedHashMap(); - - public UserAgentConfig() { - excludeList.add("java"); - excludeList.add("Core"); - } - - public static String getDefaultMessage() { - return DEFAULT_MESSAGE; - } - - public void append(String key, String value) { - if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) { - return; - } - if (excludeList.contains(key.toLowerCase())) { - return; - } - this.userAgents.put(key, value); - } - - public Map getSysUserAgentsMap() { - return Collections.unmodifiableMap(this.userAgents); - } - - public static String resolve(UserAgentConfig requestConfig, UserAgentConfig clientConfig) { - Map finalMap = new LinkedHashMap(); - if (clientConfig != null && clientConfig.getSysUserAgentsMap().size() > 0) { - finalMap.putAll(clientConfig.getSysUserAgentsMap()); - } - if (requestConfig != null && requestConfig.getSysUserAgentsMap().size() > 0) { - finalMap.putAll(requestConfig.getSysUserAgentsMap()); - } - StringBuilder agents = new StringBuilder(DEFAULT_MESSAGE); - for (Map.Entry entry : finalMap.entrySet()) { - agents.append(" "); - agents.append(entry.getKey()); - agents.append("/"); - agents.append(entry.getValue()); - } - return agents.toString(); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/X509TrustAll.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/X509TrustAll.java deleted file mode 100644 index 9543cb3..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/X509TrustAll.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.aliyuncs.http; - -import com.aliyuncs.IAcsClient; - -@Deprecated -public final class X509TrustAll { - - public static boolean ignoreSSLCerts = false; - - @Deprecated - public static void restoreSSLCertificate() { - ignoreSSLCerts = false; - } - - @Deprecated - public static void ignoreSSLCertificate() { - ignoreSSLCerts = true; - } - @Deprecated - public static void restoreSSLCertificate(IAcsClient client) { - ignoreSSLCerts = false; - } - @Deprecated - public static void ignoreSSLCertificate(IAcsClient client) { - ignoreSSLCerts = true; - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/ApacheHttpClient.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/ApacheHttpClient.java deleted file mode 100644 index cccf0e7..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/ApacheHttpClient.java +++ /dev/null @@ -1,383 +0,0 @@ -package com.aliyuncs.http.clients; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.http.*; -import com.aliyuncs.utils.EnvironmentUtils; -import com.aliyuncs.utils.IOUtils; -import com.aliyuncs.utils.StringUtils; -import org.apache.http.Header; -import org.apache.http.HttpHost; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.entity.EntityBuilder; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.client.methods.RequestBuilder; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.ConnectionKeepAliveStrategy; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.DefaultHostnameVerifier; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.entity.ContentType; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.protocol.HttpContext; -import org.apache.http.util.EntityUtils; - -import javax.net.ssl.*; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.security.KeyStore; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; - -public class ApacheHttpClient extends IHttpClient { - - protected static final String CONTENT_TYPE = "Content-Type"; - protected static final String ACCEPT_ENCODING = "Accept-Encoding"; - - private static final String EXT_PARAM_KEY_BUILDER = "apache.httpclient.builder"; - private static final int DEFAULT_THREAD_KEEP_ALIVE_TIME = 60; - - private ExecutorService executorService; - private CloseableHttpClient httpClient; - private PoolingHttpClientConnectionManager connectionManager; - private AtomicBoolean initialized = new AtomicBoolean(false); - private CountDownLatch latch = new CountDownLatch(1); - - private static volatile ApacheHttpClient client; - - /** - * use ApacheHttpClient.getInstance() instead - */ - @Deprecated - public static ApacheHttpClient getInstance(HttpClientConfig config) throws ClientException { - throw new IllegalStateException("use ApacheHttpClient.getInstance() instead"); - } - - public static ApacheHttpClient getInstance() { - if (client == null) { - synchronized (ApacheHttpClient.class) { - if (client == null) { - client = new ApacheHttpClient(); - } - } - } - return client; - } - - private ApacheHttpClient() { - super(); - } - - private SSLConnectionSocketFactory createSSLConnectionSocketFactory() throws ClientException { - try { - List trustManagerList = new ArrayList(); - X509TrustManager[] trustManagers = clientConfig.getX509TrustManagers(); - - if (null != trustManagers) { - trustManagerList.addAll(Arrays.asList(trustManagers)); - } - - // get trustManager using default certification from jdk - TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); - tmf.init((KeyStore) null); - trustManagerList.addAll(Arrays.asList(tmf.getTrustManagers())); - - final List finalTrustManagerList = new ArrayList(); - for (TrustManager tm : trustManagerList) { - if (tm instanceof X509TrustManager) { - finalTrustManagerList.add((X509TrustManager) tm); - } - } - CompositeX509TrustManager compositeX509TrustManager = new CompositeX509TrustManager(finalTrustManagerList); - compositeX509TrustManager.setIgnoreSSLCert(clientConfig.isIgnoreSSLCerts()); - KeyManager[] keyManagers = null; - if (clientConfig.getKeyManagers() != null) { - keyManagers = clientConfig.getKeyManagers(); - } - - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(keyManagers, new TrustManager[]{compositeX509TrustManager}, clientConfig.getSecureRandom()); - - HostnameVerifier hostnameVerifier = null; - if (clientConfig.isIgnoreSSLCerts()) { - hostnameVerifier = new NoopHostnameVerifier(); - } else if (clientConfig.getHostnameVerifier() != null) { - hostnameVerifier = clientConfig.getHostnameVerifier(); - } else { - hostnameVerifier = new DefaultHostnameVerifier(); - } - SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); - return sslConnectionSocketFactory; - } catch (Exception e) { - throw new ClientException("SDK.InitFailed", "Init https with SSL socket failed", e); - } - - } - - private void initConnectionManager() throws ClientException { - // http - RegistryBuilder socketFactoryRegistryBuilder = RegistryBuilder.create(); - socketFactoryRegistryBuilder.register("http", new PlainConnectionSocketFactory()); - - // https - SSLConnectionSocketFactory sslConnectionSocketFactory = createSSLConnectionSocketFactory(); - socketFactoryRegistryBuilder.register("https", sslConnectionSocketFactory); - - // connPool - connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistryBuilder.build()); - connectionManager.setMaxTotal(clientConfig.getMaxRequests()); - connectionManager.setDefaultMaxPerRoute(clientConfig.getMaxRequestsPerHost()); - } - - private HttpClientBuilder initHttpClientBuilder() { - HttpClientBuilder builder; - if (clientConfig.containsExtParam(EXT_PARAM_KEY_BUILDER)) { - builder = (HttpClientBuilder) clientConfig.getExtParam(EXT_PARAM_KEY_BUILDER); - } else { - builder = HttpClientBuilder.create(); - } - return builder; - } - - private void initExecutor() { - // async - if (clientConfig.getExecutorService() == null) { - executorService = new ThreadPoolExecutor(0, clientConfig.getMaxRequests(), DEFAULT_THREAD_KEEP_ALIVE_TIME, - TimeUnit.SECONDS, new SynchronousQueue(), new DefaultAsyncThreadFactory()); - } else { - executorService = clientConfig.getExecutorService(); - } - } - - @Override - protected void init(final HttpClientConfig config0) throws ClientException { - if (!initialized.compareAndSet(false, true)) { - try { - latch.await(); - } catch (InterruptedException e) { - throw new ClientException("SDK.InitFailed", "Init apacheHttpClient failed", e); - } - return; - } - final HttpClientConfig config = (config0 != null ? config0 : HttpClientConfig.getDefault()); - this.clientConfig = config; - - HttpClientBuilder builder = initHttpClientBuilder(); - - // default request config - RequestConfig defaultConfig = RequestConfig.custom().setConnectTimeout((int) config - .getConnectionTimeoutMillis()).setSocketTimeout((int) config.getReadTimeoutMillis()) - .setConnectionRequestTimeout((int) config.getWriteTimeoutMillis()).build(); - builder.setDefaultRequestConfig(defaultConfig); - - initConnectionManager(); - builder.setConnectionManager(connectionManager); - ApacheIdleConnectionCleaner.registerConnectionManager(connectionManager, config.getMaxIdleTimeMillis()); - - initExecutor(); - - // keepAlive - if (config.getKeepAliveDurationMillis() > 0) { - builder.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() { - @Override - public long getKeepAliveDuration(org.apache.http.HttpResponse response, HttpContext context) { - long duration = DefaultConnectionKeepAliveStrategy.INSTANCE.getKeepAliveDuration(response, context); - - if (duration > 0 && duration < config.getKeepAliveDurationMillis()) { - return duration; - } else { - return config.getKeepAliveDurationMillis(); - } - } - }); - } - - httpClient = builder.build(); - latch.countDown(); - } - - private HttpUriRequest parseToHttpRequest(HttpRequest apiReq) throws IOException, ClientException { - RequestBuilder builder = RequestBuilder.create(apiReq.getSysMethod().name()); - - builder.setUri(apiReq.getSysUrl()); - - if (apiReq.getSysMethod().hasContent() && apiReq.getHttpContent() != null && apiReq.getHttpContent().length > 0) { - EntityBuilder bodyBuilder = EntityBuilder.create(); - - String contentType = apiReq.getHeaderValue(CONTENT_TYPE); - if (StringUtils.isEmpty(contentType)) { - contentType = apiReq.getContentTypeValue(apiReq.getHttpContentType(), apiReq.getSysEncoding()); - } - bodyBuilder.setContentType(ContentType.parse(contentType)); - bodyBuilder.setBinary(apiReq.getHttpContent()); - builder.setEntity(bodyBuilder.build()); - } - - builder.addHeader(ACCEPT_ENCODING, "identity"); - - // calcProxy will modify the "Proxy-Authorization" header of the request - HttpHost proxy = calcProxy(apiReq); - - for (Map.Entry entry : apiReq.getSysHeaders().entrySet()) { - if ("Content-Length".equalsIgnoreCase(entry.getKey())) { - continue; - } - builder.addHeader(entry.getKey(), entry.getValue()); - } - int connectTimeout; - int readTimeout; - if (null != apiReq.getSysConnectTimeout()) { - connectTimeout = apiReq.getSysConnectTimeout(); - } else { - connectTimeout = (int) clientConfig.getConnectionTimeoutMillis(); - } - if (null != apiReq.getSysReadTimeout()) { - readTimeout = apiReq.getSysReadTimeout(); - } else { - readTimeout = (int) clientConfig.getReadTimeoutMillis(); - } - RequestConfig requestConfig = RequestConfig.custom().setProxy(proxy).setConnectTimeout(connectTimeout).setSocketTimeout( - readTimeout).setConnectionRequestTimeout((int) clientConfig.getWriteTimeoutMillis()).build(); - builder.setConfig(requestConfig); - return builder.build(); - } - - private HttpHost calcProxy(HttpRequest apiReq) throws MalformedURLException, ClientException { - boolean needProxy = HttpUtil.needProxy(new URL(apiReq.getSysUrl()).getHost(), clientConfig.getNoProxy(), EnvironmentUtils.getNoProxy()); - if (!needProxy) { - return null; - } - URL url = new URL(apiReq.getSysUrl()); - HttpHost proxy = null; - if ("https".equalsIgnoreCase(url.getProtocol())) { - proxy = HttpUtil.getApacheProxy(clientConfig.getHttpsProxy(), EnvironmentUtils.getHttpsProxy(), apiReq); - } else { - proxy = HttpUtil.getApacheProxy(clientConfig.getHttpProxy(), EnvironmentUtils.getHttpProxy(), apiReq); - } - return proxy; - } - - private HttpResponse parseToHttpResponse(org.apache.http.HttpResponse httpResponse) throws IOException { - com.aliyuncs.http.HttpResponse result = new com.aliyuncs.http.HttpResponse(); - - // status code - result.setStatus(httpResponse.getStatusLine().getStatusCode()); - result.setReasonPhrase(httpResponse.getStatusLine().getReasonPhrase()); - boolean existed = ((httpResponse.getEntity() != null && (httpResponse.getEntity().getContentLength() > 0 || httpResponse - .getEntity().isChunked()))); - if (existed){ - // content type - Header contentTypeHeader = httpResponse.getEntity().getContentType(); - ContentType contentType = ContentType.parse(contentTypeHeader.getValue()); - FormatType formatType = FormatType.mapAcceptToFormat(contentType.getMimeType()); - result.setHttpContentType(formatType); - - String charset = "utf-8"; - if (contentType.getCharset() != null) { - charset = contentType.getCharset().toString(); - } - - // body - result.setHttpContent(EntityUtils.toByteArray(httpResponse.getEntity()), charset, formatType); - } - - // headers - for (Header header : httpResponse.getAllHeaders()) { - result.putHeaderParameter(header.getName(), header.getValue()); - } - - return result; - } - - @Override - public final HttpResponse syncInvoke(HttpRequest apiRequest) throws IOException, ClientException { - HttpUriRequest httpRequest = parseToHttpRequest(apiRequest); - CloseableHttpResponse httpResponse = null; - try { - httpResponse = httpClient.execute(httpRequest); - return parseToHttpResponse(httpResponse); - } finally { - IOUtils.closeQuietly(httpResponse); - } - } - - @Override - public final Future asyncInvoke(final HttpRequest apiRequest, - final CallBack callback) { - return executorService.submit(new Callable() { - @Override - public com.aliyuncs.http.HttpResponse call() throws Exception { - com.aliyuncs.http.HttpResponse result; - try { - result = syncInvoke(apiRequest); - } catch (Exception e) { - if (callback != null) { - callback.onFailure(apiRequest, e); - } - throw e; - } - - if (callback != null) { - callback.onResponse(apiRequest, result); - } - return result; - } - }); - } - - /** - * use HttpClientConfig.setIgnoreSSLCerts(true) instead - */ - @Override - public void ignoreSSLCertificate() { - throw new IllegalStateException("Apache httpclient does not support modify sslFactory after inited, " - + "use HttpClientConfig.setIgnoreSSLCerts(true) while building client"); - } - - /** - * use HttpClientConfig.setIgnoreSSLCerts(false) instead - */ - @Override - public void restoreSSLCertificate() { - throw new IllegalStateException("Apache httpclient does not support modify sslFactory after inited, " - + "use HttpClientConfig.setIgnoreSSLCerts(true) while building client"); - } - - @Override - public boolean isSingleton() { - return true; - } - - @Override - public void close() throws IOException { - client = null; - if (initialized.compareAndSet(true, false)) { - executorService.shutdown(); - ApacheIdleConnectionCleaner.removeConnectionManager(connectionManager); - connectionManager.shutdown(); - IOUtils.closeQuietly(httpClient); - } - } - - private class DefaultAsyncThreadFactory implements ThreadFactory { - - private AtomicInteger counter = new AtomicInteger(0); - - @Override - public Thread newThread(Runnable runnable) { - return new Thread(runnable, "Aliyun_SDK_Async_ThreadPool_" + counter.incrementAndGet()); - } - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/ApacheIdleConnectionCleaner.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/ApacheIdleConnectionCleaner.java deleted file mode 100644 index eb5d66d..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/ApacheIdleConnectionCleaner.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.aliyuncs.http.clients; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.http.conn.HttpClientConnectionManager; - -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -public class ApacheIdleConnectionCleaner extends Thread { - - private static final Log LOG = LogFactory.getLog(ApacheIdleConnectionCleaner.class); - - public static int getPeriodSec() { - return periodSec; - } - - public static void setPeriodSec(int periodSec) { - ApacheIdleConnectionCleaner.periodSec = periodSec; - } - - private static final int DEFAULT_PERIOD_SEC = 60; - private static int periodSec = DEFAULT_PERIOD_SEC; - private static final Map CONNMGRMAP = new ConcurrentHashMap(); - private static volatile ApacheIdleConnectionCleaner instance; - private volatile boolean isShuttingDown; - - private ApacheIdleConnectionCleaner() { - super("sdk-apache-idle-connection-cleaner"); - setDaemon(true); - } - - public static void registerConnectionManager(HttpClientConnectionManager connMgr, Long idleTimeMills) { - if (instance == null) { - synchronized (ApacheIdleConnectionCleaner.class) { - if (instance == null) { - instance = new ApacheIdleConnectionCleaner(); - instance.start(); - } - } - } - CONNMGRMAP.put(connMgr, idleTimeMills); - } - - public static void removeConnectionManager(HttpClientConnectionManager connectionManager) { - CONNMGRMAP.remove(connectionManager); - if (CONNMGRMAP.isEmpty()) { - shutdown(); - } - } - - public static void shutdown() { - if (instance != null) { - instance.isShuttingDown = true; - instance.interrupt(); - CONNMGRMAP.clear(); - instance = null; - } - } - - @Override - public void run() { - while (true) { - if (isShuttingDown) { - LOG.debug("Shutting down."); - return; - } - try { - Thread.sleep(periodSec * 1000); - - for (Entry entry : CONNMGRMAP.entrySet()) { - try { - entry.getKey().closeIdleConnections(entry.getValue(), TimeUnit.MILLISECONDS); - } catch (Exception t) { - LOG.warn("close idle connections failed", t); - } - } - } catch (InterruptedException e) { - LOG.debug("interrupted.", e); - } - } - } - -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/CompatibleUrlConnClient.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/CompatibleUrlConnClient.java deleted file mode 100644 index 1c947a9..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/http/clients/CompatibleUrlConnClient.java +++ /dev/null @@ -1,364 +0,0 @@ -package com.aliyuncs.http.clients; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.http.*; -import com.aliyuncs.utils.EnvironmentUtils; -import org.apache.http.conn.ssl.DefaultHostnameVerifier; -import org.apache.http.conn.ssl.NoopHostnameVerifier; - -import javax.net.ssl.*; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.Proxy; -import java.net.URL; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.Future; - -public class CompatibleUrlConnClient extends IHttpClient { - - protected static final String CONTENT_TYPE = "Content-Type"; - protected static final String ACCEPT_ENCODING = "Accept-Encoding"; - - public CompatibleUrlConnClient(HttpClientConfig clientConfig) throws ClientException { - super(clientConfig); - } - - public static HttpResponse compatibleGetResponse(HttpRequest request) throws IOException, ClientException { - CompatibleUrlConnClient client = new CompatibleUrlConnClient(null); - HttpResponse response = client.syncInvoke(request); - client.close(); - return response; - } - - @Override - protected void init(HttpClientConfig clientConfig) { - // do nothing - } - - @Override - public HttpResponse syncInvoke(HttpRequest request) throws IOException, ClientException { - InputStream content = null; - HttpResponse response = null; - HttpURLConnection httpConn = buildHttpConnection(request); - OutputStream out = null; - - try { - httpConn.connect(); - if (null != request.getHttpContent() && request.getHttpContent().length > 0) { - out = httpConn.getOutputStream(); - if (request.getSysMethod().hasContent()) { - out.write(request.getHttpContent()); - } - out.flush(); - - } - - content = httpConn.getInputStream(); - response = new HttpResponse(httpConn.getURL().toString()); - parseHttpConn(response, httpConn, content); - return response; - } catch (IOException e) { - content = httpConn.getErrorStream(); - response = new HttpResponse(httpConn.getURL().toString()); - parseHttpConn(response, httpConn, content); - return response; - } finally { - if (content != null) { - content.close(); - } - httpConn.disconnect(); - } - } - - @Override - public Future asyncInvoke(HttpRequest apiRequest, CallBack callback) { - throw new IllegalStateException("not supported"); - } - - private boolean calcIgnoreSSLCert(HttpRequest request) { - boolean ignoreSSLCert = request.isIgnoreSSLCerts() ? request.isIgnoreSSLCerts() : clientConfig.isIgnoreSSLCerts(); - return ignoreSSLCert; - } - - private CompositeX509TrustManager calcX509TrustManager(HttpRequest request) throws KeyStoreException, NoSuchAlgorithmException { - X509TrustManager[] trustManagers = null; - - if (clientConfig.getX509TrustManagers() != null) { - trustManagers = clientConfig.getX509TrustManagers(); - } - if (request.getX509TrustManagers() != null) { - trustManagers = request.getX509TrustManagers(); - } - - List trustManagerList = new ArrayList(); - if (null != trustManagers) { - trustManagerList.addAll(Arrays.asList(trustManagers)); - } - - // get trustManager using default certification from jdk - TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); - tmf.init((KeyStore) null); - trustManagerList.addAll(Arrays.asList(tmf.getTrustManagers())); - - final List finalTrustManagerList = new ArrayList(); - for (TrustManager tm : trustManagerList) { - if (tm instanceof X509TrustManager) { - finalTrustManagerList.add((X509TrustManager) tm); - } - } - CompositeX509TrustManager compositeX509TrustManager = new CompositeX509TrustManager(finalTrustManagerList); - compositeX509TrustManager.setIgnoreSSLCert(calcIgnoreSSLCert(request)); - return compositeX509TrustManager; - } - - private KeyManager[] calcKeyManager(HttpRequest request) { - KeyManager[] keyManagers = null; - if (clientConfig.getKeyManagers() != null) { - keyManagers = clientConfig.getKeyManagers(); - } - if (request.getKeyManagers() != null) { - keyManagers = request.getKeyManagers(); - } - return keyManagers; - } - - - private SSLSocketFactory createSSLSocketFactory(HttpRequest request) throws ClientException { - try { - CompositeX509TrustManager compositeX509TrustManager = calcX509TrustManager(request); - KeyManager[] keyManagers = calcKeyManager(request); - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(keyManagers, new TrustManager[]{compositeX509TrustManager}, clientConfig.getSecureRandom()); - return sslContext.getSocketFactory(); - } catch (Exception e) { - throw new ClientException("SDK.InitFailed", "Init https with SSL socket failed", e); - } - - } - - private HostnameVerifier createHostnameVerifier(HttpRequest request) { - boolean ignoreSSLCert = request.isIgnoreSSLCerts() ? request.isIgnoreSSLCerts() : clientConfig.isIgnoreSSLCerts(); - if (ignoreSSLCert) { - return new NoopHostnameVerifier(); - } else if (clientConfig.getHostnameVerifier() != null) { - return clientConfig.getHostnameVerifier(); - } else { - return new DefaultHostnameVerifier(); - } - } - - private void checkHttpRequest(HttpRequest request) { - String strUrl = request.getSysUrl(); - if (null == strUrl) { - throw new IllegalArgumentException("URL is null for HttpRequest."); - } - if (null == request.getSysMethod()) { - throw new IllegalArgumentException("Method is not set for HttpRequest."); - } - } - - - private Proxy calcProxy(URL url, HttpRequest request) throws ClientException { - String targetHost = url.getHost(); - boolean needProxy = HttpUtil.needProxy(targetHost, clientConfig.getNoProxy(), EnvironmentUtils.getNoProxy()); - if (!needProxy) { - return Proxy.NO_PROXY; - } - Proxy proxy; - if ("https".equalsIgnoreCase(url.getProtocol())) { - String httpsProxy = EnvironmentUtils.getHttpsProxy(); - proxy = HttpUtil.getJDKProxy(clientConfig.getHttpsProxy(), httpsProxy, request); - } else { - String httpProxy = EnvironmentUtils.getHttpProxy(); - proxy = HttpUtil.getJDKProxy(clientConfig.getHttpProxy(), httpProxy, request); - } - return proxy; - - } - - private HttpURLConnection initHttpConnection(URL url, HttpRequest request) throws ClientException, IOException { - HttpURLConnection httpConn = null; - Proxy proxy = calcProxy(url, request); - if ("https".equalsIgnoreCase(url.getProtocol())) { - SSLSocketFactory sslSocketFactory = createSSLSocketFactory(request); - HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection(proxy); - httpsConn.setSSLSocketFactory(sslSocketFactory); - HostnameVerifier hostnameVerifier = createHostnameVerifier(request); - httpsConn.setHostnameVerifier(hostnameVerifier); - httpConn = httpsConn; - } - - if (httpConn == null) { - httpConn = (HttpURLConnection) url.openConnection(proxy); - } - - httpConn.setRequestMethod(request.getSysMethod().toString()); - httpConn.setInstanceFollowRedirects(false); - httpConn.setDoOutput(true); - httpConn.setDoInput(true); - httpConn.setUseCaches(false); - setConnectionTimeout(httpConn, request); - setConnectionRequestProperty(httpConn, request); - return httpConn; - } - - private void setConnectionTimeout(HttpURLConnection httpConn, HttpRequest request) { - if (request.getSysConnectTimeout() != null) { - httpConn.setConnectTimeout(request.getSysConnectTimeout()); - } else { - httpConn.setConnectTimeout((int) clientConfig.getConnectionTimeoutMillis()); - } - - if (request.getSysReadTimeout() != null) { - httpConn.setReadTimeout(request.getSysReadTimeout()); - } else { - httpConn.setReadTimeout((int) clientConfig.getReadTimeoutMillis()); - } - } - - private void setConnectionRequestProperty(HttpURLConnection httpConn, HttpRequest request) { - Map mappedHeaders = request.getSysHeaders(); - httpConn.setRequestProperty(ACCEPT_ENCODING, "identity"); - for (Entry entry : mappedHeaders.entrySet()) { - httpConn.setRequestProperty(entry.getKey(), entry.getValue()); - } - - if (null != request.getHeaderValue(CONTENT_TYPE)) { - httpConn.setRequestProperty(CONTENT_TYPE, request.getHeaderValue(CONTENT_TYPE)); - } else { - String contentTypeValue = request.getContentTypeValue(request.getHttpContentType(), request - .getSysEncoding()); - if (null != contentTypeValue) { - httpConn.setRequestProperty(CONTENT_TYPE, contentTypeValue); - } - } - } - - private HttpURLConnection buildHttpConnection(HttpRequest request) throws IOException, ClientException { - checkHttpRequest(request); - String strUrl = request.getSysUrl(); - URL url = null; - String[] urlArray = null; - if (MethodType.POST.equals(request.getSysMethod()) && null == request.getHttpContent()) { - urlArray = strUrl.split("\\?"); - url = new URL(urlArray[0]); - } else { - url = new URL(strUrl); - } - System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); - HttpURLConnection httpConn = initHttpConnection(url, request); - if (MethodType.POST.equals(request.getSysMethod()) && null != urlArray && urlArray.length == 2) { - httpConn.getOutputStream().write(urlArray[1].getBytes()); - } - return httpConn; - } - - private void parseHttpConn(HttpResponse response, HttpURLConnection httpConn, InputStream content) - throws IOException { - byte[] buff = readContent(content); - response.setStatus(httpConn.getResponseCode()); - response.setReasonPhrase(httpConn.getResponseMessage()); - Map> headers = httpConn.getHeaderFields(); - for (Entry> entry : headers.entrySet()) { - String key = entry.getKey(); - if (null == key) { - continue; - } - List values = entry.getValue(); - StringBuilder builder = new StringBuilder(values.get(0)); - for (int i = 1; i < values.size(); i++) { - builder.append(","); - builder.append(values.get(i)); - } - response.putHeaderParameter(key, builder.toString()); - } - String type = response.getHeaderValue("Content-Type"); - if (null != buff && null != type) { - response.setSysEncoding("UTF-8"); - String[] split = type.split(";"); - response.setHttpContentType(FormatType.mapAcceptToFormat(split[0].trim())); - if (split.length > 1 && split[1].contains("=")) { - String[] codings = split[1].split("="); - response.setSysEncoding(codings[1].trim().toUpperCase()); - } - } - response.setHttpContent(buff, response.getSysEncoding(), response.getHttpContentType()); - } - - private byte[] readContent(InputStream content) throws IOException { - if (content == null) { - return null; - } - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - byte[] buff = new byte[1024]; - - while (true) { - final int read = content.read(buff); - if (read == -1) { - break; - } - outputStream.write(buff, 0, read); - } - - return outputStream.toByteArray(); - } - - /** - * use HttpClientConfig.setIgnoreSSLCerts(true) instead - */ - @Override - public void ignoreSSLCertificate() { - throw new IllegalStateException("use HttpClientConfig.setIgnoreSSLCerts(true) instead"); - } - - /** - * use HttpClientConfig.setIgnoreSSLCerts(false) instead - */ - @Override - public void restoreSSLCertificate() { - throw new IllegalStateException("use HttpClientConfig.setIgnoreSSLCerts(false) instead"); - } - - @Override - public boolean isSingleton() { - return false; - } - - @Override - public void close() { - // do nothing - } - - - /** - * use HttpClientConfig.setIgnoreSSLCerts(true/false) instead - */ - @Deprecated - public static final class HttpsCertIgnoreHelper { - /** - * use HttpClientConfig.setIgnoreSSLCerts(false) instead - */ - @Deprecated - public static void restoreSSLCertificate() { - X509TrustAll.ignoreSSLCerts = false; - } - - /** - * use HttpClientConfig.setIgnoreSSLCerts(true) instead - */ - @Deprecated - public static void ignoreSSLCertificate() { - X509TrustAll.ignoreSSLCerts = true; - } - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/profile/DefaultProfile.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/profile/DefaultProfile.java deleted file mode 100644 index 47de0db..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/profile/DefaultProfile.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.aliyuncs.profile; - -import com.aliyuncs.auth.*; -import com.aliyuncs.endpoint.DefaultEndpointResolver; -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.HttpClientConfig; -import org.slf4j.Logger; - -import static com.aliyuncs.utils.LogUtils.DEFAULT_LOG_FORMAT; - -@SuppressWarnings("deprecation") -public class DefaultProfile implements IClientProfile { - private static DefaultProfile profile = null; - private String regionId = null; - private FormatType acceptFormat = null; - private ICredentialProvider icredential = null; - private Credential credential; - private String certPath; - private HttpClientConfig httpClientConfig = HttpClientConfig.getDefault(); - private boolean usingInternalLocationService = false; - private boolean usingVpcEndpoint = false; - private Logger logger; - private String logFormat = DEFAULT_LOG_FORMAT; - - private DefaultProfile() { - } - - private DefaultProfile(String regionId) { - this.regionId = regionId; - } - - private DefaultProfile(String regionId, Credential creden) { - this.credential = creden; - this.regionId = regionId; - } - - private DefaultProfile(String region, ICredentialProvider icredential) { - this.regionId = region; - this.icredential = icredential; - } - - public synchronized static DefaultProfile getProfile() { - if (null == profile) { - profile = new DefaultProfile(); - } - return profile; - } - - public synchronized static DefaultProfile getProfile(String regionId, ICredentialProvider icredential) { - profile = new DefaultProfile(regionId, icredential); - return profile; - } - - public synchronized static DefaultProfile getProfile(String regionId, String accessKeyId, String secret) { - Credential creden = new Credential(accessKeyId, secret); - profile = new DefaultProfile(regionId, creden); - return profile; - } - - public synchronized static DefaultProfile getProfile(String regionId, String accessKeyId, String secret, - String stsToken) { - Credential creden = new Credential(accessKeyId, secret, stsToken); - profile = new DefaultProfile(regionId, creden); - return profile; - } - - public synchronized static DefaultProfile getProfile(String regionId) { - return new DefaultProfile(regionId); - } - - /** - * @Deprecated : Use addEndpoint(String regionId, String product, String endpoint) instead of this - */ - @Deprecated - public synchronized static void addEndpoint(String endpointName, String regionId, String product, String domain) - throws ClientException { - addEndpoint(endpointName, regionId, product, domain, true); - } - - /** - * @Deprecated : Use addEndpoint(String regionId, String product, String endpoint) instead of this - */ - @Deprecated - public synchronized static void addEndpoint(String endpointName, String regionId, String product, String domain, - boolean isNeverExpire) { - // endpointName, isNeverExpire take no effect - addEndpoint(regionId, product, domain); - } - - public synchronized static void addEndpoint(String regionId, String product, String endpoint) { - DefaultEndpointResolver.predefinedEndpointResolver.putEndpointEntry(regionId, product, endpoint); - } - - @Override - public synchronized String getRegionId() { - return regionId; - } - - @Override - public synchronized FormatType getFormat() { - return acceptFormat; - } - - @Override - public synchronized Credential getCredential() { - if (null == credential && null != icredential) { - credential = icredential.fresh(); - } - return credential; - } - - @Override - @Deprecated - public ISigner getSigner() { - return null; - } - - @Override - public void setCredentialsProvider(AlibabaCloudCredentialsProvider credentialsProvider) { - if (credential != null) { - return; - } - credential = new CredentialsBackupCompatibilityAdaptor(credentialsProvider); - } - - @Override - public String getCertPath() { - return certPath; - } - - @Override - public void setCertPath(String certPath) { - this.certPath = certPath; - } - - @Override - public HttpClientConfig getHttpClientConfig() { - return httpClientConfig; - } - - @Override - public void setHttpClientConfig(HttpClientConfig httpClientConfig) { - this.httpClientConfig = httpClientConfig; - } - - @Override - public void enableUsingInternalLocationService() { - usingInternalLocationService = true; - } - - @Override - public boolean isUsingInternalLocationService() { - return usingInternalLocationService; - } - - @Override - public boolean isUsingVpcEndpoint() { - return usingVpcEndpoint; - } - - @Override - public void enableUsingVpcEndpoint() { - this.usingVpcEndpoint = true; - } - - /** - * @deprecated : use enableUsingInternalLocationService instead of this. - */ - @Override - @Deprecated - public void setUsingInternalLocationService() { - enableUsingInternalLocationService(); - } - - @Override - public Logger getLogger() { - return logger; - } - - @Override - public void setLogger(Logger logger) { - this.logger = logger; - } - - @Override - public String getLogFormat() { - return logFormat; - } - - @Override - public void setLogFormat(String logFormat) { - this.logFormat = logFormat; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/profile/IClientProfile.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/profile/IClientProfile.java deleted file mode 100644 index 5c9c978..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/profile/IClientProfile.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.aliyuncs.profile; - -import com.aliyuncs.auth.AlibabaCloudCredentialsProvider; -import com.aliyuncs.auth.Credential; -import com.aliyuncs.auth.ISigner; -import com.aliyuncs.http.FormatType; -import com.aliyuncs.http.HttpClientConfig; -import org.slf4j.Logger; - -@SuppressWarnings("deprecation") -public interface IClientProfile { - - /** - * @Deprecated : Use Signer.getSigner(AlibabaCloudCredentials credentials) instead of this - */ - @Deprecated - ISigner getSigner(); - - String getRegionId(); - - FormatType getFormat(); - - /** - * @Deprecated : Use AlibabaCloudCredentialsProvider getCredentials() instead of this - */ - @Deprecated - Credential getCredential(); - - /** - * This method exists because ClientProfile holds too much modules like endpoint management - * - * @param credentialsProvider - */ - void setCredentialsProvider(AlibabaCloudCredentialsProvider credentialsProvider); - - /** - * use HttpClientConfig.getCertPath instead - */ - @Deprecated - String getCertPath(); - - /** - * use HttpClientConfig.setCertPath instead - * - * @param certPath - */ - @Deprecated - void setCertPath(String certPath); - - /** - * http client configs - */ - HttpClientConfig getHttpClientConfig(); - - void setHttpClientConfig(HttpClientConfig httpClientConfig); - - void enableUsingInternalLocationService(); - - boolean isUsingInternalLocationService(); - - boolean isUsingVpcEndpoint(); - - void enableUsingVpcEndpoint(); - - /** - * @Deprecated : Use enableUsingInternalLocationService instead of this - */ - @Deprecated - void setUsingInternalLocationService(); - - Logger getLogger(); - - void setLogger(Logger logger); - - String getLogFormat(); - - void setLogFormat(String logFormat); -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/JsonReader.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/JsonReader.java deleted file mode 100644 index 50d2949..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/JsonReader.java +++ /dev/null @@ -1,372 +0,0 @@ -package com.aliyuncs.reader; - -import java.text.CharacterIterator; -import java.text.StringCharacterIterator; -import java.util.HashMap; -import java.util.Map; - -@Deprecated -public class JsonReader implements Reader { - - private static final Object ARRAY_END_TOKEN = new Object(); - private static final Object OBJECT_END_TOKEN = new Object(); - private static final Object COMMA_TOKEN = new Object(); - private static final Object COLON_TOKEN = new Object(); - - private static final int FIRST_POSITION = 0; - private static final int CURRENT_POSITION = 1; - private static final int NEXT_POSITION = 2; - private static Map escapes = new HashMap(); - - static { - escapes.put(Character.valueOf('\\'), Character.valueOf('\\')); - escapes.put(Character.valueOf('/'), Character.valueOf('/')); - escapes.put(Character.valueOf('"'), Character.valueOf('"')); - escapes.put(Character.valueOf('t'), Character.valueOf('\t')); - escapes.put(Character.valueOf('n'), Character.valueOf('\n')); - escapes.put(Character.valueOf('r'), Character.valueOf('\r')); - escapes.put(Character.valueOf('b'), Character.valueOf('\b')); - escapes.put(Character.valueOf('f'), Character.valueOf('\f')); - } - - private CharacterIterator ct; - private char c; - private Object token; - private StringBuffer stringBuffer = new StringBuffer(); - private Map map = new HashMap(); - - public static String trimFromLast(String str, String stripString) { - int pos = str.lastIndexOf(stripString); - if (pos > -1) { - return str.substring(0, pos); - } else { - return str; - } - } - - @Override - public Map read(String response, String endpoint) { - return read(new StringCharacterIterator(response), endpoint, FIRST_POSITION); - } - - @Override - public Map readForHideArrayItem(String response, String endpoint) { - return readForHideItem(new StringCharacterIterator(response), endpoint, FIRST_POSITION); - } - - public Map read(CharacterIterator ci, String endpoint, int start) { - ct = ci; - switch (start) { - case FIRST_POSITION: - c = ct.first(); - break; - case CURRENT_POSITION: - c = ct.current(); - break; - case NEXT_POSITION: - c = ct.next(); - break; - default: - break; - } - readJson(endpoint); - return map; - } - - public Map readForHideItem(CharacterIterator ci, String endpoint, int start) { - ct = ci; - switch (start) { - case FIRST_POSITION: - c = ct.first(); - break; - case CURRENT_POSITION: - c = ct.current(); - break; - case NEXT_POSITION: - c = ct.next(); - break; - } - readJsonForHideItem(endpoint); - return map; - } - - private Object readJson(String baseKey) { - skipWhiteSpace(); - char ch = c; - nextChar(); - switch (ch) { - case '{': - processObject(baseKey); - break; - case '}': - token = OBJECT_END_TOKEN; - break; - case '[': - if (c == '"') { - processList(baseKey); - break; - } else { - processArray(baseKey); - break; - } - case ']': - token = ARRAY_END_TOKEN; - break; - case '"': - token = processString(); - break; - case ',': - token = COMMA_TOKEN; - break; - case ':': - token = COLON_TOKEN; - break; - case 't': - nextChar(); - nextChar(); - nextChar(); - token = Boolean.TRUE; - break; - case 'n': - nextChar(); - nextChar(); - nextChar(); - token = null; - break; - case 'f': - nextChar(); - nextChar(); - nextChar(); - nextChar(); - token = Boolean.FALSE; - break; - default: - c = ct.previous(); - if (Character.isDigit(c) || c == '-') { - token = processNumber(); - } - } - return token; - } - - private Object readJsonForHideItem(String baseKey) { - skipWhiteSpace(); - char ch = c; - nextChar(); - switch (ch) { - case '{': - processObjectForHideItemName(baseKey); - break; - case '}': - token = OBJECT_END_TOKEN; - break; - case '[': - if (c == '"') { - processListForHideItem(baseKey); - break; - } else { - processArrayForHideItem(baseKey); - break; - } - case ']': - token = ARRAY_END_TOKEN; - break; - case '"': - token = processString(); - break; - case ',': - token = COMMA_TOKEN; - break; - case ':': - token = COLON_TOKEN; - break; - case 't': - nextChar(); - nextChar(); - nextChar(); - token = Boolean.TRUE; - break; - case 'n': - nextChar(); - nextChar(); - nextChar(); - token = null; - break; - case 'f': - nextChar(); - nextChar(); - nextChar(); - nextChar(); - token = Boolean.FALSE; - break; - default: - c = ct.previous(); - if (Character.isDigit(c) || c == '-') { - token = processNumber(); - } - } - return token; - } - - private void processObject(String baseKey) { - String key = baseKey + "." + readJson(baseKey); - while (!token.equals(OBJECT_END_TOKEN)) { - readJson(key); - if (!token.equals(OBJECT_END_TOKEN)) { - Object object = readJson(key); - if (object instanceof String || object instanceof Number || object instanceof Boolean) { - map.put(key, String.valueOf(object)); - } - - if (readJson(key) == COMMA_TOKEN) { - key = String.valueOf(readJson(key)); - key = baseKey + "." + key; - } - } - } - } - - private void processObjectForHideItemName(String baseKey) { - String key = baseKey + "." + readJsonForHideItem(baseKey); - while (!token.equals(OBJECT_END_TOKEN)) { - readJsonForHideItem(key); - if (!token.equals(OBJECT_END_TOKEN)) { - Object object = readJsonForHideItem(key); - if (object instanceof String || object instanceof Number || object instanceof Boolean) { - map.put(key, String.valueOf(object)); - } - - if (readJson(key) == COMMA_TOKEN) { - key = String.valueOf(readJson(key)); - key = baseKey + "." + key; - } - } - } - } - - private void processList(String baseKey) { - Object value = readJson(baseKey); - int index = 0; - while (!token.equals(ARRAY_END_TOKEN)) { - String key = trimFromLast(baseKey, ".") + "[" + (index++) + "]"; - map.put(key, String.valueOf(value)); - if (readJson(baseKey) == COMMA_TOKEN) { - value = readJson(baseKey); - } - } - map.put(trimFromLast(baseKey, ".") + ".Length", String.valueOf(index)); - } - - private void processListForHideItem(String baseKey) { - Object value = readJsonForHideItem(baseKey); - int index = 0; - while (!token.equals(ARRAY_END_TOKEN)) { - String key = baseKey + "[" + (index++) + "]"; - map.put(key, String.valueOf(value)); - if (readJsonForHideItem(baseKey) == COMMA_TOKEN) { - value = readJsonForHideItem(baseKey); - } - } - map.put(baseKey + ".Length", String.valueOf(index)); - } - - private void processArray(String baseKey) { - int index = 0; - String preKey = baseKey.substring(0, baseKey.lastIndexOf(".")); - String key = preKey + "[" + index + "]"; - Object value = readJson(key); - - while (!token.equals(ARRAY_END_TOKEN)) { - map.put(preKey + ".Length", String.valueOf(index + 1)); - if (value instanceof String) { - map.put(key, String.valueOf(value)); - } - if (readJson(baseKey) == COMMA_TOKEN) { - key = preKey + "[" + (++index) + "]"; - value = readJson(key); - } - } - } - - private void processArrayForHideItem(String baseKey) { - int index = 0; - String preKey = baseKey; - String key = preKey + "[" + index + "]"; - Object value = readJsonForHideItem(key); - - while (!token.equals(ARRAY_END_TOKEN)) { - map.put(preKey + ".Length", String.valueOf(index + 1)); - if (value instanceof String) { - map.put(key, String.valueOf(value)); - } - if (readJsonForHideItem(baseKey) == COMMA_TOKEN) { - key = preKey + "[" + (++index) + "]"; - value = readJsonForHideItem(key); - } - } - } - - private Object processNumber() { - stringBuffer.setLength(0); - if ('-' == c) { - addChar(); - } - addDigits(); - if ('.' == c) { - addChar(); - addDigits(); - } - if ('e' == c || 'E' == c) { - addChar(); - if ('+' == c || '-' == c) { - addChar(); - } - addDigits(); - } - return stringBuffer.toString(); - } - - private void addDigits() { - while (Character.isDigit(c)) { - addChar(); - } - } - - private void skipWhiteSpace() { - while (Character.isWhitespace(c)) { - nextChar(); - } - } - - private char nextChar() { - c = ct.next(); - return c; - } - - private Object processString() { - stringBuffer.setLength(0); - while (c != '"') { - if (c == '\\') { - nextChar(); - Object value = escapes.get(Character.valueOf(c)); - if (value != null) { - addChar(((Character) value).charValue()); - } - } else { - addChar(); - } - } - nextChar(); - return stringBuffer.toString(); - } - - private void addChar(char ch) { - stringBuffer.append(ch); - nextChar(); - } - - private void addChar() { - addChar(c); - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/Reader.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/Reader.java deleted file mode 100644 index aa87c90..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/Reader.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.aliyuncs.reader; - -import com.aliyuncs.exceptions.ClientException; - -import java.util.Map; - -@Deprecated -public interface Reader { - - Map read(String response, String endpoint) throws ClientException; - - Map readForHideArrayItem(String response, String endpoint) throws ClientException; -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/ReaderFactory.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/ReaderFactory.java deleted file mode 100644 index b9a6846..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/ReaderFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.aliyuncs.reader; - -import com.aliyuncs.http.FormatType; - -@Deprecated -public class ReaderFactory { - - public static Reader createInstance(FormatType format) { - if (FormatType.JSON == format) { - return new JsonReader(); - } - if (FormatType.XML == format) { - return new XmlReader(); - } - - throw new IllegalStateException("Server response has a bad format type: " + format); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/XmlReader.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/XmlReader.java deleted file mode 100644 index 34d035d..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/reader/XmlReader.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.aliyuncs.reader; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.utils.XmlUtils; -import org.w3c.dom.Element; -import org.xml.sax.SAXException; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Deprecated -public class XmlReader implements Reader { - Map map = new HashMap(); - - @Override - public Map read(String response, String endpoint) throws ClientException { - Element root; - try { - root = XmlUtils.getRootElementFromString(response); - read(root, endpoint, false); - } catch (ParserConfigurationException e) { - new ClientException("SDK.InvalidXMLParser", e.toString()); - } catch (SAXException e) { - new ClientException("SDK.InvalidXMLFormat", e.toString()); - } catch (IOException e) { - new ClientException("SDK.InvalidContent", e.toString()); - } - return map; - } - - @Override - public Map readForHideArrayItem(String response, String endpoint) throws ClientException { - return read(response, endpoint); - } - - private void read(Element element, String path, boolean appendPath) { - path = buildPath(element, path, appendPath); - List childElements = XmlUtils.getChildElements(element); - - if (childElements.size() == 0) { - map.put(path, element.getTextContent()); - return; - } - - List listElements = XmlUtils.getChildElements(element, childElements.get(0).getNodeName()); - //be list - if (listElements.size() > 1 && childElements.size() == listElements.size()) { - elementsAsList(childElements, path); - //may be list - } else if (listElements.size() == 1 && childElements.size() == 1) { - //as list - elementsAsList(listElements, path); - //as not list - read(childElements.get(0), path, true); - //not list - } else { - for (Element childElement : childElements) { - read(childElement, path, true); - } - } - } - - private String buildPath(Element element, String path, boolean appendPath) { - return appendPath ? path + "." + element.getNodeName() : path; - } - - private void elementsAsList(List listElements, String path) { - map.put(path + ".Length", String.valueOf(listElements.size())); - for (int i = 0; i < listElements.size(); i++) { - read(listElements.get(i), path + "[" + i + "]", false); - } - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/regions/ProductDomain.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/regions/ProductDomain.java deleted file mode 100644 index d0b8ecb..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/regions/ProductDomain.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.aliyuncs.regions; - -public class ProductDomain { - - private String productName; - private String domainName; - - public ProductDomain(String product, String domain) { - this.productName = product; - this.domainName = domain; - } - - public String getProductName() { - return productName; - } - - public void setProductName(String productName) { - this.productName = productName; - } - - public String getDomainName() { - return domainName; - } - - public void setDomainName(String domainName) { - this.domainName = domainName; - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/transform/UnmarshallerContext.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/transform/UnmarshallerContext.java deleted file mode 100644 index 0176946..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/transform/UnmarshallerContext.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.aliyuncs.transform; - -import com.aliyuncs.http.HttpResponse; -import com.aliyuncs.utils.FlattenMapUtil; - -import java.util.List; -import java.util.Map; - -public class UnmarshallerContext { - private int httpStatus; - private Map responseMap; - private HttpResponse httpResponse; - - public Integer integerValue(String key) { - String value = responseMap.get(key); - if (null == value || 0 == value.length()) { - return null; - } - return Integer.valueOf(value); - } - - public String stringValue(String key) { - return responseMap.get(key); - } - - public Long longValue(String key) { - String value = responseMap.get(key); - if (null == value || 0 == value.length()) { - return null; - } - return Long.valueOf(responseMap.get(key)); - } - - public Boolean booleanValue(String key) { - String value = responseMap.get(key); - if (null == value || 0 == value.length()) { - return null; - } - return Boolean.valueOf(responseMap.get(key)); - } - - public Float floatValue(String key) { - String value = responseMap.get(key); - if (null == value || 0 == value.length()) { - return null; - } - return Float.valueOf(responseMap.get(key)); - } - - public Double doubleValue(String key) { - String value = responseMap.get(key); - if (null == value || 0 == value.length()) { - return null; - } - return Double.valueOf(responseMap.get(key)); - } - - public int lengthValue(String key) { - String value = responseMap.get(key); - if (null == value || 0 == value.length()) { - return 0; - } - return Integer.valueOf(responseMap.get(key)); - } - - public List> listMapValue(String key) { - return FlattenMapUtil.toListMap(responseMap, key); - } - - public Map mapValue(String key) { - return FlattenMapUtil.toMap(responseMap, key); - } - - public int getHttpStatus() { - return httpStatus; - } - - public void setHttpStatus(int httpStatus) { - this.httpStatus = httpStatus; - } - - public Map getResponseMap() { - return responseMap; - } - - public void setResponseMap(Map responseMap) { - this.responseMap = responseMap; - } - - public HttpResponse getHttpResponse() { - return httpResponse; - } - - public void setHttpResponse(HttpResponse httpResponse) { - this.httpResponse = httpResponse; - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/JsonUnmashaller.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/JsonUnmashaller.java deleted file mode 100644 index 501c397..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/JsonUnmashaller.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.aliyuncs.unmarshaller; - -import com.aliyuncs.AcsResponse; -import com.aliyuncs.exceptions.ClientException; -import com.google.gson.Gson; -import com.google.gson.JsonSyntaxException; - -public class JsonUnmashaller implements Unmarshaller { - - @Override - public T unmarshal(Class clazz, String content) throws ClientException { - try { - return (new Gson()).fromJson(content, clazz); - } catch (JsonSyntaxException e) { - throw newUnmarshalException(clazz, content, e); - } - } - - private ClientException newUnmarshalException(Class clazz, String content, Exception e) { - return new ClientException("SDK.UnmarshalFailed", - "unmarshal response from json content failed, clazz = " + clazz.getSimpleName() + ", origin response = " + content, e); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/Unmarshaller.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/Unmarshaller.java deleted file mode 100644 index b15f1f7..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/Unmarshaller.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.aliyuncs.unmarshaller; - -import com.aliyuncs.AcsResponse; -import com.aliyuncs.exceptions.ClientException; - -public interface Unmarshaller { - - T unmarshal(Class clasz, String content) throws ClientException; -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/UnmarshallerFactory.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/UnmarshallerFactory.java deleted file mode 100644 index 4cff686..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/UnmarshallerFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.aliyuncs.unmarshaller; - -import com.aliyuncs.http.FormatType; - -public class UnmarshallerFactory { - - public static Unmarshaller getUnmarshaller(FormatType format) throws IllegalStateException { - switch (format) { - case JSON: - return new JsonUnmashaller(); - case XML: - return new XmlUnmashaller(); - default: - throw new IllegalStateException("Unsupported response format: " + format); - } - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/XmlUnmashaller.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/XmlUnmashaller.java deleted file mode 100644 index 2cac428..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/unmarshaller/XmlUnmashaller.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.aliyuncs.unmarshaller; - -import com.aliyuncs.AcsResponse; -import com.aliyuncs.exceptions.ClientException; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import java.io.StringReader; - -public class XmlUnmashaller implements Unmarshaller { - - @Override - public T unmarshal(Class clazz, String content) throws ClientException { - try { - JAXBContext jc = JAXBContext.newInstance(clazz); - javax.xml.bind.Unmarshaller unmarshaller = jc.createUnmarshaller(); - return (T) unmarshaller.unmarshal(new StringReader(content)); - } catch (JAXBException e) { - throw newUnmarshalException(clazz, content, e); - } - } - - private ClientException newUnmarshalException(Class clazz, String xmlContent, Exception e) { - return new ClientException("SDK.UnmarshalFailed", - "unmarshal response from xml content failed, clazz = " + clazz.getSimpleName() + ", origin response = " + xmlContent, e); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/AuthUtils.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/AuthUtils.java deleted file mode 100644 index 34cecaa..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/AuthUtils.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.aliyuncs.utils; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - - -public class AuthUtils { - private static volatile String clientType = System.getenv("ALIBABA_CLOUD_PROFILE"); - private static volatile String environmentAccessKeyId; - private static volatile String environmentAccesskeySecret; - private static volatile String environmentECSMetaData; - private static volatile String environmentCredentialsFile; - private static volatile String privateKey; - - public static String getPrivateKey(String filePath) { - if (null == privateKey) { - synchronized (AuthUtils.class) { - if (null == privateKey) { - FileInputStream in = null; - byte[] buffer; - try { - in = new FileInputStream(new File(filePath)); - buffer = new byte[in.available()]; - in.read(buffer); - privateKey = new String(buffer, "UTF-8"); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - } - } - return privateKey; - } - - public static void setPrivateKey(String key) { - privateKey = key; - } - - public static String getClientType() { - if (null == clientType) { - AuthUtils.clientType = "default"; - return AuthUtils.clientType; - } else { - return AuthUtils.clientType; - } - } - - public static void setClientType(String clientType) { - AuthUtils.clientType = clientType; - } - - public static String getEnvironmentAccessKeyId() { - if (null == AuthUtils.environmentAccessKeyId) { - return System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); - } else { - return AuthUtils.environmentAccessKeyId; - } - } - - public static void setEnvironmentAccessKeyId(String environmentAccessKeyId) { - AuthUtils.environmentAccessKeyId = environmentAccessKeyId; - } - - public static String getEnvironmentAccessKeySecret() { - if (null == AuthUtils.environmentAccesskeySecret) { - return System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); - } else { - return AuthUtils.environmentAccesskeySecret; - } - } - - public static void setEnvironmentAccessKeySecret(String environmentAccesskeySecret) { - AuthUtils.environmentAccesskeySecret = environmentAccesskeySecret; - } - - public static String getEnvironmentECSMetaData() { - if (null == AuthUtils.environmentECSMetaData) { - return System.getenv("ALIBABA_CLOUD_ECS_METADATA"); - } else { - return AuthUtils.environmentECSMetaData; - } - } - - public static void setEnvironmentECSMetaData(String environmentECSMetaData) { - AuthUtils.environmentECSMetaData = environmentECSMetaData; - } - - public static String getEnvironmentCredentialsFile() { - if (null == AuthUtils.environmentCredentialsFile) { - return System.getenv("ALIBABA_CLOUD_CREDENTIALS_FILE"); - } else { - return AuthUtils.environmentCredentialsFile; - } - } - - public static void setEnvironmentCredentialsFile(String environmentCredentialsFile) { - AuthUtils.environmentCredentialsFile = environmentCredentialsFile; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/Base64Helper.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/Base64Helper.java deleted file mode 100644 index 13b366a..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/Base64Helper.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package com.aliyuncs.utils; - -import java.io.UnsupportedEncodingException; - -public class Base64Helper { - - private static final String BASE64_CODE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+/"; - - private static final int[] BASE64_DECODE = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - }; - - private static byte[] zeroPad(int length, byte[] bytes) { - byte[] padded = new byte[length]; - System.arraycopy(bytes, 0, padded, 0, bytes.length); - return padded; - } - - public synchronized static String encode(byte[] buff) { - if (null == buff) { - return null; - } - - StringBuilder strBuilder = new StringBuilder(""); - int paddingCount = (3 - (buff.length % 3)) % 3; - byte[] stringArray = zeroPad(buff.length + paddingCount, buff); - for (int i = 0; i < stringArray.length; i += 3) { - int j = ((stringArray[i] & 0xff) << 16) + - ((stringArray[i + 1] & 0xff) << 8) + - (stringArray[i + 2] & 0xff); - strBuilder.append(BASE64_CODE.charAt((j >> 18) & 0x3f)); - strBuilder.append(BASE64_CODE.charAt((j >> 12) & 0x3f)); - strBuilder.append(BASE64_CODE.charAt((j >> 6) & 0x3f)); - strBuilder.append(BASE64_CODE.charAt(j & 0x3f)); - } - int intPos = strBuilder.length(); - for (int i = paddingCount; i > 0; i--) { - strBuilder.setCharAt(intPos - i, '='); - } - - return strBuilder.toString(); - } - - public synchronized static String encode(String string, String encoding) - throws UnsupportedEncodingException { - if (null == string || null == encoding) { - return null; - } - byte[] stringArray = string.getBytes(encoding); - return encode(stringArray); - } - - public synchronized static String decode(String string, String encoding) throws - UnsupportedEncodingException { - if (null == string || null == encoding) { - return null; - } - int posIndex = 0; - int decodeLen = string.endsWith("==") ? (string.length() - 2) : - string.endsWith("=") ? (string.length() - 1) : string.length(); - byte[] buff = new byte[decodeLen * 3 / 4]; - int count4 = decodeLen - decodeLen % 4; - for (int i = 0; i < count4; i += 4) { - int c0 = BASE64_DECODE[string.charAt(i)]; - int c1 = BASE64_DECODE[string.charAt(i + 1)]; - int c2 = BASE64_DECODE[string.charAt(i + 2)]; - int c3 = BASE64_DECODE[string.charAt(i + 3)]; - buff[posIndex++] = (byte) (((c0 << 2) | (c1 >> 4)) & 0xFF); - buff[posIndex++] = (byte) ((((c1 & 0xF) << 4) | (c2 >> 2)) & 0xFF); - buff[posIndex++] = (byte) ((((c2 & 3) << 6) | c3) & 0xFF); - } - if (2 <= decodeLen % 4) { - int c0 = BASE64_DECODE[string.charAt(count4)]; - int c1 = BASE64_DECODE[string.charAt(count4 + 1)]; - buff[posIndex++] = (byte) (((c0 << 2) | (c1 >> 4)) & 0xFF); - if (3 == decodeLen % 4) { - int c2 = BASE64_DECODE[string.charAt(count4 + 2)]; - buff[posIndex++] = (byte) ((((c1 & 0xF) << 4) | (c2 >> 2)) & 0xFF); - } - } - return new String(buff, encoding); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/EnvironmentUtils.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/EnvironmentUtils.java deleted file mode 100644 index c31d02b..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/EnvironmentUtils.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.aliyuncs.utils; - -public class EnvironmentUtils { - - private static volatile String httpProxy; - private static volatile String httpsProxy; - private static volatile String noProxy; - - public static String getHttpProxy() { - if (null == httpProxy) { - String proxy0 = System.getenv("HTTP_PROXY"); - String proxy1 = System.getenv("http_proxy"); - return (!StringUtils.isEmpty(proxy0) ? proxy0 : proxy1); - } else { - return httpProxy; - } - } - - public static void setHttpProxy(String httpProxy) { - EnvironmentUtils.httpProxy = httpProxy; - } - - public static String getHttpsProxy() { - if (null == httpsProxy) { - return System.getenv("HTTPS_PROXY"); - } else { - return httpsProxy; - } - } - - public static void setHttpsProxy(String httpsProxy) { - EnvironmentUtils.httpsProxy = httpsProxy; - } - - - public static String getNoProxy() { - if (null == noProxy) { - return System.getenv("NO_PROXY"); - } else { - return noProxy; - } - } - - public static void setNoProxy(String noProxy) { - EnvironmentUtils.noProxy = noProxy; - } - -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/FlattenMapUtil.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/FlattenMapUtil.java deleted file mode 100644 index d03db47..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/FlattenMapUtil.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.aliyuncs.utils; - -import java.util.*; - -public class FlattenMapUtil { - public static List> toListMap(Map flattenMap, String prefix) { - MapUtils mapUtils = new MapUtils(); - return mapUtils.convertMapToListMap(flattenMap, prefix); - } - - public static Map toMap(Map flattenMap, String prefix) { - MapUtils mapUtils = new MapUtils(); - return mapUtils.convertMapToMap(flattenMap, prefix); - } - - public static Object put(Map flattenMap, Object object, String[] subKeys, int subKeysIndex) { - if (subKeysIndex >= subKeys.length) { - return object; - } - String key = subKeys[subKeysIndex]; - - if (key.endsWith("]")) { - int index = parseIndex(key); - if (index == -1) { - return null; - } - - ArrayList arrayList; - - if (object == null) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < subKeysIndex; i++) { - sb.append(subKeys[i]).append("."); - } - sb.append(key); - int length = parseLength(flattenMap, sb.toString()); - if (length == -1) { - return null; - } - arrayList = new ArrayList(Collections.nCopies(length, null)); - } else { - arrayList = (ArrayList) object; - } - - if (subKeys.length == subKeysIndex + 1) { - arrayList.set(index, flattenMap.get(stringJoin(".", subKeys))); - return arrayList; - } else { - arrayList.set(index, put(flattenMap, arrayList.get(index), subKeys, subKeysIndex + 1)); - return arrayList; - } - - } else { - HashMap hashMap; - if (object == null) { - hashMap = new HashMap(); - } else { - hashMap = (HashMap) object; - } - if (subKeys.length == subKeysIndex + 1) { - hashMap.put(key, flattenMap.get(stringJoin(".", subKeys))); - return hashMap; - } else { - hashMap.put(key, put(flattenMap, hashMap.get(key), subKeys, subKeysIndex + 1)); - return hashMap; - } - } - } - - public static Object putForMap(Map flattenMap, Object object, String[] subKeys, int subKeysIndex) { - if (subKeysIndex >= subKeys.length) { - return object; - } - String key = subKeys[subKeysIndex]; - - if (key.endsWith("]")) { - int index = parseIndex(key); - if (index == -1) { - return null; - } - - if (object != null && !(object instanceof HashMap)) { - return null; - } - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < subKeysIndex; i++) { - sb.append(subKeys[i]).append("."); - } - sb.append(key); - int length = parseLength(flattenMap, sb.toString()); - if (length == -1) { - return null; - } - - String name = parseArrayName(key); - - ArrayList arrayList; - HashMap hashMap; - if (object != null) { - hashMap = (HashMap) object; - - if (!(hashMap.get(name) instanceof ArrayList)) { - arrayList = new ArrayList(Collections.nCopies(length, null)); - hashMap.put(name, arrayList); - } else { - arrayList = (ArrayList) hashMap.get(name); - } - } else { - hashMap = new HashMap(); - arrayList = new ArrayList(Collections.nCopies(length, null)); - hashMap.put(name, arrayList); - object = hashMap; - } - - if (subKeys.length == subKeysIndex + 1) { - arrayList.set(index, flattenMap.get(stringJoin(".", subKeys))); - return object; - } else { - arrayList.set(index, putForMap(flattenMap, arrayList.get(index), subKeys, subKeysIndex + 1)); - return object; - } - - } else { - HashMap hashMap; - if (object == null) { - hashMap = new HashMap(); - } else { - hashMap = (HashMap) object; - } - if (subKeys.length == subKeysIndex + 1) { - hashMap.put(key, flattenMap.get(stringJoin(".", subKeys))); - return hashMap; - } else { - hashMap.put(key, putForMap(flattenMap, hashMap.get(key), subKeys, subKeysIndex + 1)); - return hashMap; - } - } - } - - public static int parseIndex(String key) { - int start = key.indexOf("["); - int end = key.indexOf("]"); - if (start == -1 || end == -1 || end <= start) { - return -1; - } - - try { - return Integer.parseInt(key.substring(start + 1, end)); - } catch (Exception e) { - return -1; - } - } - - public static int parseLength(Map flattenMap, String key) { - int end = key.lastIndexOf("["); - if (end == -1) { - return -1; - } - - try { - return Integer.parseInt(flattenMap.get(key.substring(0, end) + ".Length")); - } catch (Exception e) { - return -1; - } - } - - public static String parseArrayName(String key) { - if (key == null) { - return null; - } - int end = key.lastIndexOf("["); - if (end == -1) { - return null; - } - return key.substring(0, end); - } - - public static String stringJoin(String delimiter, String... sequences) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < sequences.length; i++) { - sb.append(sequences[i]); - if (i < sequences.length - 1) { - sb.append(delimiter); - } - } - return sb.toString(); - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/IOUtils.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/IOUtils.java deleted file mode 100644 index 6e875cb..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/IOUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.aliyuncs.utils; - -import java.io.Closeable; -import java.io.IOException; - -public class IOUtils { - - public static void closeQuietly(Closeable closeable) { - try { - if (closeable != null) { - closeable.close(); - } - } catch (IOException ioe) { - // ignore - } - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/LogUtils.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/LogUtils.java deleted file mode 100644 index 878ecfb..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/LogUtils.java +++ /dev/null @@ -1,190 +0,0 @@ -package com.aliyuncs.utils; - -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.http.HttpRequest; -import com.aliyuncs.http.HttpResponse; -import lombok.Getter; -import lombok.Setter; - -import java.net.InetAddress; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.UnknownHostException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class LogUtils { - public final static String REQUEST = "{request}"; - public final static String RESPONSE = "{response}"; - public final static String TS = "{ts}"; - public final static String DATE_ISO_8601 = "{date_iso_8601}"; - public final static String DATE_COMMON_LOG = "{date_common_log}"; - public final static String HOST = "{host}"; - public final static String METHOD = "{method}"; - public final static String URI = "{uri}"; - public final static String VERSION = "{version}"; - public final static String TARGET = "{target}"; - public final static String HOSTNAME = "{hostname}"; - public final static String CODE = "{code}"; - public final static String PHRASE = "{phrase}"; - public final static String REQ_HEADERS = "{req_headers}"; - public final static String RES_HEADERS = "{res_headers}"; - public final static String REQ_BODY = "{req_body}"; - public final static String RES_BODY = "{res_body}"; - public final static String PID = "{pid}"; - public final static String COST = "{cost}"; - public final static String START_TIME = "{start_time}"; - public final static String TIME = "{time}"; - public final static String ERROR = "{error}"; - public final static String DEFAULT_LOG_FORMAT = - "{method} {uri} HTTP/{version} {code} {cost} {hostname} {pid} {error}"; - public final static Pattern REQ_HEADER_PATTERN = Pattern.compile("\\{req_header_(.*?)\\}"); - public final static Pattern RES_HEADER_PATTERN = Pattern.compile("\\{res_header_(.*?)\\}"); - - public static String fillContent(String format, LogUnit logUnit) { - String content = format.replace(REQUEST, logUnit.getHttpRequest().toString()) - .replace(TS, logUnit.getTs()) - .replace(DATE_ISO_8601, logUnit.getTs()) - .replace(DATE_COMMON_LOG, logUnit.getTs()) - .replace(HOST, logUnit.getHost()) - .replace(METHOD, logUnit.getMethod()) - .replace(URI, logUnit.getUrl()) - .replace(VERSION, logUnit.getVersion()) - .replace(TARGET, logUnit.getTarget()) - .replace(HOSTNAME, logUnit.getHostname()) - .replace(ERROR, logUnit.getError()) - .replace(REQ_HEADERS, logUnit.getReqHeaders()) - .replace(RES_HEADERS, logUnit.getResHeaders()) - .replace(REQ_BODY, logUnit.getReqBody()) - .replace(PID, logUnit.getPid()) - .replace(COST, logUnit.getCost()) - .replace(START_TIME, logUnit.getStartTime()) - .replace(TIME, logUnit.getTime()); - if (null != logUnit.getHttpResponse()) { - content = content.replace(RESPONSE, logUnit.getHttpResponse().toString()). - replace(RES_BODY, logUnit.getResBody()). - replace(PHRASE, logUnit.getPhrase()). - replace(CODE, logUnit.getCode()); - } - Matcher m = REQ_HEADER_PATTERN.matcher(content); - while (m.find()) { - String headerKey = m.group(1); - if (null != logUnit.getHttpRequest().getHeaderValue(headerKey)) { - content = content.replace(m.group(), logUnit.getHttpRequest().getHeaderValue(headerKey)); - } - } - m = RES_HEADER_PATTERN.matcher(content); - while (m.find()) { - String headerKey = m.group(1); - if (null != logUnit.getHttpResponse().getHeaderValue(headerKey)) { - content = content.replace(m.group(), logUnit.getHttpResponse().getHeaderValue(headerKey)); - } - } - return content; - } - - public static String utcNow() { - TimeZone tz = TimeZone.getTimeZone("UTC"); - DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSS'Z'"); - df.setTimeZone(tz); - return df.format(new Date()); - } - - public static String localeNow() { - TimeZone tz = TimeZone.getDefault(); - DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSS'Z'"); - df.setTimeZone(tz); - return df.format(new Date()); - } - - public static long getCurrentPID() { - String processName = - java.lang.management.ManagementFactory.getRuntimeMXBean().getName(); - return Long.parseLong(processName.split("@")[0]); - } - - public static String getLocalHostName() { - try { - return InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } - return "unknown host name"; - } - - public static LogUnit createLogUnit(HttpRequest httpRequest, HttpResponse httpResponse) { - return new LogUnit(httpRequest, httpResponse); - } - - @Getter - @Setter - public static class LogUnit { - private HttpRequest httpRequest; - private HttpResponse httpResponse; - private String ts; - private String host; - private String method; - private String url; - private String version = "1.1"; - private String target; - private String hostname; - private String code; - private String phrase; - private String reqHeaders; - private String resHeaders; - private String reqBody; - private String resBody; - private String pid; - private String cost; - private String startTime; - private String time; - private String error; - - public LogUnit(HttpRequest httpRequest, HttpResponse httpResponse) { - this.httpRequest = httpRequest; - this.httpResponse = httpResponse; - this.ts = utcNow(); - try { - URL url = new URL(httpRequest.getSysUrl()); - this.host = url.getHost(); - this.target = ""; - String path = url.getPath(); - String query = url.getQuery(); - String ref = url.getRef(); - if (null != path) { - this.target += path; - } - if (null != query) { - this.target += "?" + query; - } - if (null != ref) { - this.target += "#" + ref; - } - } catch (MalformedURLException e) { - e.printStackTrace(); - } - this.method = httpRequest.getSysMethod().name(); - this.url = httpRequest.getSysUrl(); - this.hostname = getLocalHostName(); - this.reqHeaders = httpRequest.getSysHeaders().toString(); - try { - this.reqBody = httpRequest.getHttpContentString(); - if (null != httpResponse) { - this.resHeaders = httpResponse.getSysHeaders().toString(); - this.code = String.valueOf(httpResponse.getStatus()); - this.phrase = (httpResponse.getReasonPhrase() != null ? httpResponse.getReasonPhrase() : ""); - this.resBody = httpResponse.getHttpContentString(); - } - } catch (ClientException e) { - e.printStackTrace(); - } - - this.pid = String.valueOf(getCurrentPID()); - this.time = localeNow(); - } - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/MapUtils.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/MapUtils.java deleted file mode 100644 index 43b9cb6..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/MapUtils.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.aliyuncs.utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class MapUtils { - - public List> convertMapToListMap(Map flattenMap, String prefix) { - List> list = new ArrayList>(); - for (Map.Entry entry : flattenMap.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - if (key.contains(prefix)) { - String[] keys = key.replace(prefix, "").split("\\."); - String pre = prefix + keys[0]; - if (keys[0].contains("[")) { - String mapKey = key.replace(pre + ".", ""); - int index = Integer.parseInt(keys[0].replace("[", "").replace("]", "")); - list = setList(list, index, mapKey, value); - } - } - } - return list; - } - - public Map convertMapToMap(Map flattenMap, String prefix) { - Map map = new HashMap(); - for (Map.Entry entry : flattenMap.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - if (key.contains(prefix)) { - String[] keys = key.replace(prefix, "").split("\\."); - String pre = prefix + keys[0]; - String mapKey = key.replace(pre + ".", ""); - map = setMap(map, mapKey, value); - } - } - return map; - } - - private List> setList(List> targetList, int index, String key, - String value) { - List> list = targetList; - if (null == list) { - list = new ArrayList>(); - } - while (list.size() <= index) { - list.add(new HashMap()); - } - list.set(index, setMap(list.get(index), key, value)); - return list; - } - - private Map setMap(Map targetMap, String key, String value) { - Map map = targetMap; - if (null == map) { - map = new HashMap(); - } - if (key.contains("[")) { - String[] keys = key.split("\\."); - String listKey = key.substring(0, key.indexOf("[")); - int index = Integer.parseInt(key.substring(key.indexOf("[") + 1, key.indexOf("]"))); - List> listObj = (List>) map.get(listKey); - listObj = setList(listObj, index, key.replace(keys[0] + ".", ""), value); - map.put(listKey, listObj); - } else if (key.contains(".")) { - String[] keys = key.split("\\."); - String mapKey = keys[0]; - // exclude *.Length - if (!(map.get(mapKey) instanceof List) && !"Length".equals(keys[1])) { - map.put(mapKey, setMap((Map) map.get(mapKey), - key.replace(keys[0] + ".", ""), value)); - } - } else { - map.put(key, value); - } - return map; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/ParameterHelper.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/ParameterHelper.java deleted file mode 100644 index 2cd304c..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/ParameterHelper.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.aliyuncs.utils; - -import com.google.gson.Gson; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.security.MessageDigest; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; - -public class ParameterHelper { - - private final static String TIME_ZONE = "GMT"; - private final static String FORMAT_ISO8601 = "yyyy-MM-dd'T'HH:mm:ss'Z'"; - private final static String FORMAT_RFC2616 = "EEE, dd MMM yyyy HH:mm:ss zzz"; - - public ParameterHelper() { - } - - public static String getUniqueNonce() { - StringBuffer uniqueNonce = new StringBuffer(); - UUID uuid = UUID.randomUUID(); - uniqueNonce.append(uuid.toString()); - uniqueNonce.append(System.currentTimeMillis()); - uniqueNonce.append(Thread.currentThread().getId()); - return uniqueNonce.toString(); - } - - public static String getISO8601Time(Date date) { - SimpleDateFormat df = new SimpleDateFormat(FORMAT_ISO8601); - df.setTimeZone(new SimpleTimeZone(0, TIME_ZONE)); - return df.format(date); - } - - public static String getRFC2616Date(Date date) { - SimpleDateFormat df = new SimpleDateFormat(FORMAT_RFC2616, Locale.ENGLISH); - df.setTimeZone(new SimpleTimeZone(0, TIME_ZONE)); - return df.format(date); - } - - public static Date parse(String strDate) throws ParseException { - if (null == strDate || "".equals(strDate)) { - return null; - } - // The format contains 4 ' - if (strDate.length() == FORMAT_ISO8601.length() - 4) { - return parseISO8601(strDate); - } else if (strDate.length() == FORMAT_RFC2616.length()) { - return parseRFC2616(strDate); - } - return null; - } - - public static Date parseISO8601(String strDate) throws ParseException { - if (null == strDate || "".equals(strDate)) { - return null; - } - - // The format contains 4 ' symbol - if (strDate.length() != (FORMAT_ISO8601.length() - 4)) { - return null; - } - - SimpleDateFormat df = new SimpleDateFormat(FORMAT_ISO8601); - df.setTimeZone(new SimpleTimeZone(0, TIME_ZONE)); - return df.parse(strDate); - } - - public static Date parseRFC2616(String strDate) throws ParseException { - if (null == strDate || "".equals(strDate) || strDate.length() != FORMAT_RFC2616.length()) { - return null; - } - SimpleDateFormat df = new SimpleDateFormat(FORMAT_RFC2616, Locale.ENGLISH); - df.setTimeZone(new SimpleTimeZone(0, TIME_ZONE)); - return df.parse(strDate); - } - - public static String md5Sum(byte[] buff) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - byte[] messageDigest = md.digest(buff); - return Base64Helper.encode(messageDigest); - } catch (Exception e) { - // TODO: should not eat the excepiton - } - return null; - } - - public static byte[] getXmlData(Map params) throws UnsupportedEncodingException { - StringBuilder xml = new StringBuilder(); - xml.append(""); - Iterator> entries = params.entrySet().iterator(); - while (entries.hasNext()) { - Map.Entry entry = entries.next(); - xml.append("<" + entry.getKey() + ">"); - xml.append(entry.getValue()); - xml.append(""); - } - return xml.toString().getBytes("UTF-8"); - } - - public static byte[] getJsonData(Map params) throws UnsupportedEncodingException { - String json = new Gson().toJson(params); - return json.getBytes("UTF-8"); - } - - public static byte[] getFormData(Map params) throws UnsupportedEncodingException { - StringBuilder result = new StringBuilder(); - boolean first = true; - for (Map.Entry entry : params.entrySet()) { - if (first) { - first = false; - } else { - result.append("&"); - } - result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); - result.append("="); - result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); - } - return result.toString().getBytes("UTF-8"); - } -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/StringUtils.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/StringUtils.java deleted file mode 100644 index 6f6d7a3..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/StringUtils.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.aliyuncs.utils; - -public class StringUtils { - - public static boolean isEmpty(final CharSequence cs) { - return cs == null || cs.length() == 0; - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/XmlUtils.java b/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/XmlUtils.java deleted file mode 100644 index 5b8378f..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/java/com/aliyuncs/utils/XmlUtils.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.aliyuncs.utils; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; - -public final class XmlUtils { - - public static Document getDocument(String payload) - throws ParserConfigurationException, SAXException, IOException { - if (payload == null || payload.length() < 1) { - return null; - } - - StringReader sr = new StringReader(payload); - InputSource source = new InputSource(sr); - - Document doc = null; - - try { - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = dbf.newDocumentBuilder(); - doc = builder.parse(source); - } finally { - IOUtils.closeQuietly(source.getByteStream()); - } - - return doc; - } - - public static Element getRootElementFromString(String payload) - throws ParserConfigurationException, SAXException, IOException { - Document doc = getDocument(payload); - if (doc == null) { - return null; - } - return doc.getDocumentElement(); - } - - public static List getChildElements(Element parent, String tagName) { - if (null == parent) { - return null; - } - NodeList nodes = parent.getElementsByTagName(tagName); - List elements = new ArrayList(); - - for (int i = 0; i < nodes.getLength(); i++) { - Node node = nodes.item(i); - if (node.getParentNode() == parent) { - elements.add((Element) node); - } - } - - return elements; - } - - public static List getChildElements(Element parent) { - if (null == parent) { - return null; - } - - NodeList nodes = parent.getChildNodes(); - List elements = new ArrayList(); - - for (int i = 0; i < nodes.getLength(); i++) { - Node node = nodes.item(i); - if (node.getNodeType() == Node.ELEMENT_NODE) { - elements.add((Element) node); - } - } - - return elements; - } -} \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/resources/com/aliyuncs/sdk/info.xml b/APITest/aliyun-java-sdk-core/src/main/resources/com/aliyuncs/sdk/info.xml deleted file mode 100644 index 899fea4..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/resources/com/aliyuncs/sdk/info.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - x-sdk-client - Java/2.0.0 - \ No newline at end of file diff --git a/APITest/aliyun-java-sdk-core/src/main/resources/endpoints.json b/APITest/aliyun-java-sdk-core/src/main/resources/endpoints.json deleted file mode 100644 index b08e6b1..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/resources/endpoints.json +++ /dev/null @@ -1,1111 +0,0 @@ -{ - "global_endpoints": { - "domain": "domain.aliyuncs.com", - "cdn": "cdn.aliyuncs.com", - "ram": "ram.aliyuncs.com", - "cbn": "cbn.aliyuncs.com", - "drds": "drds.aliyuncs.com", - "emr": "emr.aliyuncs.com", - "sts": "sts.aliyuncs.com", - "cs": "cs.aliyuncs.com", - "cr": "cr.aliyuncs.com", - "hbase": "hbase.aliyuncs.com", - "ros": "ros.aliyuncs.com", - "ess": "ess.aliyuncs.com", - "gpdb": "gpdb.aliyuncs.com", - "dds": "mongodb.aliyuncs.com", - "jaq": "jaq.aliyuncs.com", - "cloudauth": "cloudauth.aliyuncs.com", - "live": "live.aliyuncs.com", - "hpc": "hpc.aliyuncs.com", - "ddosbasic": "antiddos.aliyuncs.com", - "dm": "dm.aliyuncs.com", - "domain-intl": "domain-intl.aliyuncs.com", - "cloudwf": "cloudwf.aliyuncs.com", - "ecs": "ecs-cn-hangzhou.aliyuncs.com", - "vpc": "vpc.aliyuncs.com", - "redisa": "r-kvstore.aliyuncs.com", - "codepipeline": "cds.cn-beijing.aliyuncs.com", - "vipaegis": "aegis.cn-hangzhou.aliyuncs.com", - "rds": "rds.aliyuncs.com", - "petadata": "petadata.aliyuncs.com", - "httpdns": "httpdns-api.aliyuncs.com", - "green": "green.aliyuncs.com", - "alidns": "alidns.aliyuncs.com", - "push": "cloudpush.aliyuncs.com", - "itaas": "itaas.aliyuncs.com", - "cms": "metrics.cn-hangzhou.aliyuncs.com", - "slb": "slb.aliyuncs.com" - }, - "location_code_mapping": { - "cloudapi": "apigateway", - "sas-api": "sas", - "chatbot": "beebot", - "aegis": "vipaegis", - "cds": "codepipeline", - "r-kvstore": "redisa" - }, - "regional_endpoint_pattern": { - "apigateway": "apigateway.[RegionId].aliyuncs.com", - "domain": "domain.aliyuncs.com", - "dm": "dm.[RegionId].aliyuncs.com", - "ess": "ess.[RegionId].aliyuncs.com", - "beebot": "chatbot.[RegionId].aliyuncs.com", - "domain-intl": "domain-intl.aliyuncs.com", - "batchcompute": "batchcompute.[RegionId].aliyuncs.com", - "dds": "mongodb.[RegionId].aliyuncs.com", - "iot": "iot.[RegionId].aliyuncs.com", - "drds": "drds.aliyuncs.com", - "arms": "arms.[RegionId].aliyuncs.com", - "emr": "emr.[RegionId].aliyuncs.com", - "csb": "csb.[RegionId].aliyuncs.com", - "polardb": "polardb.aliyuncs.com", - "ccc": "ccc.[RegionId].aliyuncs.com", - "cloudphoto": "cloudphoto.[RegionId].aliyuncs.com" - }, - "regions": [ - "me-east-1", - "us-east-1", - "ap-northeast-1", - "ap-southeast-5", - "cn-hongkong", - "cn-shenzhen", - "ap-southeast-3", - "ap-southeast-2", - "ap-south-1", - "cn-huhehaote", - "cn-qingdao", - "cn-beijing", - "cn-shanghai", - "cn-hangzhou", - "ap-southeast-1", - "us-west-1", - "eu-central-1", - "cn-zhangjiakou", - "cn-chengdu", - "eu-west-1" - ], - "regional_endpoints": { - "bastionhost": { - "cn-hangzhou": "yundun-bastionhost.aliyuncs.com" - }, - "xianzhi": { - "cn-hangzhou": "xianzhi.aliyuncs.com" - }, - "rtc": { - "cn-hangzhou": "rtc.aliyuncs.com" - }, - "nlp": { - "cn-shanghai": "nlp.cn-shanghai.aliyuncs.com" - }, - "trademark": { - "cn-hangzhou": "trademark.aliyuncs.com" - }, - "cdn": { - "cn-hangzhou": "cdn.aliyuncs.com" - }, - "sca": { - "cn-hangzhou": "qualitycheck.cn-hangzhou.aliyuncs.com" - }, - "drds": { - "ap-southeast-1": "drds.ap-southeast-1.aliyuncs.com", - "cn-hangzhou":"drds.cn-hangzhou.aliyuncs.com" - }, - "arms": { - "cn-beijing": "arms.cn-beijing.aliyuncs.com", - "cn-hangzhou": "arms.cn-hangzhou.aliyuncs.com", - "cn-shanghai": "arms.cn-shanghai.aliyuncs.com", - "cn-hongkong": "arms.cn-hongkong.aliyuncs.com", - "ap-southeast-1": "arms.ap-southeast-1.aliyuncs.com", - "cn-shenzhen": "arms.cn-shenzhen.aliyuncs.com", - "cn-qingdao": "arms.cn-qingdao.aliyuncs.com" - }, - "iovcc": { - "cn-shanghai": "iovcc.cn-shanghai.aliyuncs.com" - }, - "ddosrewards": { - "cn-hangzhou": "ddosright.cn-hangzhou.aliyuncs.com" - }, - "ons": { - "us-west-1": "ons.us-west-1.aliyuncs.com", - "cn-beijing": "ons.cn-beijing.aliyuncs.com", - "me-east-1": "ons.me-east-1.aliyuncs.com", - "us-east-1": "ons.us-east-1.aliyuncs.com", - "ap-northeast-1": "ons.ap-northeast-1.aliyuncs.com", - "ap-southeast-2": "ons.ap-southeast-2.aliyuncs.com", - "cn-shanghai": "ons.cn-shanghai.aliyuncs.com", - "cn-hongkong": "ons.cn-hongkong.aliyuncs.com", - "cn-shenzhen": "ons.cn-shenzhen.aliyuncs.com", - "ap-southeast-3": "ons.ap-southeast-3.aliyuncs.com", - "cn-hangzhou": "ons.cn-hangzhou.aliyuncs.com", - "ap-southeast-1": "ons.ap-southeast-1.aliyuncs.com", - "ap-south-1": "ons.cn-hangzhou.aliyuncs.com", - "eu-central-1": "ons.eu-central-1.aliyuncs.com", - "cn-qingdao": "ons.cn-qingdao.aliyuncs.com", - "cn-zhangjiakou":"ons.cn-zhangjiakou.aliyuncs.com", - "cn-huhehaote":"ons.cn-huhehaote.aliyuncs.com", - "eu-west-1":"ons.eu-west-1.aliyuncs.com" - }, - "hbase": { - "cn-huhehaote": "hbase.cn-huhehaote.aliyuncs.com", - "me-east-1": "hbase.me-east-1.aliyuncs.com", - "ap-southeast-2": "hbase.ap-southeast-2.aliyuncs.com", - "ap-southeast-3": "hbase.ap-southeast-3.aliyuncs.com", - "ap-southeast-5": "hbase.ap-southeast-5.aliyuncs.com", - "ap-south-1": "hbase.ap-south-1.aliyuncs.com", - "eu-central-1": "hbase.eu-central-1.aliyuncs.com", - "cn-qingdao":"hbase.aliyuncs.com", - "cn-beijing":"hbase.aliyuncs.com", - "cn-hangzhou":"hbase.aliyuncs.com", - "cn-shanghai":"hbase.aliyuncs.com", - "cn-shenzhen":"hbase.aliyuncs.com", - "ap-southeast-1":"hbase.aliyuncs.com", - "us-west-1":"hbase.aliyuncs.com", - "us-east-1":"hbase.aliyuncs.com" - }, - "ros": { - "cn-hangzhou": "ros.aliyuncs.com" - }, - "pts": { - "cn-hangzhou": "pts.aliyuncs.com" - }, - "polardb": { - "cn-huhehaote": "polardb.cn-huhehaote.aliyuncs.com", - "cn-qingdao": "polardb.aliyuncs.com", - "cn-beijing": "polardb.aliyuncs.com", - "cn-hangzhou": "polardb.aliyuncs.com", - "cn-shanghai": "polardb.aliyuncs.com", - "ap-southeast-5": "polardb.ap-southeast-5.aliyuncs.com", - "ap-south-1": "polardb.ap-south-1.aliyuncs.com", - "cn-shenzhen":"polardb.aliyuncs.com", - "cn-hongkong":"polardb.aliyuncs.com" - }, - "ddosdip": { - "ap-southeast-1": "ddosdip.ap-southeast-1.aliyuncs.com" - }, - "ehs": { - "cn-huhehaote": "ehpc.cn-huhehaote.aliyuncs.com", - "cn-beijing": "ehpc.cn-beijing.aliyuncs.com", - "cn-hangzhou": "ehpc.cn-hangzhou.aliyuncs.com", - "cn-shanghai": "ehpc.cn-shanghai.aliyuncs.com", - "cn-hongkong": "ehpc.cn-hongkong.aliyuncs.com", - "cn-shenzhen": "ehpc.cn-shenzhen.aliyuncs.com", - "ap-southeast-1": "ehpc.ap-southeast-1.aliyuncs.com", - "cn-qingdao": "ehpc.cn-qingdao.aliyuncs.com", - "eu-central-1": "ehpc.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "ehpc.cn-zhangjiakou.aliyuncs.com", - "ap-southeast-2":"ehpc.ap-southeast-2.aliyuncs.com" - }, - "gpdb": { - "cn-huhehaote": "gpdb.cn-huhehaote.aliyuncs.com", - "ap-south-1": "gpdb.ap-south-1.aliyuncs.com", - "ap-southeast-2": "gpdb.ap-southeast-2.aliyuncs.com", - "ap-southeast-3": "gpdb.ap-southeast-3.aliyuncs.com", - "ap-southeast-5": "gpdb.ap-southeast-5.aliyuncs.com", - "eu-central-1": "gpdb.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "gpdb.cn-zhangjiakou.aliyuncs.com", - "cn-beijing":"gpdb.aliyuncs.com", - "cn-hangzhou":"gpdb.aliyuncs.com", - "cn-shanghai":"gpdb.aliyuncs.com", - "cn-shenzhen":"gpdb.aliyuncs.com", - "ap-southeast-1":"gpdb.aliyuncs.com", - "ap-northeast-1":"gpdb.ap-northeast-1.aliyuncs.com", - "eu-west-1":"gpdb.eu-west-1.aliyuncs.com", - "us-west-1":"gpdb.aliyuncs.com", - "us-east-1":"gpdb.aliyuncs.com" - }, - "waf": { - "cn-hangzhou": "wafopenapi.cn-hangzhou.aliyuncs.com" - }, - "cloudfirewall": { - "cn-hangzhou": "cloudfw.cn-hangzhou.aliyuncs.com" - }, - "baas": { - "cn-hangzhou": "baas.cn-hangzhou.aliyuncs.com", - "ap-northeast-1": "baas.ap-northeast-1.aliyuncs.com", - "ap-southeast-1": "baas.ap-southeast-1.aliyuncs.com", - "cn-beijing":"baas.aliyuncs.com", - "cn-shanghai":"baas.aliyuncs.com", - "cn-shenzhen":"baas.aliyuncs.com" - }, - "imm": { - "cn-shanghai": "imm.cn-shanghai.aliyuncs.com", - "cn-hangzhou": "imm.cn-hangzhou.aliyuncs.com", - "cn-shenzhen": "imm.cn-shenzhen.aliyuncs.com", - "cn-beijing": "imm.cn-beijing.aliyuncs.com", - "ap-southeast-1": "imm.ap-southeast-1.aliyuncs.com", - "cn-zhangjiakou":"imm.cn-zhangjiakou.aliyuncs.com" - }, - "live": { - "cn-beijing": "live.aliyuncs.com", - "cn-hangzhou": "live.aliyuncs.com", - "ap-northeast-1": "live.aliyuncs.com", - "cn-shanghai": "live.aliyuncs.com", - "ap-southeast-1": "live.aliyuncs.com", - "eu-central-1": "live.aliyuncs.com", - "cn-shenzhen":"live.aliyuncs.com" - }, - "qualitycheck": { - "cn-hangzhou": "qualitycheck.cn-hangzhou.aliyuncs.com" - }, - "cloudauth": { - "cn-hangzhou": "cloudauth.aliyuncs.com" - }, - "ims": { - "cn-hangzhou": "ims.aliyuncs.com" - }, - "oas": { - "cn-hangzhou": "cn-hangzhou.oas.aliyuncs.com", - "cn-shenzhen": "cn-shenzhen.oas.aliyuncs.com", - "cn-beijing": "cn-beijing.oas.aliyuncs.com" - }, - "drdspre": { - "ap-southeast-1": "drds.ap-southeast-1.aliyuncs.com", - "cn-qingdao":"drds.cn-qingdao.aliyuncs.com", - "cn-beijing":"drds.cn-beijing.aliyuncs.com", - "cn-hangzhou":"drds.cn-hangzhou.aliyuncs.com", - "cn-shanghai":"drds.cn-shanghai.aliyuncs.com", - "cn-shenzhen":"drds.cn-shenzhen.aliyuncs.com", - "cn-hongkong":"drds.cn-hangzhou.aliyuncs.com" - }, - "oss": { - "cn-qingdao": "oss-cn-qingdao.aliyuncs.com", - "cn-beijing": "oss-cn-beijing.aliyuncs.com", - "cn-hangzhou": "oss-cn-hangzhou.aliyuncs.com", - "cn-shanghai": "oss-cn-shanghai.aliyuncs.com", - "cn-hongkong": "oss-cn-hongkong.aliyuncs.com", - "cn-shenzhen": "oss-cn-shenzhen.aliyuncs.com", - "ap-southeast-1": "oss-ap-southeast-1.aliyuncs.com", - "us-west-1": "oss-us-west-1.aliyuncs.com" - }, - "ddosbasic": { - "cn-huhehaote": "antiddos-openapi.cn-huhehaote.aliyuncs.com", - "me-east-1": "antiddos-openapi.me-east-1.aliyuncs.com", - "ap-northeast-1": "antiddos-openapi.ap-northeast-1.aliyuncs.com", - "ap-southeast-5": "antiddos-openapi.ap-southeast-5.aliyuncs.com", - "ap-southeast-3": "antiddos-openapi.ap-southeast-3.aliyuncs.com", - "ap-southeast-2": "antiddos-openapi.ap-southeast-2.aliyuncs.com", - "ap-south-1": "antiddos-openapi.ap-south-1.aliyuncs.com", - "eu-central-1": "antiddos-openapi.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "antiddos-openapi.cn-zhangjiakou.aliyuncs.com", - "cn-qingdao":"antiddos.aliyuncs.com", - "cn-beijing":"antiddos.aliyuncs.com", - "cn-hangzhou":"antiddos.aliyuncs.com", - "cn-shanghai":"antiddos.aliyuncs.com", - "cn-shenzhen":"antiddos.aliyuncs.com", - "cn-hongkong":"antiddos.aliyuncs.com", - "ap-southeast-1":"antiddos.aliyuncs.com", - "eu-west-1":"antiddos-openapi.eu-west-1.aliyuncs.com", - "us-west-1":"antiddos.aliyuncs.com", - "us-east-1":"antiddos.aliyuncs.com" - }, - "dm": { - "ap-southeast-2": "dm.ap-southeast-2.aliyuncs.com" - }, - "ddoscoo": { - "cn-hangzhou": "ddoscoo.cn-hangzhou.aliyuncs.com" - }, - "smartag": { - "cn-shanghai": "smartag.cn-shanghai.aliyuncs.com", - "cn-hongkong":"smartag.cn-hongkong.aliyuncs.com", - "ap-southeast-1":"smartag.ap-southeast-1.aliyuncs.com", - "ap-southeast-2":"smartag.ap-southeast-2.aliyuncs.com", - "ap-southeast-3":"smartag.ap-southeast-3.aliyuncs.com", - "ap-southeast-5":"smartag.ap-southeast-5.aliyuncs.com", - "eu-central-1":"smartag.eu-central-1.aliyuncs.com" - }, - "actiontrail": { - "cn-huhehaote": "actiontrail.cn-huhehaote.aliyuncs.com", - "ap-south-1": "actiontrail.ap-south-1.aliyuncs.com", - "cn-beijing": "actiontrail.cn-beijing.aliyuncs.com", - "me-east-1": "actiontrail.me-east-1.aliyuncs.com", - "us-east-1": "actiontrail.us-east-1.aliyuncs.com", - "ap-northeast-1": "actiontrail.ap-northeast-1.aliyuncs.com", - "ap-southeast-2": "actiontrail.ap-southeast-2.aliyuncs.com", - "cn-shanghai": "actiontrail.cn-shanghai.aliyuncs.com", - "cn-hongkong": "actiontrail.cn-hongkong.aliyuncs.com", - "cn-shenzhen": "actiontrail.cn-shenzhen.aliyuncs.com", - "ap-southeast-3": "actiontrail.ap-southeast-3.aliyuncs.com", - "cn-hangzhou": "actiontrail.cn-hangzhou.aliyuncs.com", - "ap-southeast-5": "actiontrail.ap-southeast-5.aliyuncs.com", - "ap-southeast-1": "actiontrail.ap-southeast-1.aliyuncs.com", - "us-west-1": "actiontrail.us-west-1.aliyuncs.com", - "eu-central-1": "actiontrail.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "actiontrail.cn-zhangjiakou.aliyuncs.com", - "cn-qingdao":"actiontrail.cn-qingdao.aliyuncs.com", - "eu-west-1":"actiontrail.eu-west-1.aliyuncs.com" - }, - "vpc": { - "cn-huhehaote": "vpc.cn-huhehaote.aliyuncs.com", - "me-east-1": "vpc.me-east-1.aliyuncs.com", - "ap-northeast-1": "vpc.ap-northeast-1.aliyuncs.com", - "ap-southeast-5": "vpc.ap-southeast-5.aliyuncs.com", - "ap-southeast-3": "vpc.ap-southeast-3.aliyuncs.com", - "ap-southeast-2": "vpc.ap-southeast-2.aliyuncs.com", - "ap-south-1": "vpc.ap-south-1.aliyuncs.com", - "eu-central-1": "vpc.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "vpc.cn-zhangjiakou.aliyuncs.com", - "cn-qingdao":"vpc.aliyuncs.com", - "cn-beijing":"vpc.aliyuncs.com", - "cn-hangzhou":"vpc.aliyuncs.com", - "cn-shanghai":"vpc.aliyuncs.com", - "cn-shenzhen":"vpc.aliyuncs.com", - "cn-hongkong":"vpc.aliyuncs.com", - "ap-southeast-1":"vpc.aliyuncs.com", - "eu-west-1":"vpc.eu-west-1.aliyuncs.com", - "us-west-1":"vpc.aliyuncs.com", - "us-east-1":"vpc.aliyuncs.com" - }, - "ots": { - "cn-huhehaote": "ots.cn-huhehaote.aliyuncs.com", - "cn-beijing": "ots.cn-beijing.aliyuncs.com", - "me-east-1": "ots.me-east-1.aliyuncs.com", - "cn-hangzhou": "ots.cn-hangzhou.aliyuncs.com", - "ap-northeast-1": "ots.ap-northeast-1.aliyuncs.com", - "cn-shanghai": "ots.cn-shanghai.aliyuncs.com", - "ap-southeast-1": "ots.ap-southeast-1.aliyuncs.com", - "ap-southeast-3": "ots.ap-southeast-3.aliyuncs.com", - "ap-southeast-2": "ots.ap-southeast-2.aliyuncs.com", - "ap-southeast-5": "ots.ap-southeast-5.aliyuncs.com", - "ap-south-1": "ots.ap-south-1.aliyuncs.com", - "eu-central-1": "ots.eu-central-1.aliyuncs.com", - "cn-zhangjiakou":"ots.cn-zhangjiakou.aliyuncs.com", - "eu-west-1":"ots.eu-west-1.aliyuncs.com", - "us-west-1":"ots.us-west-1.aliyuncs.com", - "us-east-1":"ots.us-east-1.aliyuncs.com" - }, - "redisa": { - "cn-huhehaote": "r-kvstore.cn-huhehaote.aliyuncs.com", - "me-east-1": "r-kvstore.me-east-1.aliyuncs.com", - "ap-northeast-1": "r-kvstore.ap-northeast-1.aliyuncs.com", - "ap-southeast-5": "r-kvstore.ap-southeast-5.aliyuncs.com", - "cn-hongkong": "r-kvstore.cn-hongkong.aliyuncs.com", - "ap-southeast-1": "r-kvstore.ap-southeast-1.aliyuncs.com", - "ap-southeast-3": "r-kvstore.ap-southeast-3.aliyuncs.com", - "ap-southeast-2": "r-kvstore.ap-southeast-2.aliyuncs.com", - "ap-south-1": "r-kvstore.ap-south-1.aliyuncs.com", - "eu-central-1": "r-kvstore.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "r-kvstore.cn-zhangjiakou.aliyuncs.com", - "cn-qingdao":"r-kvstore.aliyuncs.com", - "cn-beijing":"r-kvstore.aliyuncs.com", - "cn-hangzhou":"r-kvstore.aliyuncs.com", - "cn-shanghai":"r-kvstore.aliyuncs.com", - "cn-shenzhen":"r-kvstore.aliyuncs.com", - "eu-west-1":"r-kvstore.eu-west-1.aliyuncs.com", - "us-west-1":"r-kvstore.aliyuncs.com", - "us-east-1":"r-kvstore.aliyuncs.com" - }, - "codepipeline": { - "cn-beijing": "cds.cn-beijing.aliyuncs.com" - }, - "csb": { - "cn-hangzhou": "csb.cn-hangzhou.aliyuncs.com", - "cn-beijing": "csb.cn-beijing.aliyuncs.com" - }, - "apigateway": { - "cn-shanghai": "apigateway.cn-shanghai.aliyuncs.com", - "cn-qingdao": "apigateway.cn-qingdao.aliyuncs.com", - "cn-beijing": "apigateway.cn-beijing.aliyuncs.com", - "cn-hangzhou": "apigateway.cn-hangzhou.aliyuncs.com", - "ap-northeast-1": "apigateway.ap-northeast-1.aliyuncs.com", - "us-west-1": "apigateway.us-west-1.aliyuncs.com", - "ap-southeast-5": "apigateway.ap-southeast-5.aliyuncs.com", - "cn-hongkong": "apigateway.cn-hongkong.aliyuncs.com", - "cn-shenzhen": "apigateway.cn-shenzhen.aliyuncs.com", - "ap-southeast-3": "apigateway.ap-southeast-3.aliyuncs.com", - "ap-southeast-2": "apigateway.ap-southeast-2.aliyuncs.com", - "ap-southeast-1": "apigateway.ap-southeast-1.aliyuncs.com", - "ap-south-1": "apigateway.ap-south-1.aliyuncs.com", - "eu-central-1": "apigateway.eu-central-1.aliyuncs.com", - "cn-zhangjiakou":"apigateway.cn-zhangjiakou.aliyuncs.com", - "cn-huhehaote":"apigateway.cn-huhehaote.aliyuncs.com", - "eu-west-1":"apigateway.eu-west-1.aliyuncs.com", - "us-east-1":"apigateway.us-east-1.aliyuncs.com", - "me-east-1":"apigateway.me-east-1.aliyuncs.com" - }, - "beebot": { - "cn-shanghai": "chatbot.cn-shanghai.aliyuncs.com", - "cn-hangzhou": "chatbot.cn-hangzhou.aliyuncs.com" - }, - "cas": { - "cn-hangzhou": "cas.aliyuncs.com", - "ap-southeast-2":"cas.ap-southeast-2.aliyuncs.com", - "ap-northeast-1":"cas.ap-northeast-1.aliyuncs.com", - "eu-central-1":"cas.eu-central-1.aliyuncs.com", - "me-east-1":"cas.me-east-1.aliyuncs.com" - }, - "mts": { - "ap-south-1": "mts.ap-south-1.aliyuncs.com", - "cn-beijing": "mts.cn-beijing.aliyuncs.com", - "cn-hangzhou": "mts.cn-hangzhou.aliyuncs.com", - "ap-northeast-1": "mts.ap-northeast-1.aliyuncs.com", - "cn-shanghai": "mts.cn-shanghai.aliyuncs.com", - "cn-hongkong": "mts.cn-hongkong.aliyuncs.com", - "cn-shenzhen": "mts.cn-shenzhen.aliyuncs.com", - "ap-southeast-1": "mts.ap-southeast-1.aliyuncs.com", - "us-west-1": "mts.us-west-1.aliyuncs.com", - "eu-central-1": "mts.eu-central-1.aliyuncs.com", - "cn-zhangjiakou":"mts.cn-zhangjiakou.aliyuncs.com", - "eu-west-1":"mts.eu-west-1.aliyuncs.com" - }, - "pvtz": { - "cn-hangzhou": "pvtz.aliyuncs.com", - "ap-southeast-1": "pvtz.aliyuncs.com" - }, - "petadata": { - "cn-huhehaote": "petadata.cn-huhehaote.aliyuncs.com", - "me-east-1": "petadata.me-east-1.aliyuncs.com", - "ap-southeast-2": "petadata.ap-southeast-2.aliyuncs.com", - "ap-southeast-5": "petadata.ap-southeast-5.aliyuncs.com", - "eu-central-1": "petadata.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "petadata.cn-zhangjiakou.aliyuncs.com", - "cn-qingdao":"petadata.aliyuncs.com", - "cn-beijing":"petadata.aliyuncs.com", - "cn-hangzhou":"petadata.aliyuncs.com", - "cn-shanghai":"petadata.aliyuncs.com", - "cn-shenzhen":"petadata.aliyuncs.com", - "cn-hongkong":"petadata.aliyuncs.com", - "ap-southeast-1":"petadata.aliyuncs.com", - "us-west-1":"petadata.aliyuncs.com", - "us-east-1":"petadata.aliyuncs.com" - }, - "ensdisk": { - "cn-hangzhou": "ens.aliyuncs.com" - }, - "onsvip": { - "cn-beijing": "ons.cn-beijing.aliyuncs.com", - "cn-hangzhou": "ons.cn-hangzhou.aliyuncs.com", - "cn-shanghai": "ons.cn-shanghai.aliyuncs.com", - "cn-shenzhen": "ons.cn-shenzhen.aliyuncs.com", - "ap-southeast-1": "ons.ap-southeast-1.aliyuncs.com", - "cn-qingdao": "ons.cn-qingdao.aliyuncs.com" - }, - "emr": { - "cn-huhehaote": "emr.cn-huhehaote.aliyuncs.com", - "ap-south-1": "emr.ap-south-1.aliyuncs.com", - "me-east-1": "emr.me-east-1.aliyuncs.com", - "us-east-1": "emr.us-east-1.aliyuncs.com", - "ap-northeast-1": "emr.ap-northeast-1.aliyuncs.com", - "ap-southeast-2": "emr.ap-southeast-2.aliyuncs.com", - "ap-southeast-3": "emr.ap-southeast-3.aliyuncs.com", - "ap-southeast-5": "emr.ap-southeast-5.aliyuncs.com", - "eu-central-1": "emr.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "emr.cn-zhangjiakou.aliyuncs.com", - "cn-qingdao":"emr.cn-qingdao.aliyuncs.com", - "cn-beijing":"emr.aliyuncs.com", - "cn-hangzhou":"emr.aliyuncs.com", - "cn-shanghai":"emr.aliyuncs.com", - "cn-shenzhen":"emr.aliyuncs.com", - "cn-hongkong":"emr.cn-hongkong.aliyuncs.com", - "ap-southeast-1":"emr.aliyuncs.com", - "eu-west-1":"emr.eu-west-1.aliyuncs.com", - "us-west-1":"emr.aliyuncs.com" - }, - "hdm": { - "cn-shanghai": "hdm-api.aliyuncs.com" - }, - "cms": { - "ap-southeast-5": "metrics.ap-southeast-5.aliyuncs.com", - "cn-huhehaote": "metrics.cn-huhehaote.aliyuncs.com", - "ap-northeast-1": "metrics.ap-northeast-1.aliyuncs.com", - "ap-south-1": "metrics.ap-south-1.aliyuncs.com", - "ap-southeast-3": "metrics.ap-southeast-3.aliyuncs.com", - "cn-qingdao":"metrics.cn-hangzhou.aliyuncs.com", - "cn-beijing":"metrics.cn-hangzhou.aliyuncs.com", - "cn-zhangjiakou":"metrics.cn-hangzhou.aliyuncs.com", - "cn-hangzhou":"metrics.cn-hangzhou.aliyuncs.com", - "cn-shanghai":"metrics.cn-hangzhou.aliyuncs.com", - "cn-shenzhen":"metrics.cn-hangzhou.aliyuncs.com", - "cn-hongkong":"metrics.cn-hangzhou.aliyuncs.com", - "ap-southeast-1":"metrics.cn-hangzhou.aliyuncs.com", - "ap-southeast-2":"metrics.cn-hangzhou.aliyuncs.com", - "eu-west-1":"metrics.eu-west-1.aliyuncs.com", - "us-west-1":"metrics.cn-hangzhou.aliyuncs.com", - "us-east-1":"metrics.cn-hangzhou.aliyuncs.com", - "eu-central-1":"metrics.cn-hangzhou.aliyuncs.com", - "me-east-1":"metrics.cn-hangzhou.aliyuncs.com" - }, - "luban": { - "cn-shanghai": "luban.cn-shanghai.aliyuncs.com", - "cn-hangzhou": "luban.cn-hangzhou.aliyuncs.com" - }, - "slb": { - "cn-huhehaote": "slb.cn-huhehaote.aliyuncs.com", - "me-east-1": "slb.me-east-1.aliyuncs.com", - "ap-northeast-1": "slb.ap-northeast-1.aliyuncs.com", - "ap-southeast-5": "slb.ap-southeast-5.aliyuncs.com", - "ap-southeast-3": "slb.ap-southeast-3.aliyuncs.com", - "ap-southeast-2": "slb.ap-southeast-2.aliyuncs.com", - "ap-south-1": "slb.ap-south-1.aliyuncs.com", - "eu-central-1": "slb.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "slb.cn-zhangjiakou.aliyuncs.com", - "cn-qingdao":"slb.aliyuncs.com", - "cn-beijing":"slb.aliyuncs.com", - "cn-hangzhou":"slb.aliyuncs.com", - "cn-shanghai":"slb.aliyuncs.com", - "cn-shenzhen":"slb.aliyuncs.com", - "cn-hongkong":"slb.aliyuncs.com", - "ap-southeast-1":"slb.aliyuncs.com", - "eu-west-1":"slb.eu-west-1.aliyuncs.com", - "us-west-1":"slb.aliyuncs.com", - "us-east-1":"slb.aliyuncs.com" - }, - "vod": { - "cn-shanghai": "vod.cn-shanghai.aliyuncs.com", - "cn-hangzhou": "vod.cn-shanghai.aliyuncs.com", - "cn-shenzhen": "vod.cn-shanghai.aliyuncs.com", - "cn-beijing": "vod.cn-shanghai.aliyuncs.com", - "ap-southeast-1":"vod.ap-southeast-1.aliyuncs.com", - "eu-central-1":"vod.eu-central-1.aliyuncs.com" - }, - "domain": { - "cn-hangzhou": "domain.aliyuncs.com", - "ap-southeast-1": "domain-intl.aliyuncs.com" - }, - "imagesearch": { - "ap-southeast-1": "imagesearch.ap-southeast-1.aliyuncs.com", - "ap-southeast-2": "imagesearch.ap-southeast-2.aliyuncs.com", - "cn-shanghai":"imagesearch.cn-shanghai.aliyuncs.com", - "ap-northeast-1":"imagesearch.ap-northeast-1.aliyuncs.com" - }, - "ddos": { - "cn-hangzhou": "ddospro.cn-hangzhou.aliyuncs.com", - "cn-hongkong": "ddospro.cn-hongkong.aliyuncs.com" - }, - "odpsmayi": { - "cn-shanghai": "bsb.cloud.alipay.com", - "ap-southeast-1": "bsb.cloud.alipay.com" - }, - "gameshield": { - "cn-hangzhou": "gameshield.aliyuncs.com", - "cn-zhangjiakou": "gameshield.cn-zhangjiakou.aliyuncs.com" - }, - "kvstore": { - "ap-northeast-1": "r-kvstore.ap-northeast-1.aliyuncs.com" - }, - "ddosbgp": { - "cn-huhehaote": "ddosbgp.cn-hangzhou.aliyuncs.com", - "cn-qingdao": "ddosbgp.cn-hangzhou.aliyuncs.com", - "cn-beijing": "ddosbgp.cn-hangzhou.aliyuncs.com", - "cn-hangzhou": "ddosbgp.cn-hangzhou.aliyuncs.com", - "cn-shanghai": "ddosbgp.cn-hangzhou.aliyuncs.com", - "cn-hongkong": "ddosbgp.cn-hongkong.aliyuncs.com", - "cn-shenzhen": "ddosbgp.cn-hangzhou.aliyuncs.com", - "us-west-1": "ddosbgp.us-west-1.aliyuncs.com", - "cn-zhangjiakou": "ddosbgp.cn-hangzhou.aliyuncs.com" - }, - "ess": { - "cn-huhehaote": "ess.cn-huhehaote.aliyuncs.com", - "me-east-1": "ess.me-east-1.aliyuncs.com", - "ap-northeast-1": "ess.ap-northeast-1.aliyuncs.com", - "ap-southeast-5": "ess.ap-southeast-5.aliyuncs.com", - "ap-southeast-3": "ess.ap-southeast-3.aliyuncs.com", - "ap-southeast-2": "ess.ap-southeast-2.aliyuncs.com", - "ap-south-1": "ess.ap-south-1.aliyuncs.com", - "eu-central-1": "ess.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "ess.cn-zhangjiakou.aliyuncs.com", - "cn-qingdao":"ess.aliyuncs.com", - "cn-beijing":"ess.aliyuncs.com", - "cn-hangzhou":"ess.aliyuncs.com", - "cn-shanghai":"ess.aliyuncs.com", - "cn-shenzhen":"ess.aliyuncs.com", - "cn-hongkong":"ess.aliyuncs.com", - "ap-southeast-1":"ess.aliyuncs.com", - "eu-west-1":"ess.eu-west-1.aliyuncs.com", - "us-west-1":"ess.aliyuncs.com", - "us-east-1":"ess.aliyuncs.com" - }, - "clouddesktop": { - "cn-shanghai": "clouddesktop.cn-shanghai.aliyuncs.com", - "cn-hangzhou": "clouddesktop.cn-hangzhou.aliyuncs.com", - "cn-shenzhen": "clouddesktop.cn-shenzhen.aliyuncs.com", - "cn-beijing": "clouddesktop.cn-beijing.aliyuncs.com" - }, - "dds": { - "cn-huhehaote": "mongodb.cn-huhehaote.aliyuncs.com", - "me-east-1": "mongodb.me-east-1.aliyuncs.com", - "ap-southeast-2": "mongodb.ap-southeast-2.aliyuncs.com", - "cn-zhangjiakou": "mongodb.cn-zhangjiakou.aliyuncs.com", - "ap-southeast-3": "mongodb.ap-southeast-3.aliyuncs.com", - "ap-southeast-5": "mongodb.ap-southeast-5.aliyuncs.com", - "ap-south-1": "mongodb.ap-south-1.aliyuncs.com", - "eu-central-1": "mongodb.eu-central-1.aliyuncs.com", - "cn-qingdao":"mongodb.aliyuncs.com", - "cn-beijing":"mongodb.aliyuncs.com", - "cn-hangzhou":"mongodb.aliyuncs.com", - "cn-shanghai":"mongodb.aliyuncs.com", - "cn-shenzhen":"mongodb.aliyuncs.com", - "cn-hongkong":"mongodb.aliyuncs.com", - "ap-southeast-1":"mongodb.aliyuncs.com", - "ap-northeast-1":"mongodb.ap-northeast-1.aliyuncs.com", - "eu-west-1":"mongodb.eu-west-1.aliyuncs.com", - "us-west-1":"mongodb.aliyuncs.com", - "us-east-1":"mongodb.aliyuncs.com" - }, - "alidnsgtm": { - "cn-hangzhou": "alidns.aliyuncs.com", - "ap-southeast-1": "alidns.aliyuncs.com" - }, - "yunmarket": { - "cn-hangzhou": "market.aliyuncs.com" - }, - "pcdn": { - "cn-hangzhou": "pcdn.aliyuncs.com" - }, - "nas": { - "cn-huhehaote": "nas.cn-huhehaote.aliyuncs.com", - "cn-qingdao": "nas.cn-qingdao.aliyuncs.com", - "cn-beijing": "nas.cn-beijing.aliyuncs.com", - "us-east-1": "nas.us-east-1.aliyuncs.com", - "ap-southeast-2": "nas.ap-southeast-2.aliyuncs.com", - "cn-shanghai": "nas.cn-shanghai.aliyuncs.com", - "cn-hongkong": "nas.cn-hongkong.aliyuncs.com", - "cn-shenzhen": "nas.cn-shenzhen.aliyuncs.com", - "ap-southeast-3": "nas.ap-southeast-3.aliyuncs.com", - "cn-hangzhou": "nas.cn-hangzhou.aliyuncs.com", - "ap-southeast-5": "nas.ap-southeast-5.aliyuncs.com", - "ap-southeast-1": "nas.ap-southeast-1.aliyuncs.com", - "ap-south-1": "nas.ap-south-1.aliyuncs.com", - "eu-central-1": "nas.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "nas.cn-zhangjiakou.aliyuncs.com", - "ap-northeast-1":"nas.ap-northeast-1.aliyuncs.com", - "us-west-1":"nas.us-west-1.aliyuncs.com" - }, - "ivision": { - "cn-hangzhou": "ivision.cn-hangzhou.aliyuncs.com", - "cn-beijing": "ivision.cn-beijing.aliyuncs.com" - }, - "ens": { - "cn-hangzhou": "ens.aliyuncs.com" - }, - "kms": { - "cn-huhehaote": "kms.cn-huhehaote.aliyuncs.com", - "us-west-1": "kms.us-west-1.aliyuncs.com", - "cn-beijing": "kms.cn-beijing.aliyuncs.com", - "me-east-1": "kms.me-east-1.aliyuncs.com", - "us-east-1": "kms.us-east-1.aliyuncs.com", - "ap-northeast-1": "kms.ap-northeast-1.aliyuncs.com", - "ap-southeast-2": "kms.ap-southeast-2.aliyuncs.com", - "cn-zhangjiakou": "kms.cn-zhangjiakou.aliyuncs.com", - "cn-shanghai": "kms.cn-shanghai.aliyuncs.com", - "cn-hongkong": "kms.cn-hongkong.aliyuncs.com", - "cn-shenzhen": "kms.cn-shenzhen.aliyuncs.com", - "ap-southeast-3": "kms.ap-southeast-3.aliyuncs.com", - "cn-hangzhou": "kms.cn-hangzhou.aliyuncs.com", - "ap-southeast-5": "kms.ap-southeast-5.aliyuncs.com", - "ap-southeast-1": "kms.ap-southeast-1.aliyuncs.com", - "ap-south-1": "kms.ap-south-1.aliyuncs.com", - "eu-central-1": "kms.eu-central-1.aliyuncs.com", - "cn-qingdao": "kms.cn-qingdao.aliyuncs.com", - "eu-west-1":"kms.eu-west-1.aliyuncs.com" - }, - "hpc": { - "cn-hangzhou": "hpc.aliyuncs.com", - "cn-beijing": "hpc.aliyuncs.com" - }, - "green": { - "cn-shanghai": "green.cn-shanghai.aliyuncs.com", - "cn-hangzhou": "green.cn-hangzhou.aliyuncs.com", - "us-west-1": "green.us-west-1.aliyuncs.com", - "cn-beijing": "green.cn-beijing.aliyuncs.com", - "ap-southeast-1": "green.ap-southeast-1.aliyuncs.com" - }, - "odpsplusmayi": { - "cn-shanghai": "bsb.cloud.alipay.com", - "cn-hangzhou": "bsb.cloud.alipay.com", - "ap-southeast-1": "bsb.cloud.alipay.com" - }, - "hcs_sgw": { - "cn-shanghai": "sgw.cn-shanghai.aliyuncs.com", - "cn-hangzhou": "sgw.cn-shanghai.aliyuncs.com", - "cn-qingdao":"sgw.cn-shanghai.aliyuncs.com", - "cn-beijing":"sgw.cn-shanghai.aliyuncs.com", - "cn-zhangjiakou":"sgw.cn-shanghai.aliyuncs.com", - "cn-shenzhen":"sgw.cn-shanghai.aliyuncs.com", - "cn-hongkong":"sgw.cn-shanghai.aliyuncs.com", - "ap-southeast-1":"sgw.ap-southeast-1.aliyuncs.com", - "ap-southeast-2":"sgw.ap-southeast-2.aliyuncs.com", - "eu-central-1":"sgw.eu-central-1.aliyuncs.com" - }, - "emas": { - "cn-shanghai": "mhub.cn-shanghai.aliyuncs.com", - "cn-hangzhou": "mhub.cn-hangzhou.aliyuncs.com" - }, - "iot": { - "cn-shanghai": "iot.cn-shanghai.aliyuncs.com", - "ap-southeast-1": "iot.ap-southeast-1.aliyuncs.com", - "us-east-1": "iot.us-east-1.aliyuncs.com", - "ap-northeast-1": "iot.ap-northeast-1.aliyuncs.com", - "us-west-1": "iot.us-west-1.aliyuncs.com", - "eu-central-1": "iot.eu-central-1.aliyuncs.com" - }, - "eci": { - "cn-shanghai": "eci.aliyuncs.com", - "cn-hangzhou": "eci.aliyuncs.com", - "us-west-1": "eci.aliyuncs.com", - "cn-beijing": "eci.aliyuncs.com", - "cn-shenzhen":"eci.aliyuncs.com", - "ap-southeast-1":"eci.aliyuncs.com" - }, - "hsm": { - "cn-beijing": "hsm.aliyuncs.com", - "cn-hangzhou": "hsm.aliyuncs.com", - "cn-shanghai": "hsm.aliyuncs.com", - "cn-hongkong": "hsm.aliyuncs.com", - "cn-shenzhen": "hsm.aliyuncs.com", - "ap-southeast-1": "hsm.aliyuncs.com" - }, - "fc": { - "cn-shanghai": "cn-shanghai.fc.aliyuncs.com", - "cn-hangzhou": "cn-hangzhou.fc.aliyuncs.com", - "cn-shenzhen": "cn-shenzhen.fc.aliyuncs.com", - "cn-beijing": "cn-beijing.fc.aliyuncs.com", - "ap-southeast-2": "ap-southeast-2.fc.aliyuncs.com", - "cn-huhehaote":"cn-huhehaote.fc.aliyuncs.com" - }, - "ecs": { - "cn-huhehaote": "ecs.cn-huhehaote.aliyuncs.com", - "me-east-1": "ecs.me-east-1.aliyuncs.com", - "ap-northeast-1": "ecs.ap-northeast-1.aliyuncs.com", - "ap-southeast-5": "ecs.ap-southeast-5.aliyuncs.com", - "ap-southeast-3": "ecs.ap-southeast-3.aliyuncs.com", - "ap-southeast-2": "ecs.ap-southeast-2.aliyuncs.com", - "ap-south-1": "ecs.ap-south-1.aliyuncs.com", - "eu-central-1": "ecs.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "ecs.cn-zhangjiakou.aliyuncs.com", - "cn-qingdao":"ecs-cn-hangzhou.aliyuncs.com", - "cn-beijing":"ecs-cn-hangzhou.aliyuncs.com", - "cn-hangzhou":"ecs-cn-hangzhou.aliyuncs.com", - "cn-shanghai":"ecs-cn-hangzhou.aliyuncs.com", - "cn-shenzhen":"ecs-cn-hangzhou.aliyuncs.com", - "cn-hongkong":"ecs-cn-hangzhou.aliyuncs.com", - "ap-southeast-1":"ecs-cn-hangzhou.aliyuncs.com", - "eu-west-1":"ecs.eu-west-1.aliyuncs.com", - "us-west-1":"ecs-cn-hangzhou.aliyuncs.com", - "us-east-1":"ecs-cn-hangzhou.aliyuncs.com" - }, - "batchcompute": { - "cn-huhehaote": "batchcompute.cn-huhehaote.aliyuncs.com", - "us-west-1": "batchcompute.us-west-1.aliyuncs.com", - "cn-beijing": "batchcompute.cn-beijing.aliyuncs.com", - "cn-hangzhou": "batchcompute.cn-hangzhou.aliyuncs.com", - "cn-shanghai": "batchcompute.cn-shanghai.aliyuncs.com", - "ap-southeast-1": "batchcompute.ap-southeast-1.aliyuncs.com", - "cn-shenzhen": "batchcompute.cn-shenzhen.aliyuncs.com", - "cn-qingdao": "batchcompute.cn-qingdao.aliyuncs.com", - "cn-zhangjiakou": "batchcompute.cn-zhangjiakou.aliyuncs.com" - }, - "vipaegis": { - "cn-hangzhou": "aegis.cn-hangzhou.aliyuncs.com", - "ap-southeast-3": "aegis.ap-southeast-3.aliyuncs.com" - }, - "rds": { - "cn-huhehaote": "rds.cn-huhehaote.aliyuncs.com", - "me-east-1": "rds.me-east-1.aliyuncs.com", - "ap-northeast-1": "rds.ap-northeast-1.aliyuncs.com", - "ap-southeast-5": "rds.ap-southeast-5.aliyuncs.com", - "ap-southeast-3": "rds.ap-southeast-3.aliyuncs.com", - "ap-southeast-2": "rds.ap-southeast-2.aliyuncs.com", - "ap-south-1": "rds.ap-south-1.aliyuncs.com", - "eu-central-1": "rds.eu-central-1.aliyuncs.com", - "cn-zhangjiakou": "rds.cn-zhangjiakou.aliyuncs.com", - "cn-qingdao":"rds.aliyuncs.com", - "cn-beijing":"rds.aliyuncs.com", - "cn-hangzhou":"rds.aliyuncs.com", - "cn-shanghai":"rds.aliyuncs.com", - "cn-shenzhen":"rds.aliyuncs.com", - "cn-hongkong":"rds.aliyuncs.com", - "ap-southeast-1":"rds.aliyuncs.com", - "eu-west-1":"rds.eu-west-1.aliyuncs.com", - "us-west-1":"rds.aliyuncs.com", - "us-east-1":"rds.aliyuncs.com" - }, - "cloudap": { - "cn-hangzhou": "cloudwf.aliyuncs.com" - }, - "openanalytics": { - "cn-beijing": "openanalytics.cn-beijing.aliyuncs.com", - "cn-hangzhou": "openanalytics.cn-hangzhou.aliyuncs.com", - "cn-shanghai": "openanalytics.cn-shanghai.aliyuncs.com", - "ap-southeast-1": "openanalytics.ap-southeast-1.aliyuncs.com", - "ap-southeast-3": "openanalytics.ap-southeast-3.aliyuncs.com", - "cn-zhangjiakou": "openanalytics.cn-zhangjiakou.aliyuncs.com", - "cn-shenzhen":"openanalytics.cn-shenzhen.aliyuncs.com", - "eu-west-1":"openanalytics.eu-west-1.aliyuncs.com" - }, - "hcs_mgw": { - "cn-shanghai": "mgw.cn-shanghai.aliyuncs.com", - "cn-hangzhou": "mgw.cn-hangzhou.aliyuncs.com", - "ap-southeast-1": "mgw.ap-southeast-1.aliyuncs.com" - }, - "dcdn": { - "cn-hangzhou": "dcdn.aliyuncs.com", - "ap-southeast-1": "dcdn.aliyuncs.com" - }, - "elasticsearch": { - "ap-south-1": "elasticsearch.ap-south-1.aliyuncs.com", - "cn-hangzhou": "elasticsearch.cn-hangzhou.aliyuncs.com", - "cn-shanghai": "elasticsearch.cn-shanghai.aliyuncs.com", - "cn-hongkong": "elasticsearch.cn-hongkong.aliyuncs.com", - "cn-shenzhen": "elasticsearch.cn-shenzhen.aliyuncs.com", - "ap-southeast-3": "elasticsearch.ap-southeast-3.aliyuncs.com", - "ap-southeast-1": "elasticsearch.ap-southeast-1.aliyuncs.com", - "us-west-1": "elasticsearch.us-west-1.aliyuncs.com", - "cn-qingdao":"elasticsearch.cn-qingdao.aliyuncs.com", - "cn-beijing":"elasticsearch.cn-beijing.aliyuncs.com", - "cn-zhangjiakou":"elasticsearch.cn-zhangjiakou.aliyuncs.com", - "ap-southeast-2":"elasticsearch.ap-southeast-2.aliyuncs.com", - "ap-southeast-5":"elasticsearch.ap-southeast-5.aliyuncs.com", - "ap-northeast-1":"elasticsearch.ap-northeast-1.aliyuncs.com", - "eu-central-1":"elasticsearch.eu-central-1.aliyuncs.com" - }, - "alidns": { - "cn-hangzhou": "alidns.aliyuncs.com" - }, - "cps": { - "cn-hangzhou": "cloudpush.aliyuncs.com" - }, - "ccc": { - "cn-shanghai": "ccc.cn-shanghai.aliyuncs.com", - "cn-hangzhou": "ccc.cn-hangzhou.aliyuncs.com" - }, - "cloudphoto": { - "cn-shanghai": "cloudphoto.cn-shanghai.aliyuncs.com" - }, - "dts": { - "cn-qingdao": "dts.aliyuncs.com", - "cn-beijing": "dts.aliyuncs.com", - "cn-zhangjiakou": "dts.aliyuncs.com", - "cn-huhehaote": "dts.aliyuncs.com", - "cn-hangzhou": "dts.aliyuncs.com", - "cn-shanghai": "dts.aliyuncs.com", - "cn-shenzhen": "dts.aliyuncs.com", - "cn-hongkong": "dts.aliyuncs.com", - "ap-southeast-1": "dts.aliyuncs.com" - }, - "dysmsapi": { - "cn-shenzhen": "dysmsapi.aliyuncs.com", - "cn-huhehaote": "dysmsapi.aliyuncs.com", - "cn-qingdao": "dysmsapi.aliyuncs.com", - "cn-beijing": "dysmsapi.aliyuncs.com", - "cn-shanghai": "dysmsapi.aliyuncs.com", - "cn-hangzhou": "dysmsapi.aliyuncs.com", - "cn-zhangjiakou": "dysmsapi.aliyuncs.com", - "cn-chengdu": "dysmsapi.aliyuncs.com", - "cn-hongkong": "dysmsapi.ap-southeast-1.aliyuncs.com", - "me-east-1": "dysmsapi.ap-southeast-1.aliyuncs.com", - "us-east-1": "dysmsapi.ap-southeast-1.aliyuncs.com", - "ap-northeast-1": "dysmsapi.ap-southeast-1.aliyuncs.com", - "ap-southeast-5": "dysmsapi.ap-southeast-1.aliyuncs.com", - "ap-southeast-3": "dysmsapi.ap-southeast-1.aliyuncs.com", - "ap-southeast-2": "dysmsapi.ap-southeast-1.aliyuncs.com", - "ap-south-1": "dysmsapi.ap-southeast-1.aliyuncs.com", - "ap-southeast-1": "dysmsapi.ap-southeast-1.aliyuncs.com", - "us-west-1": "dysmsapi.ap-southeast-1.aliyuncs.com", - "eu-central-1": "dysmsapi.ap-southeast-1.aliyuncs.com" - }, - "dybaseapi": { - "cn-shenzhen": "dybaseapi.aliyuncs.com", - "cn-huhehaote": "dybaseapi.aliyuncs.com", - "cn-qingdao": "dybaseapi.aliyuncs.com", - "cn-beijing": "dybaseapi.aliyuncs.com", - "cn-shanghai": "dybaseapi.aliyuncs.com", - "cn-hangzhou": "dybaseapi.aliyuncs.com", - "cn-zhangjiakou": "dybaseapi.aliyuncs.com", - "cn-chengdu": "dybaseapi.aliyuncs.com", - "cn-hongkong": "dybaseapi.ap-southeast-1.aliyuncs.com", - "me-east-1": "dybaseapi.ap-southeast-1.aliyuncs.com", - "us-east-1": "dybaseapi.ap-southeast-1.aliyuncs.com", - "ap-northeast-1": "dybaseapi.ap-southeast-1.aliyuncs.com", - "ap-southeast-5": "dybaseapi.ap-southeast-1.aliyuncs.com", - "ap-southeast-3": "dybaseapi.ap-southeast-1.aliyuncs.com", - "ap-southeast-2": "dybaseapi.ap-southeast-1.aliyuncs.com", - "ap-south-1": "dybaseapi.ap-southeast-1.aliyuncs.com", - "ap-southeast-1": "dybaseapi.ap-southeast-1.aliyuncs.com", - "us-west-1": "dybaseapi.ap-southeast-1.aliyuncs.com", - "eu-central-1": "dybaseapi.ap-southeast-1.aliyuncs.com" - }, - "bssopenapi": { - "cn-qingdao": "business.aliyuncs.com", - "cn-beijing": "business.aliyuncs.com", - "cn-zhangjiakou": "business.aliyuncs.com", - "cn-huhehaote": "business.aliyuncs.com", - "cn-hangzhou": "business.aliyuncs.com", - "cn-shanghai": "business.aliyuncs.com", - "cn-shenzhen": "business.aliyuncs.com", - "cn-hongkong": "business.aliyuncs.com", - "ap-southeast-1": "business.ap-southeast-1.aliyuncs.com", - "ap-southeast-2": "business.ap-southeast-1.aliyuncs.com", - "ap-southeast-3": "business.ap-southeast-1.aliyuncs.com", - "ap-southeast-5": "business.ap-southeast-1.aliyuncs.com", - "ap-northeast-1": "business.ap-southeast-1.aliyuncs.com", - "us-west-1": "business.ap-southeast-1.aliyuncs.com", - "us-east-1": "business.ap-southeast-1.aliyuncs.com", - "eu-central-1": "business.ap-southeast-1.aliyuncs.com", - "eu-west-1": "business.ap-southeast-1.aliyuncs.com", - "me-east-1": "business.ap-southeast-1.aliyuncs.com", - "ap-south-1": "business.ap-southeast-1.aliyuncs.com" - }, - "faas": { - "cn-hangzhou": "faas.cn-hangzhou.aliyuncs.com", - "cn-shenzhen": "faas.cn-shenzhen.aliyuncs.com", - "cn-shanghai": "faas.cn-shanghai.aliyuncs.com", - "cn-beijing": "faas.cn-beijing.aliyuncs.com" - }, - "dmsenterprise":{ - "cn-qingdao":"dms-enterprise.aliyuncs.com", - "cn-beijing":"dms-enterprise.aliyuncs.com", - "cn-hangzhou":"dms-enterprise.aliyuncs.com", - "cn-shanghai":"dms-enterprise.aliyuncs.com", - "cn-shenzhen":"dms-enterprise.aliyuncs.com", - "ap-northeast-1":"dms-enterprise.aliyuncs.com" - }, - "alikafka":{ - "cn-qingdao":"alikafka.cn-qingdao.aliyuncs.com", - "cn-beijing":"alikafka.cn-beijing.aliyuncs.com", - "cn-zhangjiakou":"alikafka.cn-zhangjiakou.aliyuncs.com", - "cn-huhehaote":"alikafka.cn-huhehaote.aliyuncs.com", - "cn-hangzhou":"alikafka.cn-hangzhou.aliyuncs.com", - "cn-shanghai":"alikafka.cn-shanghai.aliyuncs.com", - "cn-shenzhen":"alikafka.cn-shenzhen.aliyuncs.com", - "cn-hongkong":"alikafka.cn-hongkong.aliyuncs.com" - }, - "foas":{ - "cn-qingdao":"foas.cn-qingdao.aliyuncs.com", - "cn-beijing":"foas.cn-beijing.aliyuncs.com", - "cn-zhangjiakou":"foas.cn-zhangjiakou.aliyuncs.com", - "cn-hangzhou":"foas.cn-hangzhou.aliyuncs.com", - "cn-shanghai":"foas.cn-shanghai.aliyuncs.com", - "cn-shenzhen":"foas.cn-shenzhen.aliyuncs.com", - "ap-northeast-1":"foas.ap-northeast-1.aliyuncs.com" - }, - "cbn":{ - "cn-qingdao":"cbn.aliyuncs.com", - "cn-beijing":"cbn.aliyuncs.com", - "cn-zhangjiakou":"cbn.aliyuncs.com", - "cn-huhehaote":"cbn.aliyuncs.com", - "cn-hangzhou":"cbn.aliyuncs.com", - "cn-shanghai":"cbn.aliyuncs.com", - "cn-shenzhen":"cbn.aliyuncs.com", - "cn-hongkong":"cbn.aliyuncs.com", - "ap-southeast-1":"cbn.aliyuncs.com", - "ap-southeast-2":"cbn.aliyuncs.com", - "ap-southeast-3":"cbn.aliyuncs.com", - "ap-southeast-5":"cbn.aliyuncs.com", - "ap-northeast-1":"cbn.aliyuncs.com", - "eu-west-1":"cbn.aliyuncs.com", - "us-west-1":"cbn.aliyuncs.com", - "us-east-1":"cbn.aliyuncs.com", - "eu-central-1":"cbn.aliyuncs.com", - "me-east-1":"cbn.aliyuncs.com", - "ap-south-1":"cbn.aliyuncs.com" - }, - "alidfs":{ - "cn-beijing":"dfs.cn-beijing.aliyuncs.com", - "cn-shanghai":"dfs.cn-shanghai.aliyuncs.com" - }, - "airec":{ - "cn-beijing":"airec.cn-beijing.aliyuncs.com", - "cn-hangzhou":"airec.cn-hangzhou.aliyuncs.com", - "cn-shanghai":"airec.cn-shanghai.aliyuncs.com" - }, - "scdn":{ - "cn-hangzhou":"scdn.aliyuncs.com" - }, - "saf":{ - "cn-hangzhou":"saf.cn-shanghai.aliyuncs.com", - "cn-shanghai":"saf.cn-shanghai.aliyuncs.com", - "cn-shenzhen":"saf.cn-shenzhen.aliyuncs.com" - }, - "linkwan":{ - "cn-hangzhou":"linkwan.cn-hangzhou.aliyuncs.com", - "cn-shanghai":"linkwan.cn-shanghai.aliyuncs.com" - }, - "linkedmall":{ - "cn-hangzhou":"linkedmall.aliyuncs.com", - "cn-shanghai":"linkedmall.aliyuncs.com" - }, - "vs":{ - "cn-hangzhou":"vs.cn-hangzhou.aliyuncs.com", - "cn-shanghai":"vs.cn-shanghai.aliyuncs.com" - }, - "ccs":{ - "cn-hangzhou":"ccs.aliyuncs.com" - }, - "hitsdb":{ - "cn-hangzhou":"hitsdb.aliyuncs.com" - }, - "uis":{ - "cn-hangzhou":"uis.cn-hangzhou.aliyuncs.com" - }, - "alimt":{ - "cn-hangzhou":"mt.cn-hangzhou.aliyuncs.com" - }, - "cccvn":{ - "cn-shanghai":"voicenavigator.cn-shanghai.aliyuncs.com" - }, - "drdspost":{ - "cn-shanghai":"drds.cn-shanghai.aliyuncs.com", - "cn-hongkong":"drds.cn-hangzhou.aliyuncs.com", - "ap-southeast-1":"drds.ap-southeast-1.aliyuncs.com" - }, - "dbs" : { - "cn-hangzhou" : "dbs-api.cn-hangzhou.aliyuncs.com", - "cn-shanghai" : "dbs-api.cn-hangzhou.aliyuncs.com", - "cn-qingdao" : "dbs-api.cn-hangzhou.aliyuncs.com", - "cn-beijing" : "dbs-api.cn-hangzhou.aliyuncs.com", - "cn-shenzhen" : "dbs-api.cn-hangzhou.aliyuncs.com", - "cn-hongkong" : "dbs-api.cn-hangzhou.aliyuncs.com", - "ap-southeast-1" : "dbs-api.ap-southeast-1.aliyuncs.com", - "ap-northeast-1" : "dbs-api.ap-northeast-1.aliyuncs.com" - } - }, - "document_id": { - "vod": "60574", - "domain": "42875", - "cdn": "27148", - "ram": "28672", - "drds": "51111", - "sas": "28498", - "sts": "28756", - "csb": "64837", - "ons": "44416", - "cs": "26043", - "cr": "60716", - "ros": "28899", - "polardb": "58764", - "ess": "25925", - "batchcompute": "44717", - "dds": "61715", - "waf": "62847", - "arms": "42924", - "jaq": "35037", - "cloudauth": "60687", - "nas": "62598", - "live": "48207", - "hpc": "35201", - "slb": "27565", - "rds": "26223", - "dm": "29434", - "iot": "30557", - "cloudwf": "58111", - "ecs": "25484", - "vpc": "34962", - "redisa": "60831", - "codepipeline": "62887", - "apigateway": "43590", - "vipaegis": "28449", - "beebot": "60760", - "emr": "28140", - "mts": "29212", - "httpdns": "52679", - "green": "28427", - "ccc": "63027", - "alidns": "29739", - "push": "30074", - "itaas": "55759", - "cms": "28615", - "qualitycheck": "50807", - "cloudphoto": "59902" - } -} diff --git a/APITest/aliyun-java-sdk-core/src/main/resources/project.properties b/APITest/aliyun-java-sdk-core/src/main/resources/project.properties deleted file mode 100644 index ddc6758..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/resources/project.properties +++ /dev/null @@ -1 +0,0 @@ -sdk.project.version=${project.version} diff --git a/APITest/aliyun-java-sdk-core/src/main/resources/regions.txt b/APITest/aliyun-java-sdk-core/src/main/resources/regions.txt deleted file mode 100644 index a3361af..0000000 --- a/APITest/aliyun-java-sdk-core/src/main/resources/regions.txt +++ /dev/null @@ -1,18 +0,0 @@ -cn-qingdao -cn-beijing -cn-zhangjiakou -cn-huhehaote -cn-hangzhou -cn-shanghai -cn-shenzhen -cn-hongkong -ap-southeast-1 -ap-southeast-2 -ap-southeast-3 -ap-southeast-5 -ap-south-1 -ap-northeast-1 -us-west-1 -us-east-1 -eu-central-1 -me-east-1 diff --git a/APITest/com/show/api/util/.svn/entries b/APITest/com/show/api/util/.svn/entries deleted file mode 100644 index 154d00d..0000000 --- a/APITest/com/show/api/util/.svn/entries +++ /dev/null @@ -1,273 +0,0 @@ -10 - -dir -565 -svn://120.26.59.160/showapi/ali-sdk-simple/src/com/show/api/util -svn://120.26.59.160/showapi - - - -2016-12-05T14:52:29.190128Z -565 -cxt - - -svn:special svn:externals svn:needs-lock - - - - - - - - - - - -5175282d-e61f-44f7-877a-1f46b3355884 - - - - - - -0 - -Base64.java -file - - - - -2016-11-04T17:31:30.004000Z -ea2d1fcbda562908d9ec2af75b566c62 -2016-12-05T14:52:29.190128Z -565 -cxt - - - - - - - - - - - - - - - - - - - - - -2516 - -ResData.java -file - - - - -2015-06-09T10:56:53.147000Z -e44f3d506e52732e3ebbe59f751c2ba2 -2016-12-05T14:52:29.190128Z -565 -cxt - - - - - - - - - - - - - - - - - - - - - -638 - -ShowApiLogger.java -file - - - - -2016-11-04T02:25:24.938000Z -0ebc37770b5ad1e1cb8212e1b92bc081 -2016-12-05T14:52:29.190128Z -565 -cxt - - - - - - - - - - - - - - - - - - - - - -1868 - -ShowApiUtils.java -file - - - - -2016-11-04T17:25:57.428000Z -6cd57477f651554f463e188ad77965cc -2016-12-05T14:52:29.190128Z -565 -cxt - - - - - - - - - - - - - - - - - - - - - -2893 - -StringUtils.java -file - - - - -2015-03-30T04:37:05.995000Z -85028cc10a9cfdbc41ff5c7bafb6721d -2016-12-05T14:52:29.190128Z -565 -cxt - - - - - - - - - - - - - - - - - - - - - -2860 - -WebUtils.java -file -1391 - - - -2017-09-25T08:39:47.966000Z -6993daf1858e6fb28c216768e8f51b2b -2017-09-25T08:43:11.084913Z -1391 -cxt - - - - - - - - - - - - - - - - - - - - - -17572 - -ZipUtils.java -file - - - - -2015-06-09T05:54:31.401000Z -22d4534c50aab74bad304742bd3a7811 -2016-12-05T14:52:29.190128Z -565 -cxt - - - - - - - - - - - - - - - - - - - - - -7475 - diff --git a/Base/com/baseType/TestByte.java b/Base/com/baseType/TestByte.java deleted file mode 100644 index 06f64b1..0000000 --- a/Base/com/baseType/TestByte.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baseType; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; - -public class TestByte { - - public static void main(String[] args) { - // TODO Auto-generated method stub - - // TODO Auto-generated method stub - byte[] arr = new byte[4]; - arr[0] = 0x78; - arr[1] = 0x56; - arr[2] = 0x34; - arr[3] = 0x12; - - ByteArrayInputStream bais = new ByteArrayInputStream(arr); - DataInputStream dis = new DataInputStream(bais); - try { - System.out.println(Integer.toHexString(dis.readInt())); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - - } - -} diff --git a/GUI/javaFx/Test.java b/GUI/javaFx/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/GUI/javaFx/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/GUI/swing/Test.java b/GUI/swing/Test.java new file mode 100644 index 0000000..e60ee70 --- /dev/null +++ b/GUI/swing/Test.java @@ -0,0 +1,10 @@ +package swing; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/APITest/com/show/api/util/Base64.java b/Utils/Base64.java similarity index 100% rename from APITest/com/show/api/util/Base64.java rename to Utils/Base64.java diff --git a/APITest/com/show/api/util/ResData.java b/Utils/ResData.java similarity index 100% rename from APITest/com/show/api/util/ResData.java rename to Utils/ResData.java diff --git a/APITest/com/show/api/util/ShowApiLogger.java b/Utils/ShowApiLogger.java similarity index 100% rename from APITest/com/show/api/util/ShowApiLogger.java rename to Utils/ShowApiLogger.java diff --git a/APITest/com/show/api/util/ShowApiUtils.java b/Utils/ShowApiUtils.java similarity index 100% rename from APITest/com/show/api/util/ShowApiUtils.java rename to Utils/ShowApiUtils.java diff --git a/APITest/com/show/api/util/StringUtils.java b/Utils/StringUtils.java similarity index 100% rename from APITest/com/show/api/util/StringUtils.java rename to Utils/StringUtils.java diff --git a/APITest/com/show/api/util/WebUtils.java b/Utils/WebUtils.java similarity index 100% rename from APITest/com/show/api/util/WebUtils.java rename to Utils/WebUtils.java diff --git a/APITest/com/show/api/util/ZipUtils.java b/Utils/ZipUtils.java similarity index 100% rename from APITest/com/show/api/util/ZipUtils.java rename to Utils/ZipUtils.java diff --git a/WebStudy/CSS3/action/Test.java b/WebStudy/CSS3/action/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/CSS3/action/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/HTML5/action/Test.java b/WebStudy/HTML5/action/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/HTML5/action/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/js-es5/bootstrap/grib/Test.java b/WebStudy/js-es5/bootstrap/grib/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/js-es5/bootstrap/grib/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/js-es5/bootstrap/model/Test.java b/WebStudy/js-es5/bootstrap/model/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/js-es5/bootstrap/model/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/js-es5/extjs/Ejax/Test.java b/WebStudy/js-es5/extjs/Ejax/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/js-es5/extjs/Ejax/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/js-es5/jquery/Ajax/Test.java b/WebStudy/js-es5/jquery/Ajax/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/js-es5/jquery/Ajax/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/js-es6/Vue/Test.java b/WebStudy/js-es6/Vue/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/js-es6/Vue/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/js-es6/angular/Test.java b/WebStudy/js-es6/angular/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/js-es6/angular/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/js-es6/react/Test.java b/WebStudy/js-es6/react/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/js-es6/react/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/js-typescript/new_vue/Test.java b/WebStudy/js-typescript/new_vue/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/js-typescript/new_vue/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/socket/Test.java b/WebStudy/socket/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/socket/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/WebStudy/webpack/Test.java b/WebStudy/webpack/Test.java new file mode 100644 index 0000000..74a1eea --- /dev/null +++ b/WebStudy/webpack/Test.java @@ -0,0 +1,10 @@ +package javaFx; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/fastjson-1.2.9.jar b/fastjson-1.2.9.jar deleted file mode 100644 index 839cea36c33f0d74b2dc7ee5182a9d4f1b7bfbf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393517 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%0Dc^oYn8p&QQ>r9=+d` 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

                        1lvu%$V)UKtNf1pE8aw=IxCJmDFKO|mn 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 diff --git a/src/hamcrest-2.1.jar b/hamcrest-2.1.jar similarity index 100% rename from src/hamcrest-2.1.jar rename to hamcrest-2.1.jar diff --git a/jsoup-1.12.1.jar b/jsoup-1.12.1.jar deleted file mode 100644 index 4f84d6db0a7bac5937b334d0d497d1849c5684e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 397112 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𝔳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%0DSTgvj^VFn*i1E-hbgx-%xJOcaeK^;dN$ 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

                        Bu>$t!XmmHRVoi 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

                        }$xO70{G7kQXh!FY2$~&O3PJFu@P?^|N5Npqj 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 z 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 z z9tq}bVQlC;j-$*pvmn%lxvEyg=Ig(?3N_fJwQqH-i<`e!=W$|`nI`TvfRbzThs8GT zicHvIm1|gaR7ccSA6I^}OR(9b(Wzz6tWYn%5FZekek}QrCSPVno^1&b`^^hgUB#|E z{P9V4kR5l)No4r2jk=%-{(B=Oi_0vF3&rA!!(LRWJ(uejQD2f>Ec@suthGu?M*BYIJt($)3kBCSyllxH0O-op$;en-@qiWY;2x~`dLwoFHdl)QPOcH z*YTw}s*Ly@K8@ge0$=&^#|6nzJOL5#qAH!`8#L`BMNc?8+O(Vj zib?G}B|0-Dmu0{9_sEC%$l8ius3fO6rAu;SRkeP1Gqgh--lLHPafH0yl_nCC^snzp z@+mq{}YSFHtWIpby<)<`^bUy{&D6_he?>9CDyRc zhS3B&wQlB9ct?PwAPVzXw|fYw{!qqrT5(dW<=HD#jX=AM;XGS=EE)KyxPfx7&GIg? ze|Eug|Ie3~05O~2`ClG}Ox|fNeI#Rv9CCgjWwj?##?5pw<4uV!d4KRzdKhG3Y#Y2s zF}~x9`%VA^>8%;DSz`TuZJ~cQ4Hg=PYb;^hkWYX^I)tPq08E8gj+}x|4U$cTp2kSz zoZq$OkFTH}EP^U;u&E&#|y7pFo7rY))vtP zDSVQ9DC`VL1Wy+z;tRA#cK(1o_jQ{?hzGJ=^#coTc+P>aJ%R{>3yH;30zN-bjt>~k z_J$^;PYI-D2dEeU2XuApkwonX;rcrm^Un-b&Be_5f99wEX65Lppi5zl{3e9` z;G{0fuw%BU=K!7vNA-0L10~I}S0?n)$Z|k488;_S@#Vte%B4;1wB*4^px3{gemYau zJ~>it_-Fe3`uySBblvnZ(%b9i=5Mf!p(X@*Lo+a3KEvCDNt$eSj#FDAv-+S(gvnns z^(7#S+y+5!4JiY-Bd?{@UmYei6jt0@IV@GDGJBCl$1(NT=lPo~8Nh8BWz67yPh)6crg)6vV#eEWjKASaXQm$lWUafYQ zc+hIyg=+G=CP!aH30qQSnvlvj+;NAcmjRahA(V65p_j$1p4kSH z#f#NoB^R?8f3!IJHMHY*(fC(2JuB|j?P5w@G-jPhdZafdSESaFu>YfNAi+}8SXde7q1B@MgK+k3y; zchWl+QKNrK)x02d6G)(^1QIp`MXv~&0{?fI}QiMoj!TtJqgYF9Aa zI2x8r*rd3SYRcd>S!k&dAr30@rVl_#NER_fTbSeMkUeyv(t!ewgl;Y%$IzK8*f#HU zq|3rDcNBW08$MK1tkz_~W-cJZ(3u<9w!}!}@ge7&wxy+?SU`+u*JXhV_AN@8y3`@j zd4qgy;VtfmYjpOW^{gpB)c_`}dP#Tc7|r3)D}uXxlobP}E5!f)iszk0txrH-F)gT5 z{9A4{|K~3CU)zo}Ef-L880bU38a)_{yn^J!fX1+bQ|D-mu$+NoG6Jy@h#gI{k!F;@ zp*6|FO9t~x)?bJysZvnc3y2JK(SKsCxH}`M5wB8Y#$e>vAl`I+tiD?k2zY}7i@qv{ z9WiPG6I)i^!KY|REvIpki0l+A?~_Nh=!9Nl-RcHMh9zjC-j&~aft;W@q+7lsAjtqI z!Y)7BQJR8`&?0}fP8FJXAvtKaAn0yrk{EvBD3L9&rgrlkf8;-K`mMs-K@%F<&u(2jKP%k2xXH5_f(`gd;lerbWiQ-Z1hn!d$GWM#n@h*u zrQy53Oq~_WtMJ!$q|!vC%(-%lNVK!esHMP*khAXlf2yc+p4W=m9c@v++<01#ijVeR zCyEhOGb+DZUPsE5^ey!P!J*{a6yrE*VT^0-$sp?>Arj))+?Fz04bG%ofdXh{2Rvk;WFncX0_ z8zVbUhTX>Gg5NXET8_Zrlmm5QwN`NlfJ{0{^y~#4+?(cSYufH~|A=X!cOXQJp!_$e zDd$So{sxS?PrIl(S76|jeJ+}mk=5`h^Q3`#iyzvQO0+KU5`kt}7c(`i1T9PO&G0d$o3ROmg*4OuaiH(5=L=MNg!v0#9b4tDJ7v~(!g21hMW~lUVx!2zS3Ng z`bJvtd?^g!1A;{oO=z^Wh7zK1x93B%U?_fuYL0KY2N#?r)4dQ?;$_XX@WQlsdXKB~ z`;Ncw!ByIj)B_``8MJs6#mQusnE(7V*8ZlD6~9#RdO%8Saw_S_+HFxHa|I9Y-7>cs z7P@8g<+Jpu`JgYQ9(c2xMPMQG=VnJ@n%W~C0t9-hcd+(z8OYvJ5Ybt;!Q zf!=+pLoGAT*fhW36{TM78EyM|xj@P+LjaB>jR=+JRiMP@+~o9u(gPF3mbfI;%(Y53 z-drTv!^1i6trMcEOy3?9>prs>=Ji)}ILn?&$vaLZSpGgb5tXK< ze%VWAzNeo}K$HL}(0_?#tb3B~bzff}^`?DTeX2y`ASH2laW%^)*_2`PXUGZH&;$0h zeMDzE?#JMln`imZ#Lxv%M$mTJ&;PU#Mq59)HHDg%(^nzX&hqqz^C`YBjL2=Jwo(JZ zx7jNFS%8j~g(pEN9c1fKHvc=K!-uDSI`$#4&p^VPSwnxVB&0RS{}5c9M8xEa0&doz zXTJ2*{Ae5*?j=`hTl|Nj1Eq)y6dIjUEmHoQ(N>1 z_PoC#GV|#UeJgKyuk3ex5o=gY`2(&sfUd$8yR9FOZuP5~R-2_Uj;OH@d$;IvWWaG7 zh2Sdyhugw1_poj01SD znh<^b=YV*(f&<2q8%Sq(`ywQ6moTZCAk&~i3@k@f7SFE%2e92@w1K6o2om7$>C*s7 zyYiuTmI0kdE&*V$dOYwkJrI#UBnWHDu9D<#*1>X-4Y_}`!xK~Te3TN-EF`9nCGKb( zWn&*+N(dy)k8}{t-r~e*g6nYbi#CMH3b0mpf@IZ1ym^9@AI9tr;BoT99sULNzj))1 zMu#=~xxE>*$&3E~=^8-A!raQ@zs60u>N*J&D^=#<#UAw?n#%^^D{Pc5eJ--u?{1=~&4(rEE$Yj|Bb?k{8 z?$@*1bB6$n%gndy>FFMbj9yL>T_h6p{#4jFW0DxLF8n@JT|`p+{%^1wA`CGUy77j% zv?OaN$%}v+BWLZ8+kV?!43xyK+ahZSJL-_{PgJ4tLr;-yel+&^k^8GcR6@3ph0scd zUo1fp)!}1JY>6(bV{u7ym_-?5ylLhb7C0TM^UDiSS`q2C;g*vnJC@!wWh+SBp|{$z ziaAk3xZ-@{P3K=+noC^NS=lV&`iP13EMQG1AnYzCt)P4KsqGwXx}s>Lo$vr~@Z<1fm@TGvlFP#hl7;Okn6PClI@1Efr}%t(Sh*fO5!~z5(p> zo`2+4ncXK@FU4OhDv^0L8CUo!p`#(REDp96D5PeLngTTfV@r+$k|+@k;2eUY%v6L? zbu`owXmlT&fA zSedqX#=&zLI0F*;Z5zG<(klq29KSFT!wk=7c{3b;Cwiuw&9duX@nQ?^)li<}PGc1m z7q*#Dv($IqT3Sq|S9^D%O7PVO1T**Zp6I-5~H* zFLUQi8=p$2)IRNZpvMo`?Odp#8$Fx7MrAkxYL2BhIfXP!=IK_{i8u@YI@;EM3*CAh`TU!3R zMq36(@kfK_L&1K6$wg{c50xs8<$axn9HK{P_ex;=ukugppR9$Mx{g1`7bNFZY##YX z(QT3ls=u6kGNpVq{f!QZ7C);bRz{E_q84g}Rq-|2T-ol2TvG(>9ucZA@o<7T^4k~m zVJ4%HooE9@Ka5u#F`}Yn3#tdI8p&pnw{A&*)UH*>*DHQ9Ff4L`j@S@B<^C;anOQ1# zS8{*ROJoK=)Y5r&$}9lyNkWXU+ydt&sWNFpx9H8MJIVkFauSJTwL5-Nlh``h_K;wA z#bPGVCd?e1M{`vZ22(*;>VV}TMC|yQZYnW3z4(lRyB&G-C%0_Uxt;8y5D_}MKHLkTWBa$1+a2~cfyX2+(PEC;W->H>9 zvJnn>!FvZOXZL}bGt2D~9Oy}pQ0rowG0S}>U3oqnomv{-?|0ehXHixVK-kEo+X@rG+>J_s%bT!UghmlE1{YI}mF{|d2HNt!0dHfgDRQM_6qbSIyZxJ+#m;5`Z zN!-fb^uOjOAs!fo96BD zGI~6k?tBE()}$94peN*BODm)l(F+d`H$(KmaSpn?IVTcn|L#DjU25ay=fa6VQ1?5q zaLbdlnNNrMM!CZTk!v7E*WTF(W=iPjiRj+z$Wy*;Dxr4q5r+leU*Y6u+=xeb2m^AS zwqE+Ujqj@SV|8z$TXQB{KCkcqyvRf5R*)f63x7Neek}!L8G16?O{nrndfa5oIkN1y zn?3@+PDYDe_J@vHc4VE&#cv1Nw|VXRp8Sh714BWVaQbSgQEDq;8)c7P%aPDb8daZS z1wn6vubnc9fzDTs)e%ZHv`?qTu9KFYVoqH&5*D9IwXoo_!}J1hmVL()Ka|VzIf#A5 zrP_`O;&c4~g&W0!GlNT%?{AFIwEHM7Maft18|Ak@#&u_qN*Kc~k#}9RB}c z@XP%pK0JBQ{S4=4cuNW>3kN`thJ;xTQ;<%oSX_cf19=++#S`sC>CxiwuJvkj~E6kCwt?x&Qv z;6u1n-wU$K5>Et3RLN3hQct_y*_4&KMW{GAkziBxF32X_NGTq}L-J%dL%(ZU=ZJ=0 z3uTD^%!j0XUZrxGF&wN-h)Ra*bD*V|U+0=&86D;2E8>-vxXIZ1Ho3;nx~nEZ9s-Cd z+AT!W0))as=X?p7RX^Q!x9Pm+@}$01SzBWHL*VC-{}9V;X#zhQ-R@^4`+ddOrO48Q zGdqoreOmp97DV8Ge--@)fuC|f6^NbqxmOx|00wXFKM4Fe=@b(R6_<~3#X!O}3clAm z?$E=-zT_*ANkILu!t#!X-cG!NMRnyYmZU+7S?u>f_T!@iiy0V|gQjM=D_(~ByAi0i zFBCsQ&2&G{zoC{qvQ7%XXKOf`&2^cyIo%(;D^STv_)xwi`^Y2o-?Ui=7tnu?C+gCc zEanplEl&V08k6qhlA89BzA}ndhD*XN$xge`)$5Dlx@eB@5w}nMpg8K0B8+wn_{#?J zTPdAB2k2#@1A#z^zw<&Vx*6MAxmfSLv$QcTF|8+JzNBViLuElA zuT-^>ULW+u*fK`60>zq4lCsipnqoI27RWSt@JVpEHW=-JoG+!Gahnx-$oZ|;QMOyl zXeJ6~*hQojv8*y3V%oVf8Uc6S4PpS{huveR-^FvotLVAzb8Au?rEy6I9R|E9jqbk1G3PXse`!S&Cy4weK|{3r5z}A? zj?fnWb-up5^fXTgZqjhFVnJ^luKa=Aw`9l0m#j}wDV)0SYw#|0pDWen4GlM&Ev8zR z{D_A)i_KH();%0`Mt>v(TI>t8 z@W`gj@uAy=@)=d@!MViE1ZG*Y zX-<^92p*oQ*&>fND}185YMnL80^hZoIntXamF(;wq6+l*>ssC4D*Ud4Z_Ow242Mkh zw(qsuOOlcgCKiG!8j7I^8amIm>By2s4LYR#<5zKwcI0e&$RRK!k8$n@(_DMtk353Y z{57si`@;Yjdyx++cR8{1teJxGM<258zx2n8(>UXqF`X>69`TA*5zol*-c=v4mEK!M zZq8)C;`)soEs@K87Ee+iV`i9@wyTD=yeIRHW`re)$=Kc{$^UACvl09D<$pYD;^gNHr;H8W+`(t5Un~jzs zF#$Cf%qIVtP}7bE`on%StQ5pjx)-`*XDs1%jmJ%krlkQ(<=rD=RC{&*tvC0s#T<(1BRCSc1VYUKv3V zBAb`9rlWVmlPE&1=@le36ATX%uYqqM>r_c<5 zA}bC2=1i@z3}lmrjBne4?GO`lr566C87nN@(325D-4@zWQCKm+N7;cNe4Ao*`a7OF zi@AkgwGI*;PIYJ9^l*6`GD`?rvQBj-YYxP>!X5dMRjxE*;t8^wFi%26J3}zdTjW;n zc$UR#HY8FQN>K``v)n~H$`I+A>B{43wfrX8t%z}(Ho7CpyjT$7SW*xU&WB1{HLJ>| z>IM~F)oiHk7oaHCVkfg8c3+KMiQ;;IyS#AI3tOMDhH-ptmMvC#c@H9BKhKkT1{x#PcA*m|@bx z*Fw~`4=bQ_LouW)PC*WHI^vcP@bqG8_NxU}IiAa2d7$)A2H!7iojQ`iUlg=TZp1DU z1M*TBAk{yZJcJ-D&d`nt;@wMyIh2C39RQcgLiQygpaary3}xVi7+|~tutE;20M(w0 zlq472HIjjhE;xn?B-HF{B9~-E7?ZT)m(^yf6vZEdH?5jxP<_5sZapn6orj|~CxxvUDQIii zs@Gnb7m^A?aWA^)tE6}m>yyG2=aV!pEUWJp8S#@+Z=UIuOp2@pFvicLv-S0?$;YQd z;P=b92UxVFR2!p_RzELG?UoQ4vQiRrG$!h$v}Wox(T0LCA~BH4L{B*EqZ%r{6pJ^x zQ8Io2Ff5*Y;Ym0BN^>yniyf*0Bss!*BZm&e!cUiX$tAjVdmFh;_H%bB!8u1;15RIi zKz7UFX-i*Qf+n-wya6W4_|zr*m-JjLbS6DkyN5QPwvjbLziDHF#X_*o4jbq8x|mm( z(ocp(=3Eh3_L<*n?L4!LaDI~XY5trwb~0*j)770jksn{XwCg-bw7(PHV!76{=(g8J ze6UOR`aGLsjW+6V;{6F0rMN|CZ*_w4u_=3WO5)%UQI^3>LHlYA1BsO?WGD8EN^>W- zY6i7~s{E{fh!^3=gXYQ{|JdseY`WlR1>0mx&8uEI{M}jc(AaMVbzot$bi;#0A0DB} z3bTauE4xrpBtMf8|K-T2~_8k zXz!UMWe7$EJ#X#&37-Fuy&J*&Lxr2DZ{-#%ALey?Fyoc%U^;wv{}Lpt`I?~}D53zq z!Xz%v#Zfu+65+?Sl}evlcPgxpOdk;f)KVMGv%w`5&@qf}jehaA;(Op&yDmMrOBrWW zAPg$!ff?JIx|w(&vTsk(VrIZrv%5FpugK*M>kHU6CEoFBjE!OQ>5py@_GZ)WTZv^O z_UfJzOPNN;3^rfLZIcc|v zT@GV<#~WvC#mZH|ZA|v%z?s9j3OR)gXOsKIbDht;rm8@>3CF%id0u>yB_b<~s&tJZ zm%3qQNGJ}S!;lgH==%u4T45*-(qf#e^=F6#4 zJy<%;#h$vC1ZbcH3{Ul!;NtQhP@lwDf z4{v%5d49v}{9@lWQoDc-iHck|ga-aE*SGO!6p_nhGUn6icj5@JW@l zM;V<|ku)EcvQ~YI1jrXEu$1Z(m1z=x#W^jahvbO9L)Lh_a%WG5ZKW>-s-=Q8#08nNG%?53rSZB4n8rOX9856`$S zKU=u{co6vg>lr&xiwo^SvW?b=JJtw8xh*1WygqNnkhDjV) ziD&uu1yz-%O6wIDgsKhzV00IUH(OEjXT7dMlWU7Q$!_X7!Fl!rtvxw5;`mh>Bspc7 zJESYt89c=U24XankFAXlDU#CX)H0(_Hl4sPCwbJLzO{<&vuIx7(Ihf^haa-+xHP=$#?<-R?-jVI>tIk?| z3%Wdw-7aoV@}TJhM`hZ@MXLriJ*_u7kahn<1Nd9%)oBiqHT z?@r&&X?uppzlPIdz^4ohxp=)~7g5?wf)o~c(KDuJLg`B2QpkB9>{JCI*hgv?+#H4~ z7i;mELrHc~BuFK1aj-^3gJr6%m(#?@Icn!syGady=^W;s}f{S;h^=zM$eQ5;X-9SQ>rA7V+i%qPUWv5|Xh z2M$A#`RYn*SucBQZSxnNB!CCvUfCTbPc2L*^qCi`&x44*5W|$4dA%MNk-GU?q#Gt3 z72MU0)=bHv&QAHLatsmY*|LwS0y$g^tpqn(udr>scygpOvD$+s{ygED@1<3z|A}IN}jgM#VhF zpl$^5jReyOG}l2^5mP%h%12^IUcRA_pFhQtkRNl$uqEE14Z))BSw7Us6rPgd&wLLCQ86(P`14ia9tBvw?o1R zm5{y*$X9xC30{CzcKE1C`F}>xbX} zyOsKb`t!6;qa8q~=rd>_@wfD4|Fo%)vUhR)lf(Ewu>apbkpCaT2`L2(C6tj<#0lwm z1i*(j#_|sgA+)t^f#X!cN_QL0j3zeIHgk0nyNit5Lg>g@o-?Acc; zG8aC?PjiY!3HhCS@SoM{CY|e?6NMi4%x){S++~&M^KbceR3DjvE5a|O^<31-q$sRZ zEp76SR$dP|4xJ!!lU4_3`uTQ4 zZ;qOQN%!AL^z)AJPPE&nI5?OjZJZYw%FbN{yRx@o2&I(tt?C?vuiko^jka3q?ctm} z`&FyrEpc%%ac6Y#K5KVgWE)xxhq@%sh9)NU6hxov759H-TE1YXhr2>i0inh==7dSi zNaBTP>G#LRk9eXFW3kQ5Tt1_OMPj%L4(GcSY)<5RKZ-wPV_qiIR2oZ>k$R2+S1cVw z$v8Sgl)p-n8R3tKFAvO`lX{rZhE(3((x)W`l%~{W)^Af8#Cl!i=seQ-Pn4Q#S2Dg~ z^)nlSrQsw*h(Wt1Q70Ue&Li?e(}nAQh+;b}`tE;Zc4feeNW3aLes^YO|7?|E>Ud

                        }Xb z0#tGk4=|r$u5>;wbHZuDeKNwF2?(GyLNxtrQ$N23T=N8d-WMQf^0(%VpaJ&3KV_Bw z6p;S=L;pA5?O1sMB}n{_Ge=#2zjE^Pf7}f4eTO!L_eeS#@OcJnLFzUS3~4RkoP9zGXICbiWdeVuP>!VyLA4{X*)e+M4S)!&y!4mcpIXtLGsLpawUL8k zg$<$25)nZJR%iR(=(V!8l$rydoYt-+5P>zj(FX1hfmM_xu7Nu>GiP+dv^4gVPm$d|MA5+-PwJ5rIv7l)wOtp2+cdJj?tm>O}+gt=Jj#X0x3Q0if-P^@})&rL%<#S zltYcA)9o|qY;;cA{TOoTi0Zc`v1kpN^$YUpMDhmV^E71;gVjemin6S*xnDxsid?NC ziqe{ux<|cJk6OjxZhp#ouSMsU^P6Kk-0P!K|wO$mB&Cyb%1NCgCC+cTt_Zo)?am}V4xAf5g%V`@;lo^Q zBsW68_QQ#29wAzX0dOzB){aADr*g=YW36;>e}bzua$v8>c*w~2acy(YKlyN-V$&Pj11+Q=#x8n01xGIit5@gJd{rfv%!LEYbY?J zYN{nIF!sKpnab)VPEi2~hIAvram&?Bb>ZePp|li(bJRmz#e~wR%_*Qw>)~01(wC6t z2%)spf^!f#PJPt{T@B~A-JE-}tIXU`1D7R1dt)Bm;+hg5t|98UP&u=Jw zwvc6H8PP^C&Po%zvIx_LLW3)?`jOiNQxexS`qA4E`te(&0=j4<5|LKS5ES8jIO%N@ z)M2nuz8X4CP#R*E%(jEdkUX1+-6>D~PxtJol!xC)>&3W8Yok3y1hbWlOKq#dKlkVw zLv%E1?43GmC*KS66s=bGPN0G_tF_u{X=qY10`v!xn&i|NQ6%cNm!rdr4lSa?r{uY1 zq9-Qy=)nnzT1~37d8)KIuEkxfh0^Ut$bEP}EEV04jYx_%)>dY@_p{}oMa-~No>cNv z0&JDRXef&k28Hfwoy z@T68vYiinQQB@}zU}@f2_c{d}Fyf^z++l|BvJNVLj@IPVS^lg6gnhD%)1nY*T`s27 zVW|CS*dcneXUy;BN;o#sbT(Xhq`|47Oqr4jp<|)akh7fu&s%#FSejQo9MSf;V4s|v zTpXB9NKm@z5B?sn1TaG36s41Ci{zx}3TuV3y?bstp~BQ1WxI(pCZ4~g5LvXdrbfM# z^u)f5^fc&)c~Tstha=uLQARh+Gl4oG(n`L9b626!V0AwW@0afSMt(Nfw1D5OkA7Vd zI?Y70?cz&fgpD0n(-Id7`S9gQxnHAAPCW$5V^HZEA8UJ&h-wESt-oad(o;C&rt}li zrph_gq9o2%I7L9De2vBlRE}nu*C)f z<&I8%T+Z^t$bM}pkT+=I%L+V?l=#@TOFFZ$;m9?HA;+Qht8I);nQhrJ^hbiMyOv2* zuKUU}SatN1bOpSnSrvu8-+70Lopei-D8Y4VmI6CFsaG2hqF!9)5bYq7vcmR-Ta#eC zC-`}_&j9R~x=t=7EWQt(BDYjLA9=0VVJDNyJ}La>q>z*%N*i^IseiWhfx- zp9)^GVuI(=fqW-Cx?73I*Q{!!LFaei%^}@`StvUpfqBAR>+88$1Q1CVE>XWeFz}1B zo!Ds4yLOyQ&!y|KFbs-ZU-_|7To$&+q_yG1r=XUoRL7|ENNrTa%6rVDe3!xFk(y`X z0LaqT^+JPA&+koXy`RyMYqx@tM2^0WpvG|Yu3!#&m6J>j;8elp*KM8c zadpC4(BWRnvx9kM435C=af#V|g*LUoG%d@1rU4>(6O70VVnD8-LwYrXOV-&_esPCP z#-wL2OLic~;IUSXGMU)ZFeY8lSAPAZb%x?urQKU4QVvrSBsx)0Ao^(!g=o8## zcb!ipuEVQOTQPP1R3q!;cJuQKxQW;Mx*oq@$1n2wLGc;gA9~qraq5Y&UV8&y+305L zWd}assasOvU7--+w$U8dR}N$$#s5Fb-Z8umcIz6AZQHhO+eu?IXwukOjoqZdif!Ar zZQE?)q>X!4H{NgW=Unf1o^$2Ly07&kzt+TW9<g<-%j=s`s>;XaEc`O!OWl@guvbyMl~;xH4M1PhLnG__sX;-x0&Cv>WRf zTLo&Vk396&>%-X37|uQ%#%t>a_=S~n=G}`~Xe3mBN-`ur`MOr+gaxmbS7|ttLe%ql zE&HW;nAnUz#$1~{@zaIUNzLT(r#sGNNE$-YuIa(%8E8Vs%t>rEiL1^DBfZ&NM&7yz zQj9qgrnbzgrSciQ>q);$c7<`Ij|ytxD*qgn+1T55lj*TW&Ymi(gLiIhV%>IF@iy1w-a%xDY$Z+5 zIFwl5>|UTt=Bt{A{1&fZsFtAR!_@Ss1EonI{}MW6wZyJ?6*z%gOWMnjmY!ffyY)iF`} z%!rqj=>|A49r~G(tvr(GkWoDMS9YgGmra5ZnGq`EkZtE&@l&GjU;FAOgNSjcm{QhD z)3Kj9_3Hg}BlOKH`Z_jQ2rvA(I5T0M2@z%y@jt^GT9z{Q^Alc$AK-6LX4Xl92{IYR z=B3CGhaNZ!)j2IYU8cQ4tcTAYO3|r?n>%61a&iP{;t@Id!b~^w`-e<=4*@8a07TP6 z)6k96z=y*jRiI56PyfQiDJM2Vl#EUtMAc~r{WYK!2r*w2WGD|kMsA8Amx90%EV3dP zptetcZSh&AT^pEDMuxk?}SZ z`If8Py05q+puIJ226phVgpmB&6?+VQoFR&NoBc)je>%ZGsbJpZ;xrYM3id!egukuo zrujd8;C~^#ze)xDXPy{Jw*Rmw17a*T2uUq#9o8++f2RyJh z9a7pPHO6<0nCgvL0 zKwA5p<(I5owRnS2AG*5UP|B(bYWweU_JfKS&d??k^+@y%>xO<-P^F7pv%g%w|%}cYCUpSVJKCxPu z9@io^#%yz--PTPWREXBhIt6~tvejwgS3cJ8(H$o%(@#TM^7{CcCBs{*#wsLKS6`-Q|s0IJ+LixAcN_y!wn9V!b66Wn>@QT)7$r zaV!Csi6h1C`(?t6lQ8ZZbe0UfVQEZCJZ|=3)dM>kHk*A(LylVWkGQHzKB3ZqUB65| z1}b)Wu%Kl+Vopt)sIn^;^kOSyBfaCNkz)2Wl=XeM0SJ2~b#nd?_PoQj&@XGa*JD|EYoV$4Man z3`F??WrGONrd#FjGzR~lxbVMnKq9DD5W^Z#1x+ZR^sD#ZQ0&DuA_Fv}@*)GsIJNLi zB-<0M(-(h)1v(aSZV$tf`rJ$MXDcrlw7Xka45u`-{C>J}oN>6lTWPrh1BTKf&^gt> zeld*+2aw=+wayGcLgSE^m^#Xbg>x_|&K|^jlH}PH(Dm&u6aHg;&0+(6obEwS8>l2a zK$fV$w%FKt&WAH+Zx~CU5|>*UMbH(}^)5Ng0A0)(d;C^(+=-kKhvCf5+HA2-BN=eEl)mCIQzNkkiWg;QP&qZe+Gfc#HdqFEy%O5;KCQ1*xR+EE%xB2D5}TFgtE- zZX>%kIVoX9&RJqFD1EnEc)i?M`KkIq+e4`N%FCm!9d?VlaepsX#Gz zquafR?a#m+z{POcQD^78L(IdP@IBVIPG>B?`Q{AI4Oh8W5cB31R0LZ!;7`|lj%*S zU4Zo?PVsirSITiAaj-(QQCEW=^7q6hK`(3ryE+Pq015EXSyx{$AU<$ z76c+WdxonePYGpD)_$TvX`FmH51dwi9lF{iI4zfe_Q4wc6Mz3;7XL5R_}_z9 zDmAlDmKOg@&8GU_zW?`x=bvr<)T*)_=u8xBw`DpObHwAvYvYsWdjM6DyFMMbJ_5PD zLa)67k;ePk`dVv7rDs8wyLBtM78MGaGuXe}UGp(SAtDrr#311R^IO?L@1KPo_&rs8 z0lT+Wzn-S1Pi_bW$4~tIyzs$L`ecvX(Ma2x%(>4=(ih<9}{)BNd-$anJ(kR60#%> z-k%@EU*Z!KLO$Fj7kKlLAMs~9%wZ~bG}$wfigXmk`bHUd`7&GYxdDaI(V4>Q_}KOTC;Pz1`FP0y>ad76v#q$0DFu3%$SC- z>#q1~Kfv$^iQ&T?VXpIG9^Q*rm z{}>EsUg35t*{!#!6fSc6qQ7|34nIm1;LvxXDG1Z^OEaG(sj`Yh4vuF;!?Ey(t)Tx#86%zuxu2a+b z+i<7+2;laLs2Fn5)EO__c7GP$$oaIm7WU_GUU>Bv`g`@$5;ie2U_V+YQm7dMC6{?( z^>D6YaLGF?E%D2MsPMN?_kvStGo#@C9>;~*Nw$fgjL6 z$DV&B)*$vi^sOO!Ib3BO0p~{hoNuV{_00&@!nr9~GbmD}x(ITH| z02=J-pv;#_7>kX5BS$+Y(tm{Opj2i!q{eYc+=-*XzU7cGh7Y_SC2orj3N8Ar+#HCV5UB zu)|9(1K|mR+$2majLIS~bWnTr1Jj`c3C0I<6UxI3G&vcGOEYqK>|18Uu^V6r!V?Pl zPPkYY^&!^FRJs8=$P5LTdJAa zxcoCmHfb4wNJLn|2^OOD)x}jb`b`gvruu!+&}YH(DPrOTT1xO(IWz}oC7095S;}O; z6~xhf{#c0)3T7-SwC^ignjQOPdrxm!`oF&ZB<@972PfLBE(k;Rw)@h0u*V|#5S+OUH&U!2`#bD*&N2r)VrsN#$c?SKKkxl1#H|!i8v`e3D@DQ{a+M zRfBf%I`=o923HaLhZiWeOvho~o+(qH3J3YGB<#2AomUcrA877S{AqETxKZ_ARe`dU&bwHS4b%33$j+$0Hly>7J+rVv7w| z1z3XU)7Ob5_9;k|b59%nLLc|wLa}5?K`3Q$$13$2BnQp=E!#l1$UC|crph1sC+Qqn z&--5}JqXyiyQ84ySP%r2rT)&(>A#D!tE$x>?%BV8N&g<7*=vF*xdAiCtQ$;>5a6H7 zmXhZQ#Ma~#%YxJk$!s7Q(7WB&-MhlC$WJ3bSdOzEfMBZ?xaA%Vk{=GGaC|VXaD8rl_O4^zO#x zIeIIRjeiL@Sn*vc|EMF4v_{RX`2#zj%#BOOcFCc5LaXFUyAu2q z4yVOvVp#EhqIG=}#obF)dP3SyD-6e1 zFU{0TU~8SX{MN#0>Cl0KD=z5n7+2~1JMo2nESRKQ<>8&yynR%+y0**m+S_@y*{8-4 zOa$_|4F)fih#RfiWl?g@Q10i#Skx5O)T(OlZh^IMxPH_#>WJ#~;9%OGQ2jl|YEIl} z(Wnsdbe|_)>%CQKVhm_|0ShL5i! z?vSU_hAKxsHoBw)M8~#Z#5~mJ8U2b-A1u(}D^`pNOo9`G#@7~SNF$?W(t{Z-MW~Mz zfb|tC{WW&O;1dd(sTBtaO@c*`POf-0hY_O@0)Q~{aMpCtZXxX>z5)BPt=m5(Xk9Np zJuz2bE9QjwHXIz0K8l%HPWTGh_0rTvFgLm~<}thf=nUv2aD8@f`H@Ke-nbbi$mbwU z;AtiliT0af-wWl|5$wN*YHw*ptZ<-AK?Z`+qJJk-NLkuhx>^38R{SqXBJsP%f8u87 zD+zsIA_WlzhKXwYD&0Yv z*Y11ORjL-RvSv+gbQS4I{oTac(U1IYX}f;8vnI<8RN}*Mj$*-&h%2##AfR zPfZ&yKpZ>1GiBclF3fUO%?uNP!NOD~D9OJ%2?}#7hOEzR1H*<$mUR`!S@*!FM?Lwg zr&1@5WgTRb-oEHTvoS>Sf+G^OS4r0X&}&T!{D+&FvR(gX+>fsgb+`vBgpFfPnFt`O z7CTt6eO2%SycoAXSosNJK3t3^h8Rx$Po9#pT|(94=&I`H;zyOxJ@_Oj&@j#SICP{AHg5WLRN-mflv%h z7C|@Kj3yP_2uFnu4G7_n?FhJTndTkd(K~Hgzkfz>Nj%iU&CzRx*7ywRd+Y?l${8T6 zth8A2kWlt=DlQt9cE^{4$bsYcm+mfhRQuNih;>8=0|qAfcY^F6<@jHY)Bo=4{&KmX zwe=^^-kYnG4T8kL(52qB=&a?%(dyI&A@-HfOR5Y7Fz1_)i{+J?qdG%s_Nu-FavDE^ zi6nlB?^mN^i&^E#0J+w_Oke%W41VYv-sPYZZ6i9Fp-%@>8Sf^+0{I;72j+dFEh5$ zZgpv0y*D8{{Wio{jm;0KTvGF?kLB(t+MF_5h(zpGn%zRaB0DHTo)Zb64cU zCdurhfj;ROr?B9do%hQy6$v_)nrYlCC@PAYiSs@y@{tPryzyZDsGViGs@|M1Ik#GF zbX>Pj6TX5Yo1E56d02qw>v5EG;0L6Qc_sXrI{6EMv%zQBEWsci{Q3_SI0Lsy$I)iH z`#KygWBXo?%%$Z8?g}cy#oMEMojETN35I$>Of(ZNLXV@ z*#TfD(XRI;ALm{4Lc_4TrYit2uuFqpG%a8C)Y$r3HRhfNbBrbHub374GC4b}dK^r! zWm<+fpvB8wqoC0L%ScSQK@p!riEE^xt3wthO(#0X7*&+hG&+c(>d7?Gp_k<`2W=E$ ztMMoB9vyvtwu`@rjk++Thn(X9dj$nun~K`wE1!IXWMdo^Z=pxL2zmT(2_z%AIqEOO zX7?B)VEK(G6oDI!oJu?B>!d?S!%o2-77~xVZln(L9XZ)5A%2+P32=%N%)lYCJV|jo z`gk8H-Lpp`s7t{JnDQH%{%iC-HB(L{)q@?lwx2uZ{(mV*bG`A&!k~iG0xC#2^+HuLY){%8Mb{B1399DCc2jd9yTfvX@C&5 zVXD)r4r3Rhgma#4+OG|=?34X?T_F|I949Z()vmEeuNBXool`au?WrpQj;k;xK(cIw zt9&JDo;I^pw}pnt#jUw-G}vk=b5llJ+=C)~O4s#)QWJ!ObzECq+ul581msc;YQu{t zH1!9ZYiU0cn~$)SgOgee+drW>5Y4)mJPx{dzS)oeB+gKmQddlLT(LVR&PKJY-$ypZ7$jW9Cv2E2(>?BVf8(5pdSmVOJ+i8bA5Ebk~a| zuOjSpHLoX`pJwwz9`3W2HLP|h%BdDPy^hhx(=ZZz7X~KKoEIN2&h+elTY+u0k`6wM zu=>-Qa0feT_sYCeT5>6y1*G~tAg20GWY z+YszG@6Onm%)2vVraRb^tB8D_K~(F|BYvAUe2NsJci4rheydzqwv@1}Bj9~addvL&Iw$aa2atQP4WL0KB_esDyl+=B@7u)+SMAcgQ zGB0p|Y9`|}s^7@u(zE@W0XJe=lPHJ4%O=Z9i7vkqaYvhth;SF$#*KT>WvSH2ijxJi+uE?gj%1l<$ zc%TIW^TkR&8_U0z_|wL(eg$@>6y@JTft6lYdwv)?@kLp+fVrC-E4X`ZdIt-lE%U@5btwf#EbA!#Y=he ztBzYc2}k4a=^gT2$dBdwZpXvUR#_!hG{P+PWYQLi4(!NzdlC)CnF*i`po#aF0=2Mb zv~QQChsYwgu{S^_D}mKYKfj`AQj^euBxDgMM&^G{3wcnb3^yp9jDjR&S42EuOL&$n zUtH88WLU>`bDc>k)9mJ>Ps@jFxfU)5KglQP*7#M z{)dcg=@&C5$K8zTFUL=o2eU41z)#j<6DD7m}iw_{9Y*&}+ z!f6G%`}2E`i?B3II~SgyVt&7bVWfVRrUc<*%zWj$$XX|fF*0y8}pN5 z43-f$pSiz66P0zqjAQce42&H+*M{{8k|%%`DLTB_H32@;<76r$y(8tU1brA29NJ#s z?4eka%Zlmt6K8jg>(^bXDDLGHVWsU3-GC=Eat1z00R>YPAV3z)Od6A0C}f6CDw*&%gx@))x`$ZmTd@(ztk5pwn0;iip7=yb6XFkf_l?k?|uVLMf5$QV)MkgfYqIkdRlsu>-y#n4(iSGR= z)@)B-VE-E^u9QublY)BK-=GQQ-#W7Y*S^)=#lsTh&-Bmb>c9P6|44lNbE;INrEH6- zjwS3EZxuh8y4)DCd=*SZ%}xz`{v5oLWn(HLqWpxW!EipW~(a zcm38UIuDeK2>Z5X-rDv8F)xtIW*AU)MEJufqzZ5edK7ZUv+V+%rUH*dVTZDwcrRj( zMY3Ff!(5K{P2`jAC0wj1397e{m%}f^YOAN1i_5h@wTB-Z!UAX-vRT&c2d4ccNLCwn zUbAlY^lem9-)Pvm1Y<-S?LH`tWK%MO4lKx#U8=^c4lX^+JL)WjZ(lz86U+%6+=gDs z8%K;sQjo8;fs-~_b<}9v%5R(;5^0o^NS6{LN-Y?3mEEJRY!(Mafln+!W#)5PjZ>&1 zx9J{ryz@DEDbkHBCoFds$SJ4tSxU$*OQ8TTVd{~7ss11w7&p92*e3Us5#Yh|Q0bqn zeK5IbRY2vJR270&u2P^?wkNcrtaN8Pf*OL*#<7$El)a<;0NDo=r^2&}ehkgW2X`W{ z97p=(^i%GR(7NX1R1RjwinGIVr=qoT-giRByeZj}feqHhJ8la)*;4#qfwHc}-MdyG z85K6}EwlQlw4nk^*|&}8xM1&>_j^s9`C z$%Ekl!4XAPWT_eU`H7AceA{0%$q@}2PKrQ<#{>?<<@!4~>i<2g_>bf7B5k8TwWjME zay_>C211~Oy#8|>o+dCa&nKCN9XOjVW+x%CE&>OzO@xzA(&0Z+y?4BCIxHq5F9TC3eXuPfbvCZy z0ma@~lRO`KdpugHqxdqtqO$34M5BA1LUVY~+$DlA;5XPwQuoL~oY6xf>vLO;QKyQm zndv@61YQ2`akpV!A7E*qnIGf4ux@s}R*)ts*MH<9-Un^&BzbI`jQ*c?hzE_87yiefxIa6a3`9(Pl1wG{<3!{Ij?pS!_2*^o1Tvyyce|`qe=& z4sUQaM?ud$riJ1|(_yh+xc>Z|CM{hj&8Pkk zv=?MyZ>i$RIun?h@B*1s&04bQO;Z2?j(7ZGhy3=Xyh}Z=yf8VS33p6d!Gt1y zLdxZVD868eN-;G*_eR%Tf};r4U9)pRhJ8umg)Jtn*qYgRHhE3u>2$f3#s9h0q9a#?nPLN0ZBtfXhSTu?gpj?QbtDH zg$?$rT+w50v5%CmgnsVAjM)dUqR)M#MceX}zLu!j!6%JrlUd$5FPon(mEK>!x9osd z_Ukyw_Jsva;T2!|VHrG4gveN=sao(2S_gIMo#)YQ<-)%)V2R4s@m9Sjy*{5d?|j>(Tj<~%z)2Kw^Uj8wAJ3Kt!ijDe{Q!)|B_^C_jY!EJN|t8e4E}q;>Ba3UHPFR%u~nI zVd_Bo8xx@7Q1=Ldwbt?bnQS_{I*lDl=#K3F@3Ao+M?H+LkU&zus4sM2n$qR z^(wH*=C9n#Fka*-y|(Uzsvh3(t$9Eb$u;sGcOC^>=;IFVkx%#=*YeF$2F<;4WBJk* zKkzy))zQBHTFU4JxB?kV2{nCSW@lTrC;W7OI&ie%oMIEJN~FJ zwDKqumbVX892JicHUhPGB*f%-A$P zm&V9aG7!8U7qYhbZL<_tTcBi!v&SrfEyc$E1DHZ&wci#qL-d%DNlG?p537)lau7C9nMz-e0slI3~K=A(ID)HosWNmxl{x`)hx>c(bZ3L)0B3pBx1%RU`>THT<5NXm>6|&Z=fSw# z7LmD^K0d-pY&kbKladpnDL*mMs@YGxMe_PNI8WGbWjX9lG2+V0iLO#MID#W+Q;WlP zsaB%-qQ9ch_T|j+S=F0);miqw?=!`tZinc@N8^i`7#p8ys!FlQMXnw9V4@ut{IPuf zF$1W~jfLXLVxbEqKsr+tAITnwC`F;Ezj6f!I@dwFkcA|UKC9rp(gDHn6q(YjuJ}rWW<4qxhq`BU#^whZabF} zN?6KKf=I)J4uU=fc@1lzY`{!)fJ=4Ir(yymDq2a({utvKzX?iI zO)aSh$n3N%=&s>t9uX%b5oujglWQvMj{8O~7-jS1Ghcbu#yEERIWY38pha3vcf1Tn zy!*UfNdLQCW}cwMI|H>UVJQE$o?wope_+mhg_Jzs>v|=_2 z@Qdt(j013$DY-~F@vSQPD*K!mgj5c|RVruA z;4l~iq)6m{`PsX#9QjSLhwe%QZ@A$-TJ>faAvfQ=3S2p4sDwMFH`nwL!-UF=>>L=u zSfWeo`S+T3cH3V5!O+T(kf7EEKg;|Za>Ee5(qQa|wpyPK;??X4GE%nkmRRd&S@OxX`U|kYetq1p_be+zp_-bU&{uuOJDCwDT4nB()zkAuZH(5U*hT zLDdu9y~O5@&U>5l{qz0O1;?(FL^~7dS4|(&4GbHFKU}XpIyHNOPgEqjqk2vfhf``X zZd8s*gtUF5V899%41Wz$H&xQmtuqqTwPe%E8t@ohVPgueYrnXSR1S=q_5H43A0| z^RgrF-3sfD^M>mogID?=;9sYxvQ_s{Gr(75ol!Snk1`%Da;-|kPkuxEl(l}w8JB1U z;HnfXdc&xN@-HGC?@b2W77sXrJRtZoR4o`)oXUkVLo6VF^`q@&`o$FFKdCGM{n4^ev0CS zs`vw2v64BerdSX3qXj3-lOKXooVdfD;m!+6N7Plt&i+GT{SOObmty{q5R_P4K=X0w zztaN!8NO*)f;|0f>@EM{nfyOs{LhWYKXXY{qM|AYg$K-BbQIm5LJq-pt0B^9s!4&1 zLn*T%V?+)nIj3$X_MJ6OD`mLlMIb60TJK9>;yx2{&84>fISh(AnM5iwbl~m(INkPZ z65w-^o%V8aRkH)e2JVRo3?Ov=I-rcPKxHL28Q&`XF=o&Q3n$+xT>La|iWz3ia^Y|} zKX09rPP$rPKwU5lMEa?a%Sj)`7zBDo~-LmLZw_PvWY*u^zB0Z1i!yy6fs>|YaQ`YpYrCC;^y+~mIHM&{{0vH?=cQ^&|4mCCY_}z%1dPic#pbX!UnVD z*wWnhR$Gg9f1Hjrn4KkUlnzHqZZ)6eSL~xJhTDzz5G@_{hpV-fGf>qlBs=V_KiGocXydY!E(Hq!L=}&1)%0BS4HB~zhWD3-LF0aee7r5{>A6=WT3l9yJAeXJ2 z%;LTRa<-YRv5)*nmgQ;L2|Vp!AJceYYq#$cv()JVR~PZeFXrO&KGu z;2kOK`lQ(O?IJ<>qH#`SgZ3pVTtxjGfGQ_I>oTkNa7Aq0(9Ef&?Ivm=!H`X-^F4X^ z>P*Y2*8CnXkZO-FQ%(Z)o+d9=DpD$4DoiR_N|Y$NA0zk)GJhYn?Zr}fb@MoVVE29R zVaD|NcS4_DXB&psj5N8}NniySaYTh?x5|sa!S~9Vn~;D$c2D7exu_WIBl$+UQvCDl zQB~6&!xT+A%IX_*qC{6^^xmI6Y989h~;e4=z+-wFUxv z`iywy?fB2atfG)rrTz>);s_X6;@R@zEaT!q6mrDo1jJ&`K0rkcAP{aoG3fA+j2!)t zf4K7$EdEwJtcc7E{jdnjLJ9=~N8H$K@;eHd4XK3|0tUMHwwyT2gg6Dos6iB91)S<2 z*f1_gN*ee}1IW%Vrv>#Cz)mU{VBw1fefy{a6%j#}Lq)coBN)>R-+E4~XAc{Ru2zeD z$~o+J26ngwvjRFRP z=qShk_cI|_@vaW|7c+WP=vEo4G^Mo36bqeEL)r#~V@6~Kf=c#LZKlig?hE$W6vLF4 zyBK;XTmm2Egg{4_&hy{gV&r+i=vIEDc4#7K*BZu6Y0TRskuSxp_C#9Cp zxw9S>oJjN4dIv~fT3SIhoMbioTVJl;h-n{=ZKsYW8+34A>T~@G|E8OIbp%_msZ%ZY z4xHTx-3CSPn9opkyVdNqdN;Z9OfqwgRcg$ZU28HM(*(!oZ5+?2i?T7zg@lEKPtlA* z)}-$+xb8F9K9$6Hwpn&oG4pojgPU%A8k_Qb%C8Co7X0W&{J|A3!V-;`m+4teMuMs4 zvzi1W3dJYRq%g4K%@ZF8nv^eV=AKGJvMmL^&jAWd1zK$n=2$OKVd*)vNtnzEh*+X4 z^rE_Doo_SHL5}{WXhLIW5qsp@ixL*x4b+LZo3b~ zf5gwjb{bIV(1cy@81jC|h%pT!)<>(m52of9M92B1gHuCZerXQ?d^Akd8TqES<14a5 zzOpS_D$tq+Lov(br;JO*5z+yZ2fWVHewUt%owP?rJe1-SQnbEX1b+WFG zZwx!9PXYrqv@h*<1M)V{TNmu8cw}U70oD@j{XiUPgb)tHy)L8awF;j|SkBz)FVCA` z?7G zg;4yk3k<+Yq+2|0)%JkdjNHMTen4h|I2Zn58ARcO6N{-Gj8%cM&Vd*K_`_g8cHU0_ zZtn6yXKO+z#fV4t2~i9Sy}B#M`M2uQ9J3#;+@Dos-k_U$Jj97F#E6G>VtLLjiKYgE z@;d?e54@Iuo&afWz?}=gUv`Sr2<@x{={IX2W8N{teV!#q*lWkfr7xd_Mo|6kgGCj(8szU(RBtjZJ{?bY z&G=q&dV2hRKZz9uuk2HIk`$NeOOC|%!Rq4?(Yav|iK{Ev)x_4@j55XbW^mYR4$9Q^ zp*c_q$-G7Qsl7QA_>~VU*&6}jBNGE(ytB!0UDOP9sdmHUK4qJj?yRKFL=5W2Wh@`~HV_0rKWvfPrriw0U>rmg1xm*}ZTV?NfIH+AJ;OTEXHTihG^_yc40OnuB*0#{wNU0__ibfm``H(;tD z*RW?~IqBZ+aKaALAy2SYt;wVEB=WbTT9a-W0B56NC}PAL)kV*#vrpV1r9UJ%MIv1pW zDDs*gB1lWZNxjh%h}$6V}e~+XT2d!QtV8;rDou;P8Ox16}=TR zHciAnhZkx~ec7RKnXzHmex%j@xx}LI@k}wdtgcJ~{#%w0ipumT`GO<*k#c>uiX9xm zg*U&t!TvE5cEgdcEZ-G~(e=yRqvjQCD~GKgIQySULeQiM z7`;O4yQJ|N@bXTGw8n9Zh$s}(>nrCkHyR7nLmv6MgFS70V&5_Go>Rc6@W1WHfdQDv z*AA^_=_tYyX4u{p)q>>5Kapjcy;qP3a zVZ_;=VT2MBg%nrV1DIzy`o>T)+PdfC+Ud0y4rkl_*dHbPg-QxKh8Vx!g>W6&zIby!~ObRuNkaJ^qcbkdDDE;Pz7Fmvul`TuK#u(ZVPFdLPsLR=vaDD4WvW)k^nx?CfbuKuyx)o^Rc^aIF)}1 z1te=SE08U;+h8bA<3-rjbW|%N!Tw4p_LfuAk&IR!n%hM;AHlY&6<~fbm}|EWk7Ky0 zWoi1%k0TjG!rT$dgKYn0#AS5i%SC`!O*CYN6Wt2e58r`?MBIWDlj5V#4N! z?#qAPcjiS`{ny=(Rp?;_cxd=lQDYul4t)AyuN?oSk zKSfB_PA89U(hFs$=b|83fg*6AF3_fgOXHEC01VdqqX+?Nk&|JmP0=PS5iELC>WEkQveLR zH$;=MC=NPRRb`h+rp)nc-7wl#E$8pq@;uD%+sbgWp8#PDQN5)IZ@J}cV8IN9Pjmwr zh5Z7F+M|7qP>3h;aHv->EPYxVI5xr|#?8$8wac1Wd6j5aAztW5GO(6-Khg^4 z7TJ5g*fR9NUidhU_XrEh)wpD=l4H{!_ zF0vneYpua&cv&yxSAGxgy>@t$vR@v z*ASMQ5cYZ{r&}mcO29B;{is)nh-f`${%lX_stSl=WHzLj2*`m-v&!h#^^k2al=%G ze@!zHaESjj|BPE3Yoix!w??E7IjQj@29Yh?@)n7a&$sdkvl2DUDrv(9<`eDIhL(NW z`9nsI8F7`zWZ44*^><4FGfPA6G*gO#2_}&gM2*p)&T(k|9MnG#8XzxifEFzou8Vl2 z9&-o)Oesro=TU1nQc3;kIrq412IR$^cpLkwv z!gv0@J~08qxuFYB&?S~e`L*UVVii3lkU^0VO~g}|RImn#xPha9(~UdoAV&%PLj$d} z^i;7b2?sBFaiV>`xRKSV_%%T&K87{8T$4QxSL*{5laZ%U(U^O^xwkNqFE!-)O#5Cp zMGL{xD8rNrDW0n?`~0Fi`}TPhBeaaR_Mr0%`?SLvvTe+L*UCfhQq1>umFRq*6YDxB z^R`+;U6=7}9_h1}3|R&?!g0A76MrKlNJ^uAzx;bMJZtx~1OfbSH4$f{`sFd zNmlkg$jOp>UH2u9uQ!hSmv-f=rrQ$^*~@R^cD*8Jl*I-ji&>K#W(TLMiAT>H&l0WU z3Go^ma#|P8u2%$v3j*GCa2nLG#mZWWQMbYVg0r2+{*X;s#b205d!vyb2QV7B*zZTB zPYQnFiglQ1$fu`yCoyt!Ca?OHn+0AewZV(@Gu(nW63FcF8?d&mJ(Q~DendNRu&_9s zk~QT}ldejxX8G#QeEfHZ)2mhmr@$Cb{y|O`OE_C6tPlK29gw1#zxl zXfMnp2Ji(}IOKwZ`N7>y>_Xl~Vx5N|Biv9fw<*;XYH$gm5@CCQ_Hg`_oJMHFv$?GRdo2hEK8&;Xy;<} z9Q)g#%f6-liytN-WElfFFrEV%)GZ&$5c)xCFJ1b=$>AdXu7bEzah>=!_tS?^<;Me~ zr=N~7`cVWnBql0|x$a$o7uH4!u*8bc*ek@g7)N_(5CoVmrfm*641EH5Uy}uzv#_d) zn5j}L&yVVnV4?FEq|DF44RyuIM$lJ6%v3`rRt<5|7}KEym(xSM+q+G`iL~-e1Xfg- zN3g^SAt!IfTqv>6{KZ-&7B5yd*jc_exXNos%NLGVhq<{aZUvj z3791^%U9ws^P$i~LS6f80FLQvr)O2APk7G)4+f%&lZR52k5l3mr#WkW@^BtiqQest zUp>zSHlDc}K0H4^Qo_9Y@@c3^q{825feW)Th-A+@dnhD=)IYG;5=Q`CuXo|K%a#wt zsG{C?w^9k&O8>yZ*l%-gx_zP;-bibg)Wf2NPL0H4gPt!ThU~vy>nKIUFX-D4nYfF{ z)o@!Wd3FHW+BaSS3NeQ861GD{an3G8bs23p_RiR`$mx7jh1$-g0ZJGv;$K>i$p&-D z^_!gykr8$bI9@qiD>W4_f1Y!rUaAk5dwD;LFFr_})c7c`@WV@leFrSLB4S^6mDi{I z%gBW8WbOUFjoC)i2L1L2*kd+vOy|0@vJmCmwEbgdOlG&QHLoQ>I*vD{MS$B((v0qR z7>-EumpQ@6i)I-ImOjdvB-AL+K2D>2wd8m44CPTIT>=-_7#N?BD9n}mnuCYzaL0n& zHND6-c4~rOv1nbe8qz&8*j*2@~5i0#bN6_JjH2p(i6iv ztV*>K4)@sY)zWf+D$*zeA9JTW*OaZj$uc=U=a$k#AMkkn*#^(Qo}5& z!q>?*LRo5?mLv=c51G5M?E|CqJUlkH0=px%oL*t(nmpHXjNl^5EiwgJ<~Z;Tx<_1k z7-s~t@hv6QN2cD4Ue36gsY|BnK-q7jjbfqxf$?f~13;{wUo%R)H*rN}tX`;KN)p*H z(g`Ms>s8zIZ*(Z6ek>3@r_yIyecF;1T7egu4Y#_3Gxf>I!(}2^)N8v!DohnGNFTTO zfnv#_ka@+&Y@$rwk?&B#J%l@`|Aktmc9WU7{9T1{lKu=?kzZk? zMe|4gPm3uB3bvk%4Cf>NMojy2!+Nudm)-+iy8tLGto&CB!GE69D%R$n-X7NfcSXEol zZ7wb^vC*E3IVRHahN>F^+9w1nY-omjomZ@~!uQwOpF;`^FuWU?Coo;wUA}HR)C_%m zQJ<}`YO5L{Yb2e+!yZMF8|&(Zcw%T4lQ+ui##V&8klzf4@7&kBENG4M`iLm)SJWIk zV1#};n%8<6QGQP^ep*SF8eYp~(!w?|L2o}s0M7Sa{{mH45N8~ea_Q&s3y4>w(iZs`Qv8%Pb24SnbgwKBUtc}V6PdYO<*Q#s$u@TJX zu{eV@D*RI@c+Nbvme(7+3q-$(UHBQMHM06n$D1`>c~{fQUO29RpP%*ak_L>&r{QCp zztj}!KNX+O&U&M(+|$4A!%B)1Xo({}UAqSV>@G!s=G(*M9pqti9H>W(Z8uLG)dVXM zQ;c39v@kdCA2 zPNUkklubvM+N}F;oj^gvo8R#Hgc`Fxf=cT9_m=!dSP?YM`QjFYAqaBM_b3JmvrUW% zJMl4vVV0Bq4B+*9W`@9DjY4pijHwc^suphD_x6G_=1&wFu82FAdOHnn?7ZyxJ~539 z?C*oLSiA-|zQ*z=cSUYVu-rh6%Rj;8MWS;7jj182dSEiR!62__;EbK8C~O#-S}=nJ z%QRca*kFiJY^{6?iU+zg8Y*z<3w62$=&dw3Tn{{Y2^6Jz?MJu`};F2oy8mZI^Nr@*kr1BQoo()VcC zfd(#pSLypT1!5`om#WgO>Dv35@wabddgjPyCu@s7tC1 zt=}1pkb3p?sob9SC5>aBKj8N-*YgIo&2!xkFNkKS$o{cg6O31kndW_fPd2TN z5o|n8`|eo6{syURt1TBz;l>e(XoS-kUxRwsm6&=}HnbHPBfh^0+`v{$Pav8&7xPv# z8uGQCD?gY@p5sGO;u9o{Q7*;J6A0-htSLGV6%oX>(qSNNQLOajt4?59p2KJ&ey8}5 zTKq~ICut+ffo5&}2WZXx-T4sIxqB;H*!$`xC%Jh0=iIh~`%)W&7fU#NK|FkUf9gDJ zG{(kFQRxCP5}IdZ|13bH>sX;~qf8uUOX^oNhjIk0@3Yhu_v4-0n*|X?*B@H=_^UN& z@21MPz0BDw*=9{Jd> zo9W|hMWf)Q`37XXZn>7N*`51N$GdD8k*E3#X8t9TVn~kjLw%6>t}@RQv+V;_R_XS$ zmx!jNG|x|@aXhnGq&I?(JemM2reO++<{m^!|frx30zuE$^fh57htTjZ9TLNhsxWEGv z8<=AS2lGO>@2hTLxex_{(K88%l|uueu@~vai9Ng!wk!Q}cy0n+D=|DPMhuM+gtjyc z?i8dY>bz4i;0zZ8&e)6t;zm-GjapA6^fL%h3c7{Ze#447^v7$J|5MHvgD9**ShucO zu~{&#q5?4=gEHi7;bvUjtA1+B9b?57$uEk(^V0bORZD=JXJ_@J@J2A6vZwC^5>;x- zxzwrQ@Rs~u2_tZDX4S}C&9$J+Pd$~lDL7{oIuIqS2oh=sy&x7|vc+~G{cG|6F*E-h z(LQ(u1&a=#$|=RaS||KVYyaP6!oQK(tJ4hs#3>E^-o_o4WH$rwqM}kchj7s$X-I0? zk@V6PxWm;kDcIYw?8d2s>12{-!0X>6zR8+?QdP2jm>Lqhk!liUL3JASh{)tNtGzuD zvi-1M&+_~Ek8@?lAQr9;T_EjNO|1DYUTfqd_k^WNe|s1*HyR`Tm*50zr|p6;xxlOF zsA>eJcg$N{y6bz%leB>oLmaea+&=l23JP#LJ9wzpVrPm|G9mhs?EF9iI%E{94t3xf{Jqp(6HUdg2TcLpD_T z_JDTtRiCPguLd57@~d5C-)MD9_q;WKxuDoh#yX=N=rt866|h)m^? zos-OdT!xVB2jeY}W*!GSdlKJK5pVT$^d(^u$mOB8I( zt=;MUUls@gLtP1scI*4qIavJAT{UBy*aG@fz6E?CC@cBg$B!{ifO|0yEuo8aG}V{f^!N4WlA;4amD|8zXN z*IQ}5fnfzF%Uvt5DeNmZVdd7Io?%ml$x?kV29(2d7ck6$n5zLw{Dn+&1XTr!AHOUd zFq=0~h`#-(CAtP#Q(rU2O?oy%U+{`$l!Pt(DdH%sreI#9-`l6uAfJqkdfHUE9?I-_ zyPz#s&6!|YRyb5a>ASq*b*VA)Rwq9g=j{;Y%*SW^<-78NQvUZEPl=dOP+(&}z0Z9% z{Tpn%2B++Xe%5mora=KE%2Ep0L8<9?eEbQ=fk=0GN=6bUI6pHmh&_v`hgG2=Zz}PF z48>cnV1=v2c=s#!2)iIEh@c!x-;HnZyd0;D)%jG6u@h{kIBzM?Cwu67#41JLLb!Q50D9^ow zzv-ej@BZ|85rmY}8i8OFz1M#31>^+eTruRD_b|9bPDv#!SWs#HEl_F6526LLM2PI4 zJVuCe^$Nt^6x2x+9+6NHfgU4mvCJ-Ocv|$%0fsyN^Q>!JSMP{)TXe9g?fcU=UFMk%^{QQPxI=^ z3*STd)m5J#WCnIOQ&2v2%ojz2Mt&ad$^-w(#%W+umde+Xig26dJ%8EVn~yQ1y9JWj z^xCT~>X+Z`23*Y(Q|@%|sB8m{j8dj63!SjOvfaNPy+O^@DGRvw+ZX@W&iV&EDW2o) zvW3diTA>yTj(=rm{W}!@_gq&fL<+@B|Amjz{sHE-%sm}xq0p%hwE1rC1r4MAJDmFO zfc-z}uv9}esF@bjFSwD_Syuulft)D zdJ;Tn1@@kCC(~Nx*yj@Q=a1}6p8cy&zrAMuj@L)TQ7dbq5y@zO%HsESPE!%#uIqgR zHs07*cl{k^ezcjA=f1K78geOzV7xX2SYqma#*-C|&`1h^yz4Q0ZJsZkPbAy2)~ziJ zph-RAlByxjox1N2CXMQ=*?9FG$2CCm7Z&*$`88zjkv2oq)!62R<2>Z?$5US$O-)VOvGF zLjOwts--G(#4TyQN_spCUJ~nU@G*2El`_3tLS6Uw+qlnUtBt)byHTRLN?$KZKh@f? zqw8|Im;(^eWtB<9=*k{knhC_J z|1+QuJ~4r@7yu$s4Du;uP<@jZA8|zBRk3YoY*&3BuOpEE8@%U+7oPW@^PS+?JLVg7 zzQaL#x_?QI`G06V{d0zUnOk~s|D*Sm44uo+9J75Vj+N2rG>^-gGHrB5!hF~2OHC9Q?`yB0?e_9Kf2QH}^Ui0Zu+d53NK!ei^R_u;+pr|0|QM=Y4K z-W`BdepUqU7P|ydRN9UUSOH$d6fNIqIZ;mfJ@B5Z@7r zq5u7hOOsIZc|gs+a7X+&@GO9h)f%gAa3Nt?<%~xjp@2YRZogx7zh-<`sO_LtwRH@r zL$NV9+};u@dLQA*-D=G@T)BARRN3TwkC`LGMR6t^jHx8}yz0o!IS*yG{Y)c3AUi%F z*{Bb}0%-iibVvn#H4ku}aS)?Hhs$aXpnep-E25N=ujZ-iO2VPKP_`8<`JVkI3;K~4%yBtYj1n7!w)qy1s3R=|;IpBsE(m_P|qS!+_rNF=5NgyFY zQgCVMLiH4}H8GNsK!PDBx3EmIH6&V}GwoZ$E~)!B;aDw{`>e-mBwmlyNInSs=NhRI zd;S#wt+vbmss`f^DyLy>>FQx+?_%rue`uW1{?FULFPG}HQCCA5{K!dfiuj!4Mel79 zzg-n~jj|aD)G1s$GBl**W(AZV_QSvIHNeTd4Lw_#*_75je3HtUOK(M zkEF1+WGr1U#~X^+NPI(EtU5)7@6}Oneec#!S*_o35VxdL9=7E;x8|(Q)m_xa$XkMQ zs88TJQ!piM7#FxyJEdEu!#c^-fdpu--ZN6emkEcP5TaAB-NjNfT#tu!C#gZR*UkR= z)@O0O&PX=}5cQgU-pd(ObZJ|uGkoc=L~d@n=yi}!PN8Iy|7CqA{@8C6$*Xw38E`O> zhOWn%>uaPg4k>9e#`RLN7FkczcDJj^UR#f+xhy*FW!FXXBk)5NvMRSyN=t!DpTF|) z7YMa>)Luv3rjK;-^ke8jBYgGv5tb;B4;n$M%1a^6yh3kdS^Oeha*{!Bw?A74g-y{LoWI07HP@Y0Ez zqQj^1rni0k^G6Lu2FC}RMON8f*Go3GqsyL-{QyAMXvjTYR!UQh{+#rECYuxg&@MJGp zg+5l0e=Bh{Y~*v%#4Z-qO>ml#WisJrl%mPt0k+H}8EQ0`EdVbeO907XmDfY||A;6w z7#ijcZsFR`fdO+NdXSx2NIZCfef7cCt)JizXF%(H*}vc=4i-YuHsBeEz)_eU;fVUd ztjM_EL0_CVcVMs|?mzcdp3F#lgVprG0r#cRN5DMGi8&as`%hj5eeiqoUG!JGViZND z$oIIOU1%_wZ=eS{umtmp4?SrIq)fhRICjqtW2F%+(jC(81wPjYBm09hFt6bEo`_($ zizTjDAwif|c<5KySls!cPq9MZ5Q3Chzn1^S0SL6Tq2_MN&_-lqlsc0_YSq5l0}u1PwXgjG|}lr(vQ{|8H! ze@iii_7DHz(C}{$|GvjHrTxuMJ7{BfvTo-|pa4Q5XJiA(|$g{=+d%@>#mzUS+C3U+np+in*%mld;(Pn3G*IxgRf z+LVK^|JlH)>SMx)?W584CmMPvnrl!G;`c)|X+6|`>i%sv? z3ev<)Di@Dx!6xgb#l%b}F3CWvel~xVkTRfl4|cy}1VA_0IE_dD3mcd#Woq~1a|fcm z|9RLM{&bc#d#Y1TskgD3C0U;$#~IODm!sFhfvPFn7vsQ@O_`y+!IJLXl4X+<;y$qR zTjvI%-6MS3H?S!S7GGqE#%7rm%WgPTM@?2OTw_6&4sNen7(-Qwy;L&@KH594bC>Os z88_JQEfm#dI9;h`w6a7V_eJm;`_q)krgk#(l~vrbcPTe;G#Mp!m6PYhBTvW*V11=&uj|B((|dPG^u~n*duUh7i|qlZq$3IGR)hk^t>h2 zqE$uK*;&;^ogF3-J&I71zc#T_r3I(>FG;Wwz&NP#miQW#4Qn7bwC{# zWd89D_u}(67VW0sk?6(2tiP?`!rypfMwS*R;lH_%tlkifCP5 z1ruP#(F|}2ud^PclwsAnx-J>LcnO6Lj7>dx}1G2dXwH1hJ2(h z#&jV@CtnEgFhQ+1#h7LcHIn#5NFy5tqrWJel|&F(gfKpkjT=I$2zGDPM4YA$?TqGkl?igXIL_`d<}84T z9tOIyfX*Uln86ue2`qD+eWULl*3=RS+Oxm^L}oY4*^-N`y9Dj6Z`&{tdYx z06O?Fg>RZF^eG>q&D5BNoEws0cddy4(NU+tV&s`-3Vo_V@PCt&s7ky`*m%zeXC-a5 zOXWwjUp&ENQbn}Cvk#bQ}N5^mEh^<&N4>|Ah{ zKVMn_`?Q=o=%+1X&=0B^1= z1RWpwF&$uDr1-W-FUf8|WHr6(4o(YZ0esES54Qf_|K{cOr*lo#dqi#nWt{Zj{Y6Wa z|Bg}lk37v{-Dh8XUE=rjq}-pz!)QNY0g%wx!mTyynW7NtgRr|S@RI29ixtheg=yiF zb519mfYqNhD&`!-t8|pXXfM>Gv_Af2w$&1 zcK!0t`{jSG{PL3b>o=Sk!wcDv1=+n|6+*-tyMbgV8V%nJV2Ia%Q)*p}VbN3FWD+4C zBJA%Yv^H}7@tI@b@&`g!h-2>#v3VQCP=m#j1DPq_j;Hh8>n^IDdxVF}altOSLBjqY zGVX2kC8kN2^?Hw|f+je@T{IM3q(hY!PbOp=ggaQX|pQ>cuk5b{UW47}b z^Ez@BW(|5U)h-dM%y54MSlXodV2XFz`b}P(jTNQxu(M9;V2>TBrFo?n-|EXjGn6V2 z1xgIND{=Y9jwcF`_)b)u6RNh6I_gYKnR``eyV6K0P?_^f9U^0p=9de+zm_jsQ=28h z+V;LxSjHJd&=qU`T(~>Z45D+c=9>Sm){7Z-q#90xYLwKoA(&ale&AtVT(;8dk{D3! z#!rfW(i|Zennb{>(^f)q+J3~;?7ZK+13S>NGB^30omVk~@a*&47N6?HEIMr-$;Q2q z?L{irtb6uarr5i~?1%HaF)ioxhkQRHn&jM?CY$qO@6Ku?ib<`_=f z){Q)TXURJAsR;o@+?SMnFo5{U^{6N_w}y)|`sqnKpx<pN5 zv!t|U%twUE#-7|~9@_`C1%5KOT9IAL?5P~&zm!D_meG0Rb(rdzc{?(QYr0@o2{b(k z+sqp0si%*>OFi%5ENfrKq+AJ+cgI)vF1GD+L3p`YccfhPZu=` z*(_(Rqm=${C3+dw9z~zx5ORNAwM?1{kQk)@JbhfNi}VyR^Lxh6Gm+r2y)(~KRU9s{ zI^oZnY57tTn^u$^oBn;IRGQd1P@}WdM{G^vx?e^1fcnV1N(K-~WGQOkw-$uJ?_q;? z=GoAm=Pwe}m#uz4^%73hhZ8S%e=I!{2>=cY(z6fs5HN6_S&q8lQ#ekaf8HS%K&(^w z=tzbdX0#KTa$zsBEu2Tkn5d`r_CnMP@PcuAXti%fY-~;II(-IG<$edw=c6r6ZSY!qiv7)sJc`BU&-ImePQ3BS5*a2={ip5ECpbQ+x<<`y}ozQ;3K$@@@?$^cU}3 zkP#u0KRsL#!8!Bi>BT;t?6?eA5zFoP$E~L(mIPOP$#LB{vdM z)?|8JL2O(oysw)n-b;*%^3mI5ubsXRQL|a_?P8-Ud1em#Qy;HWHiSlGJgJ&tJJ0s zvv$phj?L@G%N8UoUt=?;KaoGpO_)D>rPhHZYyXRTtrmNPyXn!3{PYanQ8$it0cx*V ziP0oXSiM&5-PCdVVfKvAM z;s6f{^e$?jJD}xoWH0sxnnbL2^vLF9M+Zcepzz-GKT$5l#m#G9D4_%hC6u`TmCnaM zxo3axXZ#(}`q%yMPbcI*-q8N{lm7<6zNW1~`ybfdwxe?PLWm#P?y92dRV?BJZ`^R_e-2w>DXkYP>Yd`(!}Y z^s_H9ukD&h>ZpEv1{*iN?(%w}2N7mmBx*5!pxM^%D;x z9k$r<9FIzXenzz7+w1F%;iKcyn0rjbMv=2Xwl!O-!(L^|rtYx% z@N>}!GtSvutfAylHj#ga3!r!~Q;VkWQn{k1K)mZ9O+<4l8u0dmFoD!fIMPYT8j@4! zDUuiXfVK`E7s;zf6+Wp^Iq`u0JNyc9)$@>j|AuTaj^}7)?@b}+klBkX59j9Zrv@VB zmnC916jNPz(;r0AWwv%QWzNB806u<>sl{&+3{oGMXV(hOP`wB_Nnld~+)_c~Z(0C> zh__5ADFOo3L#1$!H#G=-g$<_8Oow8b~M-kemwQ&L-c0cJ&6`LlSGc zDr6T&niu8}0E&QvAt;hT)c+m==!?RHj_PoV7Gc6<6EP{mlS#lj1XjlA9%!n^5(e7X zlpsY6iGvmiJvd#JUMcuP5SwhM%|Hn2$l=3ofI6@0m`ru|5c5>&fQ%W@r zSQpeW5?ni5dONjpC}?n~Qh_LBDgyS3KcyKXUJJDY~xL7_cj> z#PqdF?SA8bhVA-lD`A0rf_jwj24c;umaDQRbtHTwv`&`BfNApiH8z1{h6??!4!%t0 zNo(x^e5T4nkJ`j`N!S6B(+8E(qILq-sIc$KLVdCd#Eb-V{n)3eNgMVH#=~9|^p{qK z$Dv+NE)2>sCM)=|D_Z9G>V8t^*%pREOTvw|*H6MFjNEpL*5tCmlSQBQPVGC~NpD4H zM&2@NNCt$D3-Al4Vv3P`vF-L;b?^&zZD5nr-dYZ*`I3KR*-LN-33JcjG{=phPnmU4 z#F*ih40t@H6j)_memC1~=lguAcKFj7ig^@CYKHGo;q8{HxrR4UeCN-cTNl?$ zER2d0NK|9{{bSig-=*bhog2Mi!q{)5-O{Pu2>ir&X!>45LY2Y7(7=~@5JiDn6P7&F1Y`{w_(E>QhPP`14Sd0@ zj}|k82EJH;!?7ihiRVBLnLvWS1-@X`hl)X?V6@IFyFXqC?*gnsAB)bJk9(7lr;yc*wtB`2P?k&gzJ>xu6?` zHq?ROFY!+`y*=HmU96y#i2o@P{=s`l`G=$a^gqSG%OOSCsmy4I5!BlN8TL-}!{)fX zHw}3Gx|hVAQ^aaJ;eWzjYH~`Pvr5LIc-BvL41T}NfAhUM{*{mi!-;H29ra}v{p**p ztbnSv$t;5TT^T|w#Jjn7eiin;rUuz8|m|s@;#lFvoekL2RJ>dg^3W5!Nu%;&#`D0}n`wpbG zJ}Zz9XmM3#yR_$!{e{r~~78sk3AlrEpcKU*eVMMw_(ji|cfSDAX4L zo_ZnXM2Y!Ww5U)5c?d0Ou^tbK6dXS7Vvq`IJ?B7Aul`eCUq`Sf=TfswmJ9^Zn5JZ= z>L>+*TbB?`9<_Rq??fEHY(M3FGwG}<vI z8nQd;HlSuQV3#XnTiOM)@!H@{bNa~_#p#i<^1y&{keLw#h9A{`Az(FmC=*_s{ zXmOC1Vh|Lh=+XX+da@aeB^C{Bk#}lG7Yyv}-yu^eUsZja;9dRcWz#8{G0|v>P5FpD zEr_Dkx4@_2C=c!<9vy2!>FRCc1YKA(eL z1P@zGNG?pyu88%_6F2yylwr%H@mYZyC=KK+hU&c@7NA4#A*$S@p;hG z8ng_46&EdDQ#X)ntR?wqo%(6=t?3)t-rBM0?^Wey;*k<#G{`lxaOThuQUyk%;S`VZ zGy7;SN*1mV4EpGdYc)3y)C_vZg>~O~WxIW~Aoa7bUOiDeI8|;iCTMH3HJo$Om38J# zvuM`mbZXAlbY6~(XRdZ(sLgE5<3^DY%4M)}38ojRu~E)k{%rHO67aKO z_)zlu^kUWoy2tjkH-C?Feub%t2|cFR{T=P|BueYg-(+aAU_x_7#%`?(GA)=jZFH8} zjQDta0&bZ&-4gx$WVuwfUY*T+#%<}IbU&)kMVoY8)LAfs1NCovHZ|YJ!7guKomF>D zWgJfBhkOc@zhN=$5xCRoVOu8@s&zti-EuatZ?lmJEZq!P)!~E`c(gGR0Nks*bfVBA zgd~{>HwFpLJ_kkW`o2Rss5TCSJBwIFO+Va1ZmW&Cn{prPr}xA}&&)|0KJPuPzKIVa z9bV|!dwMLf3U~*HBx{n_ZR>(Trhk4>%gI)1z}isKK!y_+Y3xg2{3;;LGAr3_tEg~4 z`!GYalzrFY|pqD={Dz!5H z`MMQSHQnq`?!R|o=yRv>IHa(`u{x;Lt=c1H7PQ{^eADhKNiHsOqcwyTyD}~0z5)`b zxY{uncn=Rp{-XX6uX#g5Vi)$FzrRqjk=@|8Fv<3}{7ZZlbuQ){YRSaF7@HV;4u^sR z23}fI94X;JE``{iL^Sax8t^xuL2r`7(r=%5#e$eLZZYE+Q+ht+$6AIgBfMLF^NRxq z~%OKRa)=(51g>mEb#!;mkg?l_-JvV{{DZ9cU;R5PHP~vp~wQZk_ ztY{*+IrX{v19h|!bs`I&^g3EhV8Xnox)m$q)%!BYFRp!t^G9k+Bdb{H=KjJQ+Ikl0 zeIzd0o(~>AW|fk*Cq}koY?Gcj$uFfe+EYwbpE+1&cs+|F}q(nY{emnUXcMPy2Wc+SJK{MpK`IkomJS~C|! zcpiJl#?;^DN|RWX==Y6nokhr8UUS&BNT@^It)#|Ip9>2`!-g-`eBVsm_1U zk0DznN~gBaD=iQXsIoc82m~I&RzR&&C`2GxryMF_HTjjb!ZP?b!W`jy81WSMJ;CYQ z#V)SS%*?NklVh$n0f%|tzP*RAAa< zud6-J7TAem7iv!&S3I1T8dc#d<^E$GpM237O zolK{M-ev&U!$-RLL$@jz;8#%Njm~-C3+d^8Rn}DF4^i|D8S5a$weK{st`L~Mo>ouW z5!6Bd)IR^yz}mZ^UVrJ!ktCvRuG<}`<8(#x60c@CSF3Yzresl*fMGX0YCm{U`$v!5d z@y#@&J)qY~nou>P#r z#K`*dA^1O`(6BrrNC!D60|yEm$TMTs*C6_rBP$Gmnz5~*OwCuosz?8oEY= z47vPk%qvU~CQ{IpYc2_gJ&4;KEX4+?r=Z0{_D=vd!2&I*EOzAgcdw@`#=ymsBNmsa!(2q#l2Dsr-MbQvSUf`6s31{}Sr{_p8Kss*>xB1oqI7 zf15vFalw{0ML3KCns=7QTe~^Vp+<=}4Enm`l;N?2NKTx2mA zN;Ixx!MNksso*zrQZ~M}zZ)J&Cl~LZ_xCwq%6fM2%PxSZsD6y&NxWIS+5`^FRg9b) zK=Sql5vy$R2IbNPuXbY#43nu``z181W{gk+!)z2#I9dXyS(S4g`x?KK!%tL7#3H8| z`oK{yfYI(Ta*-OZYHU1xIJrZ0VNs;6m~XqY0~045p~`IpGxmgyu=%6Rc zD%l%gA^fUB45?Y*sC{V;#TI^OD!k;leV*?Zy%l3FV30T}*B-?{ z&40}Fe$#NTJ!|egLFwB7 z=!u9rRKg}8YCKHWh`Ml(%U(DRKy*W_*)Hqm%MizT z!k{*V>v?N;;oZ80==%9J^<3(}IX1Crj>lK>*d<>zMu7G@st5gb3gHF-F&YVkDFt!~ z50wrD(huIy2Pp>t(F=fez$g^NHgZf{^pMWpj0HRi4+;o5*K*3C~IQ6>7)Sjg9?MehsgS$Ar;CtlT&|5(G(V(r7P(GXOUy5jgx z@cqrg9Kj^i0SF6P$ZP$TrStzQJNVzjx~nz+_yIxP9EMGBbu}Fg&(j?!rqOa5^ARgy zN#8g~8OH9ut0&){9j-Y!LAt7CW(>i4f%%Z)XMZat_lx zRo2s!!_3_3m>xiJ7U0+Y<^{+A__&70^~&g@9VEd1^XDzhP@Y$>lL2R*1m%q?P2){s zQpI?bn$7Fli6RhL_{>f`cs4e9GPE_q==w`meT5B{oh>TwZ_&tr9uxfGqQY>l={Kz$ z4DW>ZZ?)F*?j|cQ|M|4MGjGhV0 zF+P&y#~8p6n!r#}^!5BE82RER`{L$C-8b7u6Om3x(RZ;eNu*bNyf;P8`d#k9b8@m8 z-X>AFA4N zJPVJ04w=4rO={ere+$4|8OG5m(dI!o)))1;h?AuL;ZJ=kNiFa(I%Pll1UGTQH0n+$ z5!dC1Xp4L53AMlX>legDLetXLhyP0IW?~*>vxUMjqtHYP{l7AS{$GOMHUAdA^bfQq zZ5&#sK<(mREwdFvgRvpSmNj@!0Ye^Rz{?pQypQE$< zrVc=OSkSNjPK@>?3l+jm zmpA%fjJ;)09Q(FD9Gt=3WpH=b;O_3O!Ciy94jNno!QI{6Avgrr1os5;pPaMzeb2dX z-KzcVS3OzGzh zkzS45LMN^lBD3zCvCEighh%8)MbS+ys%&MrrIHr%;UKNb{8TCcHop6nsyS+8YuhY% zEvw`c(H1AAP4g6_BMeicy$MLi5N#sG8b=Cnj5nEyVwvQ@Bf#$AQwomyq{ZLzoU37~ zJVyRXr;j(k*J90)rK_?Rq)U`M8jcfY#WFv zfjmpkG-OB4M%Lnn>xROw${n5}f()|)PnSoOHnJ$SW-fG(AbyUH{`84qqDHMHqO^?^ zHm>Hnm?WDY4Eni#{L3EJG$KjWLbEyc_bq$lrt=@0H}0jP53~p?DvJpwI#*FTU5INh zcs4yYaVjjEj66Fll`n`}Zu{d#0cexCCeuf7JVNkZ0*Ba&;szji@xmQX zqQ&AQawI||SiZ-LkxoB|_Cl`_(?Wg&HkY=i>04(}3?c(s?)xa)IvbB!L_ZK>^r8R4 zlDHZq6A!w8vWDou@QV9sK0tcyxLH4IypJ3V{d4R2o%0P`845Wc;rkO7-~bl~KtwND#$**4@XICVtQ>Ub_GJxPSA4n%sm zdH(dO9rs9_-RRShq~l;3|2@k#+X(Sz*>VedX}l~nZFwnigQKk>BGY0;vE6dZQC1Ub zysgv9ki3r|38ESn@{xn2qjRaAeAgiP`wQ)I>NZuJvT z8d)hqktFe{Wm9Do`tbqjFy5RvXm3IZN52|6N8P(V)0jWf_6`1?hH!iG0A1}T!6x}i zDSmDVZN{ou72IJ!xMM$18D$XD6^#w446-YI!who@p5#ki>uZBLR-J%?YkP<5g1v(= zl?VTZvbUmBmxl)q6AkNUy2Bao?74y(DqeW*`(QHV2r6X1Lf`;NeN@}6j0TqTj&(|a z?8d=|s8F_7bYKeEm;pI>L>Rynt)U71ybru&I~s%sslmHK9bGe`Bu9t(%e})FOw6|F zglQe5%vLQxf+!&u$!B|*gfHk%sU*=NlYhQKU%t{tZG!Pn(9oAiq{`?sBx!~`c>52R zx<4F3ME2lxL2v^k0M^;a{FA2~+ywnsTYJL4q8gS3~#}l0my{4 zwMFQ^#P~e~8On)@XOr1AC4?otjJWEi^){e34!EF^RN%Z}0CNMQBlSaACf> z-GV0Biw+F^vh+jm)^EAqjti+v^&89NyJs6_hR8)|MLHX?a8DiSJ#Rke!;c5mOHcyt zAC*M{H}LI@Xe-(K%++S*!yU1S1A9$YHkHrviV+g_u^wJys<2U*r)Q>TXJ(CF z%>g;tc;78LGg^8*GA6?q9^op~5G}r}lxJ z(PagzXcpO$U6KLGvdMJ3PW_EnIYGlTy-+PGl_c4RLZ@M}ed|VnMRSmjc_zLv2G8H- zS$+8Y&EGYk6^HH9O7S_Zk~u^+4q$UeT(b#OEixy19C zHF$zDt1jkfqSpd4YZ0QuW*hNC#?vahU&S)Yd;&Dggmevsx@Q6j;T!NFT(v?CtVBB$ zK@KEV;qA-P39C8gubQ_k>VV)v$s{Fmgx)Wn)yU+8A1dc z8$|~ecX0CPfSLd|bchXOp`R5&vuFpm@E|tihM^D(1rUo4$dZK8Jj6d5Xe=2NX9oh` zOoDk}hhq^AcgprJW)p=7HRl*TqFE;JTRqU}2AB@G5egBEd6&5aw5yv5vQPw#GL9+I zx&n1E58$Am*&xI682O)Y>{)?d6hQepAjQ=^5v5Gvdx|j@FxA-#!Qf+My*1&>Jc=l8 z4lLYD(A#!y1cwcrGbjA%|3)~vi1g&sz{>C`w0G}>{z--Ucb6?@>TYiH@5SeTSZ$P~ zKdWPbeKUKZ5E~f>n~9_(hY3Y>hT!p3$PsCwVRXfpB=%W18bSwWIyfrLFt|u$mu$=~ zezHck7i)!Bs-;aRKa;&byp%05Gn!>&6%YWWmapet1iWsa&-%S~SO@(6`NjAh=YA=v z>iZ1RNT{+=9SAcOsItMfD2f0Z2nC=KIIQDc0{LlVKU`^)1_T}P?LM!za6ep1K+eGr z^>A;3*(hFY5p1QOE)lJ>H>0|5yrW-cW83;X@^ANjwtIF)hu<;p5|J7_>`QJNUGLL7 z8Q<(%qOVAFk?(0jgsWQ7%5s@j_!@{fn-~aFM{@EBBRhTAAib@d2PFm5ALsz*fdReg4rzt>w*knCy8+a+Q zaQZAoqp@hQ#Nu`0b=om}YI|SI`U@F|g;V_O(6b7YbKRmOjkE zat$F_S{(^hS~3LJjQxYqP1%U|6n{9Un3aDH&dXGWT)hK{%3U<5sywB<%`6N{5}*ho zWOA=+w-vWjw_7Y#;T?znEYF>$(<}S|sj-;OimH&-Y+@oQ*LA?v_E13bl+fI&mE#b* z`MfLH$iD54-mdYhx51`q;0P=}vnal8m|-?fj?ve42fKzaH+!wjq#yNN%RfMi0Q%RT z&>EK1KJ09{C(Vu=vsCSs<8%WAMecw(KzZ{pDOlLYWGCBvz@_Yj|?oj|p_xamh=ujKk z_>CH8738fi?0^6A})qyhPR9Dw-rO_x>5usO;-HvrES4AT+wVNGg< zq;B%)BUVM>=s7Pu$KmlBPj;=jU`lLGs~{1{a)*ZyKd~0kr?7i zat;hbVcMjBmkL#ru2D|OnrAN+u;58wvH~B7H8~>oo6enh3?o`~V zYQRqwoCsJ7KWIkc3}uIxo(xX=%%H>OTS6V}$n(|p$ewJvtQ?DZqcq!tvi@^nuc+kj zbt70D7Uh_u164@MpIFm?*-WpQJf$AR7od1Nzy`+$wm~jpnHc8>@)k~5=~3B2A^m~D zN|TyKbDAc`BzCVaIOv!cCgp5k>l7E59lH zj<@B@Rj+iAP1Ij>$o>jD9>EOj+p>5<@6Rc2oaP})mVr6d4Q0ILaG*%`o)-31owh*L z1RT;#} z&Av?za<2+pzguD@4^vrkk?>k#R)^=pKb0Dtnij1FB zNZQx0zoU|0zM+*NrY|cOe#ZegYy*c;CL~Dku|S_wH=Vy|wwSKdU0zQi;ALKfTdpbbES6Uvwrj|J(A>^QRSZUoU)P*dy~dNQ(!_4>F2 z`FKf7%AgjSz5Ye|*-K{`mNW7Bd4SZ{9swORe-i}6%8!wybv6jG=arX5{BXVCS=~ce zy3OShl_YCcl|{Vi#1X*(FD*(X9tCqCDqKT+5?f94a-aa){#c=`k9AfK{se^n84Fi)UmDL3w8o&e7Ec74f10@Lk!J(NWNNG0zxamw*(ef$OSMyRw9 z&~6i?syv1+n9eN>im2KFaY5^9;2J1_7zBCE4@9YETvEl|oVBK$wRCX7;mCX*kG|Ay zCE4na2b;&aQ)!;;+CEf^K(`d2dg|1^8)f5g?$m1@sB#NLBSc2}7-8TbUUMBHD0%b+ zaDyb8mkZVK75O=g=0K0<07iKXY8zzdFs8>c7Hbg@4P?PQNaF);Y=Yp*V}1w}kRfLh z8XQY?9f?d$w@IPQf4dmRYt}m?{cl*(%{P{l#s8yDbN(QNki2;4ApuDAD=WoRQO+^UL`hs-_8#0Zr{d5Ms=UPyL10-<@>^& z*8BVUmgQYW(4+bsjJ_-{0t|+i%qnGz>?YMNh&I_-)|*m}a+_*51w;vnaR~jL(u4=X z54Nf1Al&Y`#X6{cr(+=BgOM)$b6Q_3r0S}C-$$tAN>A0PpIWMTpyUshri(!}n=Q@e zmc)}x7A}!La7tMja4GBJ*MZ(r*V;0K1M_ zIQkz|F|=4im!xBtyJJOxF(o2KxNkY(E$$YVA+c*=i5s0UEtP`fCzm=XBtYZzVC|+$ zL_v`+muXN#H6*xnErO%ho=&MK3UvB4W=L>fnlr5gXVKGRGuJ(Zelw4h^8uth8~F5L zPe2Csh&9-$9}SpoCXd~GYBQRN{A#}+S#sykTE}jeIyVSl?pxE0(u~f6wcCPSW$AXh zW68&IN#z9WnyXU*C8ecob``F6-jX_t3Wn<)d-Hkew=H&Xi?EytIeLR))8q(78Z(~5 zX6D3KK3`vE~T{28EI{OY)Zk6Jq^ z@L5XZqXe7?^tS#+-IJK+qT~5RWVjsGkDsV5HxlrP zsSWqleZgnEA6%wHGg(*AL>#-k(U_DkGC5&1iYGK|B8y*kY%$p>VQu*(%rb`HbJ%w| za30fGGGjA7*$A*H+1B_Z&iji~Qa$+j@1HWkCMJEvGLJ z=<#&^Tj4IyBc^IZkdyG!AbdAA3wE%Sdt$1042k=XO3Pp@eMYB9W*^FZ_B%gKR+QWgZ<{~dxW0D!BB6{v1WE=~e zBVG^=u?3jT`$xO(f<6=rajFgcw6@T61{6lTp*PObBDR1N z^)wfO)v(3cL4ZnL61`{yYLkryQ+j|<(GCXj&|dh8!3$MTD#}d|jP8M`8vmFy{EZ8e zj8rgVeTnU&sIaMM&F#MqlAu{L5m-%IBlABRd^a46OgJ_V5DVJDBp!$irePqY=^SWW z53CfF=>$vlL;NwJ*sDYw`v{;G3Pb%TL#hVPiDV*CZiqwtNuk8PX~_M8-5lZ~{;Ur7 z91KzJ@BK|;1DvRZ;3|Z$Br6h+UOYHSwgZcce(q zW@G2iF%Wn*h__VFzf_M_o=lY(n7u0_f_i3-$AkP>KzI`9xq!z4NZdVfk$L-%HNYPT zr80)U!yUW^fCP&;{*n1N7()41n4^TLyXoKM`fs3r!xd8+E#h|)s@)`E+%*}ID+=^l zkTzZ%L}&=3eU*eK26PYUa%k7mhm|$__8miS_%gYmJ#th~q+E%ghf#G|jA2@KUgp+C zZ|~_v+Uw(c(%+DEA;ygvVx}0nzs8Orz=r7I#<_WHE?PqHR^g`5q0 zwiG6xLPaF0j6YO2^;vulaH4gX_z7uE&vKCD?vKBeQxV-&(86qT8gWjqSkov}%QG;i z&0g?W?ATU2R;?u5AO((28zIt)=R`J)F}@#3gDU<&U(^=;in0(IL%2+Q>Q_q;TuHp* zk;^anGBYpt_M#WS)O#kVR;r^Oyz3{Z^}>qO)Un!wRUZHC7IGE~TFN!n5Blqrpy4%S z^G4Zw^?A(aDQ*AZxwN;uI6>i7l7uX%#EVu>L8J-Cl~kY2>U{%8w(8`Ti`%SOWPUck z^r4C$S+kF_9+i1tg_IE6u}IS!WGZw4@~vKsy^9yvlkO-ScUA)Poo~OkE~ZaJzX`{+ zFqkVOIeWe1k+~Uq&0FYBF4>gD-pDujKk|5S` zEFbg!;k%Bby4cQHpe$|OM~uFrNQ&j`3>b;YY5^2*qN(@A&`7gF*iQns5s+L$F%VDtJ)6nw@;YHLnT;X z^Zl`V4G^g_AF>4{ph1qUH6qBlpU;K4nY>sQBv1~FJ;lZcJNkdg7(fH9X-TH5iH;-# zhc!S9r$BRAkYdal0VMkhWV;+P5j4JXNUFMM`hEcf=$dj2W%xS^#BS#Ckk5zTK(KrN zGZVH249|i{73G+E%o-usC54!#l=L8dd8=j_PJvQJiWzynJ)A3QQF5VO@luE8+gG2+ z@q>8Z-mR7yV$ML;3$xts-Mo9kO2dx@zca@IBE|#%0}uT}vF0YLk+A^dp%LJn9`8Tt zzW$*8ik4vS8Zg89KY)f@%}f0a4Xgn1;Ll|6iqE?shXQrEq>?(aY@p-0Ngeiyo`mF= zh`XAw@XzuKLWA!I0tahntoLr8`V#|INlWswv9elBXItR1{ASyayB@nQ`FMQpFO37C zG9qbq*!9%Ad2t^0lrE&G7Fcz3rm=(@=8Y@)|*T{8y6E3@`1Q?;&|w7zJPBzqR-jyb#Kv=&~*qSOn<{WupP z90^OIv;Hul$B7N)46mcPvXi=%aK`a>-yO683*Jmpss5467PsIuE7FfB6UHBF{*I1p ztr_}r2&KnP4Kd|@R1Zxvg88)fpFVDRH*A<tbc&sq6Je{AnG#wd-kF=Ig>9 zN${mRY!&1vSQ)%n*Al_u6d|^V%=Hzgs~shMBbM}{>RVrrVJn}T%1nrGqm3H}C3q1& zWT;4<3Mt~H@nM%+MwswUIWOH8J5PNY_{rGYLe}@eWpIR z9^*ys%)lKD&jh<)@hY3lm+);G-iCM{abi5h{@=reAyP6|Xs&YM)|o}Ub1&Ej7Ywy@ zIWi?h8eLks_lo3nrmmWSIo<{*Xpc>@CytF)Zn@pw=RLNz=N(=mN)x0)a9JI>O0*{Q z6V`seL6GVELchGltEvUWMb(K}xIVCd10+gKHh284o7vnix={P_?C*0HKOxX9Ps}fs z&r(2W*tKQ5Jp7X%kA~pE!ekQd#5X`rN;t+j9SZXrgR8YP&N zPMt!QY1pKHeiUOsu)I>f zz+&fAT697){EZ$2B%dVZD2P&~qd6#@ALHno%+wdaa;~_&5&V7{uYaabn%R z^0LXN8c`<;P##_InJKlz`ato}oyg7klZ}V@7Uu35g_#uvKlq?EO7uFnD1;yEPyGJx zx$&!Bw)HTW&T;~7MYR4&<&tpna6t|c&Cg9*+}V`0UnLE9m(fHFZ>)aBDRGI9ZM$@*-c`+L1?$eiL!Xkld(@Xn#8mx13P2Pejf zl=sWA_y$7*&q7dssHde@NsyL5e(8ABWaYtH!;wVyIcmtx@7wm%k!d+ff#a3r7KGj5 zoB@5&>~E*KflJ+H0vTf^Yu9trTzWf%ZFk+Hm!vE!=Ep}<_=n${FLi|owEGzB-;0qQ zN|Hr}i_PF7(y<_9VjO=Z4O{94VK95oNLG2{bki9~62@Qt_k)8-P0f1#r+)>D8U9hO zDcE?`^*^)F{sI=#b=3)_(SrP_OelQJQ6TEa4~IVWWnlAWteQ}HNrio7rLkaPCicGu_a;dlR~+v zqZ{^8vzJv(Gt-Y5^(pIDBC+n|_pcqyLs8~rC0T5Qb@A_zwnzP>Ia1bofi^?80z96_ z6+SHTt?HNfA?+%s5Ls8Mi<>u{RY`EN*~&Pf+6>|iIO#y4LYj?ae9S1)BlM8Lw8qsJ z%UOa!7dA#sNcPmEwn_0_s0IG=xyO4=2tV$rBLab>R+Rf)FnZuH5A zeJfK@>oh@EuN%5F_8){-vEIS;)bDT1~)>K8gP^{y61CIJxHI9WX(i5IA zn+etk(jV3@f-5)OFqQ)06}rK~ZeNhN4W2XVg+=5dJwo@bpBEpVAP<~q`rs`r;C2`( zvVnMr^SgE=$ftc|W0=j3LuzAs=1cV1=b^!w{Td zLZN1Q!zw?H^oku>4|{WeeIhVOjGHXWOaTi|gj^{=UjyzRixB*%h_Y-rr zLGY-HG|-Qk(aWGi{OiQNzDfL!9FqlVw#3Q;9Cq~y!IeRXLY#gKs)-Ku9i0SzrZNn^ zmMDEWuys*1LKB4Cv_|xf9Y2^6`W^jP6oQ%}44vt?nuwGJh`4DD{7-(yutp&Q-lZWY z^kXSlpsRlWaKFh_h{BX^N)U5!1E4^>$pPsd0_mRTA9 z#xgDxdDVcP^DtaS%iOHL`=P=E&G4x0UQg!Ss16LEC;CG74C5CHUmEb)FbdEUepRdy z97($Z6)Ww`HirBLC-F>n@byyq{h7veS-F~zqB`QmrRYvI+KuEU!N1ZV&u9_pA;#9HF9=2tf(&EG6`R!#$bSz9@SyAsv1*g z*%^N`J2gR0oyIR?f6}C-P3Vm0Y%lYlpJm2l4d(ru&9kM_=NIzyie|$7==&aQ`PYEe zVGBoqLd()!wJ>D#g|;*f2Ao2Dg5GM(UR&368kRxUxUo672BcS3pm^A9kw0D-89F<= zV2~m{1}jtFi>({BNteDjq(U?Cyp)@q)Jj=D!Pc8tX0cY99@E4t%AVCupu*ORCF{PN zIbGk+)zi!Mz@BwyQUZ9iZq;G@KTq9K1p! z9C|gA6u*n-$vxYzOLUm^Zo~zd_dO~uf6RN4o$4>%3$0J&2ClIyD#SZyLwC~foW@Li zoq(!LPoj|z^ee%$FGSi9%!AmZpaNWrW!wXLsbeUNyO1gKX)#<-0F44f%};8Kn-Iq5 zkj*P)$^#hP{wxh#P*nC<7>i6IuEjL&LFs$&fij*elNqRrYk^VfFEU^RVloEd4ZZ$3 z5m))F!i0VEcr*J|>DH~4Wn?UJmn?X(#{tz!l&|{*{eokk8w*)t?~Y|7i;UxQU2^!znFY|GtCr&+nA~_8j@E4fxAZefBP34M#$xD^$xNwgCpl zOaen4Xsf25HW_zKWE##M4F&uj)3WuB8TGi}_4rQP6`>*g35SFbnJ!%0t4$4Z5$w<3gF%9_ zg%J>RQ)t^Rlp^qODxx>h#5nn#EXX{sYAJoi?z~yE(U#%2vi#RK8RTuiSFaL`l2~zh zcO!xpX|lMQt89w;(n;)Gg9!dlTYCL`H}tN2`cX6}BpLXv}) z!5z8nQ6c=jvp+hZW-$b~0YblVvD4v~g8&(vKtw*M8w(_M72b|4 zBvtH&WmyTbuoI13Gu2uR*1F5#^fp4oNDL8N31K`D-BSg9f^Xo1r6dj6TnwQs0@gMG zAMb(Dv}4>M-{T zOjISg5jL8NyP?SWSd*)4^tl{2CMhRUF5Q|igyQ1J5O1~x^<;%TtpmWu^Zur#bX1yi zlDb4iZqfoW3r$6Nl>bY3bCo5-%vw{O zM!KfL^iJ%{mY!DQBgU_>5lqMrDN*tHupub_8by=lfv`y5gbe1OLp+GqUX=d>x z`M|yysh4oP z1mRIrL$YbdYk8oUMm)zWO{@vinK}4{Tb4TI^JK0E%}HxK4wWH5|0*kLg{muQ z6^60;oraj4WEw}jyHWF_^&+46$hdvq5XO)TEA3?!WQ|SIv{_yE^PKXJdD0*Th?^2*D2#j`NZEDD&p@QS=E)oowx%wX^$o_|Cn3Hx0a1sqA%oy+ z$&jDpva2Oz2YD>vRZ6yC^%3`(aOqjh_yQbfX-ctUZ)cH$MT2Z^x#y-T4bfypvVe9B zB!NzO*zs?u+@C){W{OF5wMA3(2I|3TVI_9+^LV)#)ZslJ0I0R`KE8d5Hu7J4gM$hj z+6w1AnVm={Iov!I*wXN=I2PTGiY%DRyTDc+@|^=Yy^0;@=V=BBB3lCG*vL|{r*TM3 zEyQD2Q%&0R*c`#kFR*JOq|*0gyYWhm1ly}o>{i{kMoQ2azPZ~Q zHXg{$P2!}6s=6S%gFc5PDW}4kAYa|oP?#_qZ03Sst>n%RpT8n6C2UfnG9A1ZC4pL1 z5>ChDH-Q<@krk+{k5Tb5N6ziV5wMXaM||^X#q6~4PtCJh+62ePL}nIK^!zEw+MlhoQ!K-iF-^!n#0T`oBU(&ttdr5 zj8eq>{pg0Aw-@Y#`^ZIsVxNb7%v;PuO6xos3)4>F%=#@1BZG-g)h!B1P5opPCTV90m1!N=hisqCs&8<(K7Kc{b z{n*pX%oyu=&CPq_JbY5vb|+Wa0!KOwMwXx0xMh#N7{) zum2D#|H%Z~L1%xe1aAwbz^lK1H2VBsJ`n%4JE+z&{F4VJG!SG#fq(-GS@KNVgr`m( z8MXi|2SlM%QUJCTa@uCW` zHX7d*mCG9JN##G-@3;A+H9#ROoPK2pt$ZcKlPBjrBCR;k18*oH3XKU)0t4|(aH_LM zt|yhIb2gS85lynj%0mvc6ze9yMQJpX`>8Noa>)0oVDdZgSB)`-NF${{D&&?RLQ*Eo z;@8qOd9AS`TT6=23O6zo2x!uQynyBz0Rvqv#;$xC?$u3|y0EPuty|qpRv{fN@8op9 z%1L!wowZb)cj%RJQr+7K`&hEIXBenlveNv(9Q!(9IbC6`+ib?C`_M3A9|`|(Or#iC zU#_{eSpzR1(K(iL@5Mi~#~~^w@tu0g`4?vxi$bYHdxTlTmf6GN;ty)%NPT)Pjqk1c zE)>`A@K{DMOS7?#gQq?7jpsJPgge&=K3nTrX)}~gt5Ho;hezr?wJB{w@)g^BP?|0( z=w6IEY_yNn4zLZMu&MTG(EO;_`WpYU_k)CMT2@ITa%k(!G zWMM?e8IPFMYy7-e+6mquvVAlb=(rXYr>f|z?hl#>T)AGF&1M-W9wkx9aqJ4{*!Y@V zSf=B3qC4~4>0kG3Dr85r|D5@rJsAC5;v0sFpd$i4whbmPEU7__*yX{tIdB%)9D( z#>L+xx{_6;)kY{Ir3jFz%wx<;q%f;2^6qsI@h&&{A#31rzM@`VL2=I~KlQm( zoPo_9=)?WHC!9)uR2vxeJx~2Kk$)3XX%)&3lD~e0yPAM<7@ZQRYt1xTVANV=)rrQK zhA|XZWR4YLVcSwQTE9B*t>u%F?XFydJNW!Gk5Yb`I)?zGz;nB{ z{+_aL!4}onD6aXwp2nt0&y8d`L-X4*WAzkKz)!`%xwq@j^XjdXT$SqAXiLYKcSbP2 zbHk{x(;ZKy&eHr)7rdt%>NQN_1yHYiuSzNR6dk94?sCkS0(ZK?Z*#fcv3cfq^hM;v z6bf1gcpojs^S&xCE1%4C6(Xrlkwqt>iRHM)6@Ln#>HBu4THzC%F@+w>py4%AJM|lr zl2v{m_l{U%<$bCM8bJE}CsFt`0Ru<+c)=o?Yed)p&rf}mcO6R2be4(vY6WVy0axG+ z11^r@)LTsO+Iw_a+R(<)s2;K}quPbdP}+3A2nKY3+_8=e=qz)}6V?X0{gy-_tTKz0 z!IWv9$vlvzjdU8pNE=@vm8p5pyp3Q%C+JwdvuGb? znJK~WOSExA47b|QjFcZ{%rG&0%Styc!0|&9woyU0QGuxERCYm%Jc8(QFEqCb!>QVG z?T$?~H{n^(jf=pf8RjG?|3_)8Zb>bVezDZP`Pu(6veT$BZ8`=cK_lQO<$qKT|1zZh zD+v96=FGpTYkvdF(@unvVD%$!!ip#NXGH>^!u9TMwI5i#U$^d#ToA3NrOaWh+g2Xq{+7RYg6vMAH-VWdU*nFg#$P)<5L3P zUVqZPn;Mjs#0!ywh`EA@=EBg#IH%;6*#y?h?v=uFA-CXx>F{2P-yZNzuvZS>D$Ei3 z!(m%(Ij*LIRyGLi_umMdoU)Z-ow8bL`y-KDo6~zoH;`h;C)Cy~S@k}eTx3R=cX&Wy zt~!215A7r&vc$I{wn<6E<{XgKH&c59u~utjA$N*F{RQs`CtH8AMwgU%J!uZI8^oou?d znfznDpFK4A2C0R=Go~Cb4s5dQ)I=b#`K?G@%}Hp|y`@-Pdc^)JIv%&~W=aB{-QZZ1 ziCaN>f}_HP0H@n=|1f}se@uqa(E3Iy%${!8-*=>*5`&vFZWTdV6LSkYSli4^U>hoc zwOxYbks%G+G0cdv>LNAKvvK(Nmt#KL)+uugUcZhmEO1QiQgBC6g2P4GQyDX!{@hz= z1Fm+~m&9xS@y&f+-Tje|NUcIvnz%@IHSp=&dx10m4HRYljrL21Aklu-$_-P%bZI$n zDTv&FOEXAVG^V?Y0S(PB9_$({UN|Z({M)P_QhK=lf5Y zF&_hA-mj_{kV+9Iyqj3L&JNBhB*}S2T)iwjC!}>NyhiDYR=eaC!M9T3$OupQ*dHiz z#6$O_ZVBE{(jyp2T_X9+=KaEChbxIK{5qInl~K5K9m75sa}kP=uN8tc1{4FBm5IVy zfM!{bOd)0HAT!lNEG$8@X+Y~Gpf3IaV%#%3gatWdrgjL@1kjjHbf!WS))G|9c9abb z8izk1%FzxwumCxw0dY-4VUklsdj>NuF-1-kRd!>qxG%dpE118>YRx*JP>|5Ot?MGUqE4=R+Eynjgd{wLRbq z;|-xrQHEM59OsL5kB9Z2pzi<$-{>cRVtCnQ^RZEWS z_GgcZ0mcqum|t8r(Y^#Hi!F%QW$kb)iW>}A+pc6sclK{1cb=;lKTCsaNuf;8dIbhp zq80`%^WRA*JKbB&-I=-Fpr^Xa=`J6qZ6~YkxMKge*`K5keMkn0VyIXY&hIoZ2r2QR z6)~tVR%C1_TV%QviWG{(#Ar;%>X-%@*mW@6b2wtk_IwPjt!k=ta0VR(^epSBqOdE{ zV$7CrxGTq0Bu8(nT53`&?KS5W@I5I(ZV`?Q^!#3q_`|;8y5G3ixJX09vp&qxOr^I+(Aa{!Wk%PKB;!NK z*&5W|vFc&K>WZZg8VlrB;$Cx2RE8{pIrVSewUDonYmfWVtyYbd8EvNklMIV6xR&Ch zxbhu_vGZ<-KivXFl#;iu>U1jiELn|_qk;j711vLF`NrY7y27cDw(-*!^tp3rEL`ry z#8*sXWJ_z%97yaAe4|xrSYq@vrU|BiF}|i@tWn>dEkgDS~sA! zzo{>p)sGI}E7!NWfN4*py_M07YeTlF_L;?SVGl{@q`vJZ`GXDwCKLTiTi(Ze$!C_6 zv>=z>TB;wqm__fWIp!jeFPMARJ-eZ6Z!UhyOShk*&G@p6O38atTzSsvuBbO?Re>gT zdild&Qc7AZa(@*|;x;9@7Gs}p=GF(?yKd_HXw>QL+R1vQqLQGxBAVqAGvjHhTgDP# zUlgJ}&>^g&Kon;f2$qqkwKpYLAPQcTGX3RGz(oMj6>0Yp^SVn zkr6=1kAVJ^7(3W34Xf26rn zH}$mCwlq`I5dV|P`rlNzlJsw0n3`y#y&FyA)b_Snu=KrjF{!DZP%$w2qDZNvrC3>4 z;?NeI?Vk}(slPkYYd)8h1;Nu7puR!$#7Lj>2|t~L2Bz|Rc`Z_A6QaN=XXgt1K~OJp z*Rp^8E8}`K_|h^b{W>p>gUx>Ar)th{JDyShGrTa!g$x#%L-mAqsLxqdDv6;H9Z%J@ zgL0qUi`m6eDFR;{AG^jN$<)Pm(z&f_BIEc*9ACTL0CbK137icPHfhIRBkfEPl8wHZ zjJDjYcIqrDM(!t@y|R>Sh4VGX9N)@CL2Sy*ca8oao{ySrdnbvh^L9&+|JWvdzdfu1 zwj>6>^oLF9jQ2J(0e=hhnrW#O|K{f_+K~jUW2+2J_3A7F5*~%YHSuxS*1XiYOgdaz zH|1s4*QhRTbu*$ig ze`{yOg8V6ot5>7n(zAGZKV?aN-Mm%jgRoZYY%aL zmg01|UQ>U$R^l~oSx@WPD#=7Z2cLgO(dDAu>-Br}QP;zYl14!2;~9YqV#3vy%A++q zKEjS|vekw%T-C(8+8vqZ?oPoJ#IyZTOXswM8v5|q_nei zzu{)=4g<{NwFfjRmf#RiD)o-wbd1#6k{m+MFb=)^>kz8JSKZ-4S(w_J^14R^+9#Am zEF?1qhobE%bV02v=zRn=|I*HKeQcy_B(e|cFdI*-T22ZugPRM7m;PZ4uGMhZWd_;= zeoCSpj{0ZyhAevT0mUrdUu1N)dJ0c!FbuF~&3C=})=P&P6Vz2{GCA~_4{+&!aSL*% zP0H)!e@rKAE*bcC3$xKEi-+g$`OdhV=4!^r=`x`76K5iPFB;+L)rZ@1;sc-Oa{1#3=}ErL2T zc&Eq1=mj1eqzW)z&zd=Qhk@&zqiH>zWS2!p!}Ux_po0$!;^XsjenBdkdAY!{u;c@| zus~UxBSKFWs_ZE09cd}~SQc|)yOdyxXFEL+oS6MEs zx~tskfmUg`8r=p9+laY9`p%lQnF*Hz;wRJ^Eh>@vsI?Ny8z0>I_Y)tC>dliSwik|R zjSk_T{MJY}TpN*Tm32>v3 zpp55orA^~Ya<*Z1yPITtvtx+8la1$oM(9y>!Kd4}DWpPN9L*`4O}FG)9FmO~CVh_S z{)NC@B`S999RGzzeR5pmfj>k@Rr<$7@quJlJ|&(+6^g`>1X$7>tWB|Fk8PRIZG$`o z01rC>n&5$$sK9wRpfYd=n|+4_)4dXDD&I8=Kpv9q0?SVp=C6y?!iv-a2pfq3&ijIn zr9t!b&jNqcgPNU8M;djcIkJ+*e1;oJ1mxoBEC_9jyqp6O{_$lTQ$T?o6v=H!y8!q~&!srOCK*hTQv*J3?X+287ZCN^<46Nh453a&~>-8-K&|y43O@I9)FkayxHoh0`$#^%W%= z+$*(OMeFik-)D`)hItW%x{)J@&zm7dctypkOK`nmE0-{iM5jLhMd-t$?1OS)G&`!o zXUGk1ZenD*8cTar&z}*kqCd#aIB2G}el@7cg>QeM>#ja7(S%n?+`p=Q{cR9o@bEHw z;joH{eTm?ThduuDe7j2sLO`Ubri76eB6g&6wKn}8^>o9lCh}M-?`ZM5MbjKrxrX%< zZwz`MZBs$_(k99u4PR9;_Ir23S0D0O>^zn6z+ky!+ffr`i_wa6wna5~40Eo7Hbz%+ zXF0K_Zost$D2pfuuJA2dVqaz-1%S%d?ZU~9YLX3Hi?aS+*BVd--(!PN-UJTyq&&be|CdoB6Jl#)@6Q0`1cLBD1<|t z4%u+q5bUMWKiP19iyQols_Fj>&Hm-tfAzX45Y;gCKi)0_QyQHpER--Y`2=bNYEsbZ z%v84UFkuI7`d_Tv+Llk2LwX?^VO*DAqY;&bY`4TeXWA+WJs>{F67M@TRR;w4vENK& zEc$Y~1PZ#W-Hoq909B@FI#gXnX7;KOGZuvnxf0InHnJo!@787Yrkcrzq`x%_UC?S$LMEw~+}|QVD0)9* zq|L6ySx~{>=xkj~9d$tKrKS0XIe##%rqDVX4msB*UTt*FBfibIp)R-QR)#x`)3eq~ zt=_rGR2?}J_4X>>ncgl(K#!%p*hXn~a5+75H??FsGeuiVa(z6DM4L-lvv!VvJ$bbz zVKO=)I>C*`3U?OR`QC_zE3!fE$N0R-T5K6{1^FmB5Bed6R(bom<4SA8bZeO)Cyo{k zB2Tp&!wSAZ&Rnee@lmn(!X?Cd&9Ss`?2E8XLtW*YlWy!Tpo&KXU)fZbts+L0OhHDf zbbr!r@JSJg>$LPbfO}$UU(ar`+p(|o=b}D|K8HsRmydFPyVrYat9SM9CU}QOZBSY6 zXDwFxyB7LmRxdECwD&4*n&&h{wHy*{%$-z|{PN(PgmjVv4%F2YOC1nChTM#z^GDatd98(N(ien7 z9Yju-((u9B3@84OJYY(DR!h$ggMRCaP$0?t!Sw(!3`0@Y@OwBv|NBTO;Lvigeg$R4 z#aFDt7{ojY5RhFCAG0=+|1*r(k`Ty40%T9IQ-ihBPE?qQ=o`YX3M;ln0j|a>j6n3I zg;VbZa0`JwMtrfM5--GL!T=3IU_~Ifl&CNj(Knp`JFM7}Fo+!(H4@s69b$+T3Kjwz zjQA2lO>G7nhPfGTiy!%b?qNXPqa9(L$jv8CwOfeg7Gl~WUoq2vu|t(Y6fND=!hKsY zJ28`Nm66qZgpNwYX6$Z^@Czb*XU5Zi(LgnnpfwkfG1N@~$F z5v7BBWIe-z^@{lK8Q=wVIqD}Q1H6G`fPd6#X}x!W;PE}}tUUg}vHpAe|5uq!Idq?v z!wNDO12QMau57O0(urAiW6J?RL=rH-;eJ|0aeVC+=hQ&_fF+Ltw=ZTA0jvvLv&dQRI>G_$TFQwZ2(*DLQG5>wc;p=tlHrp6CkrMe^ z_}~FY%5lM*4Q$CKlBWgjnGa3j3k;|RGrkN03Iml-A=>&;ZV0L^z5U$%@#@Rj^6(sCYQ69`t0ZezN9UN-%f#ktK!EqM#{FYY7^^#1fI@ns|(6TX@SH%(dFU%6N; zpj34VFYD)35x9QdKQ)?h86g)$Iw!lIY$mP>xQy^YB!_&3zH<$X;pQwE%Ns-A@>-n@ zOlwoF$Df;ivd;_Xq^b{i~Vs z5xZG(Jv+`eHSJfE$TnKXZc*A1XoB3At~EQhR4*Fz_$Kn2x!a1weGZfQvtMt&SP`7n zvhDg>VA@Vyop%+>hKyD=DWMzV2R__Bi@M+ic767L`>MPHl=YBdku8Xy>sp|Q(arX) zkMFiOQ!N2B2 z2w*id4svKPV3h;hic^SGqWvdA=uhVSV*(X!lT1Eo1yZH~6MM;e67Pug3xT1CKMA_) zAlIrQ_?E))mmn{x*Y6hQjia>fY0A?&K0V*M5%R0S+agiFYX zeHIXbhGUL44wVrl4w1bd<4)UoLi%NuxKHfM+GREIM97}0N3Y60cuk?iuliKCG~z)s z<>87?;P#OrhCbk5fYpCy;8xl@4tfymraA=1_Kz4nf3TYxR%VV`c1~8}HV~lZe`klk zVVZx*J}X&yTRBqy75<$wDpQmlaMkf5*0aWGGq{wU%qwzdOXbUR>H+X6F&ua0wCl6`V_qnp z>Mt@lX&Q1HwH)|X#)QFUH$JW;MRHXlSb(C-G}nhGy@b*$Ts1 zgnM{e%F`)%Pl$}h)QITLTHon75KAynJcHt zS#Qg3ou|k-vv{qjBUNOf^t;O(@A3RiF=&mIw?cSww@GlNSnQ6>;Hq{>i$ay0;_%Uf z{H%f2@?E)BPuS3)saYO}QOOK=3fyl}ZoO-novX)>C-An!qbRx+`9;xvPrG&Z#wckW zU*U+86JB5QfTT8ko-HytqMn1;imQ-_f}&v#4b`H7q8_v5kVf66`8GF}=!}w_vFG+9 zWd#1yL*k87KbCst6hpq{ZGiO-_j<|C@qK|m57vsLT(|o`pqUV)Y7wg+ogfH{>frHI&V2*deWfNfj@^)GXIo~K6U#s!onS! zr_qr=^+z{|dE|_}(0-N2CcV@Ef=axagCN@&keTbEyoEbJpzgd{saX|K>xijLd@H_8`|sA!40QLM13(Ja^c#>b-t5pX2@A zfnS8YDNI$%KSmZuMDvor6Le7&^ZkN*Fb1MqO$uZ8u@^H(fkiy-|-T8{AqKA zm?iN(5hZ-x@V7NGb-tIyXkV_kVzm>@Hp5AB%=S*+ST&PQcl_>uBOoM7?Z5F$xTEVO z)Y~68tHd!FH2{qlW&bUfplaNWzmMNsvmGg`i;Lb0ZJzr| zADL^*Gig>og)7;e-5dwKrjm0qeE5zak(E*>|E|5nQ)iR$x~L5QHJi z4zH!^C-ou8zYw}7WbZ@3Z-^6vtYCx#nR{;AoBaK30_Ta}$4ocma#X-~scSg-%AxF( zaU4WOl@2%UDsz}}lV}0FF(lJC@2+?YV?^Hs#IY++?O0fXHR9cZnYrux2cNLZo-{SU zd2uMl`K!jjPsDMPoS5M^9)*E9?N(HoJ<1X{@FeMr@w_Bddd4dRG!mm`7eNntQV+7ln%6(5tHA(tnO|a}r#R`QSqubZ&g|64 zfraX4=4o6&%P5Xm!Qg{kS2JqHH7Oc>v23{EDF+4u4bpJKxNv_?3Jp}?+kWx2f?e$p zLt1bOC*XU$M5+alP8O(Z0dyIVREYqkZ2{)(9udTyadzg2L67QkIWf6NcMP&1`O_QCpL`(rx1+3NCXQP1M0Sn0>tCHHgo93I_8%GI~;nZ>J>E*UNc`|Ur9T?L}JFb zQB9t@MHPg3k?SGd;2!MhsPKKZi^%@YO4jRNHxKE3m{dGc{?uE6c%gE#)zOIRh66f8 z%TyFH3F15<5t@|-7}s+wY2oXiI7 zT8#;~fYi~cgjA1{7&Bp;J!=M8_f>9p(umQk5$cXPn$d|9E9kt-Xd~!RhJmIxmBc6F zMLs`A$alrwn<{uV8THLPtZ?!y!;j*Cl)e?^R~#(K_o=byYiqa2akTn#Wo2imj?wM! zXe&?7$8(q+Y;WTRKN@JKeYuRK5JHZ&N6l8v`dT4zE7 zD~c(r^%^}aYIRQE1J8Uc(~5a+25Tk0?w9f!i6U>)N0`ac=P_>*mu>`jVQCBCl-!ML zYx#|WQyyVUC{TM6O$%`P6TB2X?a`5gXdEAjFadwEd%eB=i5u(nVT<BQHyX;qYDXc2KL`SL* zr8^K5ucMq)V!Fvx?hVt^WWEv1#QpJg7q7C$RY^!X%z9F@ep1QZ=9KFf^5|h&;Y2tC zwLE*6{L}#*i7Ax2VL^)cQ=9m)WIC|6$xb>S=~W`Po9h!tfWYL(a!>1~#NM$8S#f~k--os!x40%gxue@WXLFuq3+!jFdioMF zxNkLOUhzrRI0P!RMR4qtRSJkW+_-(8EAx8vIscETy*RE!;1lGw))8`B%l}Vuq_~HN zosIJ!>eheU)aopHOj~39W>BFTP-m6=TDXa%i<2d_Cl^c`hTsuSf|Cff%SeAkXz+DG zCQ)PKy#KgbPTQ3c?`aqcwgG^V%r=_bz1|MRT9~hpq$c;l?~fN*)rKy z1}8I$3EFd`oKoQ9*tJ2-`jkKan=KMVuIA9g$i7^CQG(_xVphX@iv-c!+iiaA@mL@6 z-dGr^HIim}1 zB(n9%)}K%=Zf|o5)F_n)7`7YJQ_bmWuj@wA)vdkyyQa$XAy!47hJCF%Qf81W=!=W@ zt)%A(>KJB|wY5|Bk!8{dy`>t@<4@wz1}%!^{j>97Mj5AoGaB>`$`W(-c9aHZ^5II7;VGoq|7&^Gt4X;dwnB`m26PkDls%z zFi#z>tQR?5n_bKFYQArny=lIi9V*|^mvdN|C165T@A#zdJh!N8*SEQZs-66ybhSe3 zQrXg)HituBOIIoD<9kB`d9&P#nRp>nL4I||FV;gwB^*cT?`)fYLzAYf*r2D7&p{MH zs!n#rjiEoOagoqiVDMt)tz&(v8P=14dmHVe-_7Ks-R;mUZfeD!l2|l0PITy_(|}R5 zl~JEsYpW#H&bo=-&alOT?6OUceXihxd5#-5;1fer@2N0Jv(gJtH!**h@Jg{_ewSR0 z-$5k;x&Vq$!JS)Eg6%(K6AK-ldd~4%aM5pC_;~So7-rWz0Z(WHEWaXsEWf8nE4v z`l7R>uKpG7dqLfbNN!V5ywaRNhE@Mop*j8ah>~H!Be5V7&#@x zKLAPI>!5^bC!vScm(+;s%UzqHHQl6O4up@%W(*!x!&IA!& z=qp*K9LmmwQsRyr3-zi*zzGk~Q!NhZ-DZzU_kqNl)p@EQulic(V}@VQj)i(z)v-E0 zmalGnVFL#(SykRMt8`G}y%d4VsI@+1J;~VP%CymbTw#G?%lF<-LP`adam@hIE09X` zo5JPDNg*&fQvi+1ni<9*;JZ0TH-RLJj9XZiIb-^+Y5=7WVEXZRK)AMgG8H_p18!4tQ=3VmKBu} zG8o5>w68ZDZXr}EYIjM!z49@_@(kn6=}~wYL<}74iIgiixQ2D3!(rKPx9C~oG!rD? zagRHcvdg;R0@{J8??q(!FAW9wV2`7N#ps)XO3Nd|?$!cwyU_cCFEB;!3AA^K=&eI; z%mkBWxjZUEB1oqE2Wsw!Nn-#m^Q%xUzf*$!gcKG}L++D&><;yXFbE`^A6#AI?ZK>Ns{JkinBFq^PL> zlY##x!<3Sc zDCDA28zX%$PfkYan*-qcX##^B)*DRu^RvXrk__-{FQj?I$7Vmr*Sh{{++_VD)Iv`c zJnsCkUN^dxcXCVF2n((kE;<5d@>Rk+=8|nw5ZX zcJp`X5mQAMq6;6KXu^c?>YJaa?LN7AYA$5#c!HbkvlU()VnR7_h*TfO5bYo`j<49C zg}lZ>`W||d&>TACJgK@Y+yL>yYunhAngs*mfc*IJBD`eJ39p`-o`CaJYS*Ie)+)|o z<4(?1hgGMhrAogs{|p<6PGndHZ?0K82?zSE9#KKP@4TJ{)jKBqq_@)y_B%%vYOR&! zBk(6&7L8pk7N4Adc?ebx`u841CV}x8z^Q>_f-z(L#9B_w1&%!$#rbicYNKg;l72T! zM5HVVU?9HPoMJxx=osYmA&XXcl?n}B)g)p|)t~0tdu!O#UZ$2?fFCkO(zqsF*r#?1 zKhePPkFK*k<%0gU02r^1_9*E!G4&scMtpbaYY6WBmF!e{vUjFSR5z!C6Cj;wreVf8 zI>cD|eb*8pBK93fg2J*8esL-k?+O5I*9{NQL2#Ex)ffqtdIuW*05YerRLE>X6=Ng@ zKji2CAak}r-(COr?oSMXx~>p1H426B ztHl1vLj0Rh08uphZ-V-Nuf_kmA4xTMzbu6X866oW^X1EDqIQVcDdwq=F!EBPQv8gTCM)3gUPmfWT=s4_eeb$gk0q zZTJgaNaAo2UZNQn);e!E+Atzo36tt0c9Y@RY=u1$pRv=YE|BsvL84)aMy|`RPNrtr zbwsD%L6)Bo9xq5nRc3oGs!1SE4wjUbn9hVzP z@DAU}#`cji^`&gpHXKv(sTwCg1TrNcN>Ds~!P9+5O3mMX=A+Ww#io|-r(}6~xs5-7 z>o?lpi9~S~pj#>wkk$6tccav+mY-;jT*3W?h&jx3PU_*S=Hy|wp^mch;x4!5ftLpI zj(o*Z`KwZzR>`YxhI=N9QjCdX+Xb-?1BbIq^kF=3S<<8{`! z)NkEHZ#Gq!*4_*zwLG$C%&oF!M^(TCmdl4j-|ygx+Uk97N5HhqX=Cl6&2{&us3NB$ zznwYJi!|GGQYmVyIqrU~dUv0DD!0xQnO`$NO7#J8{VsL8(tV-cDu(UH?FvC;o}?ly zK5SdP_H9-$3q%?M+vp%`&1)8mc5Ev<+D$1vz1I#`)1Iet1kGBxJ(d&UPRak%FWMMA zbG?^ycq_i?x402g$XrN0v#j`&RiCuo$v4AK&0k_|wBcl_#_IHbt*=3|ioayQMkHufO4MZ^rP^jI%uNra@(E&9E4FT#Xbyis_&ZZ3Ll9*pU|)*5nFPRYok=_#L&ohfPF$ou=x~5Xtl|hK39+_mSXH2KmsIm+} zAbp1Ir6H1AXgjB=z)(c7VgfQF!)sxS*}rAXFw1QAI+@v4d!h}9GOpL)z0Jp*h%Eom z@5W;jqE*f~HIkj-@%p%z>lXO(dWj2FyeW?)V46oRQ4P+bS!2Go4(I*sTSpQCR}t=- zoNQ(k0dXdEdMcL7ND@i-YO|l>U0xPpZ9N-jacu3a4wHe8oEIlQVNlm@t&cFPWavUO zhul{$v}dbN=Cw;!0&?Rj0VkemI2kQ@+NLfU@;Vsw!L0K%7iP8AQHd*h?jXS{YOe~m z%HPL4TG&(C4j}CM5KP9s8J+VzQEn9ACtutW>>c`+nfHS!GpsBOi~BQ2#0LTLtjt&l zB-}oPUD(0dV8AiAHpGe}22UYX;FmVyQ~nz&Ogx>mSxP6RtsNlVaPsQW_oVVCd~^JlyfcQiLXfHo{j28BO>Tv|Nj#3(hRSwvol?%DUG$L!Txpy* zWI2&hK(-yf<0~^ximdi$B{{z@GM5k|G$auy(`ki$;ftpyb<3(%J zv1*-~;cXkJI;?r$C7cGheS3kdp-8mE_oja1fM}?ip@%@lsv=+cpm@yW*mS#vw&fb- zrY8sn#glOYeibF`k-j^N;z0W=rht_k11Q1?o>n}?bPt9=fo&$vC}gvh<{f`zCYPtZ zKuTy%Qbyh#LxTfH5;{oRWgNEhmYkefM*?|G_U(<&>+kEZ<)6QUphK`W2%`(2eke9! z`nmNUUuvv&j(_R_T>cvH#(IPAhy1H?(ghIUJ{@7GFXBu5G3d$}#xVHXf}$&W6))b$ zh@Y}1Zd!W&u+AU)n9|8N77Hv)0BWlOJ7e({qha6J)P}C`9-?y7T>MduY~k!KLwmyj z?>DND3i~iQV!1DA0V}SZm%@2(Dg!~jKyX0KpMa)9-x&tyj?5PTXLlW1f%3<0%_$J% zRk3IbgL5gC&qf7>{3Nac@mnLp4TgIG2!-f6u?YwNBz+S|>(n8_@dQ07fl9`U0 z;etfQ6XXel99Xm(I(ukD2kU4B*wfv;ip~0`iSIG+Y#%qKebhZN#pK^)i-qXNA*{a5 zm$<-RdVy;&3CI9o6#dAIWQ)AMcJ3?qkCDV~xwSeBWNd2yVFHT(lfwPy>hf>PL&!+t zzr1Jv)dH~+;wME40g>VzTPpvQkYVNB1@z ztJwoP0i>Q1p5)s+`6NFaF`i!Wq8D|?mFk*w{E-QYJUC4 z8f*}Q4=1Ly4-MjHu}>p39K)76U_)AuKZec%8Q(0c67)GYBA~ycfafGX8k`}qr5Wlz zT`Maxl%e@3i@B*hUgx2-&(XL@@}T<|iG8R!?05s%bwr|{b$++3(_q)~$zJ$^yoo*3 zDw)M-_ZwgKQic=gZ$I+t7JBX*W2v zE#)g}HI>kQR#jC|{ZcVUhF|~oyH3%PL<5<_`M^P9lv@2AmzY>(LAl>@^le=U**vl} zyr*{mJXQe3woggs_Rwy11MADTIRWl+t!u|`EfGdV0c1*uSr}{go^*0xkR8|**`zyf zi0@v2v;3v`d+l!q_WQ5xo%^5e>4nWr$K1IPBA(uB_bzmwWzaLSh?URUs>sb6d&$<= z+CJS~oRN@vi5C6nw#4#;9yV+iHG*&O(=A4&`DCE~GSGv=IDWjXr=bL@ntLT@*UFlv2h>!9_Z9Pdy2cQ(=#djD6G1r#pxjZp1T)W#eb4ypjG7hEuVh zeUbBs&^7`&DA07Ts>pmHlvz}PRVbkRy)8!Rmru{8Cz0kR@xpfkS3Q@3)OQ6n1D&!I z2A>0=;5r2BRX3|*jK7X6tw6g8D)^B&@t~{)p}echf!byZHvXyZW1agzC-+hsy>8t% z-d&?76uZbU^o8$jRhz#rxndGm8EYzT~pu>r^LPWK=KrYiip0L+~;&b zXuW^|eNa8d6~rQ@FSHP%y{>+(4g)qtyCOqPoD>(a7FW3d5R>oV&iH3Sao~k!TZ-2T zfNhw;5Mg&6#78o26Y8L33y_^pFf_X-=&e48aFYh3cS5{VVssuEaI;+)YO@gUc??*u z29!Mf73A;fz<^y>5~i8uR1hEI;WKu{-37q+rH?>pOKJq)4EVugK$AX*Q%KGjvFkD1 z1V>E90>sZZ9E9fyYGVcqF}nib$#-~XRurM~L?=8i`1LHsAgb^033h}GH~vJJGtU`N z5++E`F7T;TqtbjqooGf6%B>i}pipDOlnF|yk4WzS=?W!77ErwcX;I}MzSsZAA|9f= z@CPrYY-Q%*X}M?yF(t3PCRaOTzh=r+*(CDwD_mSg#JOr#2c4Nqii{>{^F_ zC>y^2n3_!!m?nqx=hmQTMiPF&=V2)J}a-0b1&GBABQH+t|d0G z*S!}{_Yy~8a_!lO@Ez9W#}-HK_G=v69MPeN&je&R@v|oV#0z9Pv^6}~62CVSxXne` z#O~7*-Saxe1DM1M#M`Y?oLeYDh+^Z^zn?$^HJ!ifFgKau3^*fMusV_22xnfCk6IjCO+dlR>TE`q%G$GT((AsY!hLx5M;d4QW zWj>7)?)%M>L}Y}O2HKgV3Qg!sMICJ7`cy^Tvs*8rK8E8|r{~;qdso}e!d3hB+smE| z#EQPh?`Mp1;7{uhedt25Yc+l7gul0~Y5Snj`CwiUZi39jzOw~%TLK)!RMOko;K4_1 zCE~XiCP-u(YuRZISu@=e-DWqz(+}_^mwxj=+Of!Q>3rq~zo`4?5lo@Fj9-LEA8lra_rp=uljsn3W`4+Z+kaj9? zs98gWv_s;`#kV-XoHIh_P*a4#*`e1cpfI#631oNZ7{)&l4)=F~peS8cE(*;MYAevZ z0?3V9P6NR=G_#3Z%pDsXh9i|GzQ!QVS}qO&FA3X=ctQ=z0@9KJ48%JHIF=gdiHYJO zd3zp+APFR#o;wN6kOZ}&&EGo$Xp;9P|9jH@V`Jd*O`k3ZvZLT2N^$?F*Zxzo|6BR| zzbf|MAOCyjj5`1Eg}2GUch z=*cz`#9)AKf6$1%6{q!8+lEUN9BqPvzjM|{oS*O4A;|xUuo7R;raDILgpJB7RG}-NMYR4AJZ-Cl`lSPPH;C z3g5;tZKL_w;JN|k+v-KVWk*LIp6BYIXY_5!fjvilJ%k<|R87k!Ufhj^7r3i1qda)Ify&S)ckOcW}J&#CvDRfEzwoL{;-CEJX%VQlJQ ze6GAx4iI%X)Xl(&SD4RLmMhcGztSl!q+AMlH`~AZfgbr>T1Zrx?8~#yeowmkBf4yF z62eex>Ty zT|c)MVe5(ZU{{Bkz!HlR*ny!a=UiDC9D~K;b!6pAVqr+SH;zaTa>KB8|fk~pt&ha zf|4abe${b)ZXhMH9S<0}3!$@ub7&zn%*9VIR&Z*JFgNfGCM8hts#PDdrG175K37Nl zXcaZ++NXC{B&tE+Y#!RKfNJ^uzpMKXmX7KKN=FH@y73`cx_<<;ht!LI(?0x5=1gPRhVeKTK0n0}{Lyt%NQXyQ3+tLOaF< zHPVWR*DSqy8r5^Ux&PjCt<-He4GAed-lg zcRDxc?9kL;L3Sk;??2Kv;Q{}B@GDOax5(5t)Bp-kn_h-lQnxESsrqWe-0w*wJ9d`8 zcv-H^d059P$c7E@u3L_jR^yJeYc3RyKfGDrLTtoq#!E2MggFLV$jcIxV<=~4a|vig zg#IpI>bcU&knPZPhDUjaCis#2%jWA3bN2dIPq?{5SdD{U3P4~(zNW+w{?khDah`5h zVWA}|9x-I#>3Pkv@U7Z0!;w}gP%5E9g!Ly1D+D*!*VnQ)FV`N&^)be&Gi*3%Pq}O)Woa)Cp>Ytk@Y+D5&rMxQ%kKb9DU6g8JW1IS^lJ`9IQ~ z-e&&;8mCr+5VkD;TGapd@BhY#{`LG1p7ekJ_Ro>&U%vdee?l$qZ0_RaZ25Nym|fI& zB$XzD+R*2fO%ixNMLRlMEN{PG>%kpP!6pA0F1uKH3f4A{)Nk9dZB4nufj2nyo8fNf z`8D<>3=UEl)Fl*-1OW1a`M)ng4WJANxw=W*{1-sSj3l{B6Xg+LkYY*1e2q!^f^U^$hk zUyIY+RQl5Y$X3CND_q+$`J9`1Huwo=z+KBifwzG31DgF@?~L?)g_5$p8+UmNOHm_% z>X8{sAq{uI+h(DzIQwjOI@j@3I#&bMIm((X;@h)D_l{)^vv2Xv<7H;DO(Slc`7Df% z0oKc&R9|LNSETI#0wr92T_H6SMkQGVI%sG6rV@&_Ngicf_B2YeX1C>bxn24)sSyR4 zhZQH4u}AW!6EKVOU&p#742lVedCQ_%npyO&I4xa9?S%OAk1*D*&ZG>bTf3L+RJ_fc z>_d?Cz!j{b!if3?)keHtHYMFUkI#|#sl4{m7j(#n#f_raS+iT5M-|X4DL~XOwLSKR z10HMX`y5%No+b{(bF2`Ha`dJQku!=A@&Sf5pyz|H~unOfPSZk{--HWU8$zTe2J(+JAAs8;;pwB;VXvYVZ5(vmBlA%KOOcCdXFSl|GLzXk{G|b1;&a#=AX^Et~G2 zICrNEHt_N;e$)(_Ur)36-RR-Hje@qnvgrozuDcW0+NmDe)*j3`v&cce`&f9N*;Pq>dJxI+I1xest_AH_lafrUNY1u&iqqmS7;eyU@aEj z5pfw+-|W|d-rNRn`aZYW#q!REn>P(*J8rqK-s14QKkPS3{><%WfC1)fV9nb*|DXthWKMCT7=}j8A5`M&q z`Yc&R2QOO67$<8UZSDoDw3i`i3yFffplKpNN@iV{>@ zg<4@;P=)F+hdWrG`~!xizz8@TvOhYls0#4`PB?Oe9|H<@Vv=LAD3LQtbPEl`JfRB> zU=H_~@{>R)*f`WcIy<>=Bw{G=SGcJjV2PYu5z?Z91R9A3gG3{&Wh5NV28al`3zwTBS+JU$Qhb5+``LmA8A96;=?eeV~uD z`R4hLN8~YfQ7=iXeMpQipdZx8y~p<-Dh`MM#A_9W(`P0>j4Dq=O`cy7p_se2ahhG5 zkZ{%BTq9@rS@M8a=<4K)jYC)#ST`#+f5IYqlPy@WsmB)Xb*>>5xDYpcF-RMtwrEJO z)Aw&>RjIYUCU>>;a|VJtK*Oo?Gj0HbZ)jw*w*h$*xBk|@obkd#6jvy33rb*CmkxRi z__Bm1TBm0W-)plh4)xC#5wKuetTe}YZfxI$<@PN*KBzBmn_U>`J`G(5tUDAa9FVhW ze`nE6`^MWY^Ytb$tmZgJWdxSyF6>B3BU&*->M*Q94B?3&G-2pjB;?L^j0c9nyY-Zg zDzG;kmrWx^GsZ8&08Lr z4|;?ixXlX6TixF-GEp_zPP_T}&b!e@hb*l(tqAvQ?@$a~O~=D&h1@r3{d-M!f6RaC zGBg%I<54MLCo-hK!I9;@vNr=1iZCv%`|wCZOrYcT=h&OOI$mIZp3H91czsSq>l7V~ z)q7bNpjhkvAwc+>ikx0;c%wqhC@GHfur)h=L1d6Gt*R#4H5);OJo3)V(3g*cY=9sT z{?1~{8~fDf>Jp|scpzTSnZ+CvwTaXo@b$ouIHg99VLd3axL9vfe4 zvi~hxaVGu9UAqQ+rZNpbn-3w+C*~H{sRYE{ z#l&R-n%MVLFu+Rh5}0&A?6`&2@V@I99M&N#1L>n=Aa@jZZfG{~er1polN^54q8KDH zit|l}mFQ4Ke5=p2l@3s50(<#Mli}`g#ytulTC!Gx5nX#=-234kyHT!yjd}1pamZIR z{r)Mi65n$%`agcwa8n$oU zh2i>1o5+@y*}^Fs8F0rqj#vkNUgqpiwHgA2JkT@)L=APt{rtOd`8)x-c`JkD*ipOd z_9dD2_7$ZBWXq;~T+q?Fo;mJe{aNw6%)^BwJ=fLFr1R)=15$I~+w9jtHJiW5eaOyzY)Dov^|0+*t^$x^y0 zB`8-2c%z@Ev$07~E)#9F21gL;Kc) z^0)EU)`4_uK)P7Go2-REvBlE@xq-#=LapKvsm_#RV15RzcSj%DhrPnKVJ#t)jv*=2 zSCcKAg+rPB*0C%uaF&e#iy(cxB19OU-x3#y%|(*j9Rf% zO?zJ8vO$rX%}1J=NAt@V##@?T%+-$Qn~x{H=|6wO#Qpwij1-;Pr7!3CNf1I7Um>jt zaBWAE@+4YPH!S1B*%bYS4yGgIiQw6Cj_=}zm?%NbZz9CQId@m`?2ltT9e8{}@$5w3 z{^Ef!2@L*{^9v?V#&&TvM>>~3&8#ryil|p$EOFLt2?A040O36e z9RQ^8-obSe>Lpa0fZe}>$~I!cULDMj_@cMp^pF{_79NJjql|DVeGGi;_A}9VHkIJr*YTd?(XjH?(Ps=8h3Yh zx8M-mg9n%3gak`?J9E#RIWy1s>bt9}dav5O|LCgjYpqLuA{u?>iHF?lcZ+{UVw(M*et+a1UAg@? z1gvhKK?dk#Cfbs1tZo@hR=MQSq-ifk`;OkOR;v5Lx1yNNr$3>{Ua+y-sa|SpmNWC1 z=Uw1?>Jj|=Gij{8vO-Z5wx#Wbck#37d++t-*=-fa(CVJBZ`B~z+cwm6Opez>ra z023I?W&$V9)8p+B+-_xG_(EKV<>H}|KQf-;%2okM-|1z4>32*Qrpv!>?{WSlW(K(d zdHhh=%Xqjj6X0orzgo;VPDfg9PMZF!kApGAGrp+c<;TpQna^pI)*al3S&;3H*kK7% zFgP++e2SpN8e^lM~!2g##Zn&_LB#b9E+vi z9@(v;cHfV;l)ELS>;WED;;7eJ68J$xoblcuj@cR+Hih5QLrA$hAq_euF=Xw(=MJJm z71fdL3D#`sZa|hf&R<%@8h@Xos4qDZkKip9AEqS=egB3BENyduan+kZd*O6A^NCd? zR%gY_=wVOXSEzhtjc<3jd)bNCoH%h(8N4JVf7lj22vR@tB6J$L85DO4!oKe`C}i)O z_t2GkZ?$m6zGpzDL`y|gD$NRbXd6=|*&hB^c!+MlJx^j3`_H#ET zeY{3V4T2lx4Fl?c7;{_rcL~uJIiP)41H^eu*mh~&1_~gsI2(yOEpfCIfSLy2Uj4I( zOKV*LwFp)r!UVL#wpG`oaiBNK^D>D=B5OF=u_0vYpCi|}^P*GwE{ameIKF&BIGLBoC(iiE1Vt*w#USJA^^P4USMMq% zAN{ybf%zUvR#PcGPC$f&KK**tms5^jg-7|;SHtz%ZX zv*KL*4qk{~MuI}Ul8A_Ss(7Bn0D}w(SS}2zWhwb8|L{dF8L*{yq?d-stTmoiKmW*H z%|lQ?*<`(_P>WJ;+{Ad^N<4>Rf9k+RQmus4 zs^+k(G~JxkY7$`qQn+(&a--nh&wd!mkGtn?=W}+p?QI8wYF51skq>9C|nL$JQz_!k!{!8KbuQDM&(yG z%f2?v*(I{5;K~~0?z9!W=3>8(dDoO$ zpk!ZaJSf{2Od?=koM1;f&yA^WS+59K6YGK*EGKLFZp@BAlo#c)wH}D{v44Glj}4rd zIN-cUF3HaI!`*7oC(K=MUSYA>--)>q>7=@{p)=7^IzIAs>l&rsZs0CQbnFIFo%LxS(=*Ln3_3Q{!^gnKPgA`|ME#jv~2}Aj*H;s z9yF$tmwg4Yp><+^$+B$9D0X_;Pchmukuh`oa9nu1cU$|Q8bBiaw21mzT5(FfBd(9| zB5>cP=r$*K+JEDJ%{x1-9sCAwLSk&qnmH5zLu!jRG|Px{+Z@TDqv6UBPKDgroHvFb zwAd7@{Gp2?p_l&JlCCOmC1~PbM-+n#H^S2kU^aD8a7@!t9T-Ap z>^t4tjE;+My2)7h87TuZ`Mu)v+e|yGxDBXFLJ;mQJw`vjGs+E{_=0eV-eQ`8-x?l! z9B{i5v>r-69T0X1Y!bc)nYF61aVm8iR9JNHD8vjPA~Y1F)|nF(R#%;U8KxlK`l8CZ zS-dYn)Sgf3^Eip|&1vVSgSLu$l}}x1Y)-5pv2s)8fjhDBSNX7WgogXbtL~Y_J1plV zwt~Ec7gU^|&`cM2>GGShr)NHqjUMr1*FVN}dZWb{XpKMB(c%gBQeZJY+WdMyNIqm+ z1mDIQ=KiBz{0D&6ulx8wNst1M^e~i>y-%Ew^YRPj$t_C5a;y^mJv7ZPfG|*eZx5=d3QIK8TNM3f z{}&E->NR`m;1fe+P$HFqJv>;&Cg4>ch#>SSLF-9{M&ub=VWHS)qQOWWSVkE1L~})BE1wXAluTW^hviU--jHLO;M!$ zlobN_D%_JzNmG)h3Xq{w!m83r7CVS2%YNzDZi;X`U``LFSCW{+QKHK9&i~8=iIEV( zDIH|BMoUReFfF*B4O0erm)pT0pdjPhK;yu-=teJD8*4gM!_)uu43ox6QDX*iPJ*JD z_EI_Lm1O4LyPtmSC&wXaSG!2xAb-+NL0dWjd6L)^>+ZP>buMLOJop!c$4!t5n>Q+I zuCZtQv&($i1oO$kL_R}?xo<5@o8{>bWE*4eX$@{?-V>#MKa;iCgHIJKx!%oDuO(KC zM!Z}76!KF03n4>H(tg8q*&qGd>FuojPnz`~kfNP=6Ls}FKc-c16xnxP6L)#SBKAI~ z=+By-&Rr`GZBH!?AKVY$4?k`bFPkSZ>6~qJd`{Hlz0cW`%xQHvyYv+e zsF;d9uZM*#XW?JxqnE9ge6)T9*lAq6u?APEwTz{Is%rmK^=Mq>Bjf<@%Vr1I!jPbP zy=yX?*7+enmplH&(a~tRWtCedWCjmaZnu!n`j&==O5b40>M=yzE>URE=@T9PX>06n zVjrzV@9J3as1>5nSnx`VJV-oUn|@2k6wf64#g|`%neV@SBj-^K7LkI*0OVRO-`Z2U zZ5PW8UX<5Q=oR&dtoFxvzK@6y!N@WXA-dv~tg=qQP0>!_P4P@Y$wpeFSj4hd*m6Qb z!e|tJJ04HIWtq7iQg1zyEH)E)_Eo`adU($mGODql#spIciO0i|w5sZ;)fyNa~8xx(vCc zE0G)01f`*blhv}A>RCJbt&VEGWh(BeQ|yB;b}0pxVDK|{^i#R{QG!J=1^YVBzS;-5 zd=Z8VLhPV)XxnAch9^; z=mS!(WTH@7hQs>iyvsnK{{(ENpsQOvpfEB-ffmTmC}RM7 zrvvO209|<{fvsr3c!&)%Q4GGxQ^rYt0U0saX9&>&B=Bqvz)g$uS{cecHe$-@UY#uQ zkv-HiHI#*1zi#J7;`a-{UJHOfK-$j}c!PHIiUzb@O*X`#EDwMC6t;aRs>U~&1b43v zH>m(g3GtJV*WU%&k+k7tC}LXVy?1_uVd2;Ra)SDUFQM@nFi-&{Ncf;)N9gZtg#V9X z_J5Q+|CCGJW6BhXSqKB{-eBBfNT5SYG?hr!9;&R|nMd2lq*7-os=g-e{a4g!?d6 zB(wQF8&x$wayn6xaFr&vZ$FWccg!J`c)Xsi}c;5rnR%1@ax4vrM4pzr4 zu3C%39R3f>xTh7T71pyY?IVS^vyTa3P&nTV99|2)LKSKIbnVj58kwtU5*fBtOC{`( z#}rbvx|PP4I%?I6SxJglP%G1nY4C48bP}ZC_O?6X zAy<#$0gr9DT)Jl2o%Tay=10hKzcm^PVm?R2J0Ga6*JD-@I?!Nz;?e~TV9(ekN3Z@g*&zKjcj|u$fNx)@8yXXS4f+px_ zxy5&|cGdLSPed&2RdEG$vX~F~` zIgKAlIEX$e(#XrImc=h}fwO5r1vKm2@BtjW9*OWq^B|(?5G@G(;;H!tKJ18u90f2^ zJnL7Qvqo_5sPnIxu5lr1(+76R$tat0~*cedl|}} z_qd7{pY;u)fk>t*m|OnJ2m-@O@op|$TRMV?tL&i9rt@4*D4 zLLe*h1IdvMr}zltk)RLqT+i)CSnvG;SkmDZ$j(T`21skzozJ1KG>fVz2ItAx6EP3+ ze$pX}Rnt+03nCSPtqAZZ{D=Es0(dd;F$3pdyRZp)-Z!e1}-2vrUiar11eZ?g!M3Jv=@ekbBn331&eJt@{b$M|gZLz>;Co>|h0!-6`y{X#N@u?ZOwqVD$cHco+4g zAj2d^fC;3lA~5hfFCLg!QX<5mvR}=ktn@c-pE1g3`;a+L9a#^dVJ^FK#xmT`@d4I0 z0yjO173FO0iBMSC0&&D)#wNp*XF-pSVVX9-R<=KJ&6sda9#ZEiv4^}<9X!!1ydnSR zjsS*31VIhj5lBF%x8~p75&n&v`){A@{~IRSo}vE_D#84BJNf1XMBE#4J8(-X=62V5|P5iu-s7cz)flZ@QBZG(doc5e6WnW%j^JU7!WDS)0|6`@q9lS;S< zqjS!R5v#^HEd`p#`mjsB$ox`{<~G!c;On{2k#H%{qJ1qj#gJXv7NRVeii7&67B4y&`PI1m=! z>{le3i?KXTOvYqn8?$QEJJ|-Q80T?0YHO+@2XwhPD{OKqH0m|&XbG1$sy8kjyvEbh zy{dHXh6JUqEI-?2Or6=d=MpS0;^cJ`X`#-3tGGUbd-`C`00n`VMN(K<ST5%$(r*$iB61#CB11t!ydM4}g(}4n3#fN;p-wyp*?0arK{dK?m zgY~DzLw~j^?WyE8)T2h~td~PcF~u3Cm|&a&=;M~IWgVPF?cW71T&@Gxky@Ohr{ZNM zJA;b){kiP7h%Mso`>jqn7E?4kIsN2Mp(x%JxTns|T)Toa|EexUhb5y2-8-I0n6^rVb9`CSJfNiU2OK=2?;xKKv3E}{29 z53q>cV%pxq<2{DCSN(8(d>Zw><&>8;yit$$J+Z>Gsp>-t7%$Al6{3T_iv!G;11gUI zLFh-&<9(M9Af03-c~J=RNd`I@DHIGeQ6ux2TxNhQs)Ygq2A1fqoap#5KosOUFy40q zk#a9WT?U%w9fe~Z#S>9dh6RjfDI1C`kxc4ljdG$>GKK|Ygm5q;p-vB{Wm;5Y)6Rsx zF^TN4detJT9AYTlXzUm4=iB?D2%qk3AT>Z5sR*C+AqakYKa#v#k}?sVJ3xCz{LjD? zp7G*J2L+}(NC4n((R}_K)gbckKVYl>W)l9-oj*=s|M-kj#m(8;4P;sH&#@oKwSGkf zE##CDQ9hG=__L&{s)XUK+9)D@bfzYjA^OK#J2_rm`yQrqTedg&_ppBiCIKh4-FHz; zOwK#e;3U_Itt+qT4P0kberrDKxfyS(ik*33<3Y#}wyuJYjCtxJp%5_-l+3^^YS-jZ zDvS^KU3sAl_+6hxx-S_GJ&1!PSyikZa(kiWal_(}X4q}&uS@t&`KU4xx4R-6w4XLh zoSp-exDDeEcnh40KS)hsJAbR~u{!sX&21JmI=F@k$JswGNZK-NzVe;tyu!G4LYkZB z+ttj zt*5t$Mbbn6U^OL0fJ+fG`om(;<#Ucxw*7!3+$<|n{UxKjygo6ZAcqj2kROLjT#Z+F z9QFiG0BwuJrb@e+_??-ef+{Dq;@0;HJdWciT>LV`tT0jO#kS`R0uE^x-T)Z}W{npf0SX1TxZA!lH%nl(k7gc|-nptZlKyt;P z=i!?mtwMvGCN~8yS*w>;p!vu$-P+a)f}UqZ&&AnrwVGtUGIOB^Sr-?QhfvM{7kaSW zM8B8=Q7PkH==XK}_j$aIIKQroM>_|P{(=`W1N~~01G}YP!77-lUb}aO;mWxZ&5{K7 zfaK~XNUs`TxFWrWcoIT?*<j~Qnj{vJkjmkaD1Q50na z9bQHrzcr2_US0qNY{5RM>*6cRfwtQ}QR1>S-;)XO4R)jelcYzxp5@FJ8qzLzb+k9gIE zB1W)T6g`08AW{#RCbAXXf*EXB^ak;tTR~Mu1UMUro74t!1pHg$#J?12{?$VK4@Jmw zt!Mug4J<)h`BbIlB_&*J1_ky=MOrlPL|?5+fPR^yc6Sl*Hn+dl)1 zU9?r=x&nV6q5eMFJ3Or{$W+*(Or?7#zG7s*gsWMT~AZ5E7N;R*=tb?FTAA3ZX{|GBzw{##EV1lCd@O@so4-bW`s zYV;W0m6wr3nEo(Y<|zx#$6yH4EI@5Y-7G+F=!02+){whdfYA^ld|&j4*?me_=Gaqg znD*FHPT2a`Q)C#oWgpd{BmRv{)wJ>nqj?)^`$QA5wAje4kz-*7eU}v%rvsl;VMGr6 z2XkAeAuh^1Qs3>H`PQ6tS;ejnTgw+1JT-k6B>!&({gKz~*5vuQOA7WHxn_|Twotzy zX?f%c6P*JpGwE{M6U?eWbewgzQ$t$Hd%BFUyX*&~_MY|iPH3Dzqjm%dlG^o>C@ zW1fJEmvK3Ueco6Ww}oH*Rbkl!i9x@mePyv=!mL<0Hgdw4akW`c7sXp?zmcEg80)*J zbF7qOQ0=WVuUOtz$7|T+K~w(C&o0)sr8*GTyYc+|`rIg!pbdGJGm>#)m2n4;`f&Vn8;{@J}-2g~S2r=H!FaA4poqVHxeGm&7yI`@TAGvsgMlTnEVlW*fV z>TvF|4srE3ve`z{=>Sfy z-q~>|f8bqq+xWyTq;|(9lzdkmJAd09&!Q0!)0jnlAmC(C#mQ8AfX95yHPhPfJLu#i zrm>j7$(~sIM6kyyu5qJ{Gvlz?1bxQv1u(Q`RDYm96Fm)&y=NK~oBCAnN~&0V0Q**D z#Wa@yQ@@`Gyi1K0a!&AVc25XGH#)X9 zCXK;N(PI0`g0|u^AB+_jA^*MwuBe&5-ViZuhEfu2j(#etPkUGP?L?g-l0REMt~FyN z-ZB3Rv+4P*n3DszCK1eXqH}6fU*JAi^ZkL0_p9{?wfMYUNAj*2fiCq$EWbG<^;Q?t zbb_q!^{A^B{7|diDK)`^A^XpZAG@U5_H&d8fn*<})LK1t_uuR%9&Xb&we8T4ISG@w z9^mUy2iqr`4)gN@t{yzK>yIDe`8{`ve^6X^{3!lN!r(N=?OGgPRZ4YfJUS~bXzbF7 zjpXmA(7J)u;GJl->~clJ6g;|{=D{&HFtKk z5cfAX9vvKf3JAP=4&in#M@^zI;&%H%S@RS@I!P=`r<+_S5L%OXsKXI{QI@A+r81&x z2GgEb{ktx)wX}*rXdEfwjQqk+<3R32C(O=h-jqrH*#dvg($i2!RO8eXsH`Cst$e5W zWyTfp9l7c$7oHMdJ7#*dXacQ)j69TSEIV3fJtl(JB&4P9WW7Opv+cLg`mOvNs_xLQlP^n+b9tdiVVPX=+=G|jHNGV#f>!-!yg+z}q%9+%pj-wR8Vkg}9XZu|!xJLTo5=h)YsQOYI`1dL4?u@VYjC7L)) z%V#;I7J;vRkvHUNJ1gf2MoU`4E)CIAjWmIi=|BP>|3Jpca#djGXxKJ3s#`Vc{WcGf zZ)6$D7R{mpX|jNJa;F)PDJgoL0PQO-Fli|?dF%>ciadp5R|b0F1N&8h+y@nSK!y?k zVl%**dL-ypQ4%-{afA?7_f4ii8hASKHP0#%a?}?$$3+>;`hjT9>ZUD!WMgzo-`xLu z8139E?xiZzfHVv3Rw-_QRT9Zj32JMb_~oLs%n!03XUXb6Y>Z`-elTs9`kSSC!ph(O)j&%zemcqlktx4|j^n?TmH!>`{l5^hf9PfZ z%F5H^|H#BmO!#)o=2dWT^pSpqP(tt|pcQQUOa-SgC6X@DUy`5;t({2hdnL2a;0hiS zrBOyAa-c$qavO-&+Of>nK;dfRKY2NK`Q{zW-+DK+*B=O0HF8K4?IMhb@AGLEfg6FF z6a9i*0ITSB_{zI_rv!4^D+_EX!&a@=7Hymsb01x57$4$@XqrrF*-g%W zyunVqS^5K}0!b$6g&y3hYk6%?4O}g9PKDz%&On+Q3!9>9vg5HpmS}yP5l44dgR`~~ zO`Np5VjN3xIc?xEhv0LQk-lML{rXy(^@=UVh>sHd2-Bw1pz>uh>UN2PNp?K5;l%#-59aYM6g%cat+s`e z<2qEla$}7K1rA#_tWG>t2KuGSo=Rlz6B!J7>R}H}fKVuCc&lzYw-2zV z5;~Ygp7&=@-hzG-EWN!NBLstd#~ARppw4iJGUO8!)NSOuA&Swr*R;t$dYKS?plup_jPBD#Gbp~Q!Nj?B4H z7qNl_j_Ck3u#Th|C+mIwEWkL0D?_j#fm=-x_NqV+tRrot=y!o@lS}4pM6L}K$Z}p4 zcBt=!?ZFjb&&oFuUit}4LvIqj?at)>+xhNoCry?xKS?n zT#1+n@e&2Is8M_jW_YRLI8iE?UN#@C&<5U}j#EYD&P(iN+Ft02ke)N13V!Qv@!4M# zA6yh@dSOjQO5qaEGv+Y!RUt)fP%G{8myhiDrs8LrEps3e_B7Xv zq%7B6U48Yy-_7m(qLi(>3PlXV48E8_Uyi&y_O`-}*zP1&>B)3XwV8^w)#313rr&Vs zB0ucrBA95p;7qwSh}Xld%h=bR>={0b2=Td**Rm1`Xst zAaI;Ytzp|_kDR;AKV+C|DVrR zlh=BruljnP66D+Dr#WzTVP^MOylJV_0F}9DdQ?g%sdM%Q1$R7s!(LM@OdAXGMq^US zqie1!%Cl^y5QJ90Wm>W`3^76dO!?@aKjfvwVn>6Cv=b`5b9`mx=AZNS?Zz{QGfQoo zq3eo{T90qRn(I51N7GACCf?!R8ls{KW7jejK?uGzRp+<8X?TQb@DcA^xSr`h#=%t z#Wt-j<1zMh)s2+B_%$4F3ecpoXRi^{j}{LJzAd3EX2lNrD3s z!Rn@lc|-$(aOXT8PG=52@sq`7Muf3lWSQx{5m-?MIPwxT1^9SIpN|pe2%>@r|9#J^gJ|Dy8zySJ$B;RZ6TvG)CIn{LnAaVC^R z`*fPelbG+m^u_gDS}o@wAYy63_^t9KT$&Ce~}dvPLmY? zn5KN8x&uZ?mWT~g?*pq+o}we<#Zqo%Rxp|}Lw-RK*(?N(Z1kM)wb#JB_~m%{DupX;d7o|Iv>fGV z&U-j;_`zy&P?uYGk(4ifm7(oAdn$%EbzaBqHB`lp?2PyLg?+e~avCGIn)+?H->is< zFxIdYU8M`JpgPOztE`mwd=rOEy4{jH{fT+#r$8S$R5rp1u~_1Xmb_oRs}*#XpA~0J z_uD)xEhm~IOb?X=UlU)^9@_GtKInfep%e6wamupXy0v3wc4nA<7)w#7!^`khX_aqL zp-)G^w$|7A*q?p=(7N2ZjElG)v0gPrOjeu7BspL@$u08`b)2O?%B21%9XSt+nCZOL zTCaw+%;~&Y(OD%r@iZz}w}jyKRh>Skqf4{a0p5H0OA8eCCLR8o;0UKJ2_AnxEVYy8 zFFIma*8|J_dedx}ahk5V*y$HHr@p}STTHy5Y3G3mhj_n5FRJaBel<3gm5RN5EKSmL zn=P9TyNZuAHd=-qPZkrJxMFgqCAA3^N>dAEu-ex|T)s(2^Dr(~R{ra!daOBt!T{Z$ zrHAp{qQ|s??wW2Xot2BhR333lEuIC%rB%2L6!_*ig4$cm23l@fo1RP_nEJ|leQ^?) zKkRwEMiLSg>s^EcoKdF<2Dpa25PNCT z{ASEtIzwSLXtdPA=~73W9rJKA8>#LtZ?;;NN@CtrNvjfN%hNdG%2PZdixEy4DU%m= z>dB*MmQ`W>6`J^-Qp$!;&MbbEN8yYW-r6%Otd*cnC|^4ICgNns$@wZaB{L+6Q|HO} zoKq)w6MOCJaIkC)YCCCg64-aqcoN}6GYxQKR2a|{S_i?n5aqjz$wbZ*AL&{0Cn18f zW)bt4fCNnlWTWpBr?(%lb8uNZrFKHxV3?p+2rizEaEk&@dix?;rn!Ye5osTLAPpii zRqa_38{43TL%&qY-EuqJQgsnQv6Ohn_tDG;p){YY(e1r3jR%}s^XUCVU|)zXpl}qJ z2=k}{?6m?wdTCJz_mJanc;IgAV7exve44;Q9iSvhnL6|{zIjj#7(SASk)`MX{bVEK zq&*0b1pSO`9+U)v0EuLnWP_ipiT*Yb)%uD6yHpv12uULc0{0`;{+`c*9usFUh=2~$U@0Vh9JR~>xL5|$*4igwgMW(lObhm z0Kec;V!(Y_ql;HoH~ z+9E`z(M29JUtgnofyYD~MmMBi&%|*aqhtLzF;+#kaFYBaBn`z^2+^z59jnxZ)B-ax zf;xUBhY($0W^p4XnSh-+XEL7154-d5!A$)(6`O26tKSM#c1D8~QRMzknk{APWbsdz zi@%T>|M0UuiX2uExP`%@z2D&^-bn=7+kcs>I!rkGp$)k3SRQ4ML0|vtfE5C z&Y{|6fs-Es{GJ?ULJVpUm~a|s=wnfw7kGQm{=u3rbMLuQ@h{#N0*Qvouo%81V@vnQ z33DzLmlyghc?R_7poPbkjOA1a%=*C7h2}tM&#Qde?;1aoMcNO~2X2UvV5JnPD3huPFzbV*sdf967%P>z;fPm=oX##3b;8F>E84*T)$pa z+7mLcWp3nL&#C=UQOS4L=UDw3y5zK~>|!iPlmUMP^xuYH{p~`6?jE7dseDiBQ81y$iVQ24OAXtxa-J8)AunJbmQM-)(JQ`b%2W)UmHlSOq zA*CpW_fY{s30DpLq$h<8GxGf|oZAReihOt*{3tQF85O`?3K&3e6pnsWflpZoa)SgW zQHa>VPcl)+kRg}E13G5`A30=X0De$1f-qA>=s#x;iJlQB&0>FZE`NuaRq-HsbIvXf zc;^1kd4`#e>^=l&w22QQFa9mWASloHOOxskKg#oe%Ef;UFw?%Nff&RS^BGGraBT*X zW4&Vfz%+7PeW>EkAtiGv`~GnDgfxn*y_UD00TB6jTtTa?)=$2ZZ#dp~Zuj@; z;Gkgd)Ia3(MQ})Ji-vy*orO!HXGrMam`X;#(jNgD&73tuqY&!Q&mPXU=q&?Iqd(nV z6CRE(IF8VrOJ3_L(J70VYA%<>qvP4??s^#J5}-6lEB=fwsS6`0jp!d@Kb??tx}|4$ zlCSsWN2#Q`Fg0>mbz@9~5}aBA-&|?CGXz(|Jc@8X`KaryPz4~JZZZwdR(vi0+jD{q`)eDsK zPmQozPsB`q82_Mb3M3gvZcP^rbhBGBciLA8^@Jwb*I2Cgquyy5ea*cL6Q;4N9)gRv zTR_c$fn==`HTaG}jx^K+K}g^rCK}E$gQml4Uk<0>!4DRC-a)m=6K~YSba6X={=0}# z?IyyH>GKuJl2z!t+?F4t&a|Dm%-6vC%f@42LAkD&K?UsKrhYW^pRxVXU3!BFu!j;0 z2gK(5U=jk5@#Z{B%~a&Vzpy8zjkyxpPLz$p;_%vYz^Gl2z6>I1^Q8!j9*NWX%H;^a zYlk0kYDh=$2|nPH&(>=Ob0zS87#Q(U#O8@M8oZJFN??!~@;yTIqzu5_%**_49LG8OSW{qP~Xn8Z=5fU;PlBH6o(A6spmaR`0%Z%(+?V=OIm1S z5gNL_&Xq)#798HClD-}B{^ll0^4pu?$X1{h6`;xHz8UbpdEMDFOxgSW`_3Ayzl&ZB z-Bo0Ch_$C^%^X7yuM>b7#(a>>ij?)(1VlDRNQ&hdHaY-TKoAWCwe&` z&~TJ6K#<~K7Ht<{{|apmA*+$_bDBf5p{~6^>Z%%lYwF<)o-BOyDC(rTn?`!O2Zt$s zYz7IIN~6_MY=?S*1%#NClqCh7x=3niPCFJSfwn>%19e&(wZ3jRR_1GBl$>BAMJmig zQAv#}*O&=n;gt<$ur-@$K8E=&>wA>-riNpBZ zp5Sp6U5P+Ad(c0*e1TPAb7IWimC@+q}K|M7j#o+o*VK(<47e|14^Noj{j zh!bQALt%JbR~sc1*hY6Ihd11fwwrv*yqkI}BviDa4OJDA7Hh=KUhS~7Syui%zC?GW ziY$P3UqA?9-yFX1>oOX%%o9@K7DbzkZ(4bJJasL`fJmAROH=Q;O3FD7vE12-^ushq zLj=oRdIU*>dZDudd}j%FL?cx|c$~$ha~QI&q#|$fuITcHZLbr2rc1VPgUl0-K4n1E zO|`(=IL6C@e0b{ubucs`XA3M1GCOzS8uJ!B7>iLfZ#_G>7@{U?ra)~`*QiIYKO;MT|Z6zIi`(4cu+u42< z-&@2;RYd(^4z)J&0Q)AYyf~oVd>I^~`u5rv&Y%!17K!T46D1iAqt8k>tWAxY z2M8ZIA*WiyslMYj#Qk<(D~+8;^Q%2@A2zZT2=SW^GFIFZn*Z(f@}t)e^15f-aQ)>H z#?kk~lugQlJMooLQKZt@pp&#jw1#9&V@bs!f}ML+Tm-op%3~Yi>4FIV)CT9$HH6(k z=F|w$@OHRv)i~?3P6(ghZagc_(v%rvNmWl%+AYgSz6W_S^t*OH3878GVkf-jI}nmA zBH^tWzN{Hv-@rjtuUpb_!aFN)3MJfF-5L>AfZ5(K6QaXxlye|c)Mv!RJGP#UCA~XI5GepEF72y?KDwqx7ubnLuTwkD&OyhY8JM6qOwZ&dr~7 zG8)p&32lz=y-E@+8ZGE7r+}P#3R;k=E6p<_63PWJ#R8b(*BrF0LsXrw+0i|s+lsJ1q1LW3gfTHg+x?wgu9#iz zylqvkYAl3gRXA!4`xUN!yxRX95CKlV0cJ&jKVicSPC^Vwpzc-Kg(U!$@JHsBA}CLy zLTGSqA4!i=Ljj~nFx|u8-Ry8jtrowDLIuPCNg3eXmKWSgX1ncjbvsi!(kkO~ zDbKuN_b8T^{p|RJ->n&A(&W7|5nK3{&ZB&GA)9+>jpGOAwnk*OzKst4JB9tzHLE74 z5ng0RNUjIcN^}|G#TS`A2S2%FWc#@}I?-#?~JpVZqc~Omk4jjP7_71HgoV zf?b6wLRuvQ9gARBgA)U*)63AB-rC?$srHWW7paf*W0ofdM73||=cSp;%Nbs4DFzUo z4@8I2+-_DKZzquJa+*O#jKj%*<5Y%`yQwOmT;Yd3km)L32;EXNFAtZ7lE3&h#~L0JfPNjTll{P|E4NoWDi*F1i0+%~x*|-; zGvA(ZCq{+bsf(xcZzl3xSds;lv9%(vHpE%P4>f_jcS#`g8? zBt5wxqk8A*Bi5xDhj@$xbh|@bYUL9skV9rcP(^nh_h9OqD(9Afu0@CGhcB&*6_-ap z#knsg1{@e#BcF+~e!8#$!8I!Rn+<>0d6vHsd8z)m6+!bZDPdEXs4^TL z3_eUgc)~7x2NB%Y&sbwMfW$6u=^v@g?9aZD&Qg@5n?2HDma;OW3labZpEJ!6G)2Kx z<_H$sACYk9?(`+ejGX7C<@XD2JgIG_twNliT1OzBg|7M9M=x_XZ0H1@gEY zfJOh$^o=KE6r3_5%hjka_f&TjT%z3Oq<`ba|KZNZ%JO(wSojGI>_l|52(}?ksdRt+kM17-KI7Z_swQi2xz>E=d=w^)It_<7WE3NfGtH2bK23zvi`qmgClAr<2&dxb)&wq!$D;(aQcmL4cVHMU-40M zYlG?XPnNpi^tdShg%yt@p8T>@bhc@_7~3&s5}$laovW4|)JFHCIIo~4p^mO-vO^~! z&9Cb#IapKp4WMHg1700oTs+zoAC}5@9p|?wUem!w!*1y$%UiiR|p_6*;Uq) z32DpofVSf#2B-D<*bKzvV70YrR03&rA4G+g3T>t35tGF=9w|67bma|+;c4}y>b0>D zd8sN2N1`X?xgSm@V~w%DY70?Kb37>7q}5n+9cqo@k^3t=fYupG89}{7M}2^n?u!Xda>npIt(03ia8F4oWE547(^#AVnlg=z z;fo1PKA%@?jFGJ6HGC+}xy3a+JnnI!9=D2Tl}T@JlwQ_@>BZfI%snJey9X&CLlb?t?bTLz7fRZ5Ip-TQw&%;Q+BoP&oy8rP=#{S@g%?8^ zpDkd)fmk;jl@hbV9`S1icQ3ADfR~(W$;*f8)vw9^?;h0-2MQ=t{Ux#$MqWT`@j=o% zp}ZmAnLnWW9bG@=v}>d)R0ox;ay{BM@%p7WJM<960Yrb@U|LvlY1%;u=vo%yt2oKl~Bi>ItsKG3oijrUn%wrnX5D1mP0fOoI|CBV&tZhVk|?8+1nEx!8S*_9=o z92{)i|BC&Pws-QM@2 zT7z0rUJfN!jtq&L7b{~r#UI6ogSvKCo|A=bYT>|PCUM&B!_XC%FIql{Kr1xoIoE=t zEh_SYr;YZEMJ8edmMB7WH4Y zfKC&fvs42pftJ-_O6ErHcLoGV3GObWb8k(+U6 zAUCG16X9j-`^l?x+ccjDPlx@2q0YR*nuS_h^gp0az>JIQ~dfBFBN9iAB zgTl1h+M;$?E3 z1JzS6_`O;)vEUgto{Bw#*cB6k)$h8 zZ@^GIB*T5e5qs$_=U6P-Z`;Q}0SqnHo_`n&INEfV0n58`oBRQqOBZfb*O%)7qA zAlAUPci_}~aQvWO7Jv`w(gkzyf?>BpXK;&Q*OGbn=>psfy_?|z#&@m4*~I{!-UeoV zl3?A0LGZZApLRBw32;kL3>#(S z+(;Bq+EXMMFUlPTbb7AgKbw7P>1qGPgAmf7>9)o!RAik*=r=(SYmVmH2<~8HR*p(S z>O+e%tSoM>7ydZbWY`VZaXVZHa|`KK)oxC#JaX1BX=@wEC}Ls1PgvVk)6~3g>lRT@ zi`#LW)&Cu}g7bxcDZvtUj&Z{d;=Nbi;|TBU$|>e{2?IL)Xb&HF;rXuA0IKBAJl)kR za{F;@uNRTg{@X*pXiJzvn_Vr;+^C9VJuyfPKNupWN=h&<>rlx0&e^P2w`#fMeoV?@ zI#g?+`;&gpbNGl$W5!LxO{4B-I?IbEx9+QruIm|Rs$C`6*VnG&qVnAPN+RSbHSesp zojdnqTJUNf8LI=ny3Zw1{qjwm53!-uMVnuD`SIvL9{cB1io^>mzk{ahO6+i&=Pa#* z#I-UrIT~v3vcaF$Gw*0Tm&4`rWNA!ShCLT?r&wvcESN&devYk=40>slEvPR>zOT9! zZaQcbj{e$MI^x+`jERAr2yI^78z^kgmGf0GXcQ_9NW^I(ghr}bu!M9H+ru70DQ0$O z3N2VzR#omgq9Pd!e1Y8uvA+gT_w3(ebDi&`hQZ-uS|OJivlH~V0LW^<-JcrJ`pudt zkSAn9UZ_m239QAsHHl@y&0R0)s*8h;HR>6cL1JB2{CvFd)ws9YgC=CR4le!}k#C~v zzIm);8i$UfLaH`DTy~+#x~uP7r^?B4ihWXDeIJHxE$xxhN5>)?k5ZcppEenCT>{|4 z-c2O}|HcBTqfUPdelCL-$U%fqz>ZXdCq$6$AXin?g!jNxYhcH02(2b~18et=2poj9 zs|uA9T<{(&Ru9l%uYi>+1q4tJ8gl?bfM2xmAnfw$TrgR;u`=mHzEm|z~9o~05fsv9*PI) zCvE}!U1OF(j+dF;_h2ieOJM{Mw|6?+D5B`bb`wFh6HYbic(-FtXZ&{)Owhl}d;VM~ zof~OrMj-MYFMKE{*T1s|K!A#Wec=DkF-8AzPi$XQvB%RSf;xASUn#VBvT6ztw`PpXf2?hliH z{^I_tY0NCof8+XO{IqG~%NHWnjf}f7zO$Fxv5y)(|I}>8bZLxLqa4%gAY+6HpkS&p zs5&!x<3-`^F=pmfi<^G#3Bgm=@cz`(i${^`9Nwdg60hzZ)6;?^OcC^k`;&$Hh^vNY z|4@df<7z!R`tpFv!PSSJX$U60TH_|fuBn-lo<5n=t8$Vye^PEvx|DQcwWApp5iO04 zc)VTsmh$E*!qPG(_%n;goq4j<+Me#Kt;Ah5x0dO$oj_|u3BkmLyB*Aa8uyh>9d#8O zTsyDdI>Uhg&0u}2wCVaN(N2GxX)LV*tm3cvA(Oxy!m2NvC-{m1RPy-<778I`E-3gR zaP8`T;K-I%t5&WL{aoZi7FMzF=vvx)(?5FJYKWK>;+@@kocGCm37q&&xgBO!3cG8A z#xzJ~;{|lnQ;mLhoB1y@DE^vBd37T**kEioQ8%VLYS*2K?eg)JVO+U!7cwu1erPk& z$z_v%&pkD)A{?Zz2%qX!>9&w*tVpU z@(|3n`pyR||Hkj{NBI1kNL}-zy(LAhS+r3^4Aq_r|=nNtrOMX7#~g~gfW?T;LWQZvV@7E95EOmYfG7m7~W_siks5>vXAQl z7^15!N|-W*nZA{q)Wp%UGcg>;q(4nHL8V9+H3hXH8B78`3Sg0tJqHwb^Ht-#`oT@Y zdtCRNm&L88ZQPbLYB$(vt`skOl>KNrXgbpDG;Sb$|6Ofuqu}x0=*3g@CgS~fsRn&b zq4I2n68~wZ2=V-vunXH`y6U-V2ckB(eUfqs2=d9(G`MeK;w5HWAb68KtJ<+(cX_jIiM9rtscgTe@?|@^F zmS`kXTx2n*>ZrgxD6Vx#rTgGSYLH_1tlOs$a0`}feDEr@1POm1K2_5&7y&~d3>=0f zTNQkaPZdk%suy~k_~#da%1RPohY#vRigX?nz)nb@!p0DY2cuGfMd4eNLYeo$#ZrSO zoFIV+;Sez7UytxWWEebl`K<)?VgnSe=MqSw8Kp>B{n3p3G^*^ z^wU67qNG0omB7Qjr|Tda(gP11XL;ONc{8;k*<}V2$4~sjZSV&6r3?~nuGVfS(%~Lh zOlnY$czTQ~KoXXhllD;ZSJ&m&q28Ot{tH{Y?9ijY-$!nEj)6r1Q2&WlZaDcEWJ8XZ zQjlBm-?F9t9Osm5YlTC7_AZ|!} z5KK&$W8X)cXUk_3eax}*(HDh;$f#DHW`Vw>DN3hSr?BlO9KURI`VDpcBfu^YpNzl- z`L18BkDl$$XKDK8f0KX}LUCP=(v6*wyv;spn{S-;JT}0>67O=TBsr8@oE@9^K0*?_P-b z=}aoc6FFuj2KDHpmtua$&tzoTg;1h?T6Kj$nsBxRopz0rCDBsH_UN(!>&hhaUUhmo zxxh$)T}6Iyex)Lqtj8)e$5R_#_WUWg%e zwQWv4Zgbx&KTQeE8`b#U5(_ajJ>`P*xU(5PTy;wokDqOk&KQn)e^PF#)%jM7+&jzp zdaLf<6TNS+C+BA&R(TpgJvEQ(uEVK$;;=bX_3sBD{Mkt!^{;fMt517%&y4=9Yz9y$mx$*3{mT{ogm zK3b?BNA5s56H!-~DIUaG!zBZ*R)HleUjuS~IZ*QC`FY~s-?mW#e+Hy^v_b!tgpcXo z{G5~6t$}?ubLdCEW+S|vMIU-Ahm=jLXPlRz^gYMV{eth)SF^fQb6tP_cx~$j9N4y~ z1#3d@tYE9Gfba|RejloZ2c@=TK__rS_k1*;f6x@VVa(SK1<{e39s{%Fx92w0Jw8q2Sd~cpt=tD{<*sz_;BxUbs-y@gRj3d`1vZbP!&5uu7H+)iuJG7ZUAOjITQi zPdpZEzZbkZi1=rbI5Ca|PQwF5lJFyOrofl(1v3vQ!~V(9^}7@xg6ZL!2pXCF4aDL? zy#x?~;Lm;rebEI+?7DHog^CGcD0U8(&PNzlY+M+G_uV^w8Yh`I&(i0XjvQA{2XkCX zO7A>n+sC{!cTGg%=lq!R9j?<%SU-BbszXv0c&Xu*(Lb4ETRmWC5XU6`8aVYR-2e5z zJaAR6B5OY(-+e!%;refdNc~e_qG4{~XzFV7Km8B1|9bGRyWj3p8%#p-eLl%kdFqM=K-2+JqsbI_!1c|e($nwzph6w%#b%0UPmz&Jr^;up@ zR^%FUGhV{asa<(~X9;zU;(7gk?CE~2jZgXa%h@3p)R%~fXm+?{7`!c#NFE$boCUe^ z#AcvbNZ%WhS?)y;xJq}G$8W_vN82Fv>02Bl93hFXd`6HHLfiVh3F_T~_s0=;J>TAX zKXg%Z@VAC%!*xqlJhhZzjF72c4sHwFWHS|{U%EVxqKQ^-bofX!yLIl4q*$3Z91$A# zIR_C==p6|hYKBOa5Eb&Rm{+3y#M^UZ(f14ocXyBbGgXu4+eSn2q4In`O$Uw)oU;|2 z6qfzufh5(huq@z&Tj)ynu588C2#I-FnmU@Eme>4pD_?C-%`o5=(LO({G;MV|_+e32 zA5Gx4vV~+;WX$NlW!m2MiKNGbB`oCK5W9=xkmrd>TDQ0lf_|3akN0TOWsM^X`mqkD zPScE~P1zQL`ctJe=DhdI{ir%Vrqpo6l~*|gq(!|yiRbvyqm7y_TssNLL9{8ATs|}s zjY(#rB0D-b$fP9F_Tl+uk*85zOf@a!XV4p84XERvl7~_FB-n7YyoP1IFKxU1w)o1i zcE}n<)UBh702ow16W&yM$90i>oJ~)nIe+n?@z(h34d-dz*~?*G@xizPf5H32IKg*` z)pzGrJ90C=kCN2ce(jlNm(DSEMk7u478ym`C4$%7Yk3%NO!Xpq*()U@``{wwaH_hn z$>Vyy2`YZ($9Tit{A05xI$_&5{-w#w{E4>-1|fNNJicAtgN(>P?hu_r=l*Nj`Q_m& zTA(nfM7w!d^}B=!_TiAM`G!Pn1uQ~U*pc~tT9jV^x!9tr0i^_K9Mmx1c}7rrE=A@G z;^NNajZ#v}q&MoiM5z~94jNYp@n}zJ$L1UGg96HLY2s(zHe7hNe6R2}E0q`Yw3q20 zlfO(Axkgogc}o#nOWgs(RG5GWAgo+Cj#&UK=OB4ZO9qsBl=xl}K$mzo8)r9$gqA79 zH=1LEE>Q6u;7T40B;Nf{guvGc*JcGaqGx zbXwDwocnlF-hr@`5FRw4r+xS-a~!Z!@@Pq20I`7xX5x1ow?G)xeHZ^`?J(wn+w6VL zN>TN^J&V~595uF_6LTJ0BWb@+HSsvA#gD4R=Xd$ht-;?kn@g;nfYL99OX~{Gx^wHn ztLtLydlPW)9vRK8+j060!c1r10HQzh)fhozY}&%z0B0jqf+3W`go4(K8%aWHW$ zdze@q2vmfVd$9YY&7ZU|U^j6L`qcuNoIM}`W_@hPHQ8@F5Ef`$5c8#?99jJlFPhys z&Phs^P&sFNN*G|r4l>{0OTU$+N5166-?bEkEVgqj`Jq9AFlj3AL-auJw}Tb#V0)Zh za@%zksM2?UCR6CU1V9Vz-~b-@+-DWIVc1Maw-g8a6Nv#A_AzvM0ynVdjkZ{sME0*K z8vD&E;!%PN0d)s#niNwMZK=%UoO8nee7EBi4XcVFL(&;?I2QRkxXb@OB>(wpx2Nd; zkzx+q$+688!8#mD!LbDbY)Z3KS@5HidF#0+wXAb6JIFBxK<=(Z;{v7k4$n}c2YOMg zl#t)2?Nrm2J5Yk6GJUPJZd>Nc@rziepMcG)|HZyBR5jd_4^hZUJ~-m9gvE$I35%D` zgpF6tZ-tyEf}Svr*@;S#O1*a@&{k{JIp4w?*p(8;NMC*rpDlV$>Q2jYy2rkQsVp=4 z@vft+lGE8;5~*~`{q2np4I1nazCR`2mPVwdNBx$jK~^QPn-0e+w>#tSq+2E?ns1yE zo!D#A%Zu2iYdb-&l9I?L$W(2D9}w23)Gr?8T?(6zlc|Sd?WJniZcIz++g1g|+qd*P zF2_hhf_he=&3MizHZGD^?Pk9Y9$*LH$f9uK3G<7yEx(BfDcUm+<%>rRzWc6eb1T%6 z$vSFbF*9eV#T8~mlQ)sCQTe8jmK>#xo zr(lBG@TDWBRa?{J@w4~wo0><_7bRGtaIzbOO4nJ63*qGB;zZ&n z+Uy!l=WHlxmarY4RUdw?%!s`J#9IaXTV-a2i2Y4Nvb7@UHpH`?(M=d5N1<1gmai=P zEsFaJ=fLf@@OgpS?9N-#T|w>rotgMaD-NwM4tjJb^(67;CeFl_pg^=mzycRgH1wM; z0G4-<^Ktb6Rsy*=8a0iWxE|0V^#+(3buL zE6yQ;1fl-~D+Z&j0DdZhe=L?Ff)){$q`tO`0%ot=U9d+sP`4KWm|Vb=%^hZ}0R*2I zQA9uSgQ=+>_cNK+e)Ch0u+q#pw*9>YsY z1kc!m&I%25Q>PQwIeP;NBm4UhU!h)+U!f_vFMzn_!cFeb!za;8BLa8X*=H?Z{hiYN zAD$p5W$vxdXf`F5;=v@C9u$o}-d(+t$ey&5NG0LsA6vH?SoW2y#B&x!<|f?7rcZJ` zcUy`?eC5S?9rg|zfj%<+K$o0&hM?H6VYgwl1+tGt=D4!nGaRBSB3uwK@(otid|b`4 zD}v6Lmr@3WqO{+y+v^Ugho!h&{ef1yOFvab?>F>`CaL1LbCGV9fE;)Gj8+x}s~Aq- z#dI#L0}phog2NPntVM(wwBAW+?~=kS9@6h0W83@9Pr|s^ja3MxDb#sA?WLJe8-{z{ zU+1zH7}+gV-PkJa>I7A|r<8q*UB$qU@FaNFT)OON_B|NAq{hV?8Oc)6RQ^28NuI(?tV5dv*$+Y z{v_jPlvMV&bqG2UoR%=!Tgy@RB7N)OeH)?MN6s`@XXaipUJFfP;`aXa$J(9wdl6!$ z=JWW9n@qp6pEs4LWQEZn$d9WA8V+X2v&7gL64)NfRRJjhDdZVD*gg`7LxqJ$ha3r| z1_NG^0E3W1X+r^CeSjf$SrQ;8Hoz829Xq(72M~p|TS-KVkH82R)Ps{9M~v(iF?OS5 zHD}!}gF`>w>ny}E2pavb3WOF829Y5Mx1f#jHvypko^k)?HYiM4`7`1o0ul?dXtUN~ z;7fBMt*q+PaBzC|Hesp-M9b57SXdT<0tK*#w4;hB-Ka+AmEN6CyQoz?)76s=2BHs} zi2?B=bf;Xn)|Q+VQK+2znIcwaFDD}cSsT9}A$9|yb0w^S5Ps}F4O9F6AuQ!BccS=B z8*Hm!Z~7Q37hX8xI#Y&0`0o4d%ul|bc*h#VfB0Y%_8h#U`s5>O`>eJbj}zdh7CMej zV$hA2H#!goV7<6-#ljagLf#e-6{YM$r8dHI(d<)zq0KL6tB!J6WUvhnj2rdw0V<~` zHGoG;!UbpnNt##b_9-6pCW%Kk)$OcL~+B-a)Z$w{dtT!D(f28*AUMZqMpC-Oxe z(j9duGlLQ?>4wZ)OwaS>j7)@agLET#$&JD-6I@(Jg9fyX4IEw>q@fC+@-^obeQdXk zohj6}Fa7Z4t_TV(9SL=hVSY2{gGEL zYCmbywnf?D81){(XbEi+l$LraeBjX58s%Woep{9jd&L2tF7#*@81NEY`kTM?3bBSSgB7(+sx4QT}?vlYXsqwibR4!!J~g7 zxR(1^l+?Q`7-jLrgbzd0|L`|X^}x>Y3n{YLSG9;Off;7Hcy_nSFLm*@CbpbHG&yhT zRvW4O6=t9-h#D2U9v3fBR^7fI!7cCKL201Wj=LgiY5^pXtLzGu3+mk9i@wO&3AvQp z$ey>y6%d$2XDPDideKoN#0ubG2((U`rpFOVHG3!O3DH|k%!KDkBV#(zxsk&Qn$+k4ffbYS*NF7k7cXg=Tp7l;OQ8&KV|+ zTIF^}&Ncii&au#&Yr2}W4#)JZ9V=3p#_8b*{+9zRy{mT)$5pXI%U^2yd8c!ClqY0t zJjkIxNE$0#e8RerdTzr0v>~B^KZebLQ%?Qvn=?L3eZsLOQ-vb{+#*LHIHVoL{8*D{ z?~aRKO<;OGnPF5;vkb=zZi-!$a-yBy+_3o0A-)565#0Q)fB=X6@qUM6GL8xj7u!l< zI?9gwN2kn_mll#x#iRpQG<}9G{mJ`dx+NrOJ84I?Kz|aM9Y3+0_A_m?$2;k#(;UgJ zrbU8RcS~xPx9s6MuD-m`ryq25eBS0f81^$?kDh%d9zBKzeEyjVMdL{(I~NDn3QXk zJc8W6CvyDyj0TN(@lNRhkHaNJIXl!*UV@*(r#U`&$8_mOw5m7YtI{slJ0l_4G*Uwg zrghA`8Cx#WCCuEAq6lHCe8<7wZ1B!HSdG-Rf^ZkER0U@j52(xro#re_aT|KN`zZI}mQL5ATyOtAf326D(W@2kIo{+(BMC3Ku>?_UR+7T?jWggHNOJkcPx!x;i2c z7LdC3;JSv8UIxF}E#TWlfDmznpwF`ka6X>_v2*|p$3aH23PY$!k^-^Xp;+%yjH$C` z$)ZE6iP|qU{pJDxl`g?J1m(d7xdtgiteygY=Nbe#^LRK|K&0~jF>lZN+f8sjoB7n~rLU+vl_$aSntOL;S<0ytBmJUdYI`eP1i^ z{YmWgC97`b_v6dX8>rEqa5PS4cS%0x%Pk7Z(<{?ROdsNut)Q5xC^*bNSNbN&4ez9u zACk}rjm99*Edx-2bmj>%UrvZFMiob+8LGq>pur0?sT#gvaFqd0MS^oa92qK+t% z4aRPCx;JdcneF+9s~FN_h!i1qyy#4gv}!DRG+{ySa;E z66`oi$>cpam}Qh%9-IkBvnONarCXbq4Aixx{a7_~G+HYhtYwIWs$zHFH~Gx zlU|cNRDAyv#ZC>qcttAHK)O!7LZ+8RE0%SrT#h>-Zqk_vxuVPuti!T>t76ywllMkW z?9@K|!`cV`{FRq-!HbO;@tDHO$n%uoP%H7f- zxO`s)c9LZaYyn-f8)Omqi70ec3iwYa1a%d83S;DB1;6V)P<8Efc2y-$%G3EHYGt{$G3sGnl8!6}nqRAjYZ%~avS=SB7e`tMWJPXxQXwu5f* z4z_YBb12Iqh~?r=8qj|77qfl*Z29{sV`TXE{>EJZY!~zK?j{^Fx&%gwjZUs z`BZgw2x9f;-eiZaB4{yERS;jR07(UB0pAWNQlm$%J=x|+Xo%E>fSzfFD95?j&E zqn5b*NU$Z$aG7H%ko{D9>Sp6IUP1D~XMW3mYu?wigWU?>u(VOK=FIgc1xgGx0fa;a zoEJ7rxa4kj87_FuQHOLq@3Q_Hh`_`*G*0@}Ac8IGdMgZ6Ls-4=%$h9pyJY`X#yVYo ztr!BZlq$)x)Ec-b_bKb3hVq;7tOB{QJQ>L1GMthZ?NWX3tfHV zILNK1-@5xga3k5xn|JPo*8cLQSg(M}_sb>tfEl;FT|*LbI3Yl4_v2get6n9-1fRv` ziu|m+veLVz9psQ$BWm5fiqMt@LIW}e!X^ZJV$~j*pE(q+HK)^at(TDis}d!}dy?@l z>~OvGF7%0<#=ZW3BdpL?3{t+411o{Mip`+e{N!}2_F2M0kVm|@Vw!_$$p ziGSr=Qz+e<55=J4k1cBOW5VXI_g;{$>OxS7r{Z94mW*mrE4M0NTq&J$l^XOT4>(7jKkDQDPvcUln(( zx&n8aj=486@&V|QnHzb%Cnr04UVj6i6L_!TM!3QrvIL0#=*&3`^}C_>LV@V{-x&Kp z`+)0=bj=RLwPpp;vg`hxY5f1|TKiXyJgtI-kCv&uhlQ%Cjq6`z-oK1%eW`GgE0d%@ z^<=63GOiiFZ3vcD#U6a>FAt73*ESMT{~d{lm7@iKp76ypo0nsdA44V7T~5myNppkP z)}DS}a0Pm-mUML$a>_TC$1@S6uo%$c84p3{F0T^$Z6Qz}w^q>J_MVCaPZ0v&BJcT$ zT_-A4R#Y`27gij=%M_>kGf)<{$Hjb&R0iF-#bgN%ZYZKVQJ*mwuMdn`z zZVIDG5<9_5Fb)mjE1&*Q<4ciuan;6H{&1OnZr*cMM0jI>eILSoopj`ryFc+zibo=gXppvifcAcy+bmP)ag#U} zQwr2K=^OdymU$0`j#t#q=4R&+1xlF4&M^pD)fgj-zv4BKVDx(pFTy*9z! z?+s;tn2VWhY9%MQ&~54|jF||g7&jI0&b>inrSKn`Xd!f-JO4$0t7)DQl&>!#8(V~$ zHsO`W05;gVbHNt*Y)z1d?zH(!V&+R->sC=A(@=4_u_o~nnB!6DkX8Le^KfP<}6H+a- z?{ry`5n>qBIAeYd9E9G^gQ8b+MezS+#J_o9rX`40emZXTU}Pd)(qNA8_!nDD$3 z1>F5_>QP85ph$xAVRBR>Af#cxg(8|EUENpHNqS>-?sFLl@w_)fV(QhW?(P6&OYH+R zQTZtT}iYWD_R}bfcklReK3d` zXyVv*#(UGYglisAt0{5nv~hF=+t8}E4;s-odA!N35S%uDHeSW6-mkkF4SD#Zt}ADG zO}2{9f8+BHmN@%m=K6^7SpEiO#NpffAgww%G_=aDIWjN@>8>T~AWw5PBBy1DecnU` z6(GsEwK*x{vkU2NhyghHIVNTWK$-hT4id&q^Q{Gd%RA`EIvDE~-8B=n7W!;2h@W>*@>+l#22w1< z+W+ltilT``g93>b4Nnt1ItV1J0$;b z8zI6a?G38M@LQEJ2m4+a%MfAFa8x;jb1@*9ao}O+f5}8fnUFMEAzQ*vNO7|2-yAl7 zf!lH*h|$2t(nrDvQg|xi31v{@P0*iMC5nqUJ#A` z^yqrKo0X^5)51pQE3^sx27PsAmplyRw=aDsv|1ODQFb~S&ToP|@V#n2_tA@L)`U&q zG{1>`LTOBd8-8;x9_&?6lhGv!ACGs;=slXV>hjOu!HB`!aVf}NkT%E+we%K;#HRiqMlv68(;k4xaR_VGc4_`eirh->KeF`- zLi~-RoarcLMff&-2GAJRz8QYbP)5mQUg255%T@6Z_$6a+q#R34MXHZ?UXW4qzUfpS z_$?}xQiAr)GG@>qM?8f(jlU_wi0?I5h@Q zQ7ev}l_I&`UAwJyBzcqGpB80UM(?8B(Awar@ClcaO;mK_ZKk|K=v42qTZ5UYb26tX zoF;9j{g2TL@aVQ*5+rTEf9Lj%b>dc3xYKdk5pL+E~l6{rI050EX#+ovP6u4{tWyC-jC{1y;$Lw)Y<1lrSojjSd{e2h;7}$m;Ru`jA8@l&WP*axgN4C%0zbx^eL&V zHQx+JQ5kWO;HE=Sg?Y?RGe}wbx><*kACCF@>cq_N(P&!p-i(836-0XRYwHI|=#FIi zP^%)TVx@N3!-*zB;>^gF$>tQF|pahu-rdl zhI&&{*4GnXCvk<>b(%aETcRxJBST%0C-t((hhw^Y<9QH>Oo%M3L+v#4-BKyh6=`q| zzqWIg{@^i8Uf@imAgf-F$CzA@IMqi`>YIoUQu@JBjn{685Hz}*mKg%l)aH-xs`@^X{>O$;2w}+~)g}Y4HpNPo>C>JJO?s?SNry?E z!-ZPRgr+&GdU}HJ*wAuZ#auz$#0iRpZ~3I)-}$PhLXaZkAB7$)l)l&9n1!c_1rc<)qEDc`c(H&N^ezfvP4;h_ZNaFF$6fkz27N1xZ7~X*>uSydVNA{G zeczi?g2M&i1+}9%brLf7@ROR|(wM@7j||pTOg9a=#yQx#p z7@O(L<@%pEMZuF=pvqGs{E2E7JAH+L4{rf;i-6sDz3o`hvuk|<~@c)7J!?h`P? zrs=P8wS9E=cK4>`vmuOqD3sIUt|#`a8#ahyF@FB)&UFGlGUQ@AChZ}S3lwCaxr*; z#=0hzDT=9OW=`ji9Jr0I9NqFstdM0+hf5Oe`}As9QhzFq6}su_Yx8f&dMFUYBoz8+ zMg)&TIswipF}ZYHj&Cc{` z?KXX+%q^43)Z9JKjahknx>*_Zu~}v4*B9IB*;D)hRxOXSX3g@&@Skdl!}qd32D||~ zxcFbUxri|}g?r59aow^_>1<`k-d_k96`Gf5-ruuiJ*<^&7r3KZ}b+SMXJ;X?cpIWPF~P^;JJIS|-}QS_t)7&~{T8*mQukgI1xJ&_ z$y6W6tJ^~3Sr|Ox6LVO!SH0cbttijU@IhZn5hH^y?ewRw*Y;w4Su4|tbi|mggZv8t zsPsd4nowzr1*iIRI6~>+_9O<~am=OSnBkjK!gcgBp3r;|J>kZN+Eil^= zs)Y-~M+a$%JR%cMqJuH~7z3~n37Am3M*|WdUHZZfDw17(!gBQ^yUfG7EFp6BgK7c7 z`K0w!VeM)Lx6MPS#-(;*JEs^`dhjIGBU!R;43CGernS@)jwKR4}K zp>bwCh`2!=5;UjxcMf;|m)6ohX>@-<3Ca3SIBF1Qe8dV&Fg){|*0;hum^oG{B})6p zU=Av(gzKJYj#g%wRZHE`?83?hXg>)DRJmMBatr6`(c5@5eNnLDoMgpcgeS{GCe!M%qALG3Xs|S)GCW=U zxbzxrr054&F_!fQ-$aa?WD|OEG3Cd~pV!$)?+o)NBIHI?hB9;(;{BGm5&hPxEAAu* z-nZJMe+ZaNZuB?$c6y?H_bvXWsIUz=&bEE)QAWL;lwY1;KPcMQh%8_2W-;ie&U&tR z^Ls~JzpMn*a&8tGQOaAPX%P;=M$mPT&7wnZgZCLJ&ANVc<*E@1O*h?#X`!2sO?qz; zJ=k)KSRba_5RKm|+r;%N#eLft;npP$s28qaJ#D!M1y_~ayY6@0eR==UP|udbQSQ>4 z-CgNnbeqHRg>H$}i#tqnSED&58IO~>mf5wL+PM}@J!sS&Trr-;ErN~-ulL&Wr7N0_ zS8sFExHezBDqcEX1CGj3q(Wl#<@5Msx}~@vbT=+_i?mQyJ%GHzH|U<<^}9SLFX!(r zo`ljG*!dcu-lm}AD13m#LGKR}Y;?5sJ|(exaGT_@;nG9QWW9Sr1$9t~Y#e8KZ2L1> z+xC;omVOXmOBd`87}R2y^(LTI0JOjZh$#!OkZ{uAhY*A95kuZt0_TxI=Fqb9kfwGs zC|P#`5Es@i#wkM3J1ZaxTx~m4s2B%u{$u_Z9I3$Zo=^GmloYSjJI(I|rM_|Fbp9JQ z_Qxn`A}GN>0KvwfAlTU7%6RzmM*mB~{y${Z|A^ZE7f`H1!_W>Fh$q4~NF`FCzKgQlND$X5_!QB&_;F{nR4#C|aXmAa1 zDm~pZ({t`UtN&2%`l|l%?)`0fq@EivgE8Hl?QrE@n82`IFueBOr1F(4^BZBTjHYvH zy%Cj$bLYg3+Y)(iZn|*xBq@uiFC5au7>P6X@2om;1Zl`_%>@&rDy=?BWy;DE$NQL* zDc!bV-nKuk%BZPi{X!e>(B2EkB$^c+X$TrLqdJw{mC@d799Pazoqu(cl@q(HT{i(0 zc5iaGmqvOuEk{4==HTI&tnT}6Q(^`?+<7zNY!myrLbPXCU_Y%_gU$_eIo#@nKm6?O zCzf;C&$QmO>K@8iHsNoz7~ov^nl%2Hg`~05K>ypO>F=)gU)*_!Sd*rS)qk##l#Pk~zrOiBQ2oOJ#o|vvutv>)U7>op z`o*y&_T`7Csn>JGp`@ta5lb-RktD2(Sl{?(*+=nva2t5O{*b>B77B4@{m(^;mY!x6 z{mgzlzS6qC;)XdA_;hoR8qBL{gy+224M(7)%Vn}Cy*Pj$8G7icPi>j*Kz2rPD_Ont ztc;^D`?X(HIIbvHGvpl@k?TO?#i7i+t{YULdHY#E@#es#oGN8OKEu<81uv2f#k*zD z%;vP$RMh8HV|)eLM=x4T#9;a~p0)N*$?uP-=Jl;fH1AF)XhZ<9p0L2dg{Xc=;HJVLd>|QOQA++7!;yzRCu)2E9-F z%(Jf$$wX{3YRFDF=#$@<-cNr{dcL-tHW2X`pA%C)Ri255bNM1Rtjm`VAutnJG@e`X3;{y+ z_q$$_(Jh*C)DMtO-)HLW$+rW)Q?_L1zOyd{t+ap$GbF|>P>14CedN-029aDMCC05# zh7wVIa+r1`nn1r=Kz!joesNfQ_@9;vmKo&bgby=1KYH|&XK=GTN z0-VE;avV)&%@~xP60bqMl4Zx^VLP3zw~aVR(Xe8{ls)kf#jlOv^i{a;^pU6l1@87D zAE!0ZnwzKF=ATfN`6fki6}-vLN>N7yj=H+$&NCsP3l|)#C9DP&J)Lsl^8{SmtH9;Unam_AAcavJ%%HPz;nqET=`_f*DzyC z+*KG+n~6$uPx{5Mi_KYLyz8i7OIl28pWaFm8#nZ}{DfEU7%f!wF(L8|$Ykm)N}21N zowGgqdRx03kUSKok$fni6XjCuy{-9$v#{i2t4QvH6(yy*?8STRam`CVoDY1pwL@_E)jTeo&d)%WhMBBJAYAc?@j;pyNpr;S`3}3Bt z@<9hi^qdpjnX!3O5Jqiy6velt{p^r7;aPe;s}g>1Pqc?T(a-i9)^>1|He3f?62IL@5|rUbH1#U>Ol6?zltasND3kwpJOxW^*|_ zwA7w0iHTzHRMT#u1F2M_vq<$KBAf-i?F{qHIHjO+)z;^P5&1QBztyH)5OaZUn(i#? zDlqh`yCtRr$*a^$KlSEV3VEE3SXr`Czqz%V6Juqq4% z=|$NJud;3-eweKM9%tXt%Z#LC>QET%9v*2BZ9V(`jrkZwbI@X3=5hlC za2R$abi;Z;ZdqQ(q(5njgdzJhv8DZVYlp^nKFG4^)JAFg>&c9LpeFcM@nJjprLR4B zf(q--quY~A21OL!IPVFe$4cdOh(k|S2NGdz3Mou_ALqLl9K%!QXP7T41zTm{Ef(il zc4JA8xQcr2w^Ri7tUmR6l^N$`^d!vdA-4!3I?&bK*GQnR91t`k7(I>+rkEWqX)rT_ z0w8St^}Gr!wPgY-`Hjy2ZM5&aFiT5h(-C64m!l9W%|{dZAUaMsr%Z-NbIkk5_*^O;85GEX4n`$WA)X zjhp7Q?|oFu?p`D^hNx$Vf?Pxq(B0I2fCsyrfzlx?m)JyVu5FClI9_b77QjeiNo0#^ z!&DO&n-S-hO0e$Eg(R^~i(%3^b{gf#UHC`^SM?ibkx)|Xm1L~BMpGARcB&7ZpIL2f z)woe@$G@P}b1+j`a(0^ULewtksf_nOu(n?22n+68r*5}~Gb5D55SN}FJ$bM~@NfEaYF40CV!8VkQ;PA@)34d2+N0K=sK`h9 z&2izKp>`X3uYTRHO@h4FT!s&6-S!mj7fZOlZI>qOThiGNi;l%FsccT1C7mqNUSSH0 z1lO$Kd*^mATmq(JGy5;L5m?j5dv1Jlx7`SbOd1w@n$yffEN?Ly+6`SwSw{6UzrS(_5$K3* z64Q9{{yrPe#}hQ2(qVHo{pd;B`K!o!I}sy(>F#oCIGG(W;8FQ4#=Yx8S~>f4wPL7m zN}%E-OG3k=^(W#7mk;u?(M?i6yc#|Q0tdNzqGctFrIQ;LxU@f%dh0XTh!u!DhI6@3 z>)TXHBh{!Ucpy#RBJ|aMuzWqePLTQY(`=I|<`^ShchEpbBz98GG($pD5K{12~gez!iKLU=1?u#c?n)mOki6V-l8%Z~u#skd18PiPT&bYM5lt4r1xQKDB5CR961 zfMT|AVd_Z3BVaWykbu!Y7l0nxF$3djh2<)N)GCT(gF=-ULpARQB9#IWL@dJ{VC|Tq zf(rmULK5J3AefHITpO)*Dr|)|v_pP#9_d05xMmM6Ko$-e?Kxsdtl>yd;7U5)0Gi(e zoHXvpLpu~exBBAcK=8H%_!+PROSO|sRJR_s!W`-^y9sfU(u5pEk}$Q8BDL(W3&*yzxp*E^ zxt7m7fflM)#`kD`{Qh!h=KiE3O-B-tEnKC*MaHh0tOQSLdrvbOIC6`xy!wojYPGi3!CyTg z&^bq^*t4vQ35`ZIDXdO!lPj)F6xeRg#Jyjiq|{FbnU3(2k#aQb%D&|Y>XaL%g^rZ!)8A z-G(rsWk04PpPM*5)(o#U1QfRa=757pw?Afj9N-{TU$@F96+F6wA-9%i!wDyu^}(Uq zz1|m0#XBgj%D0mocloCO-SJyZG{bUJ$U~XWreG#wD-4?3C3bD)x>ICU{corc?{*!!(!!#!VPgEW!bt|@T!_l{wMZn7YRmqUr=j z=&C}3eSy}!{~{ijji+b^xuNi@+UC3-2!kA=D(e%5crXcMqXO?DfvDhJ(W|)uIfAkw z@OmM90w85_b8KJ?Hh@P!^NzKN#z+vNpz9j;Q#K95l^m!|Egq>Q<5&k+6@;kV?hs&p zuL`TA2A?2-u;DLWqvFg1Pip}c5UVuAMRCv=5=af+H4FY=3V8Yj@be5HA_#sRdMp(j z#{}XfDAqw-v;dx-0XhZ2(4l0~!Er1g4+7ePFyVK=(+dDH`3_a6a12BQ67aJQ5FjX< z0l&BbguoWf;L4*xB?!hux-f$S+r!c#P`-Bc+|+7-ZD9_E*9m_1CEVcs@r3yIoq=Jm z@Hs!EojirKlVblQ-TjFXv$L_cmvMFSaQ-XJ{fP`qK7feh<3&sqJ1A;2+vJlzDo@Ya z=*inKu@-=2p{dkCcQz|jy!@VL{8~Pg6i~FU&%+Qm3b4GgS2Ke1abkFmI<3A6cx_Qa z*wBczasDupEduZ1v@P5eUfb2_rHwf(+S58CW+9U}*tAqojd1+9jQf8 z(&dF?m%_>?VWW;F^8JvXS}YgGcWoz2-3XFzefNmV=F~sJFYhLn?-H)8bH3#_dsXPwu2vGAuTogR@Iiu@oI!?n0A}!aU`Q8WmJBz?Zb5|@tNu64+cX` zVI5~=&8_Z_sl;Xn#3|%$Ki-q5cp=I?!$sqh4#a!OHdZRUZ_1Bupq7TT-&$^xxbYv7 zgBCaphj|#7mWJM-O!@>?z%fmcFNaJar4Y&a6eT3ly>YjAZ+cOUq&QE_B($oR*u`gb z{{3=fK%?3I!F0l%?9@s`a0j59C7^lEQ$gR$@xm9ywSxiMY7zZ9vhOCOpCv>|1O1lA zep-F1;(_3s(}<358{tc#yWt=|z55TMInL1H1T_Kqp*_Zg1ESvA$VWj6z$Y_ogx*6j z(gBXyBMP)>a)S;Z2AZRV74*!sUrOd59v@enVn@9Sn*5)+9U+Ps)3$EIXKVrQtuDXi zGK@v@W6T2+L*c__U5DjWs3@pD@! z+0f%~*u)3aRX~6mC=O=_hOJ!up%5_7xbKSz`Y@>&sUR=&Pz2yh0i?|)T*(0EnD#v} zK~rrsI>`W7HINb=xPinRfa03y+T<5pd~1u*@B!F=qP zxjKS{Z-5jmK!TYBYc&x0u+I{#dF3hC6baDi*x2xOOE!7O2QvpPwM)8L)+*zMzSnDY z=02|bv+`q5bAcOvBjy0F?-UwePh85|zXzq5VjN%qGBmt_1m-_QY5leJ_$wa&-%F2? z-%%>U7fs0-*$@#>Xnt zIYS8}FR6Iyp6K41+XV51{~!JpMh&q1E!r~ZS)Pj*&a1uX64yDI*mJ&vrp$#>KOj4g zdfh|{oa{1LddSWr#v}Wun}d~~_-FEBC;sIh{ra8haZ${EtdY@mfHJ%xaq}V54@hyKz^ z&+ePc!0z}8uTy{NU3d3)^)um;RWJp-HTnSEiNh~p^9p~gI+Ae~85z`#=<9~0nx4h` z*xze9m;7jr(Q2|g=DoYqc}M9Pw*8>;_dA0)&|ba|xig<2wd>n|lF0viRrVLm_dlcN zzpfLlhKH-Cg%6~Nb%((Jl%34~z4UOfn^wgORGxmVMB-4jJagYxWy{w+6LK8(ogKDB zm3e^^ORQwEq@AXdSWbW8o4P8T*d6RICF)$iWxdtHx7l#xBDWpF`vRD9Ujtu$!FRo; zXk*+=2%|o=b(qji~6Suxf2({Ue2_d-;d-cKgDo*tSGcNP={e@eZ`5cvQ z)mVUpOWGq+W3FbQ7%}FXIzlv>0+%h0_cviuhmXR#qZk&pMMLkyR2h{A;A$$8Wj%`k zO7ILnFXOstGh%Q7X{Y5Q6T=YGVu6CW7TM`J3o87;LERtCFS6ATAG<`^dZH1@u*W^M2pnjVdzI1`Wf<7hjd z7+xactv#(NYCB$ftfcdKq48C(`Ceg1^jqu53`s{bBbZod^U6%-uE}5;kI|Xt(5a8n zxpL>d_ehnEkDhrEFE)LT=R9(?GJr3tV^R=_KBKpT;HOjYB8C2{`~H8H848P`+$fNo zbPGX`s{NBY2I-Cd##s7ya)PjzXn(^;|58ri{8#x$B0!B zs5a%l2Ve_n^ol0!w?I=NfPdTM=F>QsdxBjC{du5t!Lx?)E9P52Q z-f=M6F_9(rG2r~Mn+EDfSgeb6s0QczUZ^3PBw!LZtt4$PEe&lEPIk%$Sy;LyNkX~6 z_9YruiG_!f7IXQR&!haQj;}B{tzB{HXPF1D=%zVX1Ay~H;jijL3rg|h&WC1gGYrsr znu-MR8t-75TMAqb$&6o*nA7yO6$llfh2D<~9INu|bMonZpC=tHw>ZpT%E;8u&|u9O zcjVZ4b)98?JPHj0_euIuMWlG+f*4>z7sg2)QxNgYHV=%>| zRJN6aZ&6hCyCvcT+o8>wv#5f`!~#-Wu*O zz1)1MVV0-EKqG7Q*ql8HQ5B*GVlG|-nnTNxXsu9VL(XSxlsbc2)PUAps1u|RAU{%6 z6W)46mxIc=q=^d#MtgrzI(hza^{F40wITT@Mn5!@o8q~Gs@z>qK;oJTAtiPwTqi&! z0wB{50J4L*;e1YElbnGU5+D%aP6<{qM4sUyv_k?k4{<#wELK3mxe4vS4t0+O_85a8 z#q~HM?QSR;Zm3iT;AaG2upfZU4n~B#{{fri3G@vIBoXd>#FD}elQjlSAYJq$(r$<1 zg#*;s!8%m3HAJ+B@b{5`^#E~wLy#zy>?rDmB$BHH8qQ_tF9^&>6tGAl3#B|~`%nPu zAOvT^mmMX771sIV1opvm5%rPk=6|a6S_X^C-+u72cu-I>|1j|WO%Rmu`7IOw8>s!K z>oDY-Kc^0Pk~Iy@0Xb%>!_cBPlp;Gyl5Ang+gQ(MMYkXL@*P)8 z8bLgPFaR!4(SOJAi3}g)Exq1% z+R{4qS&P^UG78n2ub8z3j%v4}kviCb%aNvU6T8sKgeHcwVvJ4gVj@vf=-!(v_Nr;h zgx(l&=dGsZ2U+MW>X;jGqPUKK;VI%soJL92TPoU2ui}#Y!c+g<oL@jasvNn6BrzQ-eP9UPeTg0zx4|-I&Nd{Mcmno6!qRUtDhfFj}0eN^69QSB(Wb z9@0a$rr}DXGKYQxulF+}3%H`zv69>gRs@ni%c$F^Ik+!15{H#-z-=XNQjc7tTzKH{ zCtYf3_Ut|IoU(9vt<3-IId9ZoMW+B%>KLb;3yJStN#pTtgf^@^uvGRDFe@O#$4yo}Q5U4jVvzIIKC3_OPGi#6_ zOX#&HqXsVhf7gvqZAH8J4p6sne+0X z`Zn@o(5~@|lWb_oz>d2l_*V)$u*oE?1nv_?BSGBOH+S~uG=}_$Bv=F1WXfuao2&Pq zIMobA_O1s-a;|vj(chu8pWunwybZ$1V|x3d=3g4{WOfJs`i%BnHo2ZrCI5{yYk_0l zFN$J=)8s)_&z6B$XB>+TE@+AHD>;zDOZ8&9xFfX7V{E1+=wnDN);-HGd5btG?E?#Bhhq#{s zD2pZ-r~sN8c;0f})Yud|8dTuAJ1J^mu+@)CA0%+P7xe@(P|yd&9uCmslx4uYpnLGg zhv7O6$%f=fA5cvMV80)rMzKTi;7Uod1%7Tj+WISuC>9G5_QZr!8UP1NXx-PG}}Ze(5=` z>YLTRIR%Ls{=^46#=|!aov)NTQwDX27noE2Ij#0O28*}5=$RtMm)OC; zbOtW*0rBCPI8=~aJZAvY3jbQm-Uz$U^YU|0M4|DUENbbKJ+&9<^&kn=U8wT7^($su z3d&gr2T8F*Im0qU`yXM9Xzz}Y4uLb0pML@a*bg67*DL7j5(^mV%vCt1fGCJ}5jqS7C=6R)YF@Eziv4DtR6 zTf?j6$gohvz0RB`h{MOpsOSCl)8k2eQpS!xP({UjsFb_T!voYz2y^^KNRiKDP-W}Tp3dODjT zVJVs3C$sI8Sq}Hu-6pbDK@( zF;?IG)ezzZwMGFh^%J?ed#DJ-wFsM3efo-#B_HzM#}U_sho+c@gyjde{UA>B)WMa! zTbdCXE3ff6eKWhSuYX;HiN)f~_wo1&F@h$yX((X*v11}&jZ*IA{0jl0B%kwWW zoGYUy$a$YzVl3dB>vYvzNGk*?H#P8&?q0?7IJ^Vo5zr8zOCogkCv6pkTRE_ZK$!i^AE|ac+)-1hxBZErr;uvm3v;+ByZsN#_ zrV+}>!KjsWK1^~pJ^j=Jvh=U4Cw&)wQeH<};L{B|5%zpNGnH1JQWJgH8ix9bbXCN1t{ zo`1plh`Mwnd~YXwrtjFrl0dAAL1V=5Mp=+ir#Y*dNg^+4RWMe!U25yxrsAltZJu2F zva($pl)M+DUVg3p!@z$!)q(h+`ldru3B6jA87`T}&EkQLlMz|9m-efw>TGRT6p81T zL5{VOB36)e_oYGnBo3)#uiavGK0UK{aY1BTXaIVmOa6ueIz$8t!eE>Co_1_4E!sq0 zqb)m$ar|ZOqB2<;>C#%#BviRc>R(|Z(Z*eqrTf*sfGAF3oT+!`KF3t|fZOw>pGL;5 zJoZi&X<}h>>+|e_*!j-K#%6+&N8;IUacn=u(ch2oTW>&~TR;x~WI zY#PE}8@u)^6f_ilS%dJ`sQC}l`85{j(XCo~mct~-6ZIraga%-_`KcND6Z0gM%oK>Z zR({OX``sl&Ral8|b*im#+qeKxjTtE-R>T&$11{51Pj4Z)mQ`_@#WT)$5%#KJF-{wI zN(43&yW`C~Q(d5Rrst1Y>lF2PeaKI+VJgIitUn$_m;dd2+ksh=#q)W~+~?2LV-wt9%2G5bLCB(+v}hL7Wu zB~_h6<65X=j$99y8RHuFru1scIND2)wiKr+k$RNuX=_&4g6Ze3&fiC2n!?H0?T|5; zINCqlY5a@4CTU{&*Q)k!s2vD}O=DRaLSgF(X2*tq+Z7?9&c-^B{2ruAl22O}64|$B zna^aCi3D*0Y}%3K>VLv|A_;KdVui2=DIX^>XKyNLyHYLaC9UkMZhmCHJbO+oraV9I zCyGIjZVY0jO6nq;@P<nX-Y*RKB1MF?d45#MiQTW58a zaZOV{RCmy^)VR6!6Ex1-=ybjNpw~L5Fq@TmW>g8h9IpMEtb&*4MToBRO*b0hDK_Pl zi*(gjW6apFx?Oo(PQLk|k#>k-JFBdC@lft<4y0dw93{Z?Wi-voz&GO7E2Yg!uJ-O- zv8PdD&DM#{wAVtHShl^|`uDwuLU9lPEx!IexMh88js=R|aN*{mO zL6o8VN|9cY%Fx#~Gq4_}P>G6KwA%#h4YrKx8?tTQ-I9j9=%V}A3mpb$7`Xk-Ob7LY3G;9^i`|yCK ztw-HEPjY)K(Ynf*WV5*s#tUUycbv_wAJ(y*x&2Z|#iDF*_v|3ro*db2f?cAF!pozJ zwIhm5LkKLD<&{zr8iAh_bB5kU(Us~ZohXw%DcSiO+rl{3j^K1cptP)wv?8fvG+gTb zbrC!cwn)=g&zbm^Z4a^T}%llQ<#q@F6qQ|Oe>X{Qi3DlO(qG~R8W z-^%~&qli4n5t3rR!)Q2HlJs)$7g{)Zznsu^lD-;)WnCX6Kkst*6z=IOL5Xybj%61M zA1LGZKrT2wNsKxmVTGi@?ixutgPUVacpWJ1cf-mg#TjAa9}J~l%o(iQh7lU{PAYnr z;Dh2+y4QR29`cN!m|{-36RWGAz~yhW0JxzN)07EKHNC+>U3cpxit$PfC`Phg2i9 z7|dQKzjW+UY6uoTreQbzg2A~_E>asn@qNA3Pl|3}c{J$nd2#w>J(CMUi^zvel8pXg z5%d@N-_g?P590qH6p6ox|9{St{`$=y0s-zmf6kWvRDQS0(K+F7NG|Q5jDYcx<=2!D z3HAlxsHsX-G&OAf7^L@b_GGCc$HO>FfvlNaHek;Ru<8@2`c@&Jbgufum!KOynvwM& z|0e_}gGruzxMmN=9&+N>7A-8joj5b{stmPwD?eO%>t^&ahzH0U_>ebmf$rT<~MM`!;<@a`l# zYf!(cI#X8b^X}}DUL%<-{D|0#*?WA>Z+z#^yY|(k>C1;WY&i{VmUi30g9QqC_pUKx z-;SO_cDM^*_7!zuR^cQe%I@?(=&Z5$pH;pf> zZ_0n{q-)K#)Z7sOXtJ}#UzdhCe1A+hJSAWey73^@;APB7D#04Ikk4*=?w?(%4l+$xE0oo3Yyd*3`~Q-W7XVZ=py@9ti>KHwF(NdgU;Ec=n# zStv$4hBTXhc^5*04)ggzhhJr%5hZy%{&;E4voWvIrYpkZlX9{DUijRlvBiDcGw5XL z83fJSn(Kxzli)oqJ8M{LBr0lLdg>&M1tI)lDVG*NOZ(cb2v zcD9;0enq5&F(G<>H~JGU_Gh1?!U=zO<5#-Ii{=Rd9&?T1HhQUg13Bbwj`=k~wNAB8 ziF&mWHFte*ggU}HXO2tNLWM%PdgXmjzv?P%My`LbG0^o`EE;;?=g4z6u|%GJ(fgdC z_}TK@mAg<-rgJ>%w1Wjb=TR zZz#A}MUuUrh;j_DxVg3t;J+vhRK}ffd4d<1%yh8o-%T3jR}Z8_Pj%_eKjOtj0T)ST z9soY*bA|MTsPD+#&3N8%+m~^Pg)YGM`y1JPX|IwFuS z5muNZ`W9a1$NMz^c$vYhtg0g(|A4L>@-5GJH3la5PlGhvN9hM!+>Qn41+GOi^qM?-P<6fdqPuT&IAF zqXRUy1$rIB600CKL!%!}OsC6os z-}6KLr6xWhfiRHk-l8U{0!8hB7(akG%wWPR|9Gf_WB_6#Af6e_#|owrku5^GAQus% z7H@+A5s_gCOV(nWp^8>T!8~J4QZ8TDB9jFE*RqlGH*<>ZLT(;X#b;vu!zv!qvj2WD z{mujbUUmF_@K=2Qwd?3j$WgLSqEDu!dy9~bci5mRA%|3~tf8(*nu#^+HGfoA57~8i z&jIme|FFOP%gzV@UHBOXz#kkA_viCFA*`P#%E#BsdaRYgy}GeTvQ#UjpyZ zp~zs_k@>pnk!5?|;2=a(BY%{NhNE$bmdfa(M~>|yh#sM}$4TLDaaowlH(T9EK52`@m3D=Uh@#{z1mWp&BtUAsvJh2aLu9HBTlUXj`mKb;8YVd#gWrkktz!` z?`g4q68;3-Pccmcw>N`gsWQMX1qvn?Zag3-wfKzHhFw!k z*E%TrH)%6*!F{(Gmv5gYQev`+^NZBkZVC8e`$d7oJ;hclPe1H=l7b~+aJW)XCPN}m z8?nqMHHSraMKZB3Q_GXX4qt#xe&iB_T+nuIb1*l}fU-vD6K<#b^Z$r3U!?kfeb#N|@D5HexWDFCx?!f|xsqM^cQE z+8cUNMfxUdim6SvA6=L^6V)uL*~Wx-|3+B?{uQE~yEtN%X#(`*>HontH` zzpTwWU?FU-Q8o7ZY_B!p=w5pMpuWp#Lw8g^bQdkKv zW|Y0hTAF-jd*vB3k{W(??u3UKUxrusGW1obv?m8|K4d;>)!L~1Z9+&Xrjuc!BgGBL zD0B9Y?SSLbSj`&qJ7#=?xR+k|3)H#3I=^@5c%~Hgj(04}?MhC=r;iwN%M4*j@H$U; z1eRiKeo0YDY*x2apAy^l=E~^}nm!96;#0|dHWplgmT~7t;yd7wGEMJ8ik5V)$0(v5 zuohG{4eg_iMvFGs&?a{btHg-fyy1VhoV&m+yjCflmCNGDSw67kF)tAoZ~}{dx}+dj zX-x8h2z4bvicc!zpy~7$6IFzohhS~KNFovWv1JlhLIouUn?$8|-W!nLoh+6+K$(l4 zfLVY(L1KYnB``yBIDTN4AF$Uxo*#EVfa;7_LczZglrE&U9o2iDx=}HCQ-=4egX_*Q z9lsm($Ex(&bkw)trhz%R^#_=NjvrP;XdO}rBxE=iiF8QNz7x=jZ7@X8t@_)waOzK0^l2Pg~|9V7uo zHAA!2DV5UDF0cpu$)LID6D;+RlR!XGwa{$sFj{la1m~VD9JmF_M-@3K8CcB()Sdyz z5$~|X-3!8)O9W@Dg}RRb)|r76>S4bRCZo655Y&8eKHQWAh%y;~Spjq>-eHKl7l0&M z@$nu3c-cg>i&z|Ud8KMn;3|A-VBZ9N-W+61yyFEgdv;n?bfUI^C8ymh z-U&BD0rLQB_7Vq$vi5!OupMO4_S|ONHMM;fUTDcge9dk#mK**_lUHGg_mR}>Ia<7U z-$?RkI&hSGGSL@Fi~}9x3J8O-VGRYr9+Og?Q~teZ>d?-$M}!njh!8aAKLTj{PL}^( z6#qMGLY}zMLjFL&KMoEiu0Fpv693AgRjCRPfCi*WQZ#sY_ahc2CWd_mW*84o6{s4E zS!-&FOiCz7?l>$iB)O-owk3f}nAtMf7ZHf2#6!>a3o4LtTi|4NZgX6E<<~^(ZSJ7c zxLoG*-TjFWlwwajoO`c384ib}>xUhjA&VrvB!MIr+DkRv_dQzhTODdOq^GCf+h7*I zmwqw(!P{GXXfe@vd{_xHRer?NbRbZ7pb7T$L0G3|uoAq%aBJPvOXvg(_m)q2jPeL; zd#o72x4pT>FB-4K8}J*wsqM?QFj(t=Dfk7>gxM^tPxx7uWKo|Y-PyCERithvwUaLG zFy_oE7&}tiY;w+MDC4wP<_zCJw`}S7#nO5Ftl+)HIdpqkf3r_zb=PXr!Hh?d<;iRN zk4L38haUC@(_ZwbxZDvLJ;}y(Em0X36K5p9M7Ng{#uhnvsfbS*qr#@jM_HPq(nb=& z1E0>n6+T?}g;~QOzw$h~&ByK7#_CPmo!c<`l}I|cto0?5-{}$7`)#tLMKEHgyN2@M zu%OD&jZBkg`p(x_sR}c@8ss$}Mj^%gfiBI9D@3L91 z>Fo6v;%fCw{36D99T4#JQ4gVV-5XGrz&~_UMR|KM@;#?Yd`U41YZ_tRVNpRn;X1pj zTv(}!JtR@eevH~omdzcsPAQZb{2ILEn3HdCO(iuWGlue1#i$k{{19mCuaAOr5tgnF z;&ugrD2rnNq|g94=%lpJ@F#$QItW`pb^&t>0QQ8El@E@S2T})OvB49643qi=NW|We zgOb$`&Q1w+zX#^Z1ILGeZNDJYr5ztASqL^;;rCX7P#wz%1Lr!dLkgq=4bX#D2Zi?i z0@RcMa9u&^lsgc13OdvQKH#G|sD*MT2XCi?jP?}KClNpiBkrn%h0n(0R=R<-1Vrkl zYC(vi!jSwy4*$T;4L1mQM*Vx#1@-wN2STFmAKOYnFj0Tg%lcOz{jUh?OkH-xmBEU9 z`G83pi#`C>28a}i&VkXHTX~8kFc|%b! zr<~6E@X9kM#AXQ`yT3ens3aa^26g&jz9XJ}m0)6qqW5dG7oFm@Ps>m*0cLaE!obO^ zs#D#CFRFFUIslz`O}drq+|JLRja0NPXh~r_nUFLab``2p2-0I_YLrU0zgKq+U9ew> z3w}jARAx=+$p1?J?x6IDS*f)3>vopO4;JFd`xequW-dEWeC71voiW+Zc~fG(Yi-w= zpE@X}S~}SGyEjViDRrc;$qxM3GeauK=RI-|qVLALUC+PUx-_|)z)+{N2JbA z+F~egn1u~=Ic68;V71*MOlV3cl60%wNZnx7J0HP^qDB7Q?|Rh<F4#s14S#k`_ zGfpidl|9v)1&O|S)o}YRctRDK4HNm`y!JeRRTo=Q1|MM;lt<9S_t}saHOPk~SZt`@ zTx$mNCxrwONTct&OoBeFef+Az&Q;tdoH&n>!}m?AnT{G_z$$@q{EM zylcRs5~-4+P8a5r^e({pC(@v8_$ zSpqNnwn*QnMK2OYzX}qLXSZoEK)6GBJN@bm9bQG~o5WsXvRn6$U*zKrIecKj-nm%9 zXQ@&`!7P6x>O4xE2>+4tsxFrCG}yd;0a&muNwGEDJ;lBfz|00TvQy6m^V?|^bs#40 z6R?^HNHB^|tP)oFapD>q(CYbyARd5g10t0Mp<05XdBCg}ixkjY%LsafBcuo!iebk@ zKsI`1Nx(-N5ZAq?bg=V;+Xgiov3Mnq>?~4U9HkOKn`8(3UYG*9Coutby2jn$NMGfM zRaEZduh$a$43!eu3$!^b?yvK%JaqPXOTP;~IW-r#;a5?{+36O!h@7`1Y|BwxO%TTC znI1a*J+R%4O%~%J1G8g@ppwo%ok7TXx@x+bnAzDlT1i>Bo7mX@`?dOiedG3L$p3p( z7M0a!vlJeATT~*RB$0z4k6Go4ED?hTq*CkmFw;J5N+4fUmLG-|#gPTjLez9cA==C? z`tvR=s=J`Y)y0?NXHUzm^`O9Km|zlNl`ynK4Ny2kk3C8eibhHSeXj=0{ods1f~L@3 z>2qjnGARahiB0CHBhidYI!!M(%!mdTjLp1j*;Fk;sY3pwV4-9=$;`}b=>b>HVmsr3 zMouTmRof_iEr7rwa2Tl%{q)`BcYf;)S4oEgL>hI6>Z}>^h0lV>4nG@tDn6-)B_fpW zea3ui5)6{y}R*npy+Z1&Hu1mfB!fM?ZP;_%N z>@BPoPDr=Mz&a%%+cumI*J)#i{2l{Qw|+ut_GLx>vEn332}g#v=eg;w^po7Ra_@x? zCu+I-GRXpo-w^!Jl33y@UNVYd2tGU>n7NiwQ8}GXH`OGoD@y@!@Y}HuVdp6YCpvEB z7?l{@;foh)<(7`hK%yxb?FaU3Ickfw^h+5cV?^iBms zYs~8df%R_QhGAW(`Avibxc|f2TZP5BE#1O_;2yjoc;oIK+}+)RySsaEcXxMpx8NQm zxDzx451eMLy}!NoI^T2tb@AWOFK_o{&8nI;MvY<9UsbkcOXv*?X&KkovK>vJE!G5F zNQ$~3%+kxc?c^H%=s}J?LiGy4h<1UFwHXBgvNwn(5jYnK9PB5=9KJF2qj@B(h$FmW z_<{yokBNwi9GIy;5egvWB-r~@xvPr}`~dZU4aQ^>1AXKP6Z0%|8^{j}h7SMEyZ_rX zv)?eS8dryi8=R?(`mo+mhP6I-cn7JnRUdfu9LG5S3H^Vc05e<3<2Sun6A+Xp_fJlM zu&t|&m92r1oP)Wkxs8F<-}x>7J`8_G{!p@(XbsJEX;+@Pnt!b@6E}a$ef5rcJp?-2ZAXal$JgsKb(5o51o}hbvzNOT z&)dI4=fN;bxPwrpdZ? zbpt~D(Ze^8J-7XV4O}ZNA1;mY*~KJ>tEq-l4;i;4jej4ld6b0sIJ8`MaqR7mEqc|x5Sll4?PWWMZtXOw z=HvCfU*6yaOn`li>}z*?N7N$;;5%9j_!ub+?*|@~xap^xZ9DCsu$NO;V5o6QNsZRa zKE(_XVp{Q5-ouVJe!3ENdi-oMoNoOzG4{-)a+O6emx5xrgcY+`l%1!;1l!Sa&SV#sCjlii>pxsk%QKZn480P3aM7hND>Vy$9@S<%wv8nc+7{zH_SH?q*s_F9B8n0ZD=CmW9 zE+OM~rvKJg!aR#}E$E@jG@B>Vdv*0&U7ggMv*Pt0ZBET`k#EMCu?;7*=~a0ktTb0@ zzd7`LXZp4QrX!MW9{|@C@5i{2HfA?RSxAFjo|tCy_^}N{x3Yal z_p81}+-zKAJ5A4zfwPZS5hSkcka)HQT}_uGjJiXMucz7D)|d304B;Q|@T(lwea3jQ z&Q0gi9vRZgFwC=qhG?aBIak|Qv{+(jp21H;2Y)mPClh23ow9Jryzlg9H*dbggk;b1 z6+ZVIXp235M%s|cs!4E;uEL^w3DPEa`sCg&{wW1DxUE>Fytg6@2n~ODr3*D03#&K* z;ZA^6&mSTkTd~)`^X`wTn1%sh6R0*0m@ri{`Uasvk|PK8hyVB}1b|V%#wb900t)oN zHfC!1Zd4ksUOaRenaLu+$}~V*HuI5RR0dQPe;~Zu&OYoF(H?tOCllKx9ZTvJ3;8*N z@NV?*D0I1JN8-lrg6MKd3ZrBX;oWyITi^j!(aqfOE%dcz-oE0o!+eP~diG;siO z9}oB^X#zB>`#0A9uRG?S^fy8Gw?z{N7lXf4O&doi0~koDj6adxBQrY`NByZd=LaMNd8Y?62SpMU61wcVX(dVadQ$?UjYz98TOi`*8)k&rHo?R6)jgRxim zB0)q)YRBnc22ss~fR3=HfRIFQW~|Hb(MAR1H=Q0MZKwbhHdKp=(@=BUWNg{ml-gJ0 zA2^{bx8CZz_Oi|>&&D+#Q;kKZ=$N+z2S4&b1@lRaSsePF&!A}lRbYw-HpU3 z%xuhe)LZ?UAg~{XZrBH$01q6jMQ!`EiW@PXtnH0g|Icn4m~v^`8r)81->@^(p3i*0 z_>vd`wfqBRthK{z zi$S8ygg-Aj-h?CM2isxI7q44RJ{YG@(P-H}(KW<^e$8C63*+R?pPv|ByYHOO=rvrs zppe+hez-Rx6b~iXGba?M!!8^^t{44uO3TlLKS~$^&JVhis`(QRa9}{Z-Ac)F*lGC( z6EOYd41w=JoHut|7-A9v2-Kf}og_JTwEV(lVZ8-6{*8E`Tj>J|j02QuAped}Y|P%z zGRQBb&Y~5&)zh5i9y3DWM8VX1wB0j`=Th35jGm5Ry z+x6@;aV$}(=#V`{56olh*=GN^?P(I)BHc5Wv6E?OdpA|L$#;79l%)G=+~WBC;%@r! zw@(pGt7#aXja%|5iwn2sflOUpgQ3fWHB`djP(-oYh;#GRwcX`)d*%1ore50WRl2)9 z-s1LR44bt8f#*h$s3>ZnnX^ekUvGFvRBiiyDwfNdmPyH2iqx)2FeRAt>hwQAK1Qtug$)OQD72T+{vK4&#tTuNCC@e7y* z_lEoD6NW!gKYH5wiu4q!BA^GU!c<~Yz~yt0a^t$Ld{^2zU#7mf?}e7nGlg+NZ{%E1 zV{*_Zx#>v=Ak2VY6zXclWBLtU{;4vO!!6sQwF7TJyXkU(QX%63LN+7hX-gd^geWKE z0|F#M0d_d{Fhisvg#m?OYA-{W0bF!(9=JP{+WGMvkUioRfvveZEhNRS1)Jt~j|xD$ zo!klv{?%NUgUt7n!*vP8`ww2E*AxM^MH%o^G3DCI?$Z1ANm5iPD%tYxipCF9?QL_s zIqyQa`G=qOHDpZ49Ib9i^e|$ZOnWZlp6|uTv}g&-OkJwGU0VL+r6QK z9pb^l7U>FJ-}%Zef#9GXSMcI!2};EJ$&~yL=Q6-0Ob!~ISA3AL^QbA%C_4o7d5C%~ z0%IgBfKNj7o@-AE^_l|_Fhis#F}h3?8xTMf8=H#s5E8^AAoQ7QPYd>e4uYwiFaijy z7V0J^lADWdMS2hr^g-}P$JnDpjh`Xni;FEW7Z(hDrXlJH;vYueLx%+{5cR~z&a)WF zhdz@L^@Q>dW9$J?;}?j0V`E8i-aaKq^@w8Q19+qa6}k3oQLjHDN*u@f0{3KL3M&c6 zfkxti!T?xKA)yc!aTcgLGad-0JVI(9uu3Q%xJQF1aT*&LWCXg8!(H=KqQ*ud0mz6f z?VY`FbFp1tf!|~>NTXI%Mn)g?H zR;b2ievL~Zgp_h3VHt5H-*=)y;J0``Zk$4dW=@nF8K#&!7ZdL*NUYYAsTRmd^yJgK zr-kmZUp9t0`L4m1C!e+TEPIKmNAIeuT;EjgwmnY{J%9GuSlz0R>&M3u^QXUW8U_pd zwdw4wM#p@!S9}{*hVSOK_Upl>%AoK14u zx}}Oe4||fTm{OyL%pO-1x<~S$WK_6ZBWQ+}jR9LQrX3y?&m>;13nRp$D(O>VuOwOA z1}LJ>SeCe)WOxkLp{ctZbR?*>- zB=-FkZQ#KC2tHaI#bh~~^I5#Tk+s%PKP6gHfY#~0y&`+6EpgC91vm8`;ZO#_aBz@f zDji#?!k$%He{QgZ!*ojw4f$$xkamK3olD|FSS~K_K$lVz_LwqtC0w;zho5L>cv5EqzQq~p(-^?FiG~Pk@BUtjj^?p7^%FHuV1&>7OBRjv{ zc$5r6Qco>6F+M2Y5xD zn!hQP@I25sfhj<$`8$?j94`uVOF^bd)`-_2ImCD+gUru{Fw$fpkLLy8$_Ux#-gHS= zuQe{fneYQAW*}VxZcYh@lw(&$%ib62L9YOkwXbw8Df$Ke9tYO*yND@RMBJ3MMM3+Nbf$dqp`6UFHF1Wtj$t7` z1Xca@L<`KzP_AyoUWF|RP2P)=W6COn(4sv4ojqCkyWjAlyX4rkYF$)^5A9rb^jmA}0E_o}g|m96Wa%}G_#=GzYY$h3^Fk<2{7lC$Pvjrn5p zd{KosL88AhRB(M6uBY6*R7xBfDSOtBw;gtYS3h2g`#&Un;XWPt5@u(Zu*lfz8POlE zdpdL<`doJfeSG!)iS!P~PR$>(w2(i93YisO)xC9c01vQaGy`LVFmmfOu-2GqdWP>W zc*xJUz$(@9v>JVw?(+HxY^X7O177#sN|9E)CnI3v*=8u9?n~L`1xd zS%*?pq$pvuYwwe$;z`X)Wf7PC6=~BtrnS+o(XAPm(RGB34Xk2hyeA#~fY0Xbjwkq% zRxiu|=Z+WFu^&c7KR8I1b2G?#{EX|AET6rVM+J0)(J813-R0d!FJmEtdv7WA-g|J@ z*>`yIBg%z9`7cps3gtfJDCtA?ltMnApc2~C+mYIHKUYF=qU}}Y%=5Q8V^43%4oJ6l z-{OqI_f+{Y9%F6xYeb&3f??(brS(FpXMgB{ICdBIqCwXSlJa+Z-$A;eqvZ`bw`Vp~ z(=9d$?b|=sN}bxP_RRaxml8}^M=>f!G>X9}P6Kxh%bIiOSNJ}*LJ%bKu@`}2B!Yk% z6W}E>*}@6(V|S2&iT@Jdg%zNU6$s2H>iP|9%htyO@ak~+5t|nRs(yFz-+$9_O{4yRJPK;Y*Fp7-`=3Pkzo6Pb3LJ>o z_7_=65JCOTbm@(tZbSs$+y)^zHwTZcM4XU3gDx4*70WLzSS#d6DHGJmNG$3AObfYr zgneXvT)k<$$^3Lvhx}XK+LYAaSZhjR-mzAdoBQYHX0!?L&Qb1UUeau6b*r4AqlCIWD+CEaHJ)JDCdo0)ko1+wOFwEFplzI8t@NX%;i z_+xaYZjzi7HZmrLG*RS7ID_yHSd=skDx4>2eqSFs?wN&fljOxt<76y|K|Hkv9bb)V z3uBjt=AHp7u(H^T^5c4@hA|yBkQ1$QvnFaRLL0jF+9d=jogzbag6>_u0nT~6pSp*I z6u;>dRa_IjZE7E#h;>PSYjlxi673}0Jr9FRdq)U~{-+wPr*c(BB+KIS()Q|#C!mr7 z@|3CRVZ+ZAPF7ov^YkXi$z}@`(*)is#u3ukjev?{xuvFZ@*~n+e7xL=_5EEh;Ji{5 zATBFbjOzQ3Ub*~O@w{yIA@kJRxf4-}gh0fO1;>?BmPf=QlJ$ERZ9CS)JAbIYgbBy4 z+BN<5#fb4=5MD1rC-(gfKALMrvWrZ3$rWbN14<|xlg!ucl-R~fj+ShYRV^MgFNY%s z7j3n|t6EWg87jZSeV+ASQ);zqEt;oP5p?xQ6r3HSa{}SmQpV%BQ!>ZqHa{A-^y%~g zv%i#5d6;$c9d#{0)c2a4fRg^w8UTy&>mJ*@dDFerihEWqhgeLA*zC;KG&hK@O zeGM_TXk2vc6pJayKHfLws%UQnQP(>~qVN-|zSN+5MTtOeZfQa8deQnQ=E7|Zb33(q z9EaV@_H}4$S1-o|z@C#WTJH9r8teA1TQ=4D&E6UlZhaPZ?ghWN+!3YPRI?y|4M!ET&x4Q-rS)zyE>w0c^g4VNJ&D52@QrY;q77lh&nAK*~ zs9^-77$j*T`;mn9fwvmZ!dA7WEg{8Yl9lSjd2)r6WC*z>uJ}_f8eA&E&-K+6lF(pP zc)pEymQ8@=+niqlsy}U_A-o2{9`zXVy9Byf8H} z8l@!7D+oWG@})AxgfE}@H2@toRRFUD1=KQ&&dMw^US7Bam~l)a%ub+=In^@1UTk^S zgC8C($3**z^P}WlOJVLYO5uOPUFrN%Jwbo;G{z0SS-i$vPBd1{uh-jTH#$|p#?Z(x`!NpErLNIK z;`e!9pnTY6lv%zJtAj*e;`Mvv<0M zBH^Po(=h~HUI(DVPQN08jXw+1`m~U~xEZ${9+W^bWf*ye*?!6~%CFE9$hl^Usj?1e zj2ZvonEc5OSdfhA8U6!1xnloW=OI${^$I`0(d~=7u0vLrC4+AS z7pDC0znPh})%dURftpEb5R7Z}PfG3oFVpFN&7qZbY*9h}B1*Y1bc*HzRXHlkxx+(b z#mLrfwP7LRm2t&alL+JDCFjs9$f&5kL9=}MVZ(!O79(HXOf}$ijsnBXCrwPxvpMfJ z9523q*X!|phN$(2)+m&pA`I)WXiE_#jiMT`n7{S1!Tl_!nQ#8ok7xHY>4>{}I+xX2 ztCgGVj%T|_!4M?kcGg?p%KeeKfvG=3Cq(cx7P-~Np`)b5TWz(AHk`Czi}pBfVD1ar z{oDeEV5GFxt<^bnwf;Q{_l6B1y2w!p>HXTJ(*T3h_%WOkfz<+m^%DDO%rDda9P0Bi zJH_N>S1Y+hx#~6^_CeLaJz5(ntw+QV;iC5G*!8?;gootDp@`lS7}pqA>AZ4R1eAwl&dv=pz2w+rb5<|wpi&v|MWj2l91~HhwUj90Cl1TroVux- zCzr_V2%r0q3wLNg;n8mmw#4lRKIs_N$G+mDnht&}R*uHf5&c$_Rd+7q^4CU8m|1hv z#uAIozV4tzV@)ifOIB60MNtTJh5W2-RJv&n-=Y4))Snq`Q);z1oa};8gVj~O1N}f} zHetl;VQlV>cEM=+=||2A}l2*29cmZjs*qsKhlMJ z>lyz`fa%}eDe`V*r^+y%Qo#@LgA{=#0Bce9z`=T9lTzule=5buN zizm_$Qg2afIKA*uW1hv`3{O!Aza<@4YqIK~_+qK)m}p*`t$04Avv_Kh2~RUivv}17 z*LL!pA)(D0yiD`=yDP5LWPS+)6Y-v!Tf{~h>f~Y^=<>EMRS(6?hET=aBHRzhm|P%oTzpZ%4b5zS3&u>HESKmBlz!qms`o zK)JjFd`?T6r{%(zS!MasF&z=7wC9;@YI(!C%dYksXOiV8VfR557@JGcM~p>Em%J4K zlL2u%g^cm)LjL}`oG%w=sh&Ml5ykDcN5cT4N1E8Db&l|IE|=``J|)W9o`(H?@oe=4-f2=foRJ@06nNqV+T}{ z1r+WQ$`X%e8O1t%+`}90%mGt`6F3*dnBE~w;}{)*h}Gvg&pZ3X1C!uXzz;x54F4Ao zAt0_o#&$dT+6m_L-tvAGCz_;3i$4ZYy;ldn34HGb{6Evcw`G7WU`MkzXc{O3x-AL+ zlNA0I`G0s`$eH|S-RIw9fj^_Y3q(Gcf7|Ol9aQ+N?11dQK}jo{8;1r%32Y70MwA6_ z9qT}eC{RrfQ2p8qy^~~a+UoQ;gACf}1+h)N5{!%SOdlOw)I6treGh+Vko*4rJ(BY- z`H~{kks_Kflwf7uuwm-pQwAbi2B(z)w^#!nVh4^S4nB+#a?(wbpRR+>u`NfjVtg`5 zx7PPIT_IUez^jy*IHFIoEcRkP1&e(z4cS~A?KWvx$n$%wuD1PT#QE1 z%EK-pM;U|(N_mu71#k5pR6Uh<_;`qO_F4V@BEo!~UT}30!gzfoPB7>2v7&)}QLUmn z+t+3|;>W1 zf0mJON=-9mk<7Qah_()BTP8;^I8p)dm@hg}@ujG$=s3H{9Cl=JgnbNC!TFVQ z9&7QPU$%*Ja!<)iU6Q2CLxN>7weDGWcSF6n4Z9@k`yj7N_GbH-{o)x&&eYC0(f~D@ z+dk!H>gYUFMX4!~4_6_CSFDy)4YJr$LDoi)^HN5Q_wG5}{%A>B4=*EHhL z!#U960W%<0@>9?736&T}o!fhDV)KCFlo&=ta3|mZ$$%dU6F$f&=kA|c`Ik2l^GOBp zO9E&>p!b(#2+qRP0(`>fqkH|wr;Q+VA%tb&%wT*Mj5Kb861}UGJ#eE~Zq6?Ej z)xv3H{bnM6{{2eZr)u;2zRxaOVAz3<<1|Rf_zYXi-?k&m5h1*p8hpNq!+mdkCQZN@ zc*BI1YJ)(>PA8`SG*byd$;K+SPr%VjHS+!26mBZ{(?V z5!t1yI|9q}ssBf=E8XSOIj{fSjhF4TC=C=~9O<%s-F*V5l2Lpa%hk^Hdq-5Lp^Rtm z3Y#mQY|RbL{0gIY#?q__S*syDV)d?P%lS(5{GR8!K`y&?%F}5yCB(=sE(|I@Glew* zeDBup;(cet`MQfc9VzT&V}MTQ2IH-2@^mF#4P6dvdNWM_w~FrNi?Ai=wScD#?HkZK zVDNU)(?P$u2hE6EC^YVsiOdp~${7w;C{M{rC|;SMvGgjoxsAr)G9(WHPc31H3oR0w zrLPPyCyAljn*mRW@nzd9aj;aasoIX%t$ftPD}DzM+8|6Cr)_8sogLVSwOb&zJ*SG_ z)qDrdM2{q0uEvccSH9d^>}vZ_n!3xjb?(xN_oJQ+Lgh~K@*SI6${?f~b!%eIDYnED$?SIFo2gB+Q9Dufy<;7YrFAU# z>f5=|jK{f<+X#P!Czunp|>3yh~T@9PP|Y#x^2cXQ2+t2NoK~UN9aA zfRE0?7=boo;sku;12Po?jf`Rm7!OK7h7mAEBCzpE0zRq%ow-nBUkQ8kCu(2`lVJ8l zI4a(ajS==x3g`x?V2H~?J>VI>h`-CT4W#n{=qmV`F^%R(#;R>+!U-n`y!5Ar!V)fC z1{&JwYQ%LST(_X^u{w)fqrylDB^#sio8*UAQkoVL`ZLJDUblOQ!ZC@%3fw@%YO;`E zC00>>B{YdG}te{qm7dSvM`UGY~S3YV?`h_m= zqf$U;9u#Ob2Mwk^_8k*JK;f1owj)Ni057~b2N-wlJ4lYOr3U`j_p*X`aDSKVx*mV$ z{TY;Uv_ZWz?>|X7pyuIEO`tcbgY(}euqvBs^Wx|)#k7S{29zH}KIqu1NLtDWe9%EL zrl!z@(AsnJfOx07x$W)ar!sNxKHabIg10vBp$Xd8$o!QQTk-)ttEYHS$}tPzX2c_!^`1$VQYlH48}J+y!Qs zaYII}*o3+v2~aR4M3)`PV+NxnY>?Fx2ajV>%|u!C7{n#Zk5}x7I3PpJVWUL&WO|UCb2Dhnr;|!0#apojA3c+3@MA?qju`ZiY zy6e6UH7~D!`?as3rDtiypk0b*ESi=3;cVC@^$2?yUW|J*3)*v)hm!%hbw3r%mTqmG zDEHdHv_c5uQVppk=tBltOanC2GiZB~{NATReiAKF{9E+ZC_;;b#0$x$e=$@s41kR5 zq0+jGEU+yQ2e1Je^)&(WgnWS6B0S%8*xx&b!sFlg;VaNa&WmtMyRr#Mx{yyYu@LkD zaHivLsK+SXOR$`aOKxs9N6}yTH}M~xMW)Y*#NyjS(SYV*Ec|n}qYIx<`cb|*{d)Cd z5rs8G|IHFDFyyZJ5a)ws?)_1zHOR3sKQ8pyBXX9@&Oe(+Q4hwC(nxARWXv(M63qsx zt4K`mN)F*gHbJ>l#C1@jTrI}+Bb*c6^G;;IQt&*Y+ISv^{n#-P)8%MdRHU%<+Y>*!D zE5PupjvI{s?iY+--uDTBpg}IsZm`%tIlTW5gU`PJDOIY+YG`Wcpn+CB0}X6M(oO&_ z(FZg$3|e$Jdm)8bc`fbofjxj|2yjYTzR~k+W7T`}_s;T(`EDI=NlDIQUe4p)&CS9F zI~rk{G=B_lY?}LBm*>UB%f>}_8sF>hefD>}t>=BP$g&=GUqg{HZ+8HhR|dFK?L_Vj zXMvGHSO|w+;-81#2P02)FrF5PSRfw6I*^`RoHbgX5wcP8;h~O8Yh2|DF50>6eZE_ z7c%>Et`mI>CmaW$;#45#$6gIoijP}N^`mV*_OYy#EHeVym`PHtu=CTYIB;b!L9k#- z#}pzY8{teoCMMd5Q>H}$As{44U`l7x*lI?t6eUrMHN9087T;@fWdI~*)Dt;ByRdMx zPqKh5{+5(vgo0=d$QprE9-f00)Z{BKyp|#>GEcgaHh18mGlwHMj7l1g6eKb%aPXib zF8eCTMtb@|BbmezT{LRqPPoIfpldcO&R!%NZyaY{S))I^0-4^<5ABCwa+>twFrq{@ zFR}5&7TIzG_!3zfqi)DKe{DnJr8Vg=6HCqFxR?#X>U&2Ah+rR*#@8Wj8Y9eyquLJ6 z;)6UMWz~t*g9DM?=BV2vDJjhWBx<)*O*m%7+|c5Db*b>u#fTJEXeqTTJ7;t{U5ae3 z?7%1U*ZIKL7GSpJ?r$Rvn&>lTG^fond5R7dxwN)*}9<2qb8n{gG)-0R%QqQ!z0^ z0GkzvMrbvct+Z3?Dr-Ch&$LQO9H}2_sgnNfnNt8tTn+Mf<5F%0Jq%?0$zf>V|Ut-K9C zXsSJ@6NWg?^*o>!-$^wkj>T@CIAi@n+qQv^u4Fl5oJ$TvB~5!cq14P7q3z8X!x^cU z*1}Fjx!g8HU=ysa;j&;DD-F#RS&~sfZ-3omV5oD(9&+xm{b<*@i<0pR8r0d!+ z??F3P{p^Flau!Q_h-7+R&4@fdj536FivplMxcp=J`*S~XX!XMQt2vgYp4L87c5 z?WXw5gpV-tf8l6`iE0&7IU-+pHA}7=FYJeF_*hRxFh}JaYbB>oL9mC3ag_h0Pw~ur zGT^J*@oAOP#% zW(@ycrI9yqFnAM${cE98(Rq`kig>m$*Ha?MkCd4f=`7Zu;Vb-UCC8P*zJz9>BNZzIIe?*?jcB?X1Tuxh8JeiNsSjx2inc^7R&^xP)m;PkFl z*xcrQR+BdE#b3b72NUK$SiZJU!3HlnYlgcTs(7D9|0=h^YKzwVncusk)x7?_-_mNe z6J2Ifi7tgwi;hDre-m|J!F>gX?5ZswJOqztp*DgyPiuQyW|V$WHW?GzJY zdnr613}PcjPr{e64h)NAVuy@1tOXbpO@q1N#qa=?bb3Pt?}w4FLUjv#_QnHyTC^&d zwJS2QM1L2KH8`V_eF{15e}Hw^kIObp{5Xne!)elstHtIDV^+Pna&8Ct%pI!L|79R- zWU$Pk#{xM->bbD0ln?c-JGI|LKpvBL*fr%>I!q7@InDBNLC#j}Ju#0-WdG{<$V6$j z5i?lu1zPM1%CRpHf5y=Te%=W_a<+veO$N6}BAr?0kvG|V&lD- zd1k@9q^q8d6a`#oC-}q?j2dj|f$PJG%$)Md4?f-JPEO|5OkmTzM91kF!m6!-`=ud` z_OSs6LR&XveWVKuYrX7mks~Kw-ZzyVn#9EU%1#B<$gTT{IA%&N*t%})$^eGc&dCC$u=Y0Q@7v5l;lhE_RV-T_(4MMgx|4Cl>({oGEz{$`I zlpjE;;BW8^P|4|yh;Ql+d|Q$c1*MDsacQx%L<6CZ>@_k=i%Z{BtA5SmuvTpi2Pn(K zk*S-9VOXbMG^`nL8-twb*@IuGAw@3#1#kmJ=WimAF-^|b+wL+Qkq3O9UiPW|oOx;$ z2CLxUTCJ10F_UR4QK+&J63ed^R~4Mccya~`U!nvy&#FQ;&6D8W8o*JTqLSmyhMFYiUDG$myx}ol`9C_PLksi%yTr|XI6m0;U+8@&u=9L znxEA4*Ynd?BQ_=qoNEz;hDS0!`UxjHp zAMu?}zPqQzPgZRLHd~X`R*$o7^1b1O=CL_TbaQqgb!=tC57I^ljDrzM!F%Mvomo_S z!%jpG5=2ilg`Ux|4rIX4qRK-ux}V)&cuefD8mt_W3aA`}dCpk{6M2z3q>4^>!Co z+;{7qQ+9WEIj6YqEK8T=houNeX*7R+9k4{U#gXiFOV)7nvb;suzHBz_8#C2}`u zs8G}I(bnK^-ia4WCB$9F+@dTVo3Gz`;Jt)|<73|1)xJb95!n+{9$i{a8tBaePH|VR}#kK4{ zi@>V}u;iKvVNkp0R0?IfG*EMA@V_Jl5Z}Mq$R}m5KvWz*=GNQUI8M2C+q&M4T(w-h zYo00X>x-hIYBisvMQ-6;CrXT22&(8|aqY{OVIkBaZsDlw8UBr$$|T*YfZHj$DuQW6+k!$BITY3B$x~ zCpj4pmr2VqrG6WB=@3Ct52kP-l70qsp$*KiE7j8%7t4-c@;qvQ_gxAHLa4ZlTdh~r zP(NLusn#0G=~$N|oZ3uWy4QI;tuP)DW-=`9CZ}s%Vk76|dFNG^<}O&yH8S6+EP%IO zg5O`l$i1o|7;GnQRlMZEF(bReBENv8623UVRd^|U?B*r)QCGo#XmjOPrCD>#guOMY zzVqwm zG=;UP{h?IDcH~i{UWGeQ$r$T01|mbe==17BBUDS55^#4#SNwe*=>ZeyY(|&GEX|5; zrTSWZ(E)M*Q03Jmif@$N zz`^3iD;ITS{_XVEy|OzT78Hs{ZB4kqHr9?$%vhy`I&Z?a9cvQ7c5XE3?j;&maarebb9-q+iLO5LQRp{hotr)nZ%XjRT7t-zDNl^tytp0 zVYUt2I|bWDC%eV~WMe{M{%wc^(es-r_66#^ssyh(^0UPNW`=IlId^t0o5H2K5C8)b z8t2nUUI0CdS6B^9F?s8RW%PwcbqKjzR&!&QRtDcnC!Lw%Kx?Mr8gJpYrB?w+V0|8s z_xds%ZmQOqRV>utdgn!7{n!yzcZfu8Tp8=K4#n9pCBm@BW2SQa)$e!LSO4{+@&52D z$_kc&ZzBv@9XtZnJadluI}L4p*2{2i&g0v3V3WVN_wcIyd@mfduoXD2QaRKvQ}Fuj zqFT5kG=ZY#Fe9wZRhOxmiF`g_EKPirMy=n+OfQZoAJfb`Xk7%u6-7=nq9u8=5pbUK%JOlGu95Dt7tMr-1NGHAhirJ?uq;p4Zx z*KJ7oh!jCcKHn3xsL88;`Z9Ba>F6gC(+M^5Gs2L-RIzl`aTFz3E==-f{(W)PSdmCH zeE`nEWBh`r#Ky6dLouHOFPVE6!B|IPw;=H1!`LFcxa>{*gkf?(F>w^*SkR|csVg7o zAz}ElKnjy+pDVL$<*%;Wf4kW7%>R4}12wOSAdhVIf0`KnZFv0`EcS1(?O(q6H$!9k zZF_WN^B~lBNLG3+h)n((_YcWN@J962M87^3B74F6@4rk=tX6(#a-S-Hc#~%2Cj~iF znZ5ma2a6(-^sWyK2;|>+_XgJXZu+}T1C}?gw8Df2_9tV!H`AuQ4x@e$ygck!zT*IQ zfwS>T0vZ`4^(UY&QSgXto5M}ZyCwHKqGy*}f(JLCOT!t%seTmxI0cw#Xx(nxk+yE2 z@p?Z8xs36WX(&l)^pOh62-Dkhys;ST$Q)|h^^NF zq*jwskQ`7Q^GDn?#wOdUynBc_}V!pn?sV?0&6U&k zdN}$^e5}fJ(&zmBap6&oy%@X^5-4(nqY0TR;ykJngK z6Lk7QqQq#K1)cqK<10-l? zNa`+p^*Oru2 z3u+~#`N3srHu-h?myz+>6miQF?tD>Ea#y--n0p5P&W*3;6^f28jsrtd2v{p4;u9r; zB6hwV+InWldpjwdkTP~b#{!m*1sfc}u#XH9U0U1C99G!1PQT?My4m2J^SpG`{lQFK z*Hqpg)J$U@X<+&?gL&iydJXGBYv|ZQt8f=;-gIu{pZ#)Cj}lwBQ()yQ9^Ng_l6OzA zh+OtR17kSyV3ggZh^g|ozPnLj_*7MbH;7#!SKW7pJ6#4Q0r|}!yE8bwg@iu@ zeYDGt;63WRz=nZ9be}yEusBd#aB?38#e=!=>UXOsH^?>HJq6PJ9sVBw4%et>sXHHd z5I(K7SG+UG72B&fAae&#;)swS|DXUQ^|(L!QHw+ZZ_f~Ok45k8fq6kY>>WUX^%}*K zl@f1{3Z7|NPeu~@0hLux#4obE!adcwPz?G3=iu}n68@u+wceHe_F@Rny6=HqG?j)KLEhg^ z|7$h%t$7ypHr%oWrN56LGMel^Nq?a06{rgW?ZrES%${s*{y#b+)eEgPWpp1Q|3Xrj zAaJA=D6XQ!Iwy*H*q!F<3ay7aOoiEFK@YWl!FW>2n0v8%+xx`_icc{F&qvU&6u;IB zXBrU`ka=d-GaaYhr#&}4&#hnoberf;xJ(OzM#V3_M8YSH8*zXuQ2$UzWk4J3j2`b6 zNluAgM`VzIt3}+LfPSMa7zUlvR!6e^6W!$slD#|e5`*9l=taAO`(awxi<+=(ExG2{ zCy$t)65nDZ-NHguh4!iX|1kEJVR3HTvM^3?cWd0;-Jv14Yp}-M-Gf_0aCetLaCZp~ zA!vdI4Q@emJ8SLpowN73_j}f#=6#@nKRxCgRby0@nKl7jDQVqjK70A6DLf9s7zRDD z8m^2e!t?|C^cjKZ;oZqm3?&JOZinbKB}B%`PFKSEdp)?V!A8%spUiO+)Lma^zhA#k zyiqSK`~nNvzi6*qm#?-WrssWouVuWvL>n`oy)Hw0jtFDBL>Co*k4+xs(t$UPbs%URgBDweVk5{zwkO z#Vcw!2GXD2H3&Kh;NW;6=tUn+;*@x)_LwsGCK0qe+SU(?jJ1lS^YbR%kUH$(2*fBi zIcTv?H*}=lbc>o_GVxKCHhz@(5pUIAP=aJ9YvrcQZzC*~6*GKbPFQ{Q-8%Aw& z|Jqk-E5h3CMx5UC`8Ou0JMLUYB%{d8BockCB)OcH_p4&vdAnCx`4h9wNF&;0#dq8R zP`8Bka40Hl6xF-W9Ii4PtOK+Yy!fnqSG&_!@m&;enb!V$rn-4>>dbYIRM# zG$g_c!{l9d3y&MaVTk5+!PiXxrn-(btm}tc0pF^Z-9lK$Wd_~`=P0Z%lO;E0$R5Sv z1*m=}Th^3>V<&eqrWJrWg`lMTw(&>K@xq3KS}F!I#T{=Ct6<4x#!fu-WR+wZX3tpi zroFji+7o&Yd=s2OC@b)gA#f{jkWiLibgXjFGrL0}c$Y^!v`gz8HanRy{5NK%Oynrz z<4wt~2@IwT=)r;**EPpY%84mKq=Xq_Y!HN=-aqMqIFt1Tq)VpJp9hGcKgVM1{TTZ5 z#u=i^L8+=;5D$zEUEV`|U~2Zl>|)zV9gZ5dVuK<>$2lo{PGDw&i^suyJmQtNJ*7$0 zNx3&yn9-=?c+k%SWq;6$207~x(WD#^=EuFiV7xRM1dz-4l+XH>hm(mP2m%`@Mq&lO zeCDQ@bZ2`vRirkxEx@_V5SRzV2TsuwL<@dr+8=8)Pi#)vh^G~#VBZHa?5`6<>r=hw zy4;}T^k&C&FV>#&Z&#IU3)@HWrAxK1W4Whd!SQTX4a&ko9#j>8oNg)C!?r>o_pM;Sg`o zbG(3&oxEt$jDSwD6}9JnT=4*KMt$jB?1^xS#Og}9uvS}@#ZgTn2>%*ieW3#1|L1+@ z)R2+g{I)Y;XnX=ab|xX*L&|z*D0%$2XZsJeBmc@r%=LF%N^KRIIp>dwj2??TxA{+D ztB)#Oylry^Hq(eryOplAkM-1go`;p>^d?4frOC8sE*(k$;~HnGC**w^HLiA?caGs+ zjyFog^$MrT$F42tc|;u}jqS54Fl4K-_#a4;`IMH9V-gr*!#fpOCCi;E(2bIKl;P!; zEw*0^lPst@7hGoF5DN|2g+lQJi@hLMxWhgq~mtVdZ&2++YrHNIDnKE z$|NE={Y6xJrzQq)BrrZH1Gb-lJVeKFzEDeyN`tdxz)GYtG+{=n2ouAS@64u7s3jCB z$I&Wx-jULfAo}J&aruz*&wHadMMc%hhc+QIkU{%JHJ&Fy5sP%Jy~F>(crH39^h!M7 zfL~DZIZtYYG=7IE=@aMp|1{0{bJ-8GDIyg?Dk2_I5%&MIBL23-`P)4CZ(}QWO?0H&8|yjn2J;3IpX$S=_@ma1N<5zZ1_oh zpZHG~IXGS9Gv1!`*#wR-<=-Ov-CH`$=EH^zQLaCXaaG%V<|tYo-s%MvMF78eth+hp z^_pTgyoz_EThi*cqh9NeOR=GFFYJ|NMZ86>#VkC~APr(r$=|D)fnJ*T^iaQ7G<{Oi z9HI(J!+W-&2hg1pS#$a>eb2m??{?`IPvU2nKt5Q(Z6^uv8$?>ze}KteFp) z4@l;aA#X7m4JG$`wsYb?lbM@H5BPyDl-qwGIu{DjEiIK%U)yLXPJE!NT)@+#w@4UyuOYV&mpCKq^!!D#a6M)3EVN0jBlq+xL&J2GPa!6Gh~m#s9q(|Stu#>X`rQVKvt7*iffEs1}UQd zofQ9ymTmK|)YHvWDh^><@|&x`MgH^YrzwBO;Md1jSg7(XC-N(fRir!)+P!S>iBx&S z1|}EvUO9T3XM2fcr)*4vWL2ZGSIiM+t8G1e?=+t)`>r3$%0i(-e51QP|4=Rs-)N0xo%gHNCo%8HbaG#>U4_&-3!D7WgVn=$r%mT5@qqe6<1pdv z3Ho-fIgPDezCHGsQ^eFxxut%296Xu3cQv1&W=@rI4q6VP!oj8XXK#_wBO494R@u$c zfuYLDz%)+n0?%HGITPDW0^{**tV#c&@k{YZ7C(YvnAGP)fxVCR({3P;(PL9B>HH7T4^WPmg`i9M5r}ld4!OojXvgt*A-l@mBe~v4 zfHK0pYHS+%@NV5OrAkRRu5rYvhfFAqLCUV~XK!fZyI`j=o{Epg;c6&7`jm!IG+8Z0eH6WI z2_V5b9#2_;NaT5 zqj>wFi`>1ZZs-a=4cq^nMZW5@-(+ujfrE_-6zTh3{qa^V{s(NG?u0 z5h3(;@`)u0oGsZ_fp=Pt9EynF*@#HVK)Xpr_+0>yq|v|%*nqIWSBh7 zW2GPG*tWOPKBm{B;bhzS3u=@+co7mC3-kU~Na(O$&#uYiDlk#)*6^jjue6sx%y|RB zm`Tv5LOy+nCwhTo7<*iB#OvONzHus>i1;_2)74>XMRY;3)_3$Cc_oH;+DD`cLK6pv zMIW&9{f=&6h2q$eC?jn5E)lSOGC1VslxNkiT=JZp7B&gLC0Rs1_sH`j>tCGzg5zpd zS!kdj3&sfnP)$;30ut^g==Rb}(hNN;gXK1pB;RZ(djoP4CA^j>;WyCZ+b=b#Mqo+C zRbIk+tHkGWw4W+wl7*rkQ}!q=(*_Z-eo`4I1cdPH!)z4IwI)t_i&RNT2tiXSuZv{0 zTr0I*b>mFBrw2rgK6&Od&TuP>{HPV;z=MQpOhMRw+Rtm@ZzjILPiU!KqNKbuzi_1Q znKDmEu}pOMq=ZvW6bYo%fO_R#&iP&YJcTqXm!iH zvE1p9#@p;F-Px_f>kIEH^9SSoepdGtR-%zqkc z+-N4TO2}04AEzb!9hIPIVd-S%X6yW4Bk2E{5E%a1*dF^$Z-g+YCBfFR_VueDQnZpx zvH=V78*F&3Vv%2bz3o%dz0XognV2Z8m(n$v zalCsi*zC>iKM#I+Bng54`GYeIaur%=W7zxYEe{2XIvkpDCn2tUUaSUf7e&b9w-QBu zHUjeBz#w$dl)YIF)MYFpjFi6AHm*YML^w5;~AdK9V`U zHo*Kfn0C`sfQT42We3{TvGJ@XmW}!`o^Wg@`kH#jJOR{_0R~A|M>MxihiC6Te$VOL z`@Eei%zJf{R}!&vTehR&I=_m9-mUALt^O0qlMqPD#)koPzDT6+v56>Z;P|Afm(V5O zCd%k_(vm?Hu-|(VfzGv6->3S{uYmMUUOS1ZJJ1NTbF)6$rXg=~Vo*tk&vD6&SNo7} z;l>x6ng3dBiE?Qs;9XgKISLVUB z{WjTl@mOT)H9PkTSK^fq(TZ_SxGMFlGOP-C9VwbJc+$Mc##Qg&&8B_X?42sB>(3Yc zkr}=&&tEkTEwCr>%Mk9rPN!)B-r+q@y7B&cEJ6k`Vz(H#(d}ehgqfYtK-apZQB65_ z@9%J2+1Q(n4YHA?h5L<fN$2mKuKx9==wEKb-XgIB={ps+y(GG<0PW7-YHiP z8mqA!6R@Yn^4I=~s`I9bc+dRXXll1rg1fIT3_%!`M;x zW_KGa9*n71)Vn~3yC9YtjM*Jn;?qcIv0>kABC+C0^W(KHsY7!D{o!08rh9%-3? zfQx&ZGnz&q;*jJUxBi4U4uav5hyRH{ z#3QMg1-Ne1Bp5G5YLXV~5|!|nJ&B9cdUe8_g!9ctY6>CI2c#oi8v{{Q8i(R$0WI0hfC6^mXnRH=c5R5ofC++@sa0z5~wldoyl= zBi&6JJ-OYAee@Qy#HJ$AvmLEm=*RQ;QE!gt|IyC;IRctT&L0vXM}Qeb?)i^>4E{Gt zcK_dQ(fBhP^3Yd|b=oHkhIx@Yuo-bcRKFi?h%g%=Y=0g-yQO+Za&~~$?hL4cs zpSAsFI!`Xm+3yDn8pT1gI?C87N>(DB#ox8ORdsuAJv@207a?ja7>C`g%cvIlHll_*4<|% zFFIjITn9Xl$m$2OulH@r*2>kf2TZ>JK4!ZR^lOzkl zc21C^e+Q!da(d)zIHBkYXU$R6SdrF}T6oK)Xa9Xn%}V4<&SPnxH}}Y62ewS1cBQ>* zo3CpBv`jm05lA;0RmPK2ohGlDKs4FFbCzrAMF89UiS#J+?s=MxP%W?5kq}LHl#qIR zxHm|WCusprqz9?rExDzS z@}>WJYqs_xUi%F%F3jYnRNf~o6luT97Fy;|<+o@Uyts#&^EHp@MokX`DnXZ_bR7>K zqyw3WL8M*ImS_)`bEUaJ*pefxk)S(i?Cy3$%OLe1sON?lGc10bVIOausj>X|Y z&Mn=W-`Y&}BS9ihLK92izTFbMQfa&&9=QkdYE}$2WH4HBX%SZWF5&r%9{d=#c4b2- zWkza}0p9EnEOdz_;e+*^* zuKoWV>H1$BfZ-pHov~S$b(ptRrk6VG5R;v?GMhRD=226nY)sk+o?i5I*DlXh+9|a< zu|xR<8H=58ihc}Bkxwj^T`cTh#ayiRrydF(rn81#U$3tTpuTLWBjdJbyocM!u+k=0 z&aQ^xg(t_17Oe=wR%>(2K_kZhk?RUijy-O6wwmHQr00X9TDnnRz>~TKjb?NiD`iOj^#rdk1w}|CN{xg{?{DPqs71GkN@dGkr zx^p8Mg3YBwL0t7}$VeaV!AOR^S8t1g^X~5C*;Do*n|c1q_c3l3sK2RuvfT3L7a0Pk zlG))o_sCG_3-&6-gYc;dgXluADVMw=Ve@)8el))2cB@q+#G4r^MrHzOWoFPZPs8MD zn&$O?(7fCZwq1a4=tNW+%WiqSPeT%UT~7TNPeBadC(Ri>j=jY~RkM|-?>uY()tW0j zD~)}i$Jq>jV*{bZcGD;%dOIlz=ID$L?AxPt$l&{F+vBN2nLqN-z9J;ELpPE$^&&5e zxRRAnb9FXdkx_jp(X3yVnC{If;)uQC8qeyk5c%cD0OWad#fQ5mCjfcaDJ&O<1$~Fr zM~9Drm-Jy6pLPN3VeXOHeV>Jz@B_3JM*B;GeK7Yd-i%j@I+dKGZ``IdKTEhG;od?A zN}V1MNtC2BlNC^jKJ3!5>^AJo=zJvmv5FP17cOX2=8_({XY%i#cdpI@qf!WT--HZ{ zCH@I?*Yq@Zw1uqEL6$8ooZUc>7@>b#oGVM;)PP7oM#arOg5=>?NEuS;ipml=Y2APf z%7qV_h{V`9(T+C6*>qCh2}4;0Q|Cll?a2DqSC;|^Nk<)#Qyrm&8VkjC$ zw8SDoa$8HiVD%1~LflmF8C+*Y+PuE2dQXw!6L}C&sIY=x6jvE-3WIPwRo|qTe3Wj? zIaLi+_Oa&F-cFgj#%`izq7?wJ{A>bzCO2ZuF>Yty)E(KpcJNJ>~+( zg6~mNZ^ye^XnUMkebQ+_pOxJyp3}uukTW}7RkrW-&E~IdHgU``ry*Y9c4?uu%Y^$nRWHldu>c{^4WDT zjc*F@BNk^{FcnGIZ5S>lJseh1fc{02qQ@)?eR7#+Y#XNTt*@K`vpQFG`97bcP^o#v zm@s)}-^HM^foY9#(aPNUp^8iCc|$&n@7PC&3o7Bw7B9AINA(|&X>siK4!7WAPKlBC z==d*Ob{VxUSm{x=JGl7f(EOhvaKx?Jw#R2F`nGzJM;e~7l@paixMmYJTV-zyBVpah zkpv0!mp&>bY~-{{$a|!`lr0O{xAQRWiWCsP(XNXR>`rk_o-GrqRv(2c0Oo%wh)=pi zns|S#IBZXZI6jfN2Yp%csPB^$j^(oZ&AB6_@$8mr%WqiwMI1j!cXa)|w^3VBJ(u@b zbt(q&GhR!t4wEJpo{D=(%7>%uG<4EUI#VilKPVGlfJe>qlW)cm@3d8#W%v@%hVGd4 zi+R&(9Py&@k~@9kd?F2nc3KGc&r;&5+JLlj`!8Sovp-48#ZnwmDKEeGV%XAPo?W|R z6J+r)=)R{xN&8eVr&V$!X2@=S~Z{1L8IFBD*Gc|i}F-4e2!???EpU0p-g@!VmUrr&DyP^&PJR9Vsn9RmW zlEKTxlz0?w49Hh>5t~%w>u?XA1mkgL;~l_p4?;Ia?5jAN@n#HPHe|Pm!E>BF*f670 z7(uMa+_4NS@Q~T~EpYrK)lB@CEmYP%cnEH_KwIw3Rrs43E=C8;1G>nI_6Y94sjR!R zDb52-PXekBg2ek9v3o}GD*KfMQ;n4%v671exGHt7TegW@RQhXXrc`q0yeufL@&H1) z+E&0QOp9UutmETDkFb_y_w?`oF&FrAR6|Cjuj|JN`5*Q(;*?Zr|iWD8LnbIkfwAdzgn@w(>W^cf}v z5*%FyXMOO{>pyt-h3h~C(BOslsjRt6YJ!- zbWoT1V|on~dr&oI;=$DGoJq7%w&woOdu6S_}h&zc{u9XYdNcxz&X@{5lTIU__E3XTfur?5-;RQ|?Pw$h73~Be6FBl2s zY`iUx9;DOh2uVGOU|npQ(aAmbDl%X@N&9ALv0l|qOoQ*ZUO8phiHShxU=~L3mc+2x zxTLAX@b*1}9x*AhQJrPgalN26$>ru0L7p4>Y;c<$fo#1V%l_wfSmri&hsVRIo2i=^ zqwly*{Te$r^}3mfGK9N`j-Y42;bmc|s6n?*Rm%3v)4AQ#Flg6N8Hu*qLJF<;oT;ZR z)4O4@cpz=KQgGApd_~vwyqA9DwQ?pV62PoQGew5`NDvh7f$VZ!2q2E{S$F)rURl+XzEw z*x;fsA4oHdq&-|;G(9r08YamdC;&n^Viv3Pt4C)SSv6AFwaU-1KbAn2Ww6tnR(5q2FY<|GJ5Aj?dbRKYU<{UlTw)HqGuA2XFmeW z@b*0M_ui4y)P{9O0Gts+JQToBTR{k=3h*7D!*btik^(;PoM#!S2E-v$!u+Kl0G=f2W*A6hXeP(168UUHq{7F$J^tEY#w4@ zYfJV@fZ1Us9%;r!P!=G6WF#ziThc%a+<>*00|gF3y5c~=)|BkEl*IP||MAue3!s4F z0!Yp@0bKF+5b^i0$Z6`so}&Tc@FA#*U|IZ9ZTN?*Kii15+LA$%U=vu0NSbjA7N8V7 zWb1I^8i0hi=MDEj4MoE&InxMGz}r)Wz&MN)Ey-7iX*e`s2pbd=sIQ3()U%LeyI{9h zghrAFU^}5h5hb&q?EZ{tt^#o4gR;bv`S56B098<6bzdrYe44s2kRBM19P-tJ66g&z zu7^egr~1WBXIrJYWDZW#bkHn%z*s;ij4!IhwlLV$%>~yy_&;zMT+t627YGM40U0R? z{F75z&ejR^*GTE#8Q7Ne6OAuG2m>q10XJG3V$@yRS$|^L4wS=HcVYvK*M?+Z^+wI1 zH*z7BbEkG;?6}*c)qD-QfDT}obmz)4q_e=2KFwJCb_B`QSU&K;2zYwk)P-8~NgrTj zxupz`a(D%OnzD+RX3CK#sx=dp{xn9+$Fs-#4DskzU(ki|`|erRcbuuHU~u`3zbPN6p{bGz@fH4Ub`*oM_A z-Y}h4_j|CKZ^l)@_a0U2=9_SNZKNF4z%IHTmic&8w+#f)TW=j$Xz#$&C4Epf-KFuE z)S;HPI<2F{fQ4A+<=d>3s=_z?G<5s6AH}f-BQ~PEEm&O6i}-8+9j`r>?xa>Tt_mqN@syzO14R^- z9!7CVyPpKwy+($}-6wlev%k-m@%zGmPeF+SU4PrA?=WK~O3(WV5FfFJwjZw5dqLwcHuAjEaZv;Byk|Y5}m%&%$7q!N@#ehZ3fbOL{Znw;L z#yj$YUj$Wt$4b9$@kf**kW26yfT7j_?^FWNmT@FHcK~fTl1^Jz*g#!UP^9@;3-orF z`;LRTZ09Zj16y)51wyPqJa#k7_yE%CvZFYX3$EZFGT@j$E|;JL^RMe6sPcdhU;1^x z`2s*OED#f_9rRI5xP$tX7YSzXb*_N?sWbfi4qz5XvfPy(NhU7*r`nVg31*N-Ze~yr zbzMj2SAv^S;IO!($C(+vxoMWi*&_ML-my@@9D%s{?t0y^h{O*>3-oIc!Cf3*jm|I{I!h?*-W;wg<#CTHN}6o zJUtoyx)9+-|M~l|l#ix95y&<*t$cH9%C^h~n97TY^Ae0jT8=GjIh0D@ewGX4s5~$P zp@>$9B?kY3ek>CCzUq)N4cggNdp?-S%X<1XohMA7wcKcke2e%JY@8d@>HfBz(jX%Ap}#6_qF&tF+j>88j7Z0#9$7E4G>}hlXSkdF1dk z!#2@HylVGNMsn`YAYMMM)X<`AZBC!JAGY}ojj4v3>2caW6?rIozp891UA$Xoi%+i_ zCLHQtZxkch{dVoTF*|1HoXdn9&S<*a>CB~5)i z1$^4YZ)sztf5wFGpp z6Zpg~UwNTc5GD5i_??p5KdNAQjh@6=de-e?^N9~Zgm+8Wi0LVzzsNhQI|b#pMa;3~jA{;J_oU|R(Zrj1!FZ*SB;2l<_)qgA~|IY%~)NY>-v3f zIB-Wi)CYu00fUVr4W#%C1gwf59C*yfB6f{<3X(=6Y=+NZVXUQJNJjxpzUsYE%=n3L zV?|{qq0hM4x$=UfY%>G!saA_n-=pFLu*V0@ldj(apDP6n4Gw7AaRnPnJf#fSjUS1y z^S)HM+!8+;VNipzb=2XiCj7>SGqz#T#zT;sis3u3g>FMoD*-i!pS~i3gjnc8b6csx znZ_#&z%`GtsMP@Yn~raYG&tHIeH5sFyaj_hw$`S7Hk`kJIPA6 z?n*Es@nFL495O#b@%AM}c;R=r)xV5%ClJ4aM7!jGSEM=bjM&p)NULr}G zuQ-!^zn`Dsp_pCxVHp`JD3RhoPAMI-Rx$DU?-jAriAq^3SbwsX3=t_UVZ=*Ix1n~` z@r&rLocg0Su~K%W&r_rhcReL4=X;}?agI0pEW7lew}~ReJPqQ%OOtHYTeHA4^fu5F zQYYYpm>Oko1cG>2gOe_WbKVL2XqP+M;xP5T}LzijNKCR_*^*e%v>jOt|TM@kUmTjS)Gqw!l zvGndO@k>WD4jlH{mJVHtST19hD$x91V|CWf1l0l{X~<3*S}PXQ@UqMum`Lv1_UJ(x=anOpG>xY!Z9H%3KY%H?55y;YA-7T8 zR*;{q?0be?(d~0Ub_`3I3R@(!4~NN&ygno{3W=l7?vvbmTiMaz&*GjPV6D?2zKAC$gY*zh2r zAq}9r1ZdyCyI;(M3uxst*Ze6r%fdaA* zNfILHq0yc-D204(?E>Al(4Js`@If!tg+9U$!TVB@`0X!_aD=n6k1X%;kZNqXItvD~ zIbMNpC@SV~pZt(Xu=!{m6ny%@&7Fu{8

                        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 diff --git a/lib/airec.jar b/lib/airec.jar new file mode 100644 index 0000000000000000000000000000000000000000..e66d5626f1459a2950a0bf2f4c2208e7cb4a99e1 GIT binary patch literal 201059 zcmb5V19YU@)-D`7>DabWVaK-BamTjZVTB!cYqV`p=b3XV%78<_f&6~SMo}sLWAM)p*!OQaF;yW3DS2@w#eYtN0g-v1=6LH} zZTWuK|NV{r=V@|6@>1erDyocf;#YE`BeF6Kj8lj*47B5;6Sd0Bv#gsx9qFaV2kB)P zgkhj}^VJhD={m{Xo6{qd(PWfWoHJ<4(edF?<5`t4ywOIKuilSHvpPw4ZXbUCzN8t} z_n_E?u3MR49fOGJ33UNX1h(n4>45y}-atU4|MCbB@Aqb8XY=p7|DQ7u|2f0J+QP%d z*2w8kQ-43``_X^D(B4PCPxkMr1{RJcMt@rH*Q?|F-xt`}8Jk%DY1v<|L-zl*%oV`Q z!o|YO0{GJj{(4=4|N9A?9Sv-qOzj;1{CE8I+Eo94OaJHf|B#4dWgSBbP!N#G_xJzu z0AjYr_I4Jw&g3kNM%D&SPChXs@?b3Jz&A&{P9cb?uPnAY#qbfQ2tkNl=76TIDkc$d z_5zBGsIcgt!@a>DHbrnI5L!sL$oFr5t}dTtO)!Bpa#iGoy888i5CEk=@I@6MY2(ORK$r zQoc!1zTew;&#E+1;Kw1$ETyGEkOIM2Q-oe`>E`!OsRE(KA2E+!p)3qAy|*&}5$hZ{ zlj)DWg^Y=Jv^<3uKeo9`3pgWX%WQ<}jSiDs2{)-lVNHND8Fwso4UC3dOH+Z2aMwjC z%*x9`9l|J7S+SRM(2G2fkPyanACI%8IablLf$eSVqoufu6Fz9rA8lgG_lHAGm0uwL zCEI`e%jUH{pFV(tfONgTq^oeupXm-@;RAXLICnBD5RW5Fhm3O! zzf^C+&r;-FVg;w|8*xCFOw(s*E0pz$RT=Rr%2h_ZwcQXZRA!8Twt4jhXM1LjPR%Jg zdOs$bwo(*^auTB5QMKX z0LZ)yMcp;l#VEUNbs!Hwf1nhj@f7FSpGM2$*iBPDf^lXO9l_ilU*3F@3Rs6NFZ=_+ zja|b(0BS)$U9cM7go1gMh6v1R&59IkC!|-SR?%|`kg~%`cLzTLcjcP0V5%7gYOTAG zCDQPjO;5AEnWAdrTT$Kp+Xj5(rk!xtn-nVfluT2cC=a9)cY5`A`+2|6#2yD^H|}wW z{mdaIL4F8R5w6039#(s9XF+i6e!k5|`gES{XO#Rql>I4<{VRJCXFYK%DGddAAF%Hj zT8Q$j2dpU62<&CTkkzOUVVzh;La0hH*7Sn~?lGe1#!xcb#`vHW{w8NCQ`Oe&IYzdCjU}5^7ny@ zweufZSFWrp115ydSL^$;(4z2G3i&!4s{9e1yh9^a9}=fM`beMb$ojZK{H-J##`6IB zIxn}iRKI|4ZscV<-RaC=?`7u(Q4m9$yL)f|rP~tWh{c-uK)IRlQ=z#l4xpT$$f0Mu z#H@}_qGX*!q>l32^)G}R;fqv~)vDG2lDRnP^bgPkTRIm}6y7y9jz_6H(`QsYRc>Uu z(@p57lb6`2as@#%RZT~5sYH#kUi$Vj>mR-y;_7gBvq9B$0>tMWe`YIJsD34TlE1-U z#~2&>PVQ<&_vtuF?Xcfi!F`NLye4>?mrm-AhyGKt*aP8B1D~_31E~-E%8%2HyCK-# zsu)3tDQpfL+&BGD5`jOf_l3zgr_p+qbLM>a;4b!;;0eSc|?S6d9 zIYLF)h(JVoW!Xs31QmZp+!5AYD)SElgGEk5IAyYfF2Yv)Ep>MYHZ58o3K_Q3A>kfa zEOR$M#p(wFtviPdX!NH9`f%eyzkvPs7E4d=o}RyNF$*LJh|J$Jta5h77N#C@7Vdx9 zT5?4LM*|xZXA{RiHo0C^R{`z!CNt zZUc`;Nnbvtn#+2hL*M5`y180`mn&!yx}IjR-erEgGj{v(`uGYih&Mq?ZCDTqM!2L= zf3YYYnBz>WifayK#u+YJgJxe4WJrB>6%-;I(c6!k;Tk*-_*JUQAPm%GUj@*+7d@x9 zeoyp2k}BYtUHSGBdc=l;Fkm#Gok;jGy+h1rLy~PWJ(-gH=X!#Y zV-Y@t_?M!oFUa)2(4=bHGNQPYRZig72s~7+Dim6r0ib$moN6wbW6DlCkt}7tb4guG zM0UIG59~v1q_k^Xa^4r>sS!tL_)L+=&{rDvioreSp0v^j6yuZ#?z3(ick;oNHoPVW z&(J(QUDvvX?hj1)8U@iEk^-PmBlqGLP$%@GDC3bCb&ROn%Ests93B2XKqyj0*yX3pnbQ4M1={1C-e&u9_0q2FEr;gr=(z3 z*?b*j61CbuS6u0mV!g^dT$T#JDK=qaehIJ#Xnx>1jXbH-#>( zhwF}9&f>n2C3M8MEE9tko;0hjXo`f_UYiq?0mGv5Ph-s$`BVJbV$4&^q^Y-jTI7dkUx;~XVcw+CzJ`5x z1^JS2F>YI4b#Ivef#+^K#cLwnt0sj=;D-1O0SH3>^i!h)q%vFRE5P2jP^(XLE*~9NO^xS@)5ugXnvfI{<^oM3S_fvfXDS zql#KpX8gpc#%JO%Uc%uSdZdH_6Iw7P>GiNlo>N=rOg9ehwYKwmUJ?%psWQ={=<#_` z^`o-fF`E`wSDAigJ66?YD`GOEM5NO_SrUFo-SFU*he7=i zws<Q0FXg6EKkG6Ms=W3iwo#aRBXuXB;%AVYPEpC# zSeAhgJ$va7HY{9QWLGpgqd490#6ztwkC2J6ibI;|_%DL(R3BApi*Z>~%94-fcQFG; z6)4-~HZpiy;nTL^F2*-W)aEX&qjHDvXMI8cTdZi@mXp5d zlkszKF>(55xKyB~`w34CeJzPxHV!FH-lAG@#jrFe-ym+07Fm?VuMa4U7A}3#W8#=5 zOJKS^8btA>Phhju#X@HUn#ku|LTw^L>Jz`DM`y@ry3;BD)2Y*GbNm;*w+Adg(#(OJ zf!OFgWC@lq3vcv+7xIcNAuysHGz$hAjVL3EFjRH4dvq%)Z{Wm^M$$MI+%PPdO>Z?# zmo{97>bYVUhsbmtU)Bn6v4Yk7ThepT5oRNv=a`#ZtCAu1XLg&J&qks7SV-8pCPj?c zlyrp*gpJYBL9G+f^d#{Ff!ffk>;)T$;xC1VED5wgr!uDzUYiwQk<$zY&{tM8(N}pC zD-rHNSc$1M;K{Iu7p20igX=wvSnj@(>JlB>@4w?|!-#QJtmL5yq^04~#l^XW`k(t$@Tu>$`Z(_s&4Hb2Q_KWu+O$Xx8RPYC#%Th$xj$!e!`*%=*HEeV zv3d_wIbKAu(tmb8#xY&zheC)Jm%ZpCb-eva;PETfYxOSJigguxvE}fI!AIg=uBhY7 za$J(9U1P(9eXS#*>^gcbA~=H6;nkFK|L&w39MexAGyQ4!VG0Q!HlJ@OGjyk_Fs_9#JN2 ze&5DqTP>WsV~OSoYK}1R7NpB&r*xy}weg&oVhXPQ5*9=gR5(EJ{edw@B!j!%M4bK# zukQ08Hhcr_hk!%=VU47?Es7iDwb)J5r|~^7vUp9l)=00 zFaOc}-<%Rs9O%d2n!o?9`GS8>^A%m3%%yDK!)8|#TW1S9TV<2~QhhnM8FBP>w3S$! zg#J)LX-OKIItP6GCB`}ud6Aiz1oV(5S4nvPKGDqO-0*y9NBIZ37x1;j%z3^L$PvcJ zylgvir{~ycF%6AW52yW(r;gpX^)^q$>>x9#11a=4YDy((Bh)M^2fD8^O&Q%-_sSKR z7^_l-G+zOUD)(@77OQ;=Qf0$qoN)8X5G_f)Ef99p_v&3fkZA}OGq>Qjc!srI*=m_r zA{E-Jw!dyVSx-z;44jwh#`J?p5;ImzLMuNab}{R**j!ZkR57&?blAaqEU`4zkMOCS zw)VSE0(^i!!?*AcRso;uYvzn-BCx61llVQfjy)W*OwFTY$CIQ$7TWq@q7ixEQ=X`DzD3bb=58j#Cd8ka zGOHc@7;|+w$Xd!vOrW}Q2)a;CY=6UmQkUL84*yBs-KDjo$G+YXS5_WzN*oH9a(rk` zW8`gKmJ8ZWg%IJDTWtUr5qdc==9o2vCZO33bB!!dT7j<;=$6rCFMrJ)u0^(O0bN+I zvF{rZ*~{z!_R)usMi98W&ie(7S zW0S)4XQ-agV*{-|3%+2w>-54kJIP7ds)U(jj@-VwdjZMax+$cD)htQZnCa=|W+c_+ zuP*1HC;fT4K-V8+dLB};Ne*}sT+!J4q!p!#-9_QiIa|0Hz5$v#RHKNiT}94d+(y%M zBo$L$Kwq55HVV{2uJ5wWet-~v z;3S=dPwGbYhXo`J>5#BWnTC(50cMOVzT4{t<3M_*7}yUqj~&5V!I8tKSw|dFn3f-n z*v{3>Q&s0H*K;;+F;)XU5g*qWhCS`Wm9`XGEo1&11Gwp^S5U{8Tc}jEQ^p#Oxp%%0 zcELGuPB!1biRaMF0M;xZTWWerlQU`;nDLmBF+Z1li)d>R=0r`mshXxOO+|ki%5F8_ zrX4j%^IHA>O$V|La%6k18Py5@RKJhZEd>l7vWM}g%y`}^aqD2T%u$4CM~%XVP9QUF z@az8NV{W_YdgTOb62nS;NmsQ=Ujsh>>;a!>`8i9q%jtOCI70?Oq8#HMj7!S#DZrDJ zy={ftM7e>2txUs0Ue9S+WSY}WD60XOZ(~cf1a)*aV6|8#WzvV*9ch@il*lKZajS8| zY+he-btanR*5=YYkA z8Se%(93s|GOTwBps`(d0()CC_Box&l^KLV$A^u|hs^(Jrwr>7dFi?-2;< zm5{uQPyp$m6OE)g5-PfoUiO{|bWGC+06pX(rjVYLkoYd~8tI_bY}+A7+_{kWRwM*D zc|hB@fb?J%97#zCkC4J}LL9CLlhzVg{m1)@{_>y_<$g>7(3;dE612Bm`iYW0UkeN-WU*_b2h9k=11~OD1A&Q z|JOovoKZxn$^P0Lpe11monz4`AdiXJA7@X;k$_I}Cc|_DlS4XEGWp8Rza6?N% zC?@V;dcw1qRF*Gq^${Ec)57HnOsD52vdSM%)urKq4lau-^#*dR8A#D>Yv>_bBU7#4 zI-lt)(j`r8NNkp`Z-o!p2K)oXsnu8~=8lyV zKmQ5E{f^~iYR!>N-sLLeJy-hi@5OS;Chv(-8xvdO{|@33wcTb_(FfiRol{3+gwyn@ zbjrgSSY>BuvdhbZwcyZ)ZL}0SX)X4gDVgJg$W>^FY1hw^B!2i+Zcn!)e&B!H3{k$5 znm%M3t3oH@-apRpdC2g&m4Dp-{Nn{lA7Vp_S~5AQig?Qr7usH|yVQa=WI?$p+{)Wc zxAzDYbH*LquFxJ_3s+{60=>CYl)h-Nm^>#P=%2Q_gSnteuG*~c*cGRLb<+S5Qdt2J zUC9nh=j|iYO@LBLdK%tDrJvT*mTDxg%|3%R$?m42JvAF{nmDUDV??nR2``CPcw|vH zZW;lW02S{s!7_@fS%=*KGBuZSxKf9!W(s3o+B~}DIDM`$N6{B#fV-aW*Spz8XUt)P zk>W?-1RNS)D3KY}oJ^#R+^=#jcNB9%UzcJ)?#(}G=~s!X!#9H zZT4I2*0Z@Umq0EiHjY|~CVkZk`<`deBLA7iW4Tl6Nyt_74|;vCFpuDVxN8K$$nq{% zPQyhWY@-2%Ie8K@Jh=IG8pC$ulT*{$%&u~EUY)p*ykC@S`f~BSKlBdjR)|AarK1$ZS#_I+FgDVoO2?Ngi6|#; z{_9Yu0*y$Y52(jnP0IHrU<*HCg{RMsIF_2+9RiqQ#tjHyz25=lgK=A+n@L+p2$-ua z_jJFe1&s9o?Yy&HKmBr|f#+-s>3Y%yC_nl|Y-IFBSg3-@J6fla?QQCmPS7qLya$6m z#N=c&--{ZzMxxyDK$wKj&M6i1rrDvB9lpoi7{uPKIQ&XBbe~wtsh9uCn3conlmf?P6o6$@)b00XdKf=OjnK^*3 z(wQmueI(PYbU*o1LpXdXM+TLHrKwP7NArN@S7;SHYKZF({OhSI$DyN!%yU%9dQy01ycIzjqXT^>1c<3DNesT zp_6vfQ1r2N)`vO!bh z4;=f4OpChNnwv)jU;bST^GCtJM~)={{`X+Kn%GS8`LISh+S(!ze zZI~c!(&wIQc;ClYlNnPwJ)evV3FkFK)OnWTdhuqOi5$SmysVJE#ghFm?)p)N363Cn zxp9Q{D1UmNS}vtzT3Ph)N0I1@ayU$jYRCFv&2KG*MwKC=!l<%jB`Y>AGZVWxvahwcSW_3Bu7n zFqz4%@l#v&RD#Um7d2@dC(guLWB8+0k^7n9zChg{Ig#6vp6o&nl3e zyiGADzuQGs4L=&sdMY70<}E{-Y1nL1ANkfICU_0kT=`n68v0SKDMturk9|-mv$LGQ zlF2`C?H4KYvO}L1`!D#!A?rr9YbJWSNIL*wwRarI`ss64m&67v&uM)WM8{88Ymm2z z#U2>n8`k@~7$~tQ@Kf}UD6h*{6pzmpf@vD|X&!U%+o#KI5j|;~M9R3;|l* z0HQhGWw>_$RY=((20n~=C`y&zxj1Of<$B-xz?hYYdR&Msh^-DQxw-4kjkE zhdbLQ=5vT?hKSMUmCrjx;MYao6+$nT04pFBG`Y?=14EBoZC1zpj$@9vMSXhygr3N^ zHhziYxlKgcW5pq4)eCEQwV& zEefa-Zw~bqahj+qacEblNy#L<;%SHpf|U(NQ*F+r>k4`0M?{36CFdI1PEM+%~%7@b0(fyis8|HwPxM)+by{c6tj9Q%P$$%|%Wr;x4bC)`YNT%!&CZf$d)4o4EFbj4;SHP7@;6b+2wk3C72rEHRi-teCq z>$D=DO+C|UzCBw9;w6%0E|l_g`*gWk=PX)MHa0d}eRs0Qxx1zJ6xrG(7R~+?)VRdh zZEwn5g3!Xd%^vshH2ULNG(4IHdS8psN$_abk0oTkKfi_-!j~>XzJ6Rnb!fk61 zZgAKuW{7>%KdyLO|AL?*K`vT~EFj-}GGRe7jifRf_^B8!N;gu;ze2he&l>+thAUlSjq zd>(=4Qc$ilE4XtHr_ggh{HV%jR7RpiIl zdmr;dZy@IUVft+0c-fC=r8m3yj5{)fOQo~yH?9{0sF>%!U|xl1^-Vkh)TZFeua9Fqf*w`3Z8A4O>!bJgF}g z(d-2W|2^olVwBhPWMT|}`{cf6AJF>ta*`?cbaWS;1rig?4jC6C*A3f5Gs<9K8r)po zNsz2!&&kvifDi$oN0GE<(PQTWvs`aTX|+`z$DxXGUP`0g(eq6b{Je#+mX|7Z5~qHx z)5FMs8hSL&NJgw3>7>=I+l`oT3At9yW{G=N(lE|$*(AF_f6Y}+YPvVgq52{`?RNN-YZLkOWHvt6?u_d4sYs-o&UXhrNYE0sW!r%{fYLUfGY=H)mk z6U<2v=le^`j>u?z+=X)pZ#Y=s!v#r95F8i%edAar-;UgN4B94=By zZpi!afp|Ap7K@@N+AQmdFIf;pU z8ind$-!6I65y2)wft&ah5Oz%Xu&)TyA&TcWgPRfdG%y_z>v8Au3f`dKW3?{q23ROh z=n&@LwW}KKCagD!Ovun6=DTDJ-4t;(vm}&J4TGR3SWIaw@dfjsHTj@Dn_i z9?@)89CY%&^$<3W)RI_B-1d*;$-VKR=@!V|kRMkg_HYDO;8C~aLoo$=l74wBmbr*Tb;j*e{Q(mvGebQtfQ5x7W5$FTPcgaU#3F}}Z z+qj;i_JDXeR3(ys(@)4^GffVRW8kYMKzt%~A9-RF8*VtWcZ-Hrej|je-SSsOU}6l< z{|H68IT&g5g&reaggotY}5SKW>N-6f@&d6m%gUG)A`FqiVRmZOl)J*)Z zCeI0sSv1Ldy2lSno1sa{mD;Jx53*#*8l7rrVmbhW?HYd!;69dd&X@b8tK~x?xDeq= zQx_p%{To5BiD#D6b=<^MNCm!^vlX*W*bAyjih7WB3Mpnr- z0BfV$X1G8IU=g#99wQpbgWek9l}FMVFNlMfkOJZ<(SG&@ngHYd<{S}~AW!kR@GNlA z3np+J;GxNzQv$X(M3;U3ClUNjMnNpg%@n>HeZu!RN%HTB;J=Li|Ez%iQ-ZNvP1kKj z6uBL5CH922S8b+HPR7EVI7&sL!Ggp_n0QPA?^j)yJb3=K0U1+6I4P{f+RQ7)D@bJm z_*Odq`5?FeT=KW{ooH`+q?5q>wIv?6)8kS6mz%pI0T9)5HbmC1%D6w-Xf-2u^4M%m z9Y7la_t;s*b8WyCi`5}R&fA606pn z-3kg0Tm5V>ZOT|c8&wSORnXUyRO9aPFbP&R~`kbnM_H;7*1+I>iTD4 z^;jKP4d6;x%5gzel)mN>ig5|CExYq~X{*tTdFbkc%jk}IR1wwBqYfUCK`&KT4|&wz z^rH?eNw4`h(dm#rNWC`m_YX=2rL?R$Hl=iDX}-v^M>A=MG+y53 z8XxKLRQ0x$|KhkI>PuD`0^}#E@m{Lsg#T2o)-h;uk7L>*^WmmEhZI@5_TF;b;P~Lh z%$DU$cRha zr;X)p&qovpn+sPTX|evW~Yhg=bW`@$thU-B7J6~K}qbPjaXXj z9_UH9AH+U>k+JOK_<}`igP`jRqqrIn$FsI~@#X0e^Ey)GD9*Yg*I2s(K) zcPw9zf>OF|yalPUSqpPfw{d-_4u=d5h)4}^a}Hf}Eiy@+%VzQ`FC{U2gD+SafVql2 zu`C-RDZdl}-jYH_`?{!walG2eFNpoeS%a97PPNe3USj z<3$oRI+qA~<#dpdDL^z1*mthJsKFoyU&ZY)!muzTZIbTMX|zgPWdFzU7x@3Uqu;i` zE6w0D{JSl%cn<)D{+=!P-!hH=LQOI%@2F|Oi-W`}Q4JaN!aqD0B9uO?SP%r37#9*r z^rJgoB8lb_^r>x;sZ)$=Bxvi zl7FP(9I3IdyYl(UF9T?db$#-e*|{i2qjj`Hi?{_bq5^qg74-S2V#qYF*?AOis{Eto z*}au0D~k!6h?X{4IW*|8YQBc(3x@TWvQNP<`EL{q>v8YVpM3Rkn{PKk>n4lUSFO>k z1}q4|MrBdGeZ-*Q9-oX8PpDMD=&&DJx$1}pM{n^hXQ{2MY%JVnSY1rGX$m<5h|F7gs4V2$#Sj*^Gd19!G}LWzpnStPva%^ z6=}ge)}7*8s?_E?Yb1X9HYR|u>6F>)CV&)|jKV8rDEr*by6B)`|H(g8skXM6=b?q@m$~d+~nXx!2YB*>N;5-kx)sI z`g0{sB+e~{XQ`fl09V+f=r&#K?|_dRb=Q(jk{$sN#galvOaMAqFB#*GZA^-4OpHrT z2$j;C{GF0G19Z@(2?cZ-6DlPP0w*XvQ$a5uKj4y+5;Q*H=jsoD+RMv@=EKv_KF-ZbvB1mJcp>=44Oph!otbqD?HNL-gd0N*t zl@OXE>LYcRqoR1Q!P%GO?y45#d;2;jZ=0Mx`@2dY%j%niAx_Je@gPJ`7%@+RkB@_$ z&Ju*vS`e%q%FYM7Q^T?iFF3~{a6IzW36!5VA;ip}I^l5Z0O{R_WMf3JUO#4^0ksbZ z^ZR4k-#LUE?YxC;S(fE%D~tDCh9{GA_7F_XPK}_l`kE0)9!yB=0Kw@4!Sw$ae&1iS z3&Iw`F<~m?OR5q-;=a`AV^7c5`sT`>{6!hVMb-B&+_isdb|m24ynFn8eE$#bTFl+Z z#QryDE%}Z;>>U4HK>sfruleb{)6H+cA$Sqh7zNp_E4YC;N6i>RGYVf(Fn>7Ejznig zKXrB$FX(MI&~r8FAJxbM%~H#SBtNs=y;FEnMlZ)k<$Pb?n=wExs}cgpS7o|!u(7r~ zkkN!?3-#d&Rf@+Xnd!Q~!KBhU9H@6nTOnE&ZfAYeSX66^(VNQC`f$Kt$Ce8q@&P8Y z47u}`Dtp-Jf+72-_G^msb8wH8@Sanu%|>}E?mH_>f~Q41UaC8+5)4ksc`oXlF8mV2 znd8<*4-}2w1F5#th(&E8C;PvmgdocbzV|m+9&ImiQo2i-L0~Shm6jC)eGigxRaDms zQBWl7;0O7=rv6tnK_MX!z#TSER zU8S5pvr=^=27pSmFtvL0<@r(-x#~`lX@(QI=29(A=KZj$linG*8qd8`XXj>Wq;HIyLnju9N?$A z`ENDG2eZ5N=>zVV#qA0we*2~n4nFf#`A8KIAxE=>u->v+uW>K?Jc!`;XbRgK{Gcq= zjHAlm^OdK~yptVsn4^^*xzNCc916RTjeu0iClLF4!dd1FCYzy|V$f?QM# zAl9w*&Ur|21PU^MQ4@k_buRW%3a)=^)h#8Z*R7Y~3c`I2d~PT@QtJ@1N_J_M3Z_SB zWr*7JZRaKP9jU%=Rg9wY_chXs8iypuzInngMe_!wkwt!nD}e|v9bg88+_vF4+;RSQ z&^54&2^#&*0nEHNv>5z-SMV>ITGhbG>Mu0FKY9jKTnrT*?cUQ(PEJy`rglz$@(ABX z-dkPX+k~ZNxUe{B+Jmh8h5hP+TVSzBFkDnrX_O%_zPAX`0Mjc0oKsMJbm)d~qY_9eF@G*USg?F`TMUPFu-r8;kNf%=v z&7%1P4xAJF@sM-9ox8#cU-i5|5H%mB1y)zSsMXd%2;bz-DiLiP;(g&MxQ?0uf@ znzb07dB(4IWiOA)C$2W%)f-bQVh}$|uDF>OyUQBgf_*-h{-P(gkon%Y(7YO2msT=< zILq2w8Fct-%BeuyU#sjb(fu)+!zUKrkhxT6j{LjnM@v^u->CG1C(A+cHcAN;r~G>~Wg^r*g}OdgE?aliOlb zfnSRJqv1T%3TrBe{2^DkF|p)>{+Py?SkA;`QZYrUSJp6+B)^93l}aVKVJ~&ym8a<9 z~=subR)3}b0L6KOrusz2_bnrgogzC zS%_akZUxP#82c5M&=G`(iOzsS@rEi6RqWGW(l%8_I|-2QJ__*eqj>+GHmEq;+5ek= z{;wYFgg>JXQm}1pbP7RZDN%%=Pl7Z?B+z;IZHOZ=WvAe79HDy8l)hm9z#qTa=S03V z3fK`KZ9FX#>x}l=+pCMh+4Jkw6&A>@zM4PzZk#>bY503J_+2lcw9{vh&OJ5WKo1yz z01ttxfK!=52wHEvGOEi;vmc2j*>ddi)uFOZB>T$_#ahuj{T!}-tJ70~4%6#m7J?GP z(EqV~lV%G_dIYb<$YPdlecn35YSuobLi51J@~QdInx7|QEGMe=&d;-Ml$U(b$$DJ; zh`KmKgW0-An-p0l+RmVaT|jLEXiz(rT0gdG=DcDIHahjaSxi@Cv1_2|6ML1PcL;j2 zUO7yy(yO2+ZwV-^z&3j_|0(&V33}<($n$yrW+PRIkBWOl?6u0mlSXgbnk!%^&9n57 z@u%p=b{LJC->kEPn@C)yj7`T;Q{wGvL-9!IESp0y{)!Pa_Qu1vK~LR4!M)Fb?fL_? z!XLDsGB~4~jgojxZImM(;%@>v^K9=Uxa~+(2?-CZCs-#F43wbK^$Lz>bu!BF4CzD2 z;L=dh^144_D{ir+E9EHA(^RJi`{E?3Y53>DH5x>ATAPjajGh$3(z~)FL-a@W)`~;d zvA=W93+6+xnI?Outc`t6d;#A*n5Z1<^>7=0%rnD!A2{E`znOF!Ky3UZ=ihXQ>80M3 zLY>(>`>sEb(y0qcN(r?fRL8aod&-Bl;qQIB2DF#ECt~V+AO<1O$F}Lb5^Hj%zlWF1 z67I^2?Rw`ZklTXZ8RyL8XEA=)F?2RH&c7LWBhi0b+?4a(`3L z7Lh{@poj2+6%qlxJ;bcB#AH+N)Uza^(cZFOK3EK%Ju6r~)w_R%1;91t3VL=E(_yPv zgOiHOlJ{d#O{UsezW9kI@9N@Zu<3P7ruYpBQlY&Q&ip{O^+r{)Id)|+^1*EOgAM(_ zO}uy9G5;HP>|{|ScmD%-)cnRBXJD_E?J>`PLHJc=Zhfoo>ecr5v!ee*`2Xpi{1eGn zplYH&}t{CKdKPodf)6>ril+bH_e!T3}wXw0OJs&XMy}3Q$%8o@_34@X$`3<`{BR#1KLJCY?qid4B-lxaB zTW9QG3A`Qp&^Pdp8=Hp=m3u3OVkJR0jpN-S1)(`ULOCj-V1yG2k^AtfaB?KOn6b>~ zn3(`{`bt_Iy>IiHeUS6DSCPlsKRvTm@qTUJAtuDkRGH}G@j$s=P>9$C4m&-lx~px_ zEgah~F?`}X1gcWwb^y-VZ`pWR&k=9gy{$HRycL+`#wi@A`I2~`xE^WR_fxcAhcM@2 zI1pD=v=5!ep^yYGp%OmgBn^*_#dk9M?40U1xw)7y^V%vMbJiAPDwWsmjK~oJyWMc0 zaHA@M4Cb`34EpHovQ(wi44ur<4658Sl70~ge?>&-SvqRRh^Q#s3tw@TT12`N^ALjz z@$1)id4P;(%H-)rDj&>{ylx!q)C^-@McpqDV@KVY6+YA`hhMfR)&De@xrMa0O>$J^6EQNdS!)zK+yVqBii zVmau;7mjjYah?+p){pTiHm2ROuVJ_8OAc@hcX-z-`J;6nN9a)H+zJ;^(cXmmsir-3R*L8u(yeFH?pc`#%dZs3 zg|Sragnqo@G38fv=Bg+s%^L=Z_0x(GmjQ*cHeWN z|3s<3%PH6e{tsnu85ZZ3b!!JH+}$bMgS%^RcM0z98iErfP`JAU3GP9HyA#~qf_orv zioLtv-raAX@7w23Sl5-mPpviQnD-b{r(PW_Rvdwu)xS9#{`2DaXPx>VHR_+eV^Q*m zqn;#I|3m}v_Y+F{tu|7TK*~@)_^RaO$$smoE*UbEz2D7^Urv#4-QD*2jBpr5P5!7x z>t9RKa}4FuDDs*&rGJ*E&zQZu^Ws0{#{tk8XQP?E9ck;ML^>T80}aP-s*!eikh(+h zkU9$}W8>`Nv1A&hNoeTe1Vk?>htw#Q5(LCA8HZfay~rS$3DBDC4%0m(cgkUi=0nh446zP#&ACe%y_A3s5!-n^( zE56zFKQQ3G9*l3OCg?gzq zL1lKvD4VT_DYd)igjQ#(D~B>1+ydc~@jHtTh+1g%(*6Er`gv8SZNZKg+j%_yG;>4m z7_VI%!yzam!3hq9#`u$2Dy2A^7@I7c6q_O&xC&*HWK&=hXG099Fd}gJ_2R)t(y&a5 zJG`79REqiHts$`X=6MjJkWA!DuSx*QQJ*n3JAF(EPuW&#0i;82H4o*Q}jpHUgUXHK%JLR7DY_LuF)cgP^!ckKWBZwFhmXGj(6CAE-oa+#t z^j8R)uq8g52U=(c4#ao0xKnCZnuBg-KM*+bAM-!Q)&NC`%`yN(m*Bs>Qc5$hX3~L- zwLmiBUSrW@FAxZ&HYz*igGdcC2mk$o$?QM0~<@-F6b3tkUEW1b{yVo>c?yu7JkGI|kQn`%rB8B8s&@ zbmE;4I6GLV7*nEe3-%*X2TLHm0{{_6K+;sx0=|ey?9SBwjl!|i6is+IK z8*vEC$=z2Y1vvv;!T=G+K*MTaxq!4j>;r+I)&~)4Ea@14%mHv-8^lRMnHQ}8Zh~6~ zn1Hauh#3Dvw8LC<`~oOLyu*L(cLv2)Br;wHq$A#eLA*pmjh`0v7nz6^0?r^%P6QRY zgL1S%;ohKnluLFW{|ksT6<};N@HgLJ6{B<@?BTqqzxc$N5U`F!`pul+1k9-S+b2}O zM9&G@Bj&&Et=Ex;NC4MTE%@HjK>XVi_Wz6K^_Q}zLeoI+hZL57I3VG(C@>eNL0gZu z+6_616uX9YSG*(&h&XLykGvR%{B|gPRP}Ix^pNzt@z%O&VkYYSZN6~XNg8G6DMmAG zyR^k#Ci|K9#DM(e{QCD72qPrnl2lFB0u#-?%&?K>DwFr(q&U;}NT@rERYod(;>dE^ zireU#99Y$5CJJv!7_^lVruOMOK>bQPTcwfAoB};ss+SFk0$RpH&f=jJxg`M%UR}Ao z4nW5FJw!(1`r(@c-FT-a~kWZ_03C-VTc{ghK+dahS4|Hp)xIl)Lww>5#Xf7^R zeDg5UjhV1_%?KFY8(*+G)pX$Cwh$_F`RIAuFvie*vEogGmi@i8+fc(B_(|7SRQq;B zvK&J!{Gu|!Eg>rO8^|{-EFs7Nm0)Zfg}5<(${L!xHHEYQf?*tl^FzlCm6K2!ElUIe z*84|rSdrM$EK8kiHTN;)A_6LXHsSeUEjBd9w>59t#2Y%Ej7q99A$wh6JLi39@0d0v z`S_Im&nyhtoaV63RL?ZHx?SbJxN=<0QuKK%ueHphk?hr`G3^r-Yg?x59HNI)o8zLz zb@_yPse1|!HJWWTh+NO?p!a5iExasXS}U_|y!);sjV=YN?dZg2RJu6VSKUDg; zdLF`vh$zE-ino0G%9!*Dw|Faa{WUg@&PBEvh=m{lV(+l|p=Zq6y19pHH0CalE0qz6 z)IEhIh|gq_JUR^rY|)19E+E|1SJDtVW-o|c_&QR)`IpL_-Q~tWL`)IfthFc1C2XF; zD{=RP77)g4igp|ScEs@J+tsMv;~z;zTk*ty%h~)EUWFC6h1R=|R(!~bGCX+8VC2Vd7+qFhn8UDWoO ziR@+z#vu=p4hd6}6wBvMJX?==6#R%r;&gxAZ`vmhJ}$)8uT$`X_Oqe3!-p zn zSyc|1uHuJV+`3q~}KJ{oW{H2v5n)KBI$l;5bkAE>By%uw7Xf7)v zV9C)EEIEq*J(1=AK7IPLlB@Xl{2ZB)2W2==p)yU2804@dnuf#@xoQ$3XtH0Y8;6vB zxpbpK1d`0T3+i0?lg(qRx!7 z(g2_MMJQaq#{zO_kCB^!);)0sY#^LlDpKhF%6<%7=mf~!y0`kr@_zVAeG5O^V;=MB z6jUT3ukiq`Kw$uYz|mX$K{JxkgiD+kqk<6PejBB}83XU}7h56)T60PYdnZA6zAQG!kkk!f~ zSx5dENBRCg#-s8K%X6Ov4{yCxgcO8&iNF@=CL@u8;#1c-oHpN0n05C3HII?# zD?KPgA49Rr-uM)bonq7gaN6}XsFfH0l5KRPS_D`#@cq2~zjQ#~mcyTR z9()-y!!UPqv{m-}KUPJ<33L%1zA^<&HZB&po*9$n*48MkahQr3Vj^?;rNoVX6 z;5ony0**VfGm21udwL+%j?!r08=EBWj4_<+qJjMM+)Il0zYn(+Aq}N!qyTKf3v~A< zQ=(^BYcA5iN(tK;P1eR+({>d48r%kg@(Ue87#CLx8e;|dKXy57 z(s}e_PHH|xpY52KwdaW$Z5g_3?H+Ize=qrwsfGHd7N{KcfO(tP=|h8!<+dhPva&wE zSZTST5+;f76qyvM=IMUhiMGv)rL&ZnN`yTwnuG9VGa5m#yD)?ov7L>vyc!aK?a)OV zxR}5N>NMhafgB-5feD$SqssxL#W^ls_WzsPm3oC>9HS?FYZXDY#rSqJq*fd z{3RuB!{LV%2c7;MH$Jr7ez^QHv{9s@OaR3ZrJT`*V{bj3?>go;NHsqFa- z2dZQlG@%@Xd#?j6t%X+@z*=rE()%f*_x=`I_n~+WS2{$-zkW()`wd(cQZy_drl_du zPkZTYOF2$eaS9EQAb5d@!9(gU8c+{(1-rip%i-C-sez7A&o-<7Mj^Zw$B_lTSeoGC z_!8XI|39*Sf3vN}d~NI39CJnD#j--Q$fzb4?BRLnddb>I=jYY#U>?^F#@&I8+CjaL zlsG_l74Sbb8&tWfxRNFis<^3(-&5j(P1bBRO$@EBU_2;0@L0K--B?fP8PCD9F`L0=Lr0} zFpHH8o!a&^PY@eLw2(ZnGBC7ivuxCUtz|>3PGg{G?v)igCWn5f5{Ssa12wEjK~+4z z@2Z$Sb)WY!XTs}OT#PwkCPd3hTNR7c6jd7X==G^nL0>D@DMjRqw@tfYnyIs{j5m0e zBt$nM6yrMXfJoCAK!2a-AWO$$$hg_zUFUGdNi4UgAdr&u4&2qBy&Y%H)K4|k9>oo< z7icBdoc+D2%U?;+S2LII<-C}FuEp=r^wA=@b^WV=HW!O)b7YM42sU4KkYCmnk-uS$ z;rhbI+{_;s)?ckAR3&SIVSBi{hX$o)E-nrm?X0)4vpk4!*Wnp1_+a?GmcWhu$oS1x z^Dm!C4CfZ%ZvChj7yEJctTC}nSPcBHJo65@(E==E4IPbo^fV0;7!1Q@WAU|uim<4c zO7lhL`;4O5nuOFl&()}Pk`;81JDd8pxn554L`}Wz_J<$fg=!`jLZa zJmwzso*at1YYd+U@*Vr65}OE{G@AsQ{C_m}$nUm|2&!GSS7Qe3?*<=+8>?9w+@OxP z(0wlkP=K)Ld~`A7ZVNz^5}uMRP-M^lZtg`hA%oxI-QZ;IvJ&96?pFp}m@9iAapF)S zIx*N3YrJXdVw8f~+qfsYnn!yOW7pEYB6j-1#%$^yQnnxS5i0I>t`z7CA=qFP+NGJK z8z|*wSbqVJLs=GVR|oVa0srMWa26N&g*_;MI9(L%#W)Cw3jX^ue}5JY1Ocf11e|(- z@eYP)VbDHu&~Q}>@Lm<@>q(vm$H9u|n^iFRb8MST1sz zUTY2j+>D>q08!6@tl(Du+7AtqtxzOc8`O;A5&_`t3+{CXjT}6%K$~d?3JeBOx`AS~ zLFTVrxnFd)l9-4T)}T0}v?}aFBEUNpR^|wpled3`22ugIqyuCQfrd4&Du68P1CF4U zm`FdCbRaxAGw^-IUEW5+kxemP-jQgokP2$C54FN_K9YMUb; z@%=(#lQ^r4$v*cnmT3=fU@}@>&<^c&W#nN$B2B(vN$NAEMD8Lqd}j_dii0D@ypP{3K78oj?XcI)ejIfOg-AiL zfML}ippdsMIb7&9C045LV_8$1cCO&i@!#MSm#b`5c!iV`a*g%g5hEk>^JSZ8^=R>R z^m9whz{UW;gfdB`3Ulmo{c}P(obHc{7+r!>Vszs5E&i~+s2q--?$Cj3-UWL7XF`32WC3gwp1fK&70TiZUSEs<(({W zyKeQkmhPXVEEX@KjYj&}Cq_T10H$LwS%^+4(@}#)F+UQ?r^}s9Qq*;huyhJ}Ah={L zNZ6rOAF*1=G5eGJBkmNX<=qw$&@Ga)7rx0sAMxM)We)LLvcTzMptFL1_L_emQT{{E zdj$j(z$}ch<^Lo{|Fb#J(*g&-23RhO*&&1d^WQfbn53<+B@t#-Z$1Szm7#VpIok(Y ztJV=Fe%uL0^@(ZP4i@et-F4=YS>`BS^NC@uYprvAu&_vQT>tI|2q0Hy2ZbS8FF;(W z>L+f+V}T9WNKyDJNm$ydMrk5T#?1QteMf4L+qM~QQ8v^KN4g3;VH(Wn(ucQdQXK~xqc=< znQ5SgVQZ+^(l^dy(W14vGuX2;EC{N6OcFF|GuO)`3)Z#V5^Z9}T-4XMR9`b~;C`%& z`zq39h^NgTKS2DPLYwPu;eUP z+}6(VKEa0*w#bjWOb&YGL7Zok)K~9!Fd?~N>GJch(2VzfF=RD_1ik|dBj}52jCl}e zt+JSH$6l8^Xg2DFIxiH6!FZJA%CeI8y~WemC_}*3Rv|;=g)D+tk~aD%>sTL%x zGO4>iYD5$I{!Gny_=eMlzSMC@{kYP{010mQ{+Yc=nls7N>xv*a7neP+;Tb$T2|*=X>V~JDk;@HhJjU ze=h)Bd?X(bBlKn=TiDjdpGw{0_V0-cTT-UX67H+y+`VK11j?4(*~syk`6 zAkn(ribLsDvrekY>AA}8yWYs(%7Y#d$4BX@d!fzj9rgbHlQaV8T-|kkpJT})aPNz> zk|(EKn2}ZxoA^bA_ePSX6|ENcU?;(ntMvx^r<(3w98=K{oSa#^HN;z!B!M2PuUXd5 z(JKR?dz5u8F(Y+*tBHgfj`kl#9fZEcTPT%U#*_c}qQMSLs3Yico+MBHAW4447NI{z z9dAf^ne8K#DPEX~F|-LbsuGXvXwjBU|FW$<6G<9B{hw_saDVKWVLAKa0|&m=)xg*K z-*oH$_wn-oTMK!P6H?SOOWdmicBmt4qqD04UP{F2SrjVk~)P$qOaO(r_ z{*2OqJ$Jp|N^ug%D8>~lqj2|I)Ej@u0f%YSuKW8xAiUw#Rt3VhP-X_`nWWT-3VJK7P62+9YgeCnn;uMl$(4th+I}-9QBUjQTy-nWTePyb_H8NsDepm_F*BEG z@4BBm*!+b(n7p^LhljXyD%a0s&8)ad1ei>++-o)BU!Sd!Fm+SbF1bqcD_IhdVR|rE ze41`TO4Q#T8Ns^~iy8!NljcJ>M*b@K4Ch{oYyLhgkO~4zKDr2ORaIC5dgWS5n@kyn zq~A2hVDVl(`$HM=42R>`lB%npbY2uYkxG3k$M0jdmzLBlj^9=tB!?pJvBaJhe0=9g zLCA>@nf4t%^3GJfxP9 z^))fG%yu%o*lH^8V1-)puEYuEmpTvp7xe>laap7nb&mmC8tR04kX8Km#FsDS z`^I>rr<5J%&L9cP4Oxt_&52T@ew;2H0678Nfd7g$4`ya-|Le7#fxMA=jyln`*a?Ab zgmxEje8u9{`yeRoC_YXRH;%huve6bW7hg@1bN@z_y?!gFc*=5A3$H{6fM7y(i5bW& z8PwYiOp^wUyxNTiv3{8?2V6q~wa8yR{D;z@O{-V;3CstJDmrCP;KGGObu%B!th-x$>y3_C z#9Hgs$GFl~ZiOYlarevYrqPz&Qe*s59i%~QD|;{B;}ajv<>przO-i4aYpT|h9QKZ& z5nnY1SN0UlP4pV!WM5i>9m$?{Cxe|AG5h%O@uV##Q8{p7r+@+19ddCKKa-q1*G1;I z#-8I|950oAGD&vz<7S7p58^@dwvGr5#?XhZxXpu=@F|V?$T0J{3Cpx z8rSK(+%Xw0Nl6`LLDZW~j!HVL3=`4VJupsRYnQ;=KNQfl{BDZ=K4to2iP zVADCE=fg-9T&xz+u{mzooM^jHxaMIJ4RKppXI>yV8-WMXPm_sGp$;=VtH{P|7@L0C zjg+!R{To^A^$W_In6N4&zs~~%C`f+6;>ha+_bBU_@=?wzMEo5C22eyzrQQ~5ERZUTReB1-?3kSzTN267 zOI*_{-^%IKaD_5H7Ol=8geEPlEt})L)wd|Jh)^~K^c>vp&P7T(j#T%VwvyYWz~v3&g8jb93YG9v)C+JKNS3uCiLFp6_l4kIOqK}^zC(jLC6TBeK%p@>|p2&M>L zx%|d>A$n-Z+_RPcV$krA^uYGSddAi7z?Ae?!P43yayX>~i7csy=ia#I_s7+iyX@b` zXH6g9&~AGZSP=Aa$XX}XrS{TTuZ)^Nf*s;mIi<5fe>%j`}7|| zA_bm)`NJXJ@dGToz=+Rzhz}Xa+5Nze9+rEK%s}xZv`~O)T-G+jdtYmy_m-W~rLGle zNTcd4o)iOEa%s4|lc*lMBg)GZjN)$V$uJa?PSfWO?gWyKe#xV03kI|@}d$dw_&Q9L#b zsY}no%YG+9-DljwW;@NT?ybmDUc`pKU zRalG{r`Q`qtlFU3G)UeDU(Kq!$07&B{xXT4#xi~<*S1K-I%PcaE|u43YZjSYdHvx( z!GYSTZ&zYqa3Bl}4#@t!3gQ(U_`{v?--4+BWlH)dKVX>^EMpU|y5vIpMJxb}f(~KB z{m77zM31SnY&LB+8NL#&mnegXteSSE8 zM15l=S_enH!Yo2khGm0wgmo+LWz{VdyoHE9ZZNCSZEEEH!4TR$B|HyKp&H-pQOp?z z&^J(t=cL54aFBJb=Fqy5vm}l!{qYwxKuxIustX%o&S@n_VMmXSTDvQXUf_(EePXZj ziRUhBa*quy=46bzyFp3s^Im~P!D6j1n>umjy%QHIQJ@*Ag+DDlyh*5&Q|pu3p`3ds zP_2S^o5Y^6H+LnW18=mw22QG1?kjtE>wo}=BNn&rC<_Uns4@i3_-m`!Xm$_B>9d~VKpyoqjt z{65=44I@Fw%~pYceI{BJS~cx(L~0H^H%-w#Bf*x`f{O?ztl-n(@sW*-kMltWPp%42 zHFZYHs7_|eg!%e0>|9W;5O@s;+tlNBqe!lm&&Uh=(v6|4q)Z-0gar*~om9=yX_j6^Rz>g7}rE0(Yi? zXH(m6A@XSYoo*ak=klT|)cseW?=W zcHkvr|6l3N|HWQip|0QvmJdHd8eQ8e+mUJ9^#3e?btoz4uss^z(xez_L0$ON&qU4)iQ=0YC29YJHEC&^E? zp;%6RCY4(PS#q={Fik9Sa+L|(uveI+rX;h5{~A5Lep^@D5eGuxTTl;t3yS`|Z|l!K z>VJP*{}rCH?)e8ig^nv7x&~dMTf{`J(eeh~K9kDM`RA|){Vz>mAgFl*!i%=|tEsee zCSf}G@>_hc{GQhE=Sn-w&jM~MBV#p~J^JA|F=|jUjh6_#YyFys?`0O2ARjN0 z)`FGZY3EL(0102Rqst-u2vM`3amKqbpKX-AQJ9ARG zcQD6DrLyihle+35c?-!g3-~DCx|g>N_(R;89L`*o%06Jp!=4pQobPaO^yc14R%6DP z)u<{EM4rCLXqU-nGdKjx+C|e?-oMx(7R+2QBKkAtUemm{O5m~JH12cBzt%LDO43+< zh~d9xywES3r&ai*Ir|lfaia|a$`TnXk&d1{)|KxF$@WWtaVn{Bzr&q~HkJ=p!YLlf zvl21m%vs6IdU{wfUvW}#I?4yu%O89XM5zQwi;_!eJNOUsCxi?8EcOw0Tu4Ha5nowl zI|2HX6Hf3cG`)toA0i_>G5fTfI5Dc!8jEXf84UA2SB-~Hp;+H`BNVA~c< zjR2N{V{Iis$3w3N+v&D6NYzgw4wONK+dxN5Q3vW^@Bzo#M@=LWeUQz8D!^VCjPmtA|ME(9M61K zD_h>ARDCNxE`L_=JlkGd_xuPG!0T21M%;-E^{#7#k~3aQ`fa>Ed5iod{SbD%Mm%S{ zd;Dj{w&c)xrop-2gmMmyj6CYCdyV=uPCZOt=HQwX^*~GZc^oR!?>BrM^(OcG;sD{k zvMIq~gr@f27R#pf9ke8lEBfp?uzyr9dF*L~yVF${Z}`-#V=&Y#hz9Yv2-ehEi`INO zu_1bhBx4XnFFPE?7rx#Ggp|nJYfl>5+mYWYkD>PU?I{{a*g6QJ{V3jS=?Wu!NIVYz zebLBV=Y+kik6w%4i?hIBOq*}BAxlRYH1CJs6!-Q=TYt*`jWkOU^Y4EZ>ND#XyQb&Y2 zqn|qEkf<;wwdy$21jV&|ig%IN;((4=)_T1*i(*7t(4dkiwMf#{ChoR$_|z#t`J1Hx z(6_E@JQD^l@zJ$4c(DVvaU~`GQGa3#=;^4)-!j+2xci~%NBi6Ql+|>Kq+qIRlOI+M zt`&ndDPOtL<7kpUd}BBLiJp_6%q8#!bqVaaSXQQ_i%XP==~N*MlaZ2^lIgcH$=vbh zvFL#&s@r&aaUVD@XuV5LIhqf_wcJ!d9Dg1FFs8mV5pVGL4E#W$f4N1okrHe}KxLrR zc$2^qIu&HiN{mCM@fj@<=)rp;#i- zy~jeFwhU_P3E~lu&Vj#t>$4{JhRz0rk5jk~?VSTi+ZFw#079L-GKQ3v2_CHhT4U}| z;OxMYP}&E*k`ovr!vs4rUXc((slc3Cpi&Pzk#s-w1Cn44O~9mO2u`-8Xf5?1F5_UG zfb<;n1BRd>RREGL2#iEz!e4T}nka_SfZS8A3=n1#!I{RQm(+vYjDuGK(reHypR>;} zM5H(eA$@fasRxO1b{Idt9%2t#GTyKiGan-|4hFzqVj{Z4z~Zxr`io9f!2`Dm%+Sk_ zKG_F7^#?I_MG?K8VzPbVf!A`Ph|G1sVCq3q#z8rO!Cd%D8lPv`H()-4j;Bh1;heUg zJVvpT@EmTE^b%7!@JaYzH_7WW2dVnw;&nH6Iarf__xEm+KcBh(-Sq#PEBjxYvH#HK z+oE#+xfwgyG_5;Y-P_5JH$>`B2^VefvCpWO(#SIhkTK#?+Nd^-DL)A4I0)E0GB!#dNRYD+^AAvH_<;8NQ}M zN&T4$RfCGM{eHGnAHfn<45OjD?Z!go*R-jMxyl1;`SZ05MO=8a$&I?1f4%Ct-Aze4 zg5x6P@5!5^WEKb5~s(VxoC9lJoYy6rOI8?tv!xNfot3A`^{u>4A|C~CD4Nm zC-xG$dU^cZiS~>Zf4~1Jn34}pE8dFyqauL45o4SlZOV%0c3ZJ0ZDWP=8F|oh-R{jm z$VV^0TUZpUH^I%Y`i7ylG?}QPzpz|LBHTJqxFPo?>ytxn?t5`T>3P^M9G`_u!9?aN zy)qg@Tn?Nc`zw(-BoVX{2?I827f;eG|3PFDzY>}9?}CsdUx`fcHtl5?O6-7@z|B91 zOffK#x$+qjoCwO8r__P`$%+*nPgp&0PG9YqpR$|MarvO|;xcrcM;@9l4M;|J%UUR^ zR~vUkP%407<}`oy>d$6)^=Fd^lQ*CJyF_n@==VxwLjCJE_xgJC9}3iHgIkuZ~C>5vPZaw5BuutF$zlk@epf zi@0E;B|jZrz?IBFIIJ`Y3A#SDZ7Ydm|l|{Idz##wY3THSA6}Lm=Rl)a~cx07 zod7mk>Woy(PaU0MuOOVfcddvz?y9~^JXv^-gqUi1urIX2zD}}xXUB2O-@VM{X%iH) zqibQmd~KIrZZ^8!fKJvxXI8g|`$2^psOCnriEUGy2>HDt$?2?3r|vF2hU$tsdu*5@ zs$`d$iTQ1o_N&)2#qJRI70E=NkK2;ARB3Co)2L@Sn1*7c~u9hl_~YWy^E3+KwjH|)+c;l_>Rd@5&Fy`}#pg3V=}WB%8Ybvc;wl=(_q zt|>P>&OCJmTInMR&Qoko@x+T+ZE zto{2XE9TwF^}s_GV)rF7&ok+K-}cQmDzOL(xtlDJVpcNA5f$rW`D{jQW7>p4^{sHjW_u;A0i`3dm-NJywG1H}6nW zg~JB1$LwnMGBzyC-*+9sX)qK0h9=LdP!ny8%w9DL-TWUUll2wJ)Hf5oe04TDPtCwV z;Hv|p7^UT5;}{1qP%&miv&AQN(LiK?+Gya^M;Pxwh!!gCBTWrgy#Nn>Fp>#aifSH~ z`xpgAGBev7NQiIEZ|4-xo8}4%+JmyS#3#dMD^|OLu8)9KH9*fxU_0O7@qsr5w3$R; zrkUs#-(UvgARP&1WpG<)c9Xb>6!xG2qqG>TcQ`<2Qxt=5u=T*38QM%faAhor(j9cC z1M>9(6{1{1_*8}jL^FV97++D$PXL`=QB}S{jcY#wNVYr?1V(9H*oRDj&bH_@-(bqY z13k2vY9P3#VB;H{XB^Zap)3gY3(j^F7b(UX7_{XhJFR-I#~f zU>^<|C6Ohk2^)Q?YUS)=QAv*RTH)ivS`!kk4@K}`av*h5DsvyeMD4)^_#uS2`3MJb*6hBZu)Twc?BbyIYtV9P^^ zLUUZjD$(6LX(8t}TuZ;h;vq}(N$E&^*4{gLA^u3aIQ+&(bhex2TX8C#NZejjs9%l5 zho6W*<<$2BNF8Q_X%1>UZFFPYJv$i_tp*>B=lB9u@A*iK6~%Q1P)Lp!`bc`z4UJbL zt&7vM^=x&ziq&ktO~YFuaQGD!1eJw-AXak9-LxfEx^N^LKpsFvNU*Sq@BeB?eIA19+Ra3r5cmy}?pcbzqNv zRsL#^7PPj|i3&h5GEgUaDb1k~(&mF{tnU+e1tpSGwzFGm5$QSIFFhkXl^!|G%%AxB zMR%OKzdxxgL7ZA5TSVirQatlZ)%9x=>fYi~E=d#6ZHp1|RrD`=g==C?(JPeapfP`^ zE(Y&JC4WmE23}3eSASly{Q<98w3XBdg&W=#QSKh(A>u1l(n)Z&UGi_1r{B+j?H zOR0VeLWG47$Z{KPy`^NbVV)A-?Oz_PIW74EP_!s-FFXxf0tT zy4d+SzQRB8VXwvW)NK9fW+3NHByBm^ORd@$PA@c^OR7d+%h#}KbIy&Yg-gAm6p{do3*QDL2nfb}S!x3?4Gks-k zw}a{=ogH8EYk+aB*|%_*ri$${Qy7>gKVyP$2{S_G$cJuqGDBJdTZcs-k2VWp`$*Dq zayS{WdCkEw(z#~bDamQAL0@3^EX<8yf$7P$Ct$34ZK{qoEl$ksSfxzXiEkv{Q4Ko# z7}{iN4`SD;!a8M8CZn+FD^z&6Moth(mgMN~f!=Lm%l!!NR$jN6T|^6IhOw92F}oIx zb*zzOf$X)p^!21)_^OEUah>sY`JfzHEV|i`UC^Hzf1IOq7&V(VXFD}p;(rmu##1^@ zT4zV8pg4>N&+n@vGJ}|qmlvk0qnPo3rPr2zkx|%vaA>g!lT%!DWuht6R6b7%tGbZr zQbS%hQtE0V=;*nVn1Niwf=xbl(t{dM;OqRg$Vi;ljcBdXgWQr>T0UEiDr+b5Ey0<6 z<-2?h{;5I!KE6Zd$D`Vw@y7FAf!d2*z~V&(@@tk19!z>;Wk{ao*NEz^v1lBS{g=>*B^sE4aJnatjh1Q>Uj~&3+f7I2KkCP8iO0 z3MWd-L7R~!O_(>5qiV=Z%i5cwp_#pto+!Mt-~?$rYxQd{Fr95N;bRsgm|sM??PAex zBVANw=alm;S}`~DDyX1`<#*2A%$NLN{~w)yWXW_LsG>|i8r1rOEk6Nind8?ef_XF_ z-_d{Z%oZ8?jc@~PEm&a48z`kY55GoU&fi#T_B-0_kc#!j6ho~!5<2XYEgC|5cy1g5 z@!8Z7Q}hN@_ewvoMD)@X$H|Wo z)A(gnP&)*)YMioRtd|2_O46zFmo^Sh*w+{HgFDx@+cXE>GUM8HF_i6Rs?C8Mm#-tj z_pwm6g)Y?PL$4!3Mumap$e;Guyo;JUS-0fArg8Jj5t+s3_=9JDIH=?3yp!}UK`zIi zZqrI4#6}SUt}GtLHL*uSoc(apNyr z?Ej4!{illl$0#Oj-CamtH6d|2`Am%L)pxcNA~7q609UF&CdwNSvcr>6-BrU-g<1N7 z0FE<+^?xIbz9Qj>rDl=4sl0bGhd|APY+B^aBuY7OYdYi7d)V7hWDTFQyti=dI*`d_b3=2Z+ipzaWc`>w zfZCh*sEVW*aoX!j#XQC$_c5--(L<@3e8EyWiNQe3PL(xmE6>T>mhIH}<@2nonAJpM zX5}toLu}CDMlc9zB3V?D@fQfT!b#$IS9TiY_CRA?;Pv`giwY&z)K7U6icFSa^8Cw5Vpo)^fe&tuSu#4xkfNu^e-@&ik{Kb2LYn5ZNrI~*Z;~=&5VR%m6!+oCt z9J1txXP;1vskxA8E{Xj^_Ct=19|JliHtZpFkR4TU;TF(Q=E?y=nhdff3obq;xJ?PX ztqKWzxRy3$enTe(TyD;I6CV+bgduvGmk13$MN3~fL%iCM^Y6sRpnU9dU$t}!{amn? z&hT$q`s>SvaLjPE5B^jwz%Se19Q0@!+gY0#yP5x|Kk_eJsxsQZT_KoDg>%7FSI43P zP}+mJ)abztIPzC6^>rBzCGMyU`u8|gp@ZnAi!ShrWtWwNV(^ML;xFtSKU>W1zJFh> zOUU`&@$x2s9Be}d2qIbnndL=O^I4j(wFCGOPEUuOl)@w-bz<8qSx+5F(C}9LC1Xn+ zRKDbc4Uca0RFKv^f=1A08P19f%_CmX^Ncy2%Dunyj&-B?4svu@iDwL{K+`V1cpW4m zca9k-%cYBtqrOsiOw{o$Fb%gQmXWSrX}9InG)^Cvo$Rx8_m zH{Utt7~|Zg@5D~%Cy)uQk0 z)hMS82_*tzwVo)vYcAfdTPcpZ*YfN~Lg0H(Fn{0G<2YfaCgbL$)oYe?7o^5LbKX}49EDm@^*j3Wfo4^-AV4w_)W?ByUJJXIBf z57G8$e~c(789LKk878BaI0&sQ7MH^3sU?{Z5HmEm=T&t}B8sB%~l8IWZ`-oqC^ zn`sy5PwW7SLWU2eDFNP^@p33=4M&xr z;<}J`V0C0)9fk*1kOj!}G?K*u%0;j!&Er?U@PnTuN*Y(E?;z7ShsB^W0Z`#&+JIom z@n|rFWGUb2H8rs$Tni zzW?30^mjzye=#n_C6dgQBcYFj?SxUlco~;^fuJsPN-u5!#lFhg{cBu$)KYB} z{pYx}>Gl70TsrjY<@bAB>hia7Y30kf6jy!G`q#Mhfz$c-3y;g*tA{=I@Uim3!tkDY;5?fWm^5<*xd%_#L4{v-TDRCs`u5x%L!Kv^7`gE$>NW;J zrF^%7o5GCL(9~!trQTMLmeg7DtUH8ek!ML>;TFP7rKczPLu7F1Z&dvH!tXiAiDw!- zqBFu@ZVxV=62L|Z$(v2%_Xa+f2AbUAyWDBdOsWhvOsmYieBreyv%!=DiQ6T35_n0o zOMSrZUl-BEkA-woQpK~0!L;~A?%>dGeh<2ZYmjHUu+6)LtrFWpc=^KHT+uXK%>86s zCLVjIk<0oeg1RK>NM6^Q?&S;51^jBW;6FqJc94u6zaa{S-Vq}K6ocO>PGnh|}`mnu1&~WN1(?pb6NpyFP4DyU=u=AGQAc?9p;(oA9UK8`6c( z{`T9nkbtLL0@g$rfS#-J|3AgZe+O9p+z=V;CeJ0@Y!?_Nwkd2Ih6yiAQIUuT74=)b z9MGJuJaK6}E{Fz(q9_tXWQc%{3Egl$JWOH@EvYaK*bn)5BUb)+^`iT>VWpt;w;u3{(y^qBo3+}6;3Zbp=fzBhd%^h4NQ@Ka0Yis$^YP2(e&0Vv)5mOxA}`}fBn zzX?MV5hL#03#>Sm*$|S$2O77^*0eV*ru0ekA90dgVd%RFCa$;BJ#;+qVx5WJNtF9M zN)_>7&ILwBgrdGiGU0@0s8;2LNq2gCk{vmd z=Yuj@6?}rg{c|U6%+?3${zI~dv9twq52~h}mfuGW;)$AwM(HuV`1_8@3}f~M2e0{# zY{&eg%2T_cF>&?j6NoDrrJ%b8%Mg9i@1DiqfLy{x@m{*l=M;{Vr-@LCS)Z{E;oR*r>3Gh;1@t7dL=!oyd{4Ke*6V0Mte!_z?V%(fIR$t%Fo0D(ry^Yud-i1ufibWp=jn_O|rzNP=10sWMUnk5FuL@xUCe( znp5JEBO1F`u2JJ|uRd_Wy>KkbJA14jm3K31+v}7Ny2@^=1l!W6SdKWD1qm$-9#==* zSsq_x>xU~nGc%Gqj!}{ygrz^8bWjw3mlnW0(o&H7<@{k)AAY1>n)?7TSh92h?%`bs z~uIpD+bbssDO^bEH@{C@5DpEzo}ur^JDI~@&bQM7ZNxjN)UrD^<-klIinX4!Z~8~ za{_-EOYjly`;|}*PPs%rkSz7;hkM?E4)X0eeCI@tD&|&{q zJ=*_EJ^Oo>>-SR6k^?!b^O(Fut7U4(MlEW6eB;+;QFoXjWm0)A5Oeo_kAURsfLOiddQjKheL1Ln!0Vs4+3XT z>8~Xh)K0RBMl4TME2k;j9LZjZ8W#~FSQ${oD2C(TBDy|HRUfGh-lneih9{zeMog1_ zDcLk}A4WvgDH0XAJdvp|N^8`y4n?Bvj7@uHS2cR+;5CDViEynI=A8}r`*#|uV`UWw z%kRb%(kjd`Rd=Z=7IrhOxmgk<&FW%|ru3T(OVCT3Wdo;jDW1F$Bl|E}h3lQbNlN1p zz-c-Cbj#BP7cA#wE%_ALUB0X^sfw;E&_=)Y8Yt17sySWi?a}usl{vlIoAp#8HE>GM zh*Y<;{DfAF#gw+cOXh)%hzzMrW%q!%JIfD@UM z71DpuliH#v!6@sZR~>CeO0zhZn@^;6Y5ED_4<&9vRLx9iU}&LUxY867OF|o=AfP;4 zp-HVfe_IJ3EwFM$In|+ z>Vco_rBRo$gLEd@EEl7PUvFsU%_BB?XVDPrj~#PikNbMKBQy?>`n#11+igBCxnTD_ zCvZMphzM@*_@{qf=;2EE8a@JYt84#*AWmTrL&yV@jv4Sl#7tES@N?5YQW?cuyoS$7 z)PeHmj-~X6vv<%tr$pul52y}>)C(ASXOGwkamL4ejT2;g7-WRsovKJFoPE4&vVr?8 z0jmoY78NEyCMWN#G zIIm|zE%UixCJ)|%VWMTB4%vfn=wfA|dSg#wFP>=oD$N$v8-z(>!x!!dTvHrtgJM;P zYgc4djF2DiA!I{(3FhL{e;!nbPzGED;Gj|i2lXFDB7ZM(IU6Yd$FB7sPtSiHRY22H zNJ13BfnKOHqo!z^w_D^A=TO3o$dBJsD>4J_q!jeLosY!5ZR34DjPJpIM67q03k!Cy;sU)SB|cYzzYc^UrU*_&HROh2vF8b2u7GzlZlMv*5^zkqh}cAb ztwxc9E|aiy3Avl$01ET5vyAZ!ogK!R_EQdz3R{V$Qe;f!$3hEGhp}a2@EvAA#-(7@ zxMmHml;zbwh2WyOkH}3K;W=C&*Dv;|I5*oYnXSA+NqD_H6<58~mPMA%$WeH0*rX0^ zNrru&n_eLlvofNRY3FN`%=q0gg3N?r+C0wMY^El#jIn`BGTt6`I?^_*M!kz*`nCuU z5)DBUmuvKb=PC%jHLz8-HT5!F$8e&KR_Z`IP9!u`wX{$NRpCxX-a+IyG?^ z@qF~tE;=v?PEKo|I|e@^EDG)z01F!K*NwK};pYFsNZHGq-oc*i?7-4F)fpXrtds-S zhQWzQiEfTXLf$8N5N9ChFA6XRu*INd2;76fJ=1H^G&mzLh=Fu?$lO5gI371k=Cb$G zhNkf~Vm(+^Fm%Hm`6B{@d$>D((lV(($D#1a_VcpWL9cHb_!EA=AnJ;LIvHjkpYl_< z73giI{gs@8!k~$e2QD4;i@PNkz-G16^HFK*ZfkM|DqXxjFU67v-QRfV`i;%fi-zxd zh4r|h31G8sCeOv=jtUd1T#$`IR^ivOQnCfj^W+t8mB?PCUAQpQSbt)(UL-B8uV0ol zqQnDq!XW`WG6j=q8H~gisKdch>3adK9-?MafsU(|kR}j`dr1Nae=TqY+E-jV zmszbLPVh_oMiz^B-g#Pcz8N{h$ z!8Jck$YlQVd2MJbkPo%CfiG-AesSQ~qPPoN+HeEc`@$~q@RzO2mrhZ6oGKh7a9G~~ zyHW!G>>Z(MZ{}!V{7)K1z{RT4kwXPRor{qqEouohz&r$ok#X_TDPsK9DT z6{>BHip~PQbbirAk?FBce#nUPn2?n+&(N6hejUqFMpL7n!y!G*3pH*$&Tze!3$J`T z=RJwtB7jaH0vI0y_M&ff*4qr~qthFESBsqojX}o&cZIC3@JV1V;I3c{_r@X%1KLK- zOVqsro+M?+)Nc&|d4(+*YMf$4R^TWe4a7ti>rwG}lk7B-ZuLIw0AF|ng@?2gn-Ay* zlFE1BHr|vqSRbx*EHAMDW1e=CsP4PMqHx(g0N^O{d{!ksf6NWe?2Cp`EdlICnY12t zyxWe^{hrz=2<%2JJAuZw59j7wvJ08)Dwy48`D^143;_+E#LV>adR5_uLy6FxB2lPP zdqhYTP6RWR12iDMY?iAR5=u=gEEuc}+>@K@krMhXXng)c3kbk{90qBnCQOqKS>I{u z0mPS0&p@13XctIYwA_A(H(g8j9ha~*gMW3sRHl7u9uHOY?oGH|927)7^{0_^4trZ1 zfO8LSh7oo^@*2vacvHsyEbRewC(w>P$f)OS$E$rXC{{m%Rj?|CoLP1YLM}kOa z0{;>JOH?iC9#6+3G>OW|2;X$EY#2R*5?c(au%sb*@GexC7f2n+i;En{F|!;boW7dI z`ol$TN-8Lp|B_?o`jPhS)t|JwEJg`_RAYEsG5;Syg2_|GlOQ4usnAi?fQx)``VKan zao7~=pYnYrYB>dVqXzyRU;YNfmjQRh z-{Q;p8YWDKz!@6`y0QOI4Wr=VWG-T7Q{965H&Hm zSt%Z?I|K`+a5;i|Dav@ogyU@ddhyd1;d%KLRn|7t+iPLpL{BpgHU{u<6#4P-(ay_J zmWfU$Gmh%#yKVVbGgQUrim)tiRwXxWA;D5*4d?@{Qss?6A}yWedzD~sSZ=XLEW87f z;MHoAd)k=!=W609CQV_p-<*S)perp-*Hjva_tFawxPraJ50i1CdX%3sfcRnTXxRPu_g8UOIm4sVCt1*CS$JU>p-||P zNkxw&#ZuZ+{En^gK3WYvxV5+I^~iQ@H6lB)>FVD+yq91tJ??x*)AF$Hk~Ny=!gZ~j z;G0#6;4?=eQqChBncuRdWf$qNZNZ?ORs!|Mxc&N%vYuVl6>nt+|DOf#2|`U(On2@% zmO?3-3uM2HDjo37)P`n+s(o@D~*}o3Js>X zS8RsIRNI#T`v>bA+Ibcr-@-|klXgpD84=)^isekkx+2%wa8;6Im()dTiYSnF473|1n7ghC24{_eGD^^$cZsfPu29hiR z31N6P-=B*_u<64+Efk}FfuWoNp)ed#g#qaMkEeoHIAVAhr-@mp`kM{n5Q{WgmMr6D zO}J8Dd`wdARji%C=`!{+@Wl>{7zNhT5bqS3#PhpLzJccR@Q9r97(a%|rGxA_L9%d1 z1;sz$XL98qgKM2(70AW0GY=G^9T>Z0Z_w3w8q!G5%S&LsL!EhL${0B!p`Y3klB382 zpQ(cFo?>cei2e<24|C6)Rj8i3GEdjyn(xSNIze=B{bdnB$q6n9yI(`LSh7=VD(xO) zU_z0zw^83u2h7AQ`h!8n!^PGhnGA#n7smx&RJi)kP81Cq<$=%3=+U37vDuf?VSdxDru4|<{LRb6AR8MHDkTBBK>DgO|I}Gc`y%(|}TS50Q7*IkxIX$1+<&S)|;?Xyr>RaR*>yjAwo9yyfF|-uS32F zS4m`IM!YyTha6Ad`PVb1S^CqT8llkjajwj#;GYu2Tfen>W7Ly*0d8KlK|Zd0)(%_b=wnd%(O| z^^AkYe!zr&7`$^piZ+A)Q^E>m)LnY2C_$QrW$D_i2I6=&5=96FS zL9Ig5-;&(C&;4m)dMQ~kk>0Fi6J)FR7_{o`%r@4Qm$mRl*eD{MDK)b-7RMX5m?dZj zE4X7A-4W8P{@0&Cf94a4A-qW5*_Iqz*#P-FC7 zz!Lby$}NcZB#zy7AmL}EU3Yc_V1{TKgrnzrWBnU#L-FbP;Q`{634pdi@+6QGRHP-Z zP3(7+_P1!M+&GMZXJH;i9r8M{`P}lUNjS%Cn{6$>O*FIY-38xFDLwKK?inH}(Mpt) zR=@JN5pRt*s1MW4eU%l{QI4#;3QERigO(;ax=Wu8Y@OnwLHIQ>V(E1nEb00}!_tbk2=1r;R^aST4`xx{ z+7QiB^(vWJ@z}1cf*ZjKCgcdyi8kj^1ES1eKBd+Ho`tEu*J@wR<4qDCDr8aMI^RL`s!BQS%TF;6? z%REU-Rm_(#ZOaz!b!qQc)$g%*B`nis_@{sqWEc3E1P($c&G`hL-cbMsH0d-Y%|fM&CodP>ST3$#r%Mkwb? z1odiVX3f!Eg3N+FyhbBE_@zK>T(8X+-Pdaa1$)WP1$nMtJ!UfnqdfTTUWlhaNb*u< zkzM3%e#JPwt!gP3=quk|j!cf>>FzXo;E9{a)h4WJJ$J;u%YWtU2ZG&~`B@X28~p*I zKt6n9YIehb6F_O^Hj{M>Qg#K*%2Wn5;|`z;1$Vcp7ZAzi@yFkKQ%g|5FsH#f65|8j zzBh(4r3hiT{yH)c!xVx=%7XNTfyN0$_1G)`%$NqW6<%FQfcpbcWGNA;JsUy+DU2hM zQSypk7z$eWMKy}W7)RrK0eZ>0WwCwkRcMz1d*mbT1VurmJtH9_KDB6-g#%5o08p*Y zO*nSwF8>U&u!&ocZg=-&eUed6mZ;RbznRNgkAf0j#DK4X7Z&$Fdtv=op!a_m!UJ!s z4w49^FXRoNpu1`UgWR9NR0+J{HW$Sb(10QQ+b{-i$UpH=!dz#PU_b}C)9yk1x#?aFJM^4E?j_?uP!ir{y{_+ zk0M`N)hnfK;z~CXmUeKm5`T@YpQ|Ox3j^)KOv~`|4#0(4xtjKxCROY&e@IlfyQ@eL zNKvd1W4PST3~>86$fxYyOMF;db!Crp*|gA4R$X3Mu!4$K=uDy$?;vjmnRgZp&Zlnn zkOZKi;Ql~E_3kjn5*T`y#}ebQL4X=Pe?TJaD^b{%E#2zy8o*ckQPNqsGMinJ0-n_* ztjFjMmizs7GUq-kTpS0}MKI|EXbqk2(*V%V z)wm1n=SlljuIz2f!los%AL1m^f<3vr*S5?#RvdqDz&CNo^&oA*b5u|19v+rEi~>)~ z{!c*nF{*k}{Swdu$^lxy^_UkeAfTOv{G|n?9oR|tbA}*t`;!dS{fi8RXtek7g$&hh z&j4CL3SWl}!yF`!2{MfW`9^=#5)GNjkc8>U47BoR+dL8g0_SJ_69f*)ZS(>HHd ze)0r{R}%m1aQ!zK>i@Ztm62LN@urY2yAU0e?9HsCoP;P}TtpcOf|By?E7a+MB}gb= zqLtEFUxm%P zIgJy1>#V!!W=#N2GO5p4B2Kac-yer$GqoL~uW=}Mi^E}k78CvcK>N%+1$97f@d5(r zjY0T;_}3xs#=bCWPQ~EfszWYdBlEJ<>i0%w3Rr^U~jM;8}IyF4-{}hq!t`S?T+AseMv0HOU)d;KKn?IC*5%E6Mz;$-chwPtEUP`Ia9h<1{Kb8pG8g!(vVC5Ol|v^3*BrpGP+IXvD(hoO zk7q`bN*t*Nf9r)9g#hrzWX$N-HrC`9Wu08ja4~7Br@vTB zUW%yoXOeVJU{-$y{80blg!TW@VEE0fWe8pcC7+q0c*ADww9zb%COE?)DaaI+Obgjg26X`VG8JczzyTI{^4c$2? zK9)4-3Y*<%(QvZRk*`W->V(-?%ZGn2q+fNy+$%<C3^qhX zn%aR0*Ez^(j3@bgxM{dj`%L0fHe&DBOlQe$sTR@^BMH_dRJq=*DjM^z=4scTH$6Omkjl&)`t~eNBF?VFPl%IvSOo5Vb4F|ZG($tsoDA5YX^l+Mw}M``g8bSN zMDB0sg9{y(P61TjFE04Mtdaj$f&Ax|-OB|ZnV0AYQ|TwriZNS@crK6xwT^h03slHlZ+f6Ef+zl% zOTKzfHOOa?LtZedVd}l)lm=*jT_^sikhwGzU*L~Ae&Rhcuq@=G4Zk9$YcCPg9TQ+% ze$lwY)DwI*&xXZq?vIG68{0sqVVc0rGTtxS2S()%VEY&bBBpX_e^`I%0rn%D)!!nf zKVBlHB0$76e$3)nZfTKAgX5a%xe7>@YCr)Oe1`$vR}y~>Pj@)9%DeEkdH9buvlTXb zT?H!?Xc{qcV{}KjTd#EnI?McTXKa}C9f4%&nAjoT;bzH}>iZtRKff%QGeV_Sobq!@ zuDkszKkH4$VH}|S^=b+7m;f$#yArzM333XlLy?xeF+R)VFfBwFPas$t0|ZNH{s@*D zI0C^^Bk%TD;$s&G(EOJRUIb{K+LRu3_;%yBA23-3YK>->EP!Wahj!&$QV8uHc8$C8 zfyFWd@nz-m#0;Q$Y8HY$*rjX|9Vw}}3HzhO9)-Sil3YeAbp)uEKfsPCC~OkLqoi6F zJAmJ5qo56C8zDo(XNH*$Hd>Vf!P0LnIA-q2sqKTS6cdyvBGFh}fn`5yYfc-tN&S1T zA^D#Pi*O;&kuv)9Twaqgy=qD5gTJ++)^I?zSM?9$5?qO-L{JZ~65j)A<}Pi*$1q za}E;3BoTzX7$yw<^e(``IzQ-wgd~zb5A0U{vwS7mhrg4Xkn~JH zzf2RcfNA1C98mn(`S=$u|3A*yALB$03k&OTB^2auc~my71(kU^k%fNArBTAcQ0qdR zP2H^B8R(lFw_DZc!%&$Q?EJT255ESA2o^6RilzFcv)vWGk3W8oDBzHckc00PIU!hN zMwyug`@G>X^_fDnP*T!O$d6?jZ*B1W}yomAsWLZ&2{TJ!+6eIq~{7gNYOdRB+o_AYrCL5e(B1_ zl8R7FFqY*jJBCd%o+FD;>D@_pj*~SrWj>Tq(;`-3n!~S?q%O;ykrleRAj*&O;Sa?i zfh()h;zAS(-(jD|ux{)6P?iwwX%m_%zl$GT^A28gzR5({WTJ}6T2=L=6%SPenWk^q zTGoar9zOk}M63q_#d4+w7$}94C$hP4WbUbh(JIrCN7!;<=EV)iktc(G`ItMiQS7wZ zrW1^>?)=c?g+JjbM@ZMH+glhCwOXuD#o1EwW7y;+>DTgBX?1eh0GDog+Nw^nysl{T zD_)x@Vth+G1~NJ&5)_)RGRA^HDeA6ht7V5)amaZ3Qk+%a*FCe>yhlZ$9b4p4l?2qr z>xQeKv~a-ef2rgntful(rOw&pDtbE&3Z#KV(2TuU5I@D144~r%Q4`S!W#=nq%R82L>X$^Wa zdv3Mc#J5oP9fRck`~p6;Oi$uk9=HX^M9>N|q38a{#lQ^1x1F$kVD^8VW{ctt*)6}} z1BVN)slC66xGKtJBfct3$d32$0hs;6P3ir+Px(^nutQ>kumY!57kKOn{j+*p(Z$5k zL)pUC%o+gP+uJz;^N#;GufLl{eiKc=rp^#>C+526zi{qb8&u#(NnuNV5s@1aiX_J< zpnZog1kF04k)B@pCT=g0+04Xoo11xawR>IbbUBSvy!G{Y1_5x$vO=JMLmqw9!67Bm zgC6rk4Yai6>MjHobd3y=!88ZE$^0FGe{QtTPl04s&1wmg5tS>cECCs&YbuajF`NXN zmdKBZOX;FH>uk+*stN47+{+YSEJai3Rz&JsuU7&Xt`pXL$~1m%r;`kXVX5dgMu6v) z{y;3!bD6%eE8$+NvudC9rvGM{*ozxcaXM7=Wg?5&R8>_hrzIDgO>%ygR9iijteir% z02gw)AaK>%m6+$_nB;`DB|%cHM6~Tpn}OC!;v7PzVh}P7dhFN$eDSnFC5q<9Ifk{0zr_L8Mi(@>1`08R1!%A>uB3j2G6XoqN|kv% zu7#>{sV&>ceV|ENI@IhB&5-EMxotG$`$0d1#*gBl-;~z)%ARlE8-V)G!aU>;67`5j zwL@pu)n9wijN?MXbKVPfkUxm#ycUZNqUmm=yu=t1A2bFxSyjvmRZPsYdSzw+uMWDe zKIHaGHe# z2YO!?aA@y#xc$NihISR=G?0zy(RZXcC1|1R!uX}}1@3s`U|J&F1mm)Zh8&^8?s=mY04MUV=kkw72$_h9vw?;6zfld9$(5U^h4ghR>lnr{iB zA>m4Ti=h1k%2=a0YcT1VZBd5jqob;$J6V^B@u#~-BaBy&23nz7oY~-DzhOPhWJY9I z5(ARJ8}5V5z^2k`dMo4!F1JD2Yzu{K-3F=TL#>}4EZRd8*;7PyIzn&qL~Isn?JN{b z?z12fFmktTyT3EBYtfpR)76f4EKMJPQXFf2B^O6fZlG&t~o;Atj{YXu}o9edqrIj<`3#Ro*W<77HHX_4pi`8? zijyP!ilMI26TCLPdx>{z+=+s43uaKEtpj zYEA}I*%=ZeAz0FwI-RDbP*nR%#4BYEtt-7BO z5uaq1^|fe;oxcq-J2@>oW6fAk6Z8t;B@eSgvSu-N#w_8PVwtiu&*xhg(1z)8%^e6B z#;d`bqk{TOa3ECP{hqUi{3nYDzvOUp(l8V;-G@*{ZlNi@PCcSJMJ*)L$W&!mSMxXG z;rQkvk2yVSQgPHcJ29vQ;s{FQfvde4_rye3patqMN_2s|3IVT`0#!zckeK!rp(O%e zaaDkae<6xZBJ#0}D}nzG?vxecR{$Oc^9UQ43jbXOhS@J$8bU$_(j$h8K}g^rGp9#9 zk;nmOrx10g1ec6Hu%jnqftY9vbSD*+j5x4EG2pd&AenJobLu5Mc!8*2hC%?DN!*Q8 zT!Lj>0sMCmC;kw>2G}^|FC%3mL^M)yGe<9fxchEeK}&pWsW3|)#xk)xVo(!c(JkrEP z#JO*P-BR_{X0lgmyLTrgbw*8Ou$Z}S>wWTl0G|xXC63*vc63KURE2PXpn(tWItLvw zo8)PtTa}IU$~s5yFjnwX-gF#MI*$;vg3FdJ-;QL8zs^JG6}s`0Z$-JCW^S9lT)>(2 zf4#Jdq|<%Qb>W$B#cdR*{hhH!c4A{1qln4%I>ifV7V2I4Wf{jporbIw z%qexY%dWlSNt8^8-iINDAhG1Dm~TUVCz8*}=3h%udFEzmL~P(QKC|^}hr$lqBW zRK}oUx*W6=8G&%1S1@--OJYCX=Wo}y@G*P#f*GLBO1D~tyuWh`*c^MN=tsK?+dCXd z&ka3+=)E#mFCgTSJ?1so;g9C9Fq<3|YIwpwu|oHZ91sF;QY=!81+&Lh z<`>$N4tRJ1b*$JWFu1wUPd4V6ma4e>!eJ}~vqTk%naj6jE1venVU`xi@7{a4E0K#t zP~yMMn=|@Oy0ni{Cs`T@cds)rgVXAwW$1dQM0-K%!2c*}XwF62fa;JXnClUaJDMwI zr>c{iBo!-msaoRu>OZT)g)P{RI>4`$8R*uE{?lLU3)}Qxzt#VtRa=;#ZHFodC^P8Y zG;*frr90KiLFec}VivCrktz%QI^Et?SmT+SkNx9z#f)L!P{SV#QsQKgTOb zr!mEOPiSQf^0j8ha;Z{GKF-xsw`B*P-d)CPI$C_}ukKtzuK)h+1MkEhX(cU+h;X48 zT>6!zj!|VN`X!}*Z#HcDS+Xmu*X&{d8>g8d;&)7RDh>1qg}NO0Lih%F z_lNBI!Dg0EJtN&PZZ!?h)v^Y7>n@nkjX;LGphqF zs1T58Dd$yf$t5FoARde{}QLP~uH+EpQhhVE=<9=W7m6Ur{P?`vFxFKpGE5(HcYV&l9-^v^B5S}kuvo(o* zYplt&AA0sRWVhkG)B4i2ybBHZM029a*fHFtd-)J<*sNI!Y&hap8~a?NyQw~HRJR=3 zH`}Te+O-3em??~v#$9S*S{}F0$a*)H0R|n`?OO)N2MV|M50fa=i}fu|pMA6|dB$6; z7eRWJmcGZxoGn&s1G?(f>tGWClz5{qYK(};exX`p+py2yPlYc^b|v4TFldv+CHhuS zw_f!k+Jz+Mp1FLV4_-Zs=a0|Cqj*ny5SlqbAYNL=ETWDgIO7CXdv@-}ntf~ppDB`B zw(OEJk}ThUN+4d5kvB|xo$ce+}Wa-%fd`C|xGIAKFs zCS^a8F)X;BhT(UMSOPhWoiP^PWA?p2(tCDgSG+l7{C`%gTdp8V*fQK}7v2H?5Ibky?q(5|S5;wcr>(0~ z7wF2)AJ&AIAEr=cB|mcWt7soq$>2|%;w%XB89nOkUqaJ`dlXV8; z2->yRn{9gW_Pt*;Id%BC{dZk50uK8t7T$-#j>@_(Z?FRqS2?> zcaGwq8-m&8qT}yh-f+)k>JZJiP#c8T0JdyIO+#EY?G};+FZM+K7jnEaK#oTV2PiP_ ziH*o)*l@Y)`4Yns$$KdiSz+Hx0opz@r^`>hsn2+a84k8x(cv6BQLK2gKujTcKfVXF z^i5C!R^DgC(mE9^%@R(?WMY;`F3?impD{zJ4(}DVDha}C5w+?2MrY78Il={eu%7<5 z03#BOE|mY3)O)^7(KBaobv8Af0CuW+ne=A-n)}CF0-$f<6h$# zl27j+0Z_~r_hjJAGleUm?y?qL7@#)Kw1n}zd2w~VkfFkNS=DONdnh%ex0St<``R4& z7i!{3CQVVbVLK`}t3teRU9qQ|@FdQ(42#G0RkALzR-Ic`7_Fw8*9KsFZ_7@X9ixep zGXXM`ox4jnqh_t{MUIa%)q~Ib1L!0`)ycKd^`h#e|LFR;MyIxeG=b-Oq{#|`qS?nF zP5edG`K5o_uvCNkBL+|0N1gBK3)ggt80*cz#^z@cS;ymc-LJ4*!kc*LHqfmz#Xi(L zZ>1hZ7@^za_+peyOv0+D1CsY44SP31!uj8R#)b@MRISIOPqE1^Tj7b(;FB$!YND|c zd3I;~badfDb8x-&>{y(?*iCIYcH^KL&o?dq8s4F86yI5*D-3(1+ckD&L5fK6wfMU7UMx}CP;NM$qc zN)js!Zr7}$sBCXnj5z1yc~VUEMXGtoXVs}1z7)XSxq+H#@vWuleT|6pbY6_xtWq1L z+Mu#`Z;kVjD+_Iw>&Bt+SAG!q8}ZR^ha{FqbEob*D_%NMo9*!GkWIEyOU!P;)}B|7 zDRk7-u5MP@o0hv|iESi(xDeQ;^_2NZ5yQDW=xYPA23)IHS2o(5z~+>T!@W?~?L0~{ zt1xGH3-8veukaAPI8%5O=@DVYbT)$>gMkzf;RbhfJF`&KaRya-Q@y?W;2K;6z>yEn zwE(bC7LDYMU9G>5e8{gOKmF~N^^u1$s`TRJ$ivgm+{1djB@v|g>^QDJkcz^x^@%i| zWq@bW@e|RK;1>xzGw#XZj|UsH9trU&#NR0UXsW{wQP1>I_K|zr`&=-zZs#2kAggAM zyi$7+dRF^TzZPRm;wrbJZgKmV9S-ZC5Rw?+<{r8TTXabtNEA!zCB+Xt!fu-}5A;+H z^y)XoGEWs6-}0QeoSWP(M=*e46Gcn#8H{K|~Y|RtWjmvjptpx?LfeEPx6n`a*^Jo6!yVQt%1{ zC{k;IRZIDQR;2!pFa5!xRxofhumNgTN5IqjKa{JL%D-~4d>=oCGc^<-pQQ*B)qM4P+mB!^{+VS&u zrn+L0YTE*XoL73RE*J|F7hbKRg@GF^r2mZR?XE5A$mdfjd^<)JJ}!8V465$Qp~sFi zAT%9Xg++sd$k9~NH{At|pl6~S!u-{cid`M>2Chu`nPavwqZ58m)GGn|iUeKiLYfT~ zsx!<=5LkFCVY#)4#SLQ!S&RnkT0-eq3EtW+#EQ`)?P#LjE$=G9tm7*Ne&(~OZvNUd zuWgg>7drfo&F;r$uU{fiU2#&-*IUv0cg> zk{r!kW@XBlzE6_RULh@%fbdG-E2d)rWspi__&W00yRMw$oTAXp9zP}!mKKVg7LEaj z``M=5xsu*=@t6=UJIC!=F4m;2&!lY$!c&3=yDF_js+tcYWw;n+_$yIgVZxN=yL-gz z{(@C9ZKe%G%pq<~P|R8p%3hn*+=|1kYAWw>jBn#_##v`!+9SP;K4eYFs9IHj%8iqv z!o^(4@lsh~k-4I^8cp!?13>_`VBQm!VTd@tx0>HXdX>k!#9DkH5vVbw`9>6jXza-Ekgv{W;B#HToCYZ z+1ad_jBPj)ff`dSu)BnRd!iMnF)ijz^xMZoL#D`q8k1R=fJsL44dF!P^ zZ?s8t;{8M=MV?05mJaPRfzV&pD=f9S`pU?dtVd?ewoRuA?90`0epumiwi~UXLs|eE z)RHBEUTu%9i5!Pg(^(^!bj8XM;^p&};hyRid?^M-%7f~VVXF$QIyQawjy!+78ou&v zl)>6>Tan(Ci8=q_+M+TGuXCj#a%+ewwgaX|Y=c+9HUZ!*aDq@x2@5y3V|qhvMMd{=W& zwaB5nGQNoyz=aB^#%7m0951mgX3>LJuC`+e@fwU8@vSc*R_?u}s&Q*cB(X1*hZJfq z_%UWfto_dDX0jL^4bKX=pUNn6XGKu0to2jJvtNqOP%(Cbr}iF4cOu;5Ci}1w_tj^S z>^I2koIM{*!6{KvVp?O=5qj;#e&9xPQ|wttuP||VERv8i$#jKe90|ZMkN%+Xta*-l z6)8?f-3`MuTk62&^j=%(P@9K$11i8)KkPE7yqDESgyL|fk1Spm;4ZxIyt=>WHTpzHPpy?8red_@;gQDjRnM20A+ z9m)cR`IPeD3Zs3J+ZrhZx;I}bmFp;zd#Q_(Gcye5K zOm`*NS=#g&=eFR?51cO;yHrQeFE z3U%`qRO^e=NH{?!3BT+Y>e9$FB7`Q^pc3jw?=qTn8N^_BlYLy%_<6T&dy{>%3N3@0 z-%Nswal=%elV^yBq;jI4Vo+DzXM4(OP_;j+EmmW&pgY(AmJSVpq^hE*TvKdF2nE}v zegQ^+GWH4(mL;ZXQzJSAk2iT)`WUenK?Xlhbj>ulFArE`I(^Zx z&ydn~>OFQIM!f32rL_ZOQZp8vQ|UE$Q1x|8!I{!;ozA=cU)M@cnRLoCAQPH{%}Jqp zWv-nY5}EkzGxH)n)Uh#dM0{q@F;R9y*ER`KD6=$spno9Ckrai#?rv|@=cH`A6bVGR zXaJp={^syWQqC~d8;Q#Yqf{Vd>76K#_ymjs|6%;gv(rE7F3mw3?min9ELfwNAZh(|Vc)mJJ{T<2-#%edoIB5t{_%UwcdFd9Zd5c^-p%Eqrv=f^2ZO{vu z)Rer>#dBhkAuzsKqz7GSW;ZQDi% z9ox2(4mwVE((j$M_I~!->pbU-^?tiYMn2ZR>Z)0D{w7j@5B;ydu?ELE%5CKVAO77x zH;pTq8r$0f@`5J+9y|Z{`24o0;y7zFh!YA8`!~Vif`K4=LL6xp&JVkb`tyELU;p3i zE`Ne9X58p^?AXq(`T4&93*h0E5Q0A`J3x>Hr=uE4g`crZehp%=Y63(GZWKa60`9qv zOc!(=D?|a|k!Y?@rNe+uVI_E9<vHL}^(SE-E!6=h@6mQyYWYFQMC^G7yP0_|ky znqaM_15@Jo+pURO!^$cM_c=~g7AYC$3HVnuV*Z)x^VSlpQbz?dE_K$yf=(+#C*`e) zxI;20;*Rc4xw)}I8|(yk+hI%j7+)`RYL*$yNe6Ril1ASwiMHLjmfFwJwJ9~U=R7N| zGE`m-u2Y+fIKrEt#`9Z@^(VK+2?mZOB3lpZ-Rn)hjws5{gmtktJpe~JV}?BaU1X}* z#=?010*{NNXUSWCo9cO}c%Py?b9@!d^1f*bY0c64VRL_+y$;Gl-# z=2CjBX=_v1LTBvov-C#8BAl5e{LY*V3j4Mh-InBp06U5ZU z6;I3)wYXL!H|oq7TKT9FOYn)G0mrw)i}Z%jySwElLKfWCvwOn8?-UXVBWQ)BAv_Or zG7d*bKxV9sK&3stVenR#Js!-=VR{LTuT$`TW_XNTUq4-7)up0{^E5;XS#9w*Di=dK( zF}^?$)BumxXvCYKn$Y|~kzs;iieOZR6JP?CK#g}Xo1~j(hdk>im{$Z2dBhlLHYcN6%B#iH|pI<7c3tNr=3{Ojb`l^T7{W#11 zYBGCj2S5cy7JxqjBR59)H z)ug?u=*HwqQw4KU+ErdVtFVbJcnUW_^cT4qlb3U8~ujsay-dikBO*_|zO=^DN(pj40z+ zJgbekKj#`~MZ1fNcEY#0I&2m)u~WA{CXrSG7b4lgjhbD93wM-6VB?l7z zhDaK4xch-;=rLP*t1n+PEE=;!EPr)FfS5bT;6itAh^R6}i-gm8)RRPYgx1y9I>MmS zJ}xzdR3HWuI(J)DgBF#WDi|f^rmDgAB;u(HljUE!F8d2Bg*38f2E(y#`R6hi zJI`mC`Un-p=OwUK&SxdhYY%7>y@)7f=jp>S^bqF>0I^=ZAqF9h!P!$@kQ@y_tXJ;Z z0QNd*N_TS3E?Lg?M`5|kD_)KJsbtZCK8WFG&G`$uQ6ty`xLmTD@gn9s?r8l%7qQP{ zKpD*OIdBr8(DUNcaS`cKjqJ=XkkMo65~k4?Nv`)j1g1l40@>S7qgx`#3qxcWf!pCY z*!fmvc1a=80KE9RTr26?j+9d=?HIy((q){)wuQJ;?B+?qJ85x)2lQBhTB35Ywm7DF zr67|TY_pOMpD^RH0JCtGrB|VDDxFvj{`=pKc^PMMoewg=24MgAhh%^ct?55ZtG{d= zC8`^08)B$iLBM0N6e5Tc?Zt#WK&4{osbCBRC1A*(g`vob+nR9?BaqM%sbZR>_)7rK zNu|`TE9b&^ce8O;-eOLXjAT_M6B9+8Cznk#e9j5)&v#E4KxPj4#%d#Qxa_WzrVQbp zxSz0e1PNnAHp%j^*<7P7 z+UpFZ2SGz0M_&XP?$HsRmF+qJ{lXWysAx#&6qq+K;M^FvGYQhL6}J((KWd*%f4E`b z%G;znUCH_Gv=f1O9NGHC!f}PO(#y@nksP(vRYIip!NrV= zKP_*1MnjZ5@j{QJ!#v9NR##OdQN<;Nq^)mjS8x*ZlfL;Zl~AhD_q1Vht;&@`_3-yw zbfBe3qP0kGm0go%;a*!L@Lr4vv@~&&-Y1ceRmopxiORR_)uGAFo*zsAZn;SG)bL+( zW0$sh^c#x4vhVoLrHAUm+SQy^?sRP$KPZ==ghv|pNxKUtkII~1upo+%&AeaC&jpRtV0CFij-3j zHLARhp)_@9Qg{LS#*g!S1|7r^$jdx+eO0bn*EI2;ha{l^%%hgL<$|FNVxmt^@K6dI z-xc8=BT7*+Y05l1i9@5x^ps&c?~^zbb37(+%)wP(@~H-jXz_js6RIw+_HhZJbYYg* z4-oh|ub+yq5a-4W&B)EV9msyJOL!pWq5z>Wku_`0plo_$cQKio{@i>?KWi@$c z2cfCU+AXN&ZUjI*psYvDgrC8fF@{A+DC#11i5;+Fnq;)g&9yOxxn-0p=JWgrbcLYZnU3#!pB2!d{#=r!9K02sQ-P6w6EwbE?Vt$qXyU zdM^*_7|8VtsjVO7mS@!mOUw`DO|mS?93wGliWy_{UJampM0-%xhbw-$hQoVsV{B7zVhYOPtg&yTr0wWE1(?I#%fDnvZvHRy%bFnpRG; z;Tr$Amp5bf;P>;p`5OpyAXyCmHiNG50F2RTn~+BGByNQlw{T)zjXCIt;shKj4^xLWUDh)Jo362Bs_|#D#|arY6ik zgU<55u(o1N$(W5ZsxR6FaJ5X}h3vJ-%za&7GdQc~xT>-`nZ*fG@ic^cyC+ukW@THI zDC+>kVqNz1)8YB@1~FURO<&{9wfTmNF*42iZYAWE^+~P;P(@|sXTG}HdqHwwdSj+I z{bNu0!jsfEc0XKRcenuiDGi`)V5z~O%Fa4Rlu9iTuiUR-&ua`m(J{5R&a2n!n( z9#ZhmeC>cF2dMxzLM5T>PT z?dIeBj`To%khR;;Fz4;O6f=dQ-;#FMn4WP*%~whwO{=VV5Ka`RazVH0b|rU-bhr>d zlHLWo*a`hxNkNC5m-I@{@BQ^Reu4lFf&b4b*nPK5EBi4B#_jdj{`MYlK7o zdyqx;3N~L5@UCPHFh2?ZGo}CEcZL5G;qmA9T9YJekHUx;s&CJiS}d(3r9I9b0wf8u zMFJTNmMlzFS!o$1p$bnxXl@)hVW#}uj_O$*(7($8C?!-3zcnK?z0k3sV}A75zCCDo zyIXm}2l`xoVz_SyulYe(RaQ0oHsp&^1-phpgxN_L)NNjMY=FQuM`#OKYTiC6~Z}S=$mdqf0@Lf>7H>FUTI_v-@i`IO$t%I5$ zo|nA7<37ar2~u}&T|7qX&9Fz!e)WRL!DkI=;|HiCE_}B@vY3BKA49Y8W5c~k`*1v! z`Xh9$q$y@3?O8;QVIT1?-fc(X&49rz-z#a>xS+F}99YcU+}JRR$y_M+!q&+&>dxWx z{=DFjA7iefc8U=(j!)IQd6tIFTvz6V5@5;itF*RABln%v7O`mdDP?NfxV$@fu)g9v zN#}B@ERCv5jGvr2?E42aKY^P@j!*7qM|>VkQU+$6jHNeib0)xnv6TS;V-eo#kW%ybpj5UJBa)8#b6)+T&dJ91X$*45# zC@Zf774(ltmO65ORHOI{t#}vY!x;3#P&|?xFh_}n93Z7=!Bj_O&_v0=`(}bRh4}!J zM1pI{134f?`Dn#^x8e@r55g*}R!0~!%fx~OM90p5-)8-AWyD1RD>MzTLM8v%3jO2d z^FJ+E|MlMa7iW0V#D|eI^tWST<{xQl1-cT%5AbzFXO^uj~XiX|mYjinaRZtK~r?^Sw{Sx>`KIeVs=_Naq+ zvWo9Fl0@3*_N=bT8*_S(}4 zXi%(i7)^VSgjl&Vfsq>bzz9#oQK?i*EJ-deWdZtJeGJEeDZjn@Er;Sb6z26fSRu26q^Mh6}4o59Jqg10;1g%yygnav{kOaGg0t zbBigUXhTCM#hh*EHsR2o3_r%f<=>BkTyNuCZ)choQ~=uaMzd7nxz9d+XwP?NfdCfevXWq8zn&rrU~wol7N$Bydc%6Z}P&&uef5z(hnN2#e-n6r^LrvWm)%(mS&-zwZMD% z%Ub;iHN+=|zkY;nnE(RmKOB4hm)-PVW6yuMG>nA*iQNWnHsnXU`a@RoJfjcHizUIC zDGwp+M?Rs&y)laZyBI8Bv2DoWT@_dhb*A%C|cHw;Q?*_tUSm%*YPrPm zEL*rz0&Wy1Vp!^w^eS3f%(~+2HW#)j89MAVahaV#bFIC3d84u?WKN!MNJpjSwhOKo zK+umm!)FF?;4R8`=uN*wK_Vt^&{MUbrCe(?qwQ33Y|nX_TWzVn>MYc^!OkH6ykR&~ zr|JIc5{0UvN3Hy&$?q+9(m@B5#gC?v-I+<^D)BjWpb_ph|nW2fEY#g1lC3 ziHP}@7WqtL7Lr*fh4wV1eAQSep942o5YVKD=rIrfrT-8v`1}Ag>FNdD4gh%s-l|I7 ztTdljm0oS+KQ=lTVEnA(j|VqBzzNqm6pudW2_S1o28Aii?$QB*w^lWt8XZ`y0U@oh zf(EA=e7xuWy++!}FXFVEq>UmyzUQnWwZjZcJ4Y(D!{URF>T#`Le9czx9l!S-Fu(q8 z4CKEdkr;q!PYlKm`?Uu% z_b*VBC-(W@QzrV5v%OI1d`iM#)Iy$HOQ<7QlCJ7MV>mVe4e8ZVDJM|d_ba@4&;V$h zAF8Gpj|34+;$XH9N_;Ki;U6SzCah0Ph#w^FNrPz{lz0~?r%!ex{w^Yd=tdv8TO$Fk zLIUtfO*;@G8ZwvzeDcN28tXTImE=QRlpNU40;eX1B#T&Z^dtablVzKIQ>@am_>%-f zBzFR*BKb3fQ*!>?K^T~Ezt$hQ+ZQ6@Fh)S`R{tY+o80%`X8{!NS@HwmEU*Ba1^>|Z z_GkCS|E^7_Y$z=XAo31^Xr?+a`j3jDcGu@iYoLOoD<1CKc8n6K^1-h;V!=wvm{Go< zefg^X09*y=PX0yFLLT+ab`MxNMY7ZR_5SQE_mAdef5vXPeK+JF$>JnTsRGoph5a?_niZ!WlvkWavOW}15=WSsFp=EXXq!;PhwTGB!_5fnE)5|bS~ zg*3Kj1;5yKj#?*r5^=dHy9)@U@zjsv536&tCt# z(}%@sBzsYJRb9=5(}fk-sW~eLmrj|8Gp{j*9v>hDN1~;l0<|nOz5zsq_*Nbu5i-1k zhyYC#c}8<1yic$>BT^jIF;IcC^r^TlyJ(>LUXffT26IEqJnT0EL(<($@$3!3riGlq zdMKo4-kYoqfvQ$phU(~iTto`@35GugHbxj6=OT)7__~T<>*mGD%JYTJQk*dEP8SwY zp&!VSt8^%ll)mAruCmrXr5DqdfOt!m)AqIZVw@Vcb}DI@pHAdKE|>?*tKz`Eo!!lG z*-k_ZDsj5q4LEvIL`EsKizHW+zJybwUhC{pa066?T&kQGc68X7eTQrdIw~GhQr(}N zajm10usP=O3;dBVCYU^x7N*WwKphKsx&~bwjBzP%&2s9&ey{cb8V_r}*d9|&j)|`j zuBU&6VU#AT+Cb%7Y^PzBAO7$SJIT|WK}q$nZ@LNV_o9sI)W{{NW%I@3K4fK#Va5Py ziCq}ShyMH)46@n*qN-0Tj1n-zjQ*0F1lad6XVs@-^3mX0ig#fW>4J*Q_W_726pdud z8HCc}Bs3S&I>B-(_+1cjh-C0kKaD4Wwo=-#+p+lV-~I*xO~6*w_$cfk1=z|I|JiW$ z|E^j155@0amjM;+4{+Z*S=-cbO+-yhn^%>mg!U<$Cvr+)F;u^YUh^uyf-lk#VGlbK{U_Z8_6qLg+~z6XY7`Njga(gV|lHB;+n+7tH{BC0*-D zf?R-=`w+Qe(#A>%ju zU!lZsEd>%>Um|sF?M%jNGMGyq%*0A`1ElNi%{LsUcxt<2#kmmWi&cBw;Ad>3&iX~a z2}8$*G2w)k{Z{0N$hh;H<3|$XyvwO|xkVa>iU}qM~r<5ypw20AvDKx5= zpCq5Vc6sbxPj8ta-kMBCOq1|X3f>-$_5(Jp!K?Iz+9?ksGimaet9CNeUD-~hr{e*x z0gW1b0tB3_6y~ec_mCvzIe=VpJZno*7be)4f+++Pl2(_Nbg%DVkP8*p%NoqlGBDMwJl4mN!%2Fx{F>lvn~)GpKG;Olm6Wmp*ZPoCy!%q}VwO?u@r ziB0rGu1%}-bF*CE+hfxWC17Fs$j-9W2`s&r9bX22T#-H9Et@4w806Zb;cNF2uQb$a z+HeC8`Yb=X$yS|Srs;As(2kt6c1R0|I@{Z@FehM5MQ7ac)ccwzojmG#r=;=dPdXcN zep7ufoCFoTTz491%;T?@BJ^rMA}86}H>$8&sR-y7`)T*dYHAt*r!5hC5z20lK~xM* zEt`b4yzvyLoIRd^E8vi-VlgPQL}=Y7U5At-+cn-M1(I|I?pbFJ1_W9cmj`tm`6!!q z1=%z&I~T7l-LFYS9IVugB3?JD`CPNf4H4tuyXc&g-dfvBA@N4ZHNTgEh+S%dsoF5H zK9&^+Ggmg2al1z%{aV;B7axDxP{##o#}z8h<2^;_$pMI#KdS{)4T8qdyF5doLgAWTBFW_3QtdeL ztQ5xYrVky$#CqQ)s-TAU(^m; z8HAmQ<`(i%!*GWkLe;sFv}gt>Kb2W*HwD@vBMYrS?zkkqSrIi$qrOvhs& zu9|gthg7xibCp4Ab+g&NvJzYE0npjPAVI;d;4nQu3FPwy8#*bK_$}=SVkBYbu#1hE zsA~9%9n*8+S>A*RWctH>G64SXL}s3~wLhG`@XHMuWh!sF&A zHF8QinHTOGz?OoEf#9ujZ36O&;gmCPkiw6#0{Nx0s=r|ZIVn*ES-E#2IG=x!dG=Nf4M`B2}GypjCovg*XM%5cv6+>;LQA4~10 zyoz)52&@Dd#7{g4Iz@&2oCT*V=TUsJtQIf_up=ZW!`u(3D^(O^M$H+s$85ZFmnc;E zIM=`aMp{hrfK0{%%&hw0KtM|W^oaehpu4Q8v$LT&fJ5YJyf?kFADc1<~Yr;)EkT*4$$lXu;{`gYaTiIkidOk(= zW_E5T{C8P~9r*lxzL2v6t>B@YZ2-sVNK zDezB5dtAV*w>gg1WiQ1Y3pSj#gj=f@QEc)a>Lhh!#)?aZs8S8Av~{JQe@Pl>)GRrZ zr!jL{w?t7|EmEO*F*X%c^5AduU6V^U9lgZcc`vY5Ze+}!ixsV+(et*HO!dV*Y0Rya z?Pc4_;8-xgR@2gVpkjM zSq4@*jnb%`097qySiN4J%QnMC6Tj6lqncOpE6nmJbM?VF_^mlApV?4Y$G&xYZlpV9 zSAHY*hQ302YwNvb8Vj$kp>JY}nu30m7epv_2f;U*(F>jUte1};*z?^vphhJGZBBwx zn(^)(1Z{VKABbrz^Qe4|3>hoF|fI0;%ID0g$0Z46YaPQ}B- z+d=OB;tlywD82-+?|A|SzH`8e6#HkZ@$WaN|5}BAPI>=Z5R+=*j&~M{jSW1@;ZgQFDmS+GANOMaO&eY*>ui$dG_&!R2XRupn!oE zsjoFw9zhQxOgV8jjaa4?ZspxIwp-VEn2NoYTH-ef$CoC3gAguOxndH@nyxXBXe&WZ zD>9UCXYV$T^1syBymC^9cyqygxGom|yfT2j#wXlZlI)Ph_QWH2x6pb7D{D6qme9zP zB(1J-9FM+w+^$!HyI9%Mx#j}?Bx-%0lzfGI6tNXSf+h11vh(UDTC1YxB0l~TdLr#u zu|Gg;1gj&JBPrnb{{GQVU}k7sX~`kP6-5({mupJcjEsV+Z2=7yu3t@5Zl^g#_gAo5 z28oqWONSXofm}&UML1R6fxLVA{PYivKZ^e+=jJc3_cf~80OJqpJ3O>ZB0PvPMQWGw#$E%~C+krvDWA zB!KjQimn8({KzY7Od5blQ_`3_Ae8{(U{vnbFnrQ`cd*O1qMxzbbNk6!mD&kIvS3;l z4)0B2+KQbuVYn$bQwMOtyI`)U${9>#HW1ov!@qwHQu7)2)NZwOo-t+=E`Z z4eT*iXMn9vZ^f!+Br!94!b-%Ji)j`%T|jTc7Ka2lbs+xc->VFz*p#u|*?TOt ziBRWa=LsIW)qgp4MFdjcoB!3p>eoiteL%%nFG4!0kHpUgaQ_taTYZhecWcKU2o14G zYNZSO-l`>LZsx7ZeCpmAGnIXxm?GIOrM<^gtBVK!z4v0ZceTD<-ZkfX6qAb5u+wVU z7LSDorZV?l!*gmdoGERYVsKC{JaTXaj-RjgH!z>F>*rj;R++Vdv4vMA`U|5|{WL5J ziNF(>7oCDp1}CC$9APS|+WhhQYVO+l4(s!}(zzA<=FWSGr#M?;jH!aUpM(lDm8*l< zf!cP8>LP)POz8PCP=yC9*K`W|8NBcr93ArD z(3$a|L)A!+2d}J0*6HKs-J~ua*gz8&oqI9ghlv-dzd$*PPJMs)7;iA;ho;^SDr941uja&pK#E0i$3>NZHftqe`yC;cuC4Z zb<@pT?Scabv0mvvE8oLq1M%rCSqVGr;uyjR>VY8kK4pKLTrJoXf>)D)Qyg-J&n_Naou& zpf$G9cg(~DH#+!U`5}`8;s%pWF&JqNv#t~9r4eeM#`{)^dbR_ z<(p#*CWHrIs|>dMmy%A^S%*UMi5=S{BSeW9;fEgVW27+pWQn9i9bPbFV|IymBDM6B zNl}ty&23$jwQY(rLl!TyWdgq~)Q80P?hgKXr~BAVEWk%?paHvy zVexN8TUvbq0Fpc@1=KYI6m6gU!arJg&?qRtMXE*vsXn=IJjAt^+)PHme0yN5>&>nU;r%nR_M&RdzWNM}tt!+PnI3+Ul# z{j-OM>7$3Ixv`WxRZRB4b!oXn3@+^~Gi156H7#p=+N7+J(>BC$i?vl_?ijDdH59We zc4|!`1`?Fy7;fX{3NgH7gpF~#5x>rSs(#IDY2D}w1<-CRcyhY9SzJr_*l)O5g_-_M zh@4_HKQ*Imjz&b^i>4Blir-)Jhj?zcIpbxnmh>Il87Q7pl8C@*ZKxFQpIjRcu$$xc1fXusN=}uv(`s;Y zmBQZ}vru)52PjXK_c*c@3dCV48MA}+u&yfWp}^5<`zZo^AWcaaR%7$NDxCm|@$UVh ztWia@+2G8)V_@F;8;3S|k6ShPB7v;+7IyZu=#lG+*H@7}7Ut>_et&sG7<|qqzuk%p zBJl!KPqaY!A_vaQ_Gy|5aZZZk@jz}6AZoL|V~u+6*Z_?LfAN5jgM_yL3TlVc$qR7~ z%jWmLr#s|9KJ&o~1v%lipoPA;jff*)6{dc-{OmjI6B3ZAnopoc#E~9> z==sg@EktSTh;)k`mwRSMt>Xlxp*OG&+n()S${*h(i`+8e=Y=dZc_K=V($$^TRA^#Z zjYuS8pf+D^?0TSTo&2PABc@C%HWXrr089)OmEHuC+&a$_RqXd$QRych-~}8C#K;_q zbW-i7Dmu;{E?dUmUp`?grF#n$cu=ct&tbsU>Aglpqfm3GuIy5mTEu7l?z~VYG7ZfI zM@s4zZFgZynwDeM;oZpM0ZE178)}1X%2eKK)njZqNZPZc$DXRM@&rqC14SLL3n&s0 z7aPb00Tl(usly7@j+`q;c9s6-8mTJGBL0ohHjhhHNKz21G}ss1-awK=!C;Uuo$Y{! zUQu96NumGeB4SLB-uv`!O8iv0!nea=VUGuYPWp;B{;xcV7NPvkm%bTGsBXQUFF= zHL(F()NxlGc#-(Cz~7L@v$w@yZpSTh@TWlpcIwrS{m3y|5GnW0oJ&G&T2tXC zuual)6rdH zfL6AIa5~*XT#PhnfDVfKKxP;tRQSX(gj=jsjFh-txC5Km9tE8l;36YJItCU)>9v3Q znkA4PEP2}r*C=6JIjvlz=y6}{7y4=(9}BgF4Q0 zq@R$Z(8(6pSTF&n2+2>Sb2K7Ook8#KJSR|wxgOgi1bA$>GTApWU|oI#&he$pxSp}i zcRq^=C+0bxvB5lbx&6)|h-wihpKpD9AZBjea^1^6bp|S&am|E#)#MzRp-f2Nez!Al zj>~mm6K6#}c>6n?W}TN90s$~XxBzAdp?|iw{d}=bv%) z(SFcB`X->;Nkc6eH_-=i!LJ6Q1FQac6;Jyp$rbaQ`T;iZfk9Rq{_i znIv#MF6}G6LX)EkX!FagW|AkcGe0=A?MBJhf(usPV8^(!O37^%-)uf~#RM((fmF;V7c+uRG~`E}oLkzFmX?#r zWnH}`+D}IpW~lu z(WBIrECVKqoi#|N-}rqXn1Jq(h(3P~i9$sO(g?lV6BP#Ik=<$#q_<#W{wtPj=xN=9 z9e$br4^Z zt$-5nsA@Z)Z2}EqOgu39>jOo6EyF0$E9$y`I66weEiX*-ai-P|ArhJAh8THF8okS~ zA<^s@7_?*q0%43h?V5yZj0!L`Q~Sk}eZAlf8o#u1>7nE!^&^V<9txCI9967MF;5h@ z3?kSmNt3ECngG@x8W?P3D~iiz+~~R%(}fcIrv3}krv(pt=C)rP|5wo>cbBE4&@QmN zoZIns$5YmIRtI}l-|rVdrypnXK|A({4-WpYBYlJ-%}_)7P?m<20T#8DoBp5`4nFBE z<1+Fy*oEYwVz{v|R-V4Z7O3OhcvS@R(jJJ&gvKH0!k<8vK07?|l4D!9qW1u5cW7 z)Z7-(v`V*n%OuJd1vm=UnUbn*@vH^Qv3G^U{p^!PsvfGl#JUFFH2q>E>(H{b{c4btN3JQ0d0@d6+ z1fnbJY_K`a`h_OyI&>F&k~^H(4Neip;cmKmr1vA=&%E*Un*xso-{enC#;Sg%uGTM= z#JF`ua7%p>-pLdy1q0_wo0>FrcG0tiMn$!&JD>%W`mNks4IHs<_^7G|yxiZrAWS(W zi*2u{yOtXxSi+Iw{`4q50MciOZl>f(ktv7sj1aH&119bT{Sa?()Nb}6ysEnv{ zEZ(%l+TYOjyMSFszMiGm^iqz9}NLNVC--L0{fV9BzA5c zf$F9M4x-tq7)z4D%4w~}c0cl^L6@+UYogs^a}~e-(2PUoAmKV^=9*Kf zp*y>;>e@URQTgNtc?{kbCh3J1J+ECF#-}p7XG4SYv%g$(IKlL5$76MspzJ1EXfFb3dbXph7sgR;i?%uAk+ z@(J{M_MBE`k2kU-Ml@4)zEV!JnYyM|`hfPeboP!ufFXwH%n=)vG31O)K1nQPF6|v| zn7$x8q7;*03uJ92*d(3sOY*PaaLNSrg(iB#$@dVG^>((6ud|<=#IoV;=kMT4vLpzE zZJY>CA1E52E6vVXG)Do*sKPTF^~Av(l9R4PpFZxfz3{^aI}!{^U+8msA(*EbLe6DL zr`YC);GdJMlEcvna*@`wsK&A^%+X`B?3t!#28+-AU;bmR`H+TzwqwUu|NnUb{?%IZ zf3aHrpI(4}m-zkZ1<-$}IwrI&*f^9_fk8$JtcaBI&9y0Y9KWibw3&zSnf+3n55;#6 zc`qK}&em_x>8q&O{xrSiJ;Qs#G=VE1<4IJtR~lG zMI3>p?h)oY_8VQAy{394y%!FhPf!VZ4i6Mp8Z${F+}T_;r*PR1Fera4MxGH@)IVkK z##b`yz<}i0JkeSQbofbZOCA{H80bMW!=OOaRVB~n#A6e~2K`L5#)}ZK2<_2B6z4-Y zGARZ*aIO&D6=$Ibe7-r$Z_9F3-><)cdNOzt0n7j}P>;UV(H1hd*nN8v!nPEN(|Jbf zS=bp)*2glIJsFCY>buC78*6Sl%yHCp2MO>)%9bg0IfKp{MqUnzw+ev=1+ZazYhO_1 zjE=kY?-4}fIod~Vp7YEZc%HpsH%p{7inB6`;*!f0IUhtBx)2*NP7jmJ*}7hEFQv7P z6KG4uprlQDEP?5aLU;yEt8*>iBR5Y%j!Bw2VyT;sx010{?d^Pp?f5zq&EhJ|6Nwhf zRGGoBHF@1`mSl)tM2Ya3B6KFm67@-bBzW=V2p4A~kL`J_JAHlXLeOzbvqbK-N0RF5^q<>tE@W*xbBm40`FI|5B9Mq>0Z`A2hG=Z<@wLt)aOgR*)B{a5lNJ&S`PZp|ttj=rhHtw5BqLlkGKDp(P_r zEZ|ZVkn37n8`|1h8;iD_TbUYVoa_E}8$(RR*E46W!b7ZsvFJPO`KDXtb`WvMK1%Md zZzOCYYCq;N8}GIpnkix9(&AgEsq0((?A^V^X=S^=BFQvX4(O1)FlD55_HP; zYxHQ2#tk!}G~PK!-1|+DdV6U}uM=)fo5^Tj%UZTh5qyf3(|`|TVmGOSz!w2dTv<1wDm%VtGYEI#l?PGWEDunTGpe$)Z0&nq;BF9 zb#3AkR|Rs6n!}L?W7Sj*K#%TMS2bb{x|}XYw38ih`5`(A563-A4#{HiA7H?sFyPH6 zi489*G5LvpTH?|l?iF_Ay_hY8O`%owTu~aP-AtVuSK0gJX|ic}&Q_XQTALNUB!m9O zO?H6ABTWz6B}{ZR-X0dilskB5vab(~)Hi0~9whV79Sv`WlxgRTm1CDK$gZqQm$kCU z)S01j_T;oe%o5>09rgtXe3E{v3xv&iyCrO)y^gSJA(gS5GuAF+aZ*$}j$2L*cQ)rX z`uAjt{V6t5J;fsd^>5rqRFG5=Jew&BGw`dvr^M=o1Inp+lnXds(SS@(1h0Vc`KRLh z_M*;Xum*qSz>49LFvS`6U-v6k(~L^zVpDkJq@wA{L>xx}@Dv83gmcRcJtniP%7gH$ z`H*(eY15rH(~eyR3Qf(;a->jTz6Rf|#%gG528Y@0+VjD!Fbeu`38{QbDN^Q zHCBpYb(OME8@n&yZv1j=;h+EREZ*sOwR&~I?bETKfBoZO>xu&dq{qVg^iDL9t{_p( zf4ZEA!c?k5=@yczNNR~>=#*C?35wFN#0!~8k~PUAx>z$;MS31iW#~$&*t1!g`&=Qm z1=Si!gNn`(|f*T?kmStHPzb2E&`Jhd?f*XwwLKHsA$|qy7hbR!<&S0%fyJI0X2tsxTLSvs%F$5=PQVCC#7~TY(I~}wAWp7`PS~WDWQPL;ha4DAn8dwzSY=AOrGe7(!Vd!o69>yd&BI&Cm%&oxlbaE+{UAMwXK(S9KEgYRM4s{tAkrb3 zmLBr#05dnQ=hQzz=S4p39ysy|(!UQ^zfb8d)F*wi2J_5`^eYmX>k1TIX^)>HIFzM3 z#KdPh7i7D|d(=Mk%Obc&JnTV^-x3_zrTmaf>5x+jI3)#RC zg+Kf4MxoEnQbl$*Gw~@1lng-j;oj2Bu~fKYB>x^m;5x9z8R7rRKki5`xxrFOH6E@1 z$d={%%gsK^@8|mqHBhnvAEah`a)>TN!H_9wEd^snP!&Upu&q`Q7MvNh38(iSBOyjE z;;Fum7<+}Ga+#G1Nn7?gOF;A)pCMTDXOuuS#fxJZk5-ad>~`<@#u!p9@g19Qm0T)b zI9p`vJJTXgJNjRSWjNoOOyQkfW;9|+PoRqLLRe||uhXt|n{iq%mzJ@U>alEP3ffvvILjC+L@_Uv8xn1-(!^kpM;&}iyqz`nscJk*r>?$o z(yUeEtWvV%Wi zuJCp84?HYigbKB@YOyzT+!Y~4I zWI-m!_z02sq%ndFj#1UiN*@f!v&f)HGJmiO$IrIrH|K#Q2!#T=Fci4J zRK}Mv@B;ngIo4{5slCU@@I|3JCH3Dc)KcVUam{;{3I?E}Uuk3a-XJ`O2U3;KRvK`g zh~7#Aal9ua90)I+yG3t+n>hsU)n^G9e0W0=M4Quog-7xKjcHiKY__Qc_(%f*&n*A2 z@9=-5$UoJQ|Cvtz`hoU*=#c`b{xhW^tH>op1lytt0FqJUAL(RBtdj8{c{)SdIhKG+ z^gaHUd}a?U{9nND6eCTN7Qzx(xU*?nO&iWH)20h~eZ9Yd{CRk!gki2qc2T1zOoix@ zoHC>aSvKX1Sc(Qf(eNr22;%hs+`$OZek!nL(G9czkF&Q7i!*Jyc5w^t5Zv9}-QAtw z?j8sZNzlgK9fC{npuyeUJvc!^2>T{8&-2dAyT4=4xBvCgzq`8Xs#`Eki zb(M5GrY>0`E7SU|iXM^679A7@Gfc{8GWg?s zq|rJ>$vMf6g}9uO6vUEz^^w)eWtfGsBR28sTsQfR@!0*ZZUrsvLIcfP>2~%p2zsX5 zWyF{d+=LnR>u<@_*>S6UmKzjV#Yy5$jU{LE-!HeCFWa~1>6)FrYPDodOEpumOKL3^ zfK8FDH8BN`7#I*kuN>`@>xe&H`qivw`!i5W`nD#1R9w=^pN?)LWqMCfN8njmx-6#7c?o2r@l+`du)c8{4wZ8q^Oo8L0s|X z*?lL1&-q^(=x6s{&(>We@ie{R{}4dNo{!(j4_NoTWkxt@?$TyBJK%Kj-EiLtYn+?=DgTQ?eBWQ|UT1 zxW~{?#!}KPz+lY+Ck}-$z(gBVCDnq;GlfPr>D5J8ktEBkM^!Ib=_qXt5cS4ZLHpOZ zeQ&RSVY089+iN#^Qq-gf2DLnGoI|xwp`&$XL5OO5C z96Afea`T-*-4zE_iwOD988&nIrr>NrRHau3mdH0_G$U#wpRCz8eGYFLAyCxfeTKUheuo)t{Wr{r>yI#_=s&}Z3aN=G@SxK~ zGKOGC(!dIFDyj$|fH0%gSn$h%9qje*qFl~b42ZK7LFlBp5X<9SU{}&rU$7%UxS{_d@6CSETu z%KwNa|D!<@=!(881@AhD6nea!s5@4!>LRVy8as*biR@cmUXR0lo3c}gh^>xk{gl~&#C1d=>meGP~fF+6gM)y9=XUYL~J5q7U; z$I^5M3tmxvW@=1(bKTPgOUw^wD1F z-I>bco2+kZ)R~{uwHg(qSih(h`*lnubh=ZO(<9i`9V-)a0Tg(cYXp$4LyFj%ZDkrQ zHV?(xtdX0qtqW=^n|=4On!@{r85)xVn?ylyaltz2#5<9cxz|u5iD6*=FrF#hpQ^mhWy%uz?N%ZL z?V*YYTE6;+gh|R?L1=`UQW1Q%dySYSA$S;l7kQRdcgYjZQc3X=s%jjMP>YYtZL`Qa zLQ!B2?f@D74M2uhdZOuWyQw9feD*132@Tky_*I30im}sYsGu-w$p3_OfPn7a_DIy8 z)OVwLnlU#RrT&q0r1~X}+A0>rOYK zO0%A~<~Qtp_+{!c_j-lWa!?7fu`ATsw@&o}yS9bJW)0gW(ykw5SE7X427EJhf zxDW-YV1pPK+0fte1ZbHO6gDXB3ns*AY#7}SV3*kgnzM$zQ$C{E&_T;kDgs~{A{+hK zBI^llsuN@!g5RZiqWFJ)xwn|$s`CrEWjRrcL?mZ9PUZ=}{=OacKsm5|F3y?_bsX)( z+6p-F&K7v5NbVtAQ%UZzX5lovh{Y!uj@_yTD*qu=FgxfoI0i})5-7!g4NCc&lKKBF z4p{3i62o|?Od+|g9mH^!j2;6RCsUzl zXom7N2PApg)uBzMt1~rmR0U(0LYiOil2qhgl7Wy=UZ@kXlBmns zZMr5bauW}%+=ORZV|9r3pIf^?wQDM_3+Ti7R#To1Eq$QW)KxQ?DsQarN$olyiQdzl zB-qe@6E195cXeqesB*WJjTYq;WYS{pBTeP?4Ttm3WZ+o1LDtxkSN%(-c{~nP5t9ht zAZv#ynP0V#`!VN!Z%c=xj5}tOcYN2@{{+W3Y!M<_jnJ|nQxafWr!Mw((Ugi4jM&U7F+4wd&?SB5 z5$bm?E$Bbtd<#H`qxEgv`!iDC@5bc5DJ(Bku5yRK$qgX8;t%tAUdjv*5wRmSVdkphrE3UZ z&~eIFwP0-kR0{T@EjL2r&5z+Fe4Txr;nnVb(N<71mhI%_nCbj{JXPw?uPY57*U>u* z#R(T?Rex|Q62j(kyiekq5m51BUZx1=$7$C^To}(L3x6c68V;C|z=>j-E$CX`SBvPf zz;%RwM^ohF2=8;K>1lkQsK33w%+xD$BtY-60>`N}8KsozRH<{*XgF|hT8%KW6;%3Z zrH3@vuVmu`l_p82ODN^oV5W@0`Q&?T_FiXM4$J6ps;_0TKs>Oww~U+^t^nlkc;F~* z_P5>_nTXg*b{fG?`3^ceu9i>fh10~2*MY?F$0D!yc`JKyJEX!7k>(_c)6cBA2?Tw+ z4k2PEe{jhP=VmAcK4f-BF_D{41c-Z$AMyqzKjM{P6h=q696|BPc2IkV6n5$i$KR00 z7o~)9gyM~Ev!UZsenPWuh!La4hFQ;>d5t^ZYwm{O*6_MOJ*%CDE~`_1;`Pl~{t5B# zkTF*bbJm!Te98&g!v*|zfbAmRUFu{Atc7aujE|z1;>hfPT0()+hnM?1eN>rn+z_62 zvC`yod?KqAq^zD(T-!$ugg#3?hz@-IdC@r~%>>CPj5oT=N*)xvlS;0|pN?>(isPSn@Nq&B8bV}V(rW#U#$*L^|#~CKgXBqkE%C>{UJn<&+I^<2Iw)} zioBzPTge2DcFwStoCafMEY&^12tE)WIjN4Dq(zur##i$d!`=joOj|geD0mksLOjt| z9|3XV!}L;1Zj45{B&gh3ic%t#tfbb^+VI>edPb~Sz+?BsFe{@cH+e*%Abh^5HY;O% z+_I#ecPFU6m!4_OoRUdkSTUSH9~sBK0X!59-6vB2H>%o?5EA<-@Etw2RmJyZ7`L1$ zqzqYsfx=rp55|_?qJSO_Y?S_B)VEk70r>&Tql3(_{I!kV^3s0VS4uP605Bw9|>Wm3I0-wQq zR)~jQKoQ{l`9%?s3n&6kRZS|>aV1wwSM9J~6ao8=?4Ntt%6*o(zoWQkrF>jab8>)h z7hZ+by^pO1le!qm?gJzNGiprGoo< zNYZ3L@>3+WEQ1_B%-aHQph;55MYl~rz}IosAa7iA?05UEfrWrlz?l=GkQy;Q778!S zPL)K^1Vnj5>kb~rNCmlbM>Co3WcTj9M5=jZq!K=}@v%aed2Rwcx|%7m7(O#!ohm+l z83ekyGxy=fo5)T2Qj_3uA}93Kiv&j__GHxRhg`uP49yW9H>x*8VyG#Y`svWQBGf?+!Y*snMZzc zdok%$<3bBa_i5e)_onIlWG3U1`8qu#ZEfkn>PuQ9FhNFyWIG%ak0 zKOK7KnkA7wirtIzzhP-2koIQGcW4D;dpl*wFcWGQ|ES_r5ddNvw6D^JUUc zb}o;BzG|lhZ}_~a--T0`-EBB~bTp75$)-ZJw;O%|3(#Oq; zvC_RT11}Q36w~ixt$?Rb#whws&tCp%dE9F?&+4O7zGBdiVP8T|f&aE&~ea0tCQF$@lLzr+?Uy{_^Ym@6%5GMO^-0U07s(qAPr5 zph!znxf$VR5b(Go?5U0359X!ahP@1%_%kIAK<*6)+T>CejxLVh*B!96JwKghEBZe_ zJiG#Pttl2kca`OVMF~yAwvAGwX~qR_YCP#N!6V*^tI=FKZR3iWidZGMv*(Y!O)AMU1ALh{w-7E1N}f_ z15T5qp;1xs$KKsVBL1#>Ph#=;69lNQ&y>VMAB-%1WVp`x+(q$w4w=nUHKq!y0+Da0 zp`E$cRAPIVLF2aqkg;qGLxJiQiCF+tg*qH}AV}RpF+x^#3;m|dnTV-$l3YP9HFA=^ zHv*wTMP*AU3N_WS#03gQ9}Q#Bivv=DAgUw z@myPf27BMrdzsCej-ZL>_hsRvKOw0vwFzNm5y8$VSRsFL92Hi=Ur;X~}#v(s35jt`3{0JSPx+$UAv`)t$f!gxqGU*4 zFUd7-{UihhR^Vz-8ybnB38+X0Wa3u`2dKehz|H3M0zaT(e7qFKux8|F@E0LdxXKGt z!iNRIQr<93;-MhKn-YuTzgL|5Lk;%zl7g%RA8JDc8G~cu9<4j{OUfJc6&jQF4}F~i$`E3m1g359Rl>|i%na; zTD2pQAagL0foEE%)*v{N16cvZC8R>FZ9zCs^5 zdM`R8zKkEA-M-2W8X5>++4RW{bvIHGc9f zU9ao$?4sn#aFV;%@F*5zuX`EJ&Z2rvY>Ep3%{_r}-(^v7^#x}bJRb8EV=tSoQ8#_N z{DGcOU0Dhrb8AECCSk3{33o-X(?w;lomdjXLH;Ix-Wi(hLn%Dg&D$&09a6(TOBhhazp-GZ-Ax92i&@_P9D=`IQ|yPFp1%V%k=; z#=qp&KB|wPx7Ho#LZ71=ljiYzbT;N%!>!3YJ1V;hPS|H>aCv7#SmYZ?QEPB*jJmDO z3AhC}E;k5RhvBcFuT_i-dqQl=Q9)%P)?Dy$fD$pYKBg;MD;5@JoE zq~{W1>k;Ahm!#FG=61NQnXBh$yHKJ^nt|=u;q8R*OW5I=A43VE!|kt0R|@FTDDQZK zGpPr|5I}+^gS9e)F)X`k6uVj0gUG~JwwSwgEyAROB~UF|;C0-HKHTVl=Ho#C{i@e` zP>J{|nr0Bmbpf7D8kB)WqHZ!6OGet(1CpZH_2w{7L3yy$P{tlyqmYRt@uC;G4I@2Q zeWmU5Xbv%$`a=u1)*XTsTO#AezWDH9qS$5Qwbie`#NxahbaT8;p?QI^BnB8uWdGe* z@}FDL|J-!{6KC>|YtioowAG53J-n+b>baN0D|9`{GizFJiA&egADb&&pD0tQINK!e zm4yy@jd+CaA%Ch8StT?mikFuX7+ZQ-9bAol<9PbDbHWWaD9#Ek+nf|i&O+PoKwDgx zs??1*TI|eS($x;}3MwAiSKZ3slOrmw!Aky$278(2lw1$%r(uGiP)8>g2)QH|CHm$Q zPu%K^V38avBb@Lu!FfpV>8>?x@Xai{IuUe}KL?MM8TsOfb3IHr2h0CKazHMMZUP#T0lk_c`N%Se_+!))?C85FQx9ePs}T1vQEW1i z_RHp|R{DE)BT$KGE)zT^3K-U;R~aOT+jSvbx6m?|H*~?}{Ra7$Z%bOqf``cU>n9-6 zR|SqA&F(vmGFiXu>ijgM`PwVe!OAQZ01p54iH}+jDn}F^11bO-31Vz*V3Pg)kM zYycb;%uNvt@Umxx0b#;j^cG#CH$l=w_o`inL;V1ZPTU*RaCf%kHu0qM^srE|0iJll z0WbJb485O1&SrGe6JSjl^vNLrD7qFsO=s$lZ8o1w1jAx$;=TeXx{r!Be&xBDWRo2f zO%&ex-Bt)^^ou5cqNn(g0Q6Lp@Bx6HD*lb0s$z|*&S=83XX&eZ1&erDH-n0p@PeM= zKNa7ad&r~QH5u5P2ftIWxy!uFwfKQZkJW2)vdU)cZr{7mas)5#gb`OH%#0OL0pN}c zQv|yqYwd_M`|k+1U@?93v7L9?49~*d^Y+<%GRPM3K!QnzJhJzp!iX8;MACrzPC^^& z#l%hnfTuce!v6$M&FqT~6!Z}hNPl`BpeXoY_qxx3SV+&~zIf|y_(IrvhO=Y`&vYfR zGL@+EJbrcpw3rwLm2CcCN@~oYTK*gij~cGQ8aaXIcpO7-f0q8^r2Fza^%I@&+{%93 zg{DAPdvHXAp@2s1`*-1Kc^p3;rgodNXAW_@lh>RHXOK%b5IR)=@~Nm{KRGaMsP${# zr&~(_GPZ_Q4z*C5e^kNgDHZ(cNlI}KsMfM-*5gH@I>>pUP8s~B zPVu^m=2v(szfh;lR$i!6%B@L|Ov-+C@Z^&(nGKxVqyY%80uqP~??b@O+K< z^d0Z(?(8%`ozgWZzQd~X7x@i4jJy@_Fqx5$tU^jnux6$-;yLPqCe4<9f7_&UwC6^zKo!P5%-JT@Y2a;Yl-viqo2&xr zklHUFLuo^c7d*-yVDiYb_}=Y(lsLn&7M?O?K;$IitA|YdNJQEDhzSH;q=pVrOdMbb zgf-p6PV=7jnBu5258>I&1GqUxzHDg(`NCq)cD;^>|6c5cL{=#9zy>QFc+1HAyJG(x0BrIn`c%{A zzwjvv;2i8>|DQLFx}h= z{1eHRu}wbfWjFC=EZh2$VJ_1O^|ZU?+cUv~Y~HkA5059@fkb>BiM4v-@YQqERi>2@ z9!QdSikuvk>Yn2YDY65raim_&8zp)aRQSp9dYA|c4HBqod0gl*<|eytNT&)uc2c&O zKg9T+z*Xt=#Uh+V@}&-B#BEkGP<^J*jB}DLH z1wO2*gmjWq-hDR2hRVFiv+z|)<+hSJ4YnX~?%=uM#ogAixB`NvHj8~o z5N9Q=WLJi1&-y?YiHzc*2vj=~60YXCOEFwaF7Q6Gsa)%n|)5 zB7ORYa6x4KNalR~Y0D3}e4#6{jeX*=$Bncmjh zCT^iUF3~6bL({Nzk2E6RAfa6@p*WLChn;H(O->Iyy>m3v>8dHC^?UeJ{na`dJ4%@M zI{BK)_|C*A)+H%H^GH`-n4Ok`Ij%#o7d(_Grm?dfm$$G83k4^vtjvkdf>SinQ|FMG>h7N&pgEt(E5{we=(3V@mv@A&(& zDG#T}EgN~Ig-Hs>rJ_J%OMhI0*E>JvxVm;T`DL5_j-(IE~# zP*d}}oeSKh9jv$1KOPtdv_q(faK=2kjDEfJCm^O^jcDQ7Pw>Wg1@AtGO_3O5Zp<{uocO8UCQ8ZjW9tC z4~doYdc)~bN(4t{gTzVkKBHt7rKrUBi1>ofr1z+vCM{0PeMPi9!i!Blu9~4e+|1W> zZkuS&xza49OE!ao&T?$uf2Jt+y%n1LGwY@EK);3Q`Y9qKzhD1_UeN<_!%)PGJ5sIV z@DAQt)q`PK4rvn^9z4TP-Gc#_ajwQQGzQ6{TEG5%)K<(HN9fq=V*hFN>|YIr5AQl0 ziDXk4PCFym*bo5D^`%Zfk&qSc(O_{F6{lveN4a7z^YUD{*|Jb$a4@rm-$!bM?DBhr zM}$tTOQcT9bS7urS%rc9WQ3Ru_rTM7S|Ysst(p9Y*RHfnS{2)1iHoW3(!G|=0cob} zt8Ee!?5jM_vlj2O9JWS$%y&j!T`h8YHJ`s)u*5xC{4sg=`bY8wO4jjNWVj#NCoK8? zHL_msBeL9fObG%$T&fwIf+A3Nl|IJ$7futMRjfG=bsdSsQ;&DbEe4lal!(SCn-trY zu~#|nFuhn)XEe6appv7Ecg8|fKwaR$e5)iv ziG{zOH>aQ4;~Ux%?ek)sl2iSUajInUjysM8pcOVFi7Ak-O_$Bkkej9%=RFY=vQNpu z3})s>HPYY}4-vx%lbWy%RiveDG7Zdk#mLx-n_+K zBuiq~Rm7%=2`sYan^E6&{yeypO?G~R%}Wr`zAnEj5XLOxf2{8995Yz!7^gd2$-GFt zf{r&O)k;~F8INmIdjw7;{p_4v(ldCu{*OP5r+#i}L!du#0T-5kDJ=Y>Ke?NzTe$y6 zp!8>J`k#3Eq67ygbRgBu%E!N1tf+F{szNi!7KMeCDxE4^N?eRHBK}@1VQ+DpYanZ# ziNc>=k%OueU?}88u@6XYwzf}kv$y#^KaV=S-&;5*76#9SzC!?o=n>Val+;LXA&0eL z-queJiY17OzLj&EK+7Txk-H03ZaH;zGQV>t>6j9Sc_@QRyb(k%RIPx{j{e$8_`$iO z^Ud*(yrK^|u|M+!k|7k+q^A>p1d7(_ov_O^K9MdD8y^hzQRuZbtKM!<@B{ zHCH-g8-0?{Zu(v5S2bck<&SGVisnYI;n#Fi`z;$S)4!(cB|B&;R~#l|C!b8fT9p+! zAb+{FEEp~OB7Y^2h0;_fff}8Rz-Y}??gG!rJcck95F8&ti23#xg>xT(MU z6R>|_NoVdU8uSZ1hAKPp-5_CgGK5n$E+`?^;^9}9#IlyWEBu-gO)|tY_?mnWi(Q5d z`3hU`Tq_Wh98@6%(jW+ZEn1Z(s^)?kl)ZyRq6Jk4xqw7+#Pfk8cs0-vLxvBTO)B;? zL})fXXQvI+P@kv}zNll`ixL<9Z85#bFsTfL0x>^*^bu-RHWf77Q)(i|Bs(hoai39<9XJ$U z4EnI0_tbv3qE_wED8Il05_hsG9A-era8b;@Tq_-ZZB_}tetv&~1vB3gh1hncMy7rf zA4$tp+>$EW#jvWF%SGKIh;|kUA_wUdd@5go&d`FBf$q)KGSbE^h!R=NuP#qq3S)%G zqGwJtl$^&ZpulmEXP0A#$}ew`g#UmwoT?_qXvw<-M`3tZUU_sC@zvfv2B$GTZ&CBr zQ#Q1JwxQ}+#HYh$|2dVkPuAF)dk9nudu#T5>}j%Abul}^P4bMz4(H^zF*YoGlbbnd zy>zv@W0T)_A>w8y`Oxfv%%Hl4?{O(*9-(laSq{6-@NnLuf$V$O-7sluvs+U|F&ZKU|$(P^**r);S zdmcMX;RJ;F{jnR4SigW0uG{F`M;F!0@>8C~;BNbVm0AtnxyVV#$B~#!A zsX`>YCnO14*V=`;8mJ+Hg2||x{K2r>4jj6wP!3SCC2dWha}HeLba%pki5+|qX^*gd zitB2d-O|1kb`ZGPF_tHI4#_9E=oeAkY}?9|J?}#T|0%@t7DuLZhbT`V5*trB*lOiM zn}nD!#VC<=U=j8}MXm}`C~F|03%c2xL}EV zuqV}oT0Hh-&tenE=fdekM?i-UjtUFDc^@JXOoA6R)C6{PAyO3{ED=J2kw>!7BbqM? zqK!&(1dqQFfpI?W0S7ga46dP~dI>t_I-sf<#Si%Bav@`0g72|-c0z;NT*bfBtxjti z_n6FH$nP}@u9aRPnTpPHGtxzMH_zlF+AvR)F4Up=5D#9?FH~>t%j|#@VD=731BKSd}6cdi^tEQ+^5ga^vq4s**@r{Y$xu0Ok5GPx>$A`XAMd zhKZZqf4a_JD)zUA{f~+TlrxET)>wO0(4wm51Q7x(KWai7C8nY3X?p@L`?-nzCh?qh zLWH}B_q@4eS3t#lN_fVe6WQ4#UgOz{zmNK0uFk^1YBDR-jD;x~zE&Z^f)09yB|*$a zE1aKgH3^8+XdL!la!w}DBFkk+qpCkZ8s^=Bis$mxv|QC)CY$X18GoiamusoY$kXJA zT>{s~X%~qGl8_;uBBn<8)vHxi)wt4s#(@@E6?L_bA6@R5&IYzX^5KnxNW5`VcM_KU$j3# znpVZ@G8!aiEY)yn+J%_MMB2;Q+d<;fil>I+zLZWEWZ84Hu?U0?FN z*a+aKF@E1&r>Gae3ddku&|mJZQIf$1(J$Les!6LlaG7P;qy8#+4-!T|ivx%1Bv4gQ zg~H|!q881?2FH8_wm0Qf1rBT}pXM0EW>g7#fPG!>UW%aZ$Q2U0$vig_8)EMV{d|N1 z|4h;^=Crp$m^%)+MnjQte-DUB`pOupK%8FU^r<7xaMA1|VPjw& zrm89`3vN7>H#~_H2659!EkPa5>Y6Fbr6>mR&5ZTS76WDTJ=?fFPLsW|@r}j4!M^Y{ zKfC?I)4>5VSZX*W5=W}4Xjq21V_b`(W%4K?o7d1Nt+R3vG>qI~26nXrE3V!e>zzU` z*IIZj(T^U7QP#naAb$6ZlK!v1n5=U7EUg_DR<()Nzij2#60+git5+{(wIe{j_ z%pQ5ueA>Dn-roHVQANLBKW#sZUX0?nEXsjxkjYnHr=pq8;8*FVZL zVrFY%V#{6!G?vME@5zQ<{Cu`ayQ+~VixotO7_U2R#tBvh{cqfc^ehTnZX?b$9~{0Z zDr;I*sL$D$MVo$ihhwxV$~gJ$Yr!FoW>KYR%caZJo|)C zaU$loZtG5Jy>aAy$8yw8M6jgx)#{QVJQhT#5OPc)kw`}f9xAz)LojZ?E0b<+8=54M zL?2HgS4_-x0{ZMwQR%C=u}vTRRr~Dlkz#Mw1ZtQMQ)D48RzWz8EDaoY)&wrxgC?k| zi!7x7nSePYXqPbdgnzY1XzZuFT5}+AYIsfo1YYofX81k%2Jxfmw@cEvfzJ}1m{~YM zQ!7(My;(uodFO=B;NR>pJqa9``24`ACyy(^c;Kxj*#XctU*87FH6^7#9ahc&PD9@- z+^oFA%a7+ESvk9@Be&W14{VA0sxB~kSoxn2ndC&@PLnVfk)-UB2-=`xaDHbZdB-|f zib;_Hv!w97GUlwP(4Vw!;vqGUx}Z9v7C z<^)vcBrP0+LbmIk;CWx((fJ`&$%`a%4D!(D(3S~k{AJ^;d%||+t`+9xjMJC}c_{AfXaP!>f!gW( zvd-`X@6?gi1jv`-+M=+V#`vm}W?J1~+@(?qj)K>wd!Hp0 zXHo@uQ=axm)5ch7eTbA~XesTs@aDy!yg|3Z2sc3L@CqSE!-b8-Yklq>ui^Gh!Oebt zMLU03z&xcKnD^#gfp?fEGz04Rr>q7hjBQnO%mc2@pm*bP#|_EsDkfoC+{|5?1|x8< zo0T+iGQQ+q*yQUz7x6AQhty=~5XOB|V_2+;E-_ZEL65+b=M)!KJGc2dJ6Iv5z%_Ev z%GudZ_G(AgX~vCuO4EL@AQAXfd-RP84|^2vNVBJkav-dz@xQv zbH>|uZO+hsBN{{xRTtHHL4zZI0u`Q;bM(5^@<_?B0>P5+yAK3juVD!kW`=9kg3H1L z%^id28y1$kP#c@O?^Mf{6_#sLVFQ!)t&g6h=)R4&QTV36q{qm<9vZU{sxzR=9K4EU zeb=un+-%S1-d}H*C^&0}om5kmryuKKIqX(C`XPJ>e$|M}K!1kOZNv?+>WHc!+|rCh zeuYL6%PLa6Ki)IMH6)EwZ_PD|bJ;yj=X^ z2wG0+7yAXfeW`L&6AD7;t&t8R_@*J6WGWJ2$Wq$Hi8btO7$$%Tx4N1yWd)rl4B={0n;vd zFK*N$rPAgjj0;syy!w%LE$$uJ_u^pOwht`TJAnZ##KIUkqR;Un1KoySQ9~Ne3N=u*gBVMiHD` ztYv4D7cZtLrb&l0GnUF=@3pW7ANv#QIq>s#!KF|0#q=v+DR0T0%JtMtgVV-;FzUPR zGciCB@O=G484OE6u~(rWQHnQO4m;tVCR$(Dpz9P-=qt5tWA2s`ex$BOZDMzc&iFRF zU-s7sw$90#bkfN+j(JRP!(Kt8J5GBRa|iCk)y6)l$nH|X9p>gE=g$sY=5N|g>3R?2 zPnTWONaJ$WEM=r6(mer|CD4ep2knqYUYk1@7 z;uxJJyl(#5YDfI~0-L_Ud@OxFVkaz$Uk(y(n7di>rBbzI^^~{JJD3x`W2iMi zGGHTGM&ZJfKftO%n>D~zUeHeqnn!(dDTdAZR77*CCIxmI}ugIXro$P`~K>Si*mI( z_X8|)GNFL`q&dwwd{%gP_nMX*g+A$mo^|*zld?BOlnjAD{!BKDRC&-k7ny15TrXp9 za6q4Oa|%A*+s@fy`3^x|mDR$JZ|+$<+qYm{b}v=3i|8haQa-}9(+HvFc}?p&eX*|o z%)c&=Hog1#DzT4nKrYgHYJ~xOO@_ z`OH=W0qt=+dnpt%5v8}=9PoX1Hn7}OJlVRWO#8K)`7kM4a~g@0@|kNaySAIBH?b0L z2m~w-f5GziuHP7%djDcB)G3bbln@3F5B?s#jkS!$BF$6pIsG;XHI}S^r~Ve{o12ze zNn>UZLS#d$4|vtqTdBn^r1I9qpU`2-W@A5?$6CTOLf3kxLFOr@-JX?#PZ7aMDx*5( zct7IaDzg_$8F8A|>H1f%6wqR)y$5x;_%nON;@}pPf4_i@-H*qfG-!RU9u(_ME*9UBs{7vx~h)^r4)@g zDQrGLJJJY<;SAD?3ofTCGN(5Iw(?4o=qKPg7|9-s549*L%4;80aPoM5ToCNI-Z}Vu z4h9N&|2xng!&#nT#- zYBPPLZuYUKCVo~6145NThABD4#&(|+X}co;Fd4KVqP>J?#MQ=jq%4P?!#O!~aa zt7|T)C!7#b5BFu;9y%*p0t78ByGAUpt}~66Womp3ZYvUP@ngvEIP*adD)u*-flx^vSPRe{|1g#_%p*D<3PWQ zH5g~bd*X@iB@!^gH>eI>*FX*}#XY&qxp+5uT(`J0D_m#n3ur#)9!ib9aXUcKY&5l+ zMdc0wvrl%G8r?YJ1vJkVN0RazG*1ictig}qMXDr%0ms2i97*qQ&^+ST(I#+NXcFx$ zJt!G%Tnb`%Hi(6SmvH-6xa!uBWKs$gU$p_#nVs#sFp1P%kJnioMxB#*?>~xAV_;JB zuZMB0H)xR0ajHR64Cc6!(}F`J0#}|Jcs;cy9WCC z5B+TY01wJb>~j-PYX5&EJ1QowCJq+v|La-xXV}VLEuJqXpL~Nk2tKV>J1TqKc*IR6 z4h1&BZM557SE5#!gv2l9Hc_!Nr1SbSi(cb(Od zXIz_$x*bxdoH;9cG7+xn7*J(Cv8#R-gm~NSf@|DVhN^%n<9b^>9;&@aF{$q-`S~Rx z$uv>GkvGW)!ewU79BTF@BFQ;vGiZ7z|7af3R{#7sh8EG*#S)*hp(*-wRl}2tKWPk4 zQr??hLt}(#FGHE8gma&j31m6q0rlGPjY(!-@Se^(Aw=!XAxya8ZSO56lxl1O_lZ>ZU<@x{HTdjkdUmEVk%$M zxAAUj)mBz)u#fjYlzOMl>PStWiK%$n=nh+Ck-i3JJzIj-R|x)=Dj~l zgQID?vKU&mQ%iVrKH6AjDIVK(|3zY;g1utY&#=7Ji5Px?*85Xa__05=5cS0cP0Q|> zme}d9m_MAJ4CR4qRY|LS+)I%1O_vwM@tKK)#l5tLGXO?nGEW+rmKVTCV4WR1qg(+_ zPc#U5X=b{hZqFrD8uw2@a8U%4rjMFz$w1)Iy8n{DnXai{#wGU1ceu{|wI@!q6G{Nb zarYU@lmGI={_~@J5a~~Dic4yASji@|D$FI>UzrG&->5S^Na|LczYSysv3Ix7UqcT9 z5mmoA64-xmB%EQaf=dpNc>^H!#0MYr3V{+t<=GImlhm{NDikt}Sou&=aF}q31p^=j zgAIm$nr}wNy*NB2CS$sFM8GO%3)gJ`fL zgb)U)V8opy$v{9Tdv#bp3nS5#iWp^FA!1im_8kk|Bp%1XeR>g0jT+J{XxtkFLiZ(} zrul4Mz`>#BLxDSxb(3j}{w)}v3h;jj2Ezwbc2Oj&iUu6TNxs$v|7o=O;`d?xdw+9W zI$%l$mdw8Z9m2m{GXH0tp=M!aT$B# zvcRQ-IB+9xvY4wD8kt&FdROS-snYMogk!1jF^uoQf2w><+v(}9)qJ7Ly?=PV%o#wA)>7N8exDI_>H=QD<1o4T`C= zM{^#ynp|)6%#e@fk1mp$(c2k@mq__s5T}t*L8#!DOyH8Jm-8N_|Kzs2Yv()f+8}4r zaYiYzQ^5nBb*ej_ogZx3H_(nrxgaR-!dsdqXr@x;Xs72xME5S~XNeFT?O79Hj5YnC zD@Bi8882ZzZ)7#961HCs?EX1*a-9`A#)3BnnjSay_CG?pwql_L2W~(POz7?KFx&U?(UH8?(UTCmVS|b0coTg=?;;S z?nb&hML|$J54!ia_x`?f#@Oc%F!=qfd)@b1b6%4Tws1Hz$D^e!EP3sRw?=wT&;#Zp z*EN{j<@*S_|C@0>ogKp%Hyr%&s4M6krm@(Y&n6*((Vqs`a0|8xv-@q&dAs?td&f4p z6p68dKx2b%?#i_TU?&E)txhLYZ@>5A4N>V3sd*xCza27j`@rax$C{bUk|Pa1%@xbB z7oCvOKG?}Y!uTX5Ir<1gD3gZwL29;b(zYd4sSojNf#nGJqtLf3QDTbWYJtUG3>X#b z=!5lyWm!--M90t3(K%t;3Sfpy#lAL@>3kvk#x+DV*GUYi9w%09Cx&PT_SOftlN5nr zeG@X#Bt&0g$inVZj0<^*YSN2C(d7L-Ve#o=*VIE-p$~lc48Vsk@$ZHN8XnFrPk5mJ z72y2gcS|+`#5dTWNv4fjQ9yh%sb7Vt*%2JYu66<=EfGqZDBn5NZ$)s#HOjKAmw8vi zHJ$FW1&r_rCJA^TSGJ^`Co=dSx@-V-=#MWCgDTH#d)9<3^Hal+=jcz>T9p9(%@1TQ zjwwqpUJkP3weTT z612MU{#&Yzw_hX{wqHlSjUaH)v~Q=!-m7IHnJXM-oufmN$?kS18xVyQHI zCe7Qg+w(ReBk{u{@e&@j!C<=fM;-@LE*r?DaOOXyH>Lsc876k)0NvkGM6^ll_kGQDvu0!ir`BAEwug$qT|F)p2ApptOj`k*T))_Q{=pAKusC#m6^z_~n24=d z^|4rzE12Bx4iTLbayi7F5K!do$|AWDdwG(T^SzGAxk5zud+BkB!u+JfnGRi@3oF_o zBmX76LF^AU7}1DuANhFcT&Mc>0qUjYtT0)B%1x82M$g+jj`E*CIyxt6LW5{Ome3yQzDzjrA&|So z`?z`8oWDH~`MfIVT_5!0$ASGb&a$#Q*^lp{{Ta?n*~9s9KHGK1MPTFBQQ4qjGgaR4 z#i`UL^_J=?S)iOS@DyFC_E<-Y8Zd|?Z_3QjmC-RQXPQbW};(fdd9@$Ug>AfflPSC4FPnilQODT z?_$WPFy8NhvtD4g;bBN`^9~!}Y-z_lKAuXJBKw8S)`pzwy&01uZ$G2cqvp%78q&cG zIS>fZZSob>GZbu6*ez00x2in8tUcFIy<##ydQnPp(blTC>R%eBz+%E4Chhu&=h}X{ z5UAmxdku!2)PAfU3(fbJs>d|MRNgBsz2-#L(cgrQ;#s&v6|rfxXw7kHwIQHg!@-}- zq^)&+t}in~tA&(u8m}s9VySw99H-D?J_9O+G^LhG8{!Hr^XH_-(nQf zx>W32T++FW136z2PdA1r6ufLhZQ*uVEednUnZ8e??*!v=uYwhhO7v0S^7=u=f&{!D z-;btbn|)RPG3m1N{j-hFT>e|ugTypZ<5b$NroKMaJJi0*@+y0?Ljoy`h1HRBg#-?H zA;S$Te0sz1q?RyU3%EYrujY-K(~Dk#+cB*)idhc@^=1fJuS*2hc5u^JyILX$2r;rH zS5H-cBroK>!W~a7Sbyz%oNq;xB~+G}j1N0WUMippT!yNmNl1lgySMcc6l+ZyzgQYh z#Ok1x-!u`QYm`nSG`bqQc;FWX-ICwCcuXf`@@1mPSfJq>jbZqGP*_koEWt4)FXeo% zpmGSL^1Yq)kI&zI72y~ACTF4Mxddh9ExvQ&Je~mofa$Nlj7|r!#qb+SK^FFNLq@C@ zPRT~Z-`ak`9k_xpbF#>>wrH$S!#t<4_toqn9g;%-)hq@oKI@gEw4lk0G!h} zsVQM8PU?`>Izz!eZOTb8#wC2kq!N+16ZzlUP{%^}(|q8_AOwz#|1Y`eA9jepzpegu zd{k)}d9O&Kzb9HrJY(qBntgIY6`>E7Q?3+&dC0*6azw|CJ<3pyM}7Ln<~UNAGwqR& zIFHY2-au_VC-K=0A%z)}SGEu&MGJ?M6KwE4UtP`+zCXFx`1wq==QGzBm%QDZ*)o7k zgf^Q#xsB;$b%`OOT?vEIGTWN`ks_7j4ti8CAbN5}S8c!uWga<1dsbIt(-Y;EYjv@< z2i)`vwME1XTlh8f!){66no$Ee)XJKXCBAXJkpT-Q)itLe@^Hl>CUPP73J#i}zY>PS z=MqZIS{qlJNVw+uj)@|N6>^CtYhQnWy`@9^2Yc)G^$@#>w)|d%Te%^-y%(L1?~;?B zkgelY@C5>WXe~?E$!pc5q(so}LQB?a!cZY%#qJu8TVd(zy6-x@X%dwB~+t;p<|~l;;N~h9yGduL{}+b>4+ZeA`H} zBr>M0?QgHjQ-PbHeF2_lU6W1y*Z_{Mb!5>h8r}m*z9)uRLN#_+dXZb z*6k~Q!Y21K%=Lbh4Y@p|L@Q|lt5y7>((*?z_SrLUL|9HxY@;ECo)v_HBm<#PG%4XiQR(zo+$b^3s)@2hNWw_Y;p9xtKE*B zDuQ{!CH0uw0)ezg!)Ax16lR3^N8H6+8)P2uW{YZ~WpQ4GTwyVT3N-r?IX5ISj@3B= zMCEoiOQ{rbe7o2l7-N@TBr@aUS>LjM%>>Sgu!%p09A!-)JLXNWPud|BWOnip7AucWef$#tAdze&Wa9QpKO{ypXWg+#ul23;XXCMSor# z)I6R4;$r@xi}>@_`y1^u$j?W$WQWQn%8!dkML#FUCk2URPNwmDQ6 zvxpjsl{LJ4CWLK1z^+ukw%R=&>+Q9_;cWf>!>gZn2+x>p56F-f>s_Fmhwv>4 zEi*0kEvs!dtzn($!6^Kn1&t435wZO!-OUN(k5J=s4p1-X@<<(C>^Pv!o(0G4c>LJ( zZ%+&8n8cx*jPh6uM#)GJ;AgxE+=mr>Q?TA-B)BvX{j#b?v|{Is9Y)))d6Xn#2jX*X zCKMcHagI%f^2Uv${$P*hz~y%UYJhozr1tF;k|Oq}Tf+&Sl4$r!6oRH3Z>HjxXP2g2U0{vsX!^sRF#GI^R zvEDF$ohmWVO^$bodBaU7rWf}7`MfA)Ve)XYUPvgc6rJT}Gvw{#=K>eh25AyB>9Jnb z2NNkXViPIc+yq1f^T8VEEg9p4K#{LYGP^N}i(>hyfH){6#8@o1ItXr0;Y~B)uzD>N zPU9yoi1nXUoAq}oqJl3>y9bMm0FdGWp)fyAHCn+OFxEQtb zSdY_CMQCB z&h3#AVC+&Z1n5Jm$BJUs63iP$B&(%_PTs<12cQ1eHVE=j?)+&3+zx!`|MG_X4|m1i zT3oT#f6TsBf3~>BUoDQy5it7>$p9^mT=`G4F9m|#TK=DA-^*@FwC{AA)w}U8lB_|O zWOf&84F@?7bzgt8CK+<9%&gQV3X-I>2B}2GwoBrXbceQZohs)GK!SR!^L62S&qaEp z;}fpra4SddH2d`9MNjk`=q^h@{)FfDOXgF=tVyd4AGO1J-U%PDw(hyr*v(rV`ixV9 zrmY6ucM&Bj*g7V`#-E8o%{upew#^=p<;*PrkrQEzBA>LB6SHkCnKA|yl{l-B&T`f{% zcC+0pFBLB6xi7JSo+e-vMS!c!y@IUae9qe!W+D9rSpIGvQwX8HB?gwi!k|&8d;@jZ zg=R4Ghq_yiyjb;Hp0D`TbIRi7E28hB!pz!TIP}Z$N!wY5KN{dQk4j80d4wxS7Vn(f z<}zY$wDzWIBhzA}#g{*xxaNJsdCy+pE9>)V#tK!cZsgqchY+Z@<>3Ks3%) z>GYGad&rO#ZC&Fg5{$2XS|0#2>fHonQn@HN=JqLNA!EtaJM{)2i?-_7CN>d0&eL9{l{T%|T4}*bX94 z?uWqbR^{J4i2qaW&Yo@-R)6ZS{w9~DQnKfcWx8Fvf5gs`Gt z7e(JIkdu(248NV-gT`H1v-Vc#Ekw(_%ZvKYkHmfjuEgKcS>9&h>@Iv0>xqnspnY%a zPenkpTY?HkXe9_UZpDniS4_&Fa8DWI${^ra92!e%tL{a?*~dP#0`(YqM_phq;>e~o zFY(MWj(wWa5gKgdDPb?(Uou#|Ow~(aME|1O)*I#?$DebQ(JbZKFk+OTWsg{-Kk~-m zgX}v)-t*6S(yarXN*?RVD9(ulvmEdBVA`+y?D36i7uhqJGH^|*bw*e9isPYeh~Cu? zJWoCsV>@-stVTpy+9L5j!KpdCs({p=u5WEnHLD&q8fzaHF6mYuuB{ZPOc(SVb@8+o zSe>d|sxEL=iN&Kq+KE7TZ`r<1@p&oQ$QwCc%D#E;I^X&WIRi*V-oeGW+S70Od#%GO z1f8MLz1!01(ell;1-;~Y<~*~3m+p_5E3c>n-6?PEPEs1jiHlcE!X?cD+F?$X=y= zM9xcI?pix8SF8Q^fdSr(gVY4izMo33UXN-8@is|B|vU=HX#xVf!>hb$@a({=Lus ziF77cOhWww>8t=hL$1cuQji#9Dj_Cb*IYnCGiZ6thGnCy`?cl{2##d=*c1SyPJdTB z7U8sWC%+7iNy%uqU4B^E=%W7qW7356*{+)MW*_uE<{e!~2YsxmNJs?sdcQfQg06O{ zKcP0}9bbfss_eGLyOLVa7igY0ml>dODgsC9%QlX#ns9T-6+#l*rRmyHun@*8Q~z`A zj2=3XJ=#@|Rs(j0nU=K?OolZZx)^_rkS5e0k1S*vxq^MC}s?F?yDh=y!XXn1me-@T!&QxBYE zFwf26OSYSHSH}V=XL+ws^k|l~C_cm%sRa9;Vpohau4hcMMe-&Oz}>hn$nMRlm>MwC z-@=`_wHLs{a8IK2SM))R9O@f%tIAy^QFm;+>D|(QdE0N7(7wYqt@Mo~PuM`9&6_Xr9kE6+m0fv024=YVW=o zw>b@a{)&*CxwHl1B^iYlE+q#Sfe6XCcwjKqF@z%7{s7mGxTCQeWeZM=xw#pZzh=1@*@GFvj|*vmqMR#hJ#h3`^_8V)QOjx zp7h_MUQ0HRo=*q)0EtfcVJweb7JHVyB#y(SA(xMV3xquE9xH3QAA5$lVjT zwnN}Hz;gP$vHX%H{HVq((1Eq!xAxW1>m4 zyW~2m653wgF#Aqe!nrOBJJc*XKmMiSCy#P6&$XC{K%m?hzjM3OeV|cPztlI?To|u%1Q1YqO6UrwLQ@pD=Nm-Etar80z*i&;m_U17`<^1jUPvQLy2cOyIh1-Lb89 zU}^#_7_fnH{4|hC`_DkCPksCvRq=d@Rj?W-a}_n*iUd8;qO0u92-2QW(kLmL~XrXf>JBMwJ1rW&*`Ty8ZLkc14JCUw0|-0L~QE0+Qx)I1LJxs|lo zfyUGy!TM_7J*3s}MvKkc#3KkrBwA%7_w%j%VK%Tbk`4@pp#X*TN+p?pj zUP|JGx^XssuokNkA>)h7Ok#!V4y7mDyGGs?Be5qJ*Xf~8s1b_E$sOzl<~VvQi+=Ng zo6MkwVacnn`c03?)B$o?0_$1^%Q>RN{&(^D_qY+(x}EfO#*b9-+EU`0iC9Fv#DXaV1GZO+dw8t z1(HivJYHgtP&vI+QQCHxk$RK5mSy5Lv~GN=?--`+M|v+Qn%I~=%!?a2MUQ1f4D0wD zAI~iKIq%1yf8H7DsD0FOfqFj&>iu8ZP$mDD;QqIJLzR|+KQMw821d}Q4E<`r2zqf! z{CR1-!>qV|X$Tkz#WT~i6vEGUX(;BY-jk4iFn)(HrYB9m*a7POzA#vC_*=m6UjAOs z%=u{sr;WAE?&8ny-|&Jta?05>v9;c4zTr&ojbw1Lav^D%y@Mwmoi7L#WH`50?NKMZ zt>{y&6zr%B_^gjdOz8nZM}{bBp7^VaY@b-)0d#4jX112-JJuzVd8YWY-=S zBXXfaszt;oa@6W7iGe^=IiJJToRuA zNAdD8HrM{B;6!Yc*}Kqu%isH|NEBRr6~C6tu}y2+M6yCx*`h57YaC5(hpl{&<0+dW zO3|lE2+yp8j<{xmYC)9ArfjgEL{A#w%QD8L`Ac|z#IBi3?k@67au+2odY%?;p#hlo zy>*!CpSFl9h_jc~LL)a+_CBGd$O_IHfuIosWXQgoVaJ}!&GfEUoH5z3{M-ov_K}hK zm&70i;GGVvsthO`+TzyIa-QG3J-cV=OF6b<;}?`9BEq+JD=jRJy~^K;9`sO3=ed=# z=)>f}z=_W~6iH_7YWlsZG86(r#{9#!Vh_JybIXj)qB5_vPKMzUM425!yWPvHhaxxp zh;F{k#maM=qrl3>mQW&CiKIvouf17HdK{0ua6*| zEHJQSH#uC5LNJB74I|?1J?=@YUEi|ty1-q`A{@pJmxZ@VUl80|v0t+SP?V{gRu=AG z1L(Y#8`-^}uty|j=>pZlMD|6Q-vekdi-SQbMH>FZ+@Hkv-#3PKzchR%R_vm%c&Aqi zJk*EZ2Xo=dDzQ@tlL~stJwdsoqJe}5{e3nWGJ?`6oQ$bS6ot-tTJ~wHQJHk#`;V1b zl4Ki5f6qL8>h@n&hRm~p>fiqN-TwDO{qIz+zZHM+zv=eLPu*VjSGP~Qu)~ zZ}QnpgcGT7k#=iinChI4m<-@9=+mbhEr4+aALaKdt_9uicXxkYlk z+HBlJOgYuIha~ZWiozgBk3I$P?z&0U=!vxsge`=O2D&eDoNNy^!;1s%4EVOIKHOW1 z1=)KBfXDYo$Cvx5%Ld<({USc;SI38(^n|Q?`8n9qgz$IA*Hwy)bj-c3B$dhLT)f*n z<{++pF{JAKEgHk)w>x9yD@vW&@T1|2;=|7zPwtG}Qhd38xHE77cSe3$$J4g@NTvbj z@ZmkG(Be3t0)b z+lVAQ(9_<@B4aJ!?82081YceOTLN%CWIwQDXAC%@7Q|K(}#^mZz=u*bBO z?04gDlo(wgRZ{@=PRXU?MUlWra zeTgTaYRA3MBiKlopu?~KBh>PYo89PRAk!wrlR?8tG-{o}NxYBwQy?j4t5Uk4PcYh( zL1Py%Xh{7wXe7v{i`)9GrDk5B3oMk+>PQ0y4T*=8*u=xK>7k5^LPbwtMpq=UvuOjA zzHc4dEnH(;5SZCEZC@bWM`=R0LE01IT-^tQ0GQFKOZrixo+imF{4RZdj?d}TV4>0_ zp!8YL6gn55N}o|Oo!`&=gau>h;``5k_I(G3pu}Tf^<)jq3jSr^SM_wam2(30yk1sL z9)QyD&mrCKq1^j7K!oBibbrJWI&>QX14Hx-WKwehB#gAB3lqhYthYsiuQ_oS+FiZh zc{dD*Idu$pLLEK7Ey_;=AM?GvvYMp+Mecw5{TDB0*Gwx68=syJO3%)1X1BPlsz+#b z+QnNZ!v9Ir>wD^%g7BeL#nki!N4Nl_&e&jvQHu* zJv6s))%Kht(;xhow^KjJlO;}^n&0`MueVsaHXC_G8?O84XM?9vtxwA#is2Ek%-f4$3D0>mE3-jB(rpZJtC-bZl>tpsMVwR5rP09)k zNR^z4Rm=bllGIA**~Gu3gezN}$s#LnQh+{{(Tp+HuVx$-7hw>Xv_XU;q|IZkxO zvt~JyrN(wl`oKr85c+9<<@izZ;3JCZ0o18IHDA)2cRiGg=>2*)4I$YU|u- ztvI8+tOi(1b5yy^rjJY6*0x?DqEv5}C7YA_78(i&JgT(U3Kl^1#Tx5TF=62tg zIi=5tQ3P{@AmLI|8Rm?gCm2#D!j%-vnT-RFyl7Eb%sJAGEIpY+n&{*Kod-(bDWd1R`!E**4|j^=ezxDMY=nj5)zG9bo8G^UM=6XQ^9ko+mtycVxS zD!Z0~boEY27D(wf@z!>crNT)lWV%nYuTsam?7pJYqRV$oF^spaM67E{cuQ?%zGSCsW*DWG~@}Wt*KvyRJ3O(?VdYu_^^f#7kGf9(|bti zs6Ae655V_riX3DPQs88o1>w`Uc2n|?YT81wG{J|ZTTAyew#=@boqPEAsAk^OWg|N7 zo)B=qN~WXy6oYW~0!2>Fonq#3BWY34Afg~^U(v2oL)8xWyjJ?Y#Tz!fexD{+B5@_D z|AQz(k#s3u#L!3NrAxrv7MqZ;&K8w*kAIK{Q}0}lFzAtA(QN6*21~1gPM!R1gCwcl zWTD@ArKuOSCF>MD*`$Nl1JTk!=NPTQXfh(B<&RlN!+t_v(5UVUsK?NmQfe1%c&DwA z=bdTpg~w+PCTjYzU$0MN*)Fb8t7a>F;fVBvy)Ng)DfX-=E|8)O8EMpwX|6-qNPmhI zjRSyKTu7fH|Sf-H&a7b z5cfG+gF{0F39<**xX!n_4#!7zRaM7KF%;~WcEn&wH}gYf%rA8Z86L478vQM;#L)#N(_`B8w{j|$L`&&x+r>8Qi(A-;IDw3h$h;NcXRgM zB`AP1H1r#r)59IcJ$g`RX0cDNT-q}(G|S{1>xmJnuu?6qD!InKu+FZ&F(_#J8oF28 zF<-^K&rE2~gQd`3V#Z38Lp_jKmyyP7((BOU(c;n9>{StebOPFA*Vv#SH`pK{AnXzn z;u0!Q;oP`+$F05UItHWdD*UQu#4*PA5z=4VN`!W#nSyt0Tu_>N3aziIT3$dJ zAI`p3#Wq-`d%tdV{bdl2x}oBsi0u#tv+G=%g2B)*NlonvIR}x{u(!NDnU9Zxp)C3! zwW6dfH`<;*J6ca#>m!dy>XqR~RFTB1^61G+{^9;?yruR%0Z`R8Qm68~3-~bOfTq$V zQ}Ze_edM`mOL77ywq>bz+elimBvr&Y zz9K63vU{nPX}absrx-N9n!Oygq>9i$=|6gI8-{uRG71nWg8S~wVwOy4W3>EyvX|vk zW~b9Gh;r&a(m}D0rl&qTIeQ)xEpwRl5#?8^FSh8EpGXiiKUGLHHGzzsk?3zUM9b>I)Ou>)hi268q`5JS%EA=yE$a|IhrMmd1zkh}xl)LpI7R_&U$?C0O+UQ?ge#(YYWoHJu>{!2 zb?8cRh|vSq?D8e_GCf%bd_8l`TdEW z{*ImOhNx_;;p{c?gCp4N7CEzcKBRu%76=>X?9cD}i*Eb*53u-aXlUQlD&A*=Ko3zP zn$Qfvy}5}*Nm|EKxo?sjYH%G&ksLZ12HQvsxyyl7=vK*wxI>w^gU3FS(_V@2M|r|h z4!!yM@_C(MSbFqa31qI_eZ+f$3dHI4JGg(ItnEk-lE}a<+77ry|I6p-{|=)5k z=V);qIU)s_v8vh|b(VZBY`QWS$;uQs1|hzkK07}L$~IHw=)1Up%U}4?SI=Gm_)@MZ zOm*T?0AI?|@UXFQzP$Sj3q^)B3YfaH!m(U5(hYjY5Zw(z1ldYAos2;+1a2GvYsZ1j zm{%C`WlwWPhq?L$0WH{L`9xsHIA1)k<}UhNeZ0s^i_y2*OvfF1yIsQ!+A_vfxw2KE zHDuCJV9y{3AJwUH7vu~_24eTT-L zFa*q}I5}^Ge)S!LbmxzgiyB-G&BiSwV}a76G*}+-%Hzz(gxk*z2i|9fXfb()h9bXA z@g*9Uz9}6j)X%?`For5GR4#xd_(&)<1h7Xp*Jgj9GIZ{NZ!~xX+Cjbv#ierV*n#N+ zs7h+Oyal)p=V}HrmuKMW1NE#A9)=1ljm*c_gxpHcxdy*3kqmg>iPx{AQ?PwwwYy5W zA)IYd;650)IA4NE&^wtke{2+{y(~+nxE63G*CaVTav0>ir0YvU=9`uuF7FU9;Os9$ zZK-t9S4>2-$uo&ac9D-DG4qSyM+pS*hFc=LTCETk&~C(yiQTG#uOLU?q9KITNl={T zk$;MQ3Y0sXA{9~?TeEVCIY@@D-RJy4T>XXoO70j=2J%ASp3Cj0^P?Gb(1G0di$O6= z&QL+Q*r*R*VHr`8su|GP2F z4Pi_Ykh|df#4e3)Qp3IdwmD_T=c0oINB9JIoWJWQSfea+dT}Tk_rM@fzNjsAu&;W^YHkr^SK%!jZ#GOdb8z51R z@OPqI-czC+`L9Gd=f6tr>A}jXUGF#ml-de#iP8H1yTts*Z0F+a_TS8FDitp)H!}x^ zKQ6?J()u{2A$icB-TH7c4mA#I~`Jc^>`ae3Smmz zHPnN>I@)XRk}Dq8D}yakGF5bm5CMnnMIRu)MIIrH_(0(ECIkv%r)uyAbIkz=GJ2d= zdxL{`^ei2P_YLup2_BnWWc^Av={)x`Qc+OwipnQIByK|mMDbXap9`A59b5&qG=(Q7*6F2CzR88!J zh+kgy98uQU*Tmej!mi_5tY#(Yk+O2nw0P>~Q>we|H=Z~xc4Cp{FysKx=;?6Y!6pVi z%A!=N1xyGsw58X>Ov`hb?mp|4lgw0$pn3O|5WD3rhb*JjarTE3`!8|#`hjb!sbVWF z25u{eRe=QC2)-f%n?vqUdcy046{-Ce*@r`y6GwuK^V&--JQ)2QBitoXB*Fh?!9t$dlP{yS3-5``-7>&mQn~yf2-^V0+v{uxrS9Q%M=v#qw^uOY^IDCiQmFDedju!tK+9OwS8cDD zPDd1YP5YqA&{&7~dVKLm-;i`1#UCu#R&f!bkV3hnnPWrJ4Vlj$-Vi^wcf4jj-9>Uy zQ(Eso$M&o-zC%^FF*qnVuHidqv5mNPP16q%nf^94a8VD&AifqvYU`Jf_821NJD7x) z6%$j$Ond}p)Nj1;mUPuoI-BbX1J^Eh)#{WxR z_Rj|WAMnZvOQj^VWIzEO1cd^{OCR|DJSnDK(>Gx)W(3LeftwSs(=i(#8~z)+LS25% z!TEmv$A!u5&BQN~k0{A`MV_c}h=q#;Q-gUMeX0S&DkwC%l%HVVN*8RFD0+;s<2g#3 zmqHxrOC94j!3Xitg7qZ!Vb2lr$I0Xo%RKY3=9lP;3}w#{(HWN(0*Gbn>{*5!b>lKk zLtaCJ($sJ5=lF)DC4l{2Qe^S+F*abps4k zMpP?}?f2kC)BW1yZXoSdEoAIgh2fQd>xN)T3xPbieR>pg|Ewzu(V4#5x*Zpr`U{2S z@|K7vvShWCWMG28_l%R}d#u3{k{Y$q-YqxcTmZSki$_U>f&;l6G#r&?F_(T-pzdxW zyjiXBHRHXQBd+3-2BiI(rYe^YQNEw^q^V$6R0*=TWjDPxqthDaQlLicfvkhwthpN( z9}E=X^GGbhn<#4L)Z{7FzIs?j)wxZ=SS-5dO(D=A!9*?XRKr8ezkT954eQ_~oZW zb{?P?!y2Gxm!uJPq$E)TCE+d|yG^R_-faBUo1aEib{WLDSwM;P0Q=Z~>61|Rboze? zum0Bx_&1+~?5|L?|M(=B0H1`!PsE^Loe>CkWzs*afag~-GuaY8wOpM3w-axd^?cVt8141?-g2E=*M-g_i}dQ_lI|pPEu?%d z2gMF+3<|^HIFCz-=_(+{^KAP&WW~q=~cMCEPE1@ zmR@5@z%<-^?g^>juzW09lHld5rqu)1*Lku@d~_?>NiwIin4C&vw>BESJSt2$p77AfFWCu0t(I8IaO+l4bOv=~-u+465@ zw0p)CkY5OD2L%!*xa4gq5Swh-7Z5-!N+x5v%M4l=78Rc6&g`S5UZyY*J69GvnAF76 z-hs9jjtIwVJt`1v(tSUda|-cUo2uZcSyWf|6?U)hs7H5OwFCiU>ek-uj;_ZH( z_~xAWQp)$Oe9leIu58 z?|gO@+yX<~1Al;E6RCIapfZ~a(U+cSSf6A$xrr&vntV&C-UzwMj6a6Yi79>UU4%H` zgQvfRSJd%j0#w8k@WnFflv=ku-5Yv97(P}oZ+}hAv;&axBA-ZkIRfhu04eXDWdAoQ z?_w6wHm>{~K+3z&yWeB`iuOx^)mp-3Li?n^YWV~xun>1_I0gzdchuNkh-MtC{W1ZL zC&;BUTsxR;@!}%|Q5djIFnh3nNeTr_fcKEAd1q3VwX(lRc|H~intBy6zestB8G}M0 znmOhwmc4v07_Rn%`y~^q(9LiU@eBa7#CyEIn~UYbn9hDFIdbEDFE%|7h`FM ze^lC3u=8+~pVQ{&PtFg2p)bPzgT7F2mDv)Bc>jdH;38ucDo;PSEDV82nLx5GKjEfE6u-pYc-tG0EC;nWG8^OI6X7 z12NqELe!v*Qs~i~$GlRIK7Rsi{e)a!YW z1E)?vrcZoh27IeU!qv0IoMyuDAJ&D-^=K*P6Nd;Iif$2c%7H4^Z}nt~m{HpV^wWE# zn@X}I)L2G&Ds8kpULdV}*{5vSo#BZw>1ZIg-rJz|%^8=`*Q0n1l8?jXI+2=Et+-vFcNVfl1VOVbltwj6gio`i}RPVF$`-81?~GMZHsVXap5cI58{ z4w?s#f7`A+Jtr5px1iquEh`IXS-k)5Ir%iX`ET&WTTLVHS?OQSb;maYbRlm<>FKBV zP~#n-9LelHaZ!P{MPEiXMqJk>wtQ9BQ>V_rdX)buYNDW$mD49d`Y=Tb^EPGdN=AGF z0WHbe`eMC}Q?T-<@rQdjQ5cn3wpqGjHRZyjkJ#0vu9Ptitr~^ zuJE)mn|M42JO(!rR?SgEJh?jZdqB4^WUu6aZ`pmN^nC_HOg3Zin7rlH`nItoF1>M~ ztwwlOU;*uCcbQ=lBv><>>qxbVoafW?lACSHWD5=?;7?Hyzq^%#fY9lk=EA;N|8!y+xOj?cqsn~dq)w5( zZPOa)<`eYD^?#!j`00g=uN<|0S0Baq)X?k{Bf)Th?Plmqi139KJ*gjfBggNyqx zv^I8QweJ8Q&XZF3_?dvO1>9Y5=hf0^;w@3qd|JN;DsSEES=mj>?RI!TDSU?y z%QAgToBq+N*RY4#uo!2GP(u&FHL8pANhu8aO?1`HtN{c=0MYeK7UwbiN|1n3tzw!k z{SU!VanaR2pcTaNZD;$57yB&;FsoyIhD#5S>(Olx3xuei{z}22OU7ON`o^KNPN9Nn zUJ4h0TI>ytS;UJnsMIlXm}L{B`V^{|7mRAZX8U~8zranQx)Jert>9Ck$AlkuJUIgf zfI|P5&p#z+OFL`d|Ht)I2_RKqzXyB)RSa>JB`8V?D}U;QyWqpQ^7EDLPpPI-S!k~3 zwAHA{hlO`*F5#BcQPbUZYb|>cAlGGq+vzG(ulP(B@9kRKg~jQIpWk*={ttU^6;)Rn zZR;ku6D+s{cXyZI?(XjHZVPvJcMTBSo#5_H&_HkxoJGmqRkioNr}nvTx1E=?*=TuO z|NQ&xqmQq@Gv=1<6DvpsW(DiQ&An0wwb4@S=>lWUzceJHQkQ(mH$bz*^a^lB%h{=C zX5HIy1kb<(S(i1G3}{00%G>e}z=fFqopEDMf0&f=j0R-fFh_X+88?ne`d;G>m3CR5 z;xhR3#B5sOd+61_;9Qh?JCQ&0_?W?B{zzZr-RdM+)HY?bQh(nkG2j#fXQMe}Jp>15 z^U%v29XiaalN3=@r0_+F)ny%Uv*T7$Q9{~j3&h*JN4bg3*gSQh+ldUajc=mp&Eh>( zYt1+v+J%`-a%ylsav2sJa^E zS3=Ky`Y792u4csRXw|}cqiwjgq>G7(Q46{;CtMl)h%{1sqa5W&31h%jAW~2`s#$7J z3LG2U+nJ}{9sdkISg-Rv$I>m70~`&$&8={op&V}Zw;f*nORuJB);^k&?UrN|g*!B_ zqC7xr01x~VyWII#fbDsZ8K9eGxc(zhGPxg@Kx^CIX{+px0kf&!%xdRE1;=Bk8bs6d#r220LfG*O zUf<0(b8>f@P!<>Zv3(g)Nwfr^JJL@7yI^zRac`v2N0HZ`Gd^{E*a@Z?n+gS%CLV`E zv}3{m9P`@55d)5ze$NNC_z1@!>LTmi6pE6vlK_etXiXO^LzEs> zlAfN$-tvL6=C~$DO`hp5NEm~A_wm4dAcX3Xca#brAut~(p=0`(nmv`!MU=ES#3gsx zMF7kPs@^!_nl+>!ZgE$U?kXp%@O@HumzGksLzHax1KS{}K9S3B0$@+sCjk3;acq$G zS(7h#-}-vFlRmH=aY@R4G<-#dR)mtS(Nwsy798S)fBY7z^rCvmm%#85mj#c*(L1q> zmZT5T$qeT?5!lyDw}guaCkj2_!VSVkdIn6leVTh?HN z_8Xdlgek-wWW*5$h^F{8Q`_I>jf|q*=oO@%OV)Vy!T*`|9vCu-a*0~!6g0GX>*%k0V-69`MnZ;XMfC*)qp&?&0WZ~ixw*m zcwCRVuf6nnpyR)Mkc8}^loB)=K8ux7pb-@-p)XBm|D59~f=;q@qZx4~D;y12y0BP> zUqQI*=!g$kemf^Z5_d3XJ)pA!+uT~<`lcpRmqH<||6kI=pR0wMkSalSqsji$p zT~?O$@QC`PoxNF9ycm|LUw0<{W!aofxVbOG$4F?)!8au&+x;gA(__7;bO$?867i4) zbO+`GuXeVq!-j%)x0L(!S_8c>Di_%hlVgCT8$Z#M0>^uEvxv{wu5ngJOo+1ACt{b+ z2Wm>p040_ &=k~A#$eacMrl@1tB8^5t%j58&!Oq#lLg0I%gOWLo3rFE})MY7dAmYk4(V$(_FDg^?7fMUiyVG7Em&3aIFM z@=_bqoI;o(E+S7$y|T3hPzw1h*d#f-j8!h^epJm8TzxEB_!KYEb4_X&qy0PBsi$Z) zNSww~un~N*SXx;zbv0!sTn6OM@;neIQKFS_Z1z+FVw|*l()qEgM(P2vPFlm7z+n@yR8EBu#~X6BV}bH{=)wSEg-;)i)0ufdCeoL1pos-IvWRgYQJ(_>bu95uxa&hK~ zF*nH?e_5>sdt}fVu5^=+yhcg=bSy6ykDfjS1cnRH-+=nguWMw_7SniGRt3Dz3pVv)5NxB zv?Vh93W@V!xx#}yS(u?6DDgL1Sr^trU%#4;EokdZ)4+xRS1{Ly?r*C_SuHrhW_%OS zYKBYYc7@A!+BLQjs66I$X04B9R~$iNR?9xwo|6h1n{Vc}Wdq$!M5AtV6$zPnmcu%V zL8n?_dlZ8JC3eUT%1i(grBhguCbemvC?JHAnqMbalU`8ob~8gvFBgr+-)j|AP;W03 zqRLf>N{!T5r-P^Kf?6JZK7(78uo=tsTC{Orvj3!XK^nw%^?_plWp%IbL+7@**NECwiM~Da zWh;iD0}&ii6aumLJAoTs2gx=M>kD+Dh{eEbdT*+{ZeG_uaPpY&HhBb=r@;mm5(!j` z1orn5Bw!?%zn?+#(~5YTJQfoQ0DhZ1nn$Jq|BUOW6@raKfU6&?MLbNu7720$6-cco z)d?Po!4QX`o5ye2nD-mnc9F(O!RPgUF*|u*^2SibcOdPQOi5%fy@2CH5 z$p81n(qv85ITc`HO26A^Fc*Vgm_~W^m>v~Gi3(;wM>1+E#2ov5@fT z_{Pt>(PLm_>eS*$!yCAy{+PFNmS9AH!pJ)X$-aE><7%_3{*D*&<>erT?>*c$By`r z0gZ)aXyepn;FAnvGogNw`mNa}5O{=45o9be&}I?$`!t*N%PeOz5}roJGuLWi91Y~H zoJ`(PCYn@nn(0cobRSlkEm8q&qy$N)EmC;9Dsd)F`|t_crL+@FrYadV^ay508sF>o zG1d^sGCJzEVc63btAv#+Fh-RXU6se}Qmbj><%G4durP4&a4>Kbt^kss)-T(OI0i6X z+P-PUY-zw|7jJUbEO!>>q=Iw0hq>2(U2`(>M6TZz@#3sM(Y|-r5I19tA5dx9*!L&3 z2va@=2`>AtufnrZZx4z0nK&*$*KdL|*bLeNZ?zs8K`ST$)gpLDKoy>r?-V_H6ik=# zPNyRO$3mKQ181MsDx)^5&a_rag6PPz_>Kg6WPF*satNz*)g8ttFEw~@A7ErK!BlCaR;&_tK~kr*^fg_2Z946A zIzKYdOB}8yB(moGYa||TiaJ+Vr0u;ELdPCfV{@pju~&#ZrffkBExWA-(&p&l9e7`M zV%}p#JGwEPoxfAzF94f{#(PoL`*^6O`Q}BiOi4F9R@PlUN~cv?j=_d~_b~?WA7!xG zx7?aMlkIiNnc9soZue0&4O3W}Z^_bhrg2objcZ|` zZ%8^K;wVDaE9uu2y5(i)cN`lmwF6v@e3U@v~Ort((1XZI93P?ko!O5tGBVPNC#7ivf7sU&VY+$qy5O$ zJHfO3QP8yudB_KgB>kK|t%}m6@gn9rf`4>*Z|KWj1Gx3;+JNxSPXF}y3r?LcKUl@j zkV9B5Juz|SnM=drTQOQ_i!MPGL6uSBI92S3g?7)!x<&{UY<0doj@Q`4Ry&NoB>*Zy zoC@2tznM{Z$p>llI2_{ezRz}v2KdFwX)f|g+z~{~2v1tluQMS8@rb`TAucg`%!bQm zhFu$g+{w#&UmQG(1U`3i!ewL$7&ipN?R`tILBtlC#V72dpO?B&3C2Qjj?NRalC zVyWLfBmRh0tQbpn|Dk_>4gWw(Vy``RE%OO)2ch z-2`V+d>>)|9tdSjsnmA(G&UuBuH0S8r}K#TACs&%w?IMcL2(WE{csN4FZ!2m!Jkpt zzoG5^6jj!WZ=&i>!dxm;0qMg9k}w4#aJeWsfWPFh8;+BR{AY|^GW!wuPh^PAC-G-6 z&fVGjULfbkVNFstcLE$o2K9ZQa`Ej&5o;QpR*qlG1P6+8io^)~L?d@Rb)9LV#7(Gl|KB%-gP%mI*h+noY`nRa;SYUJn zeJb*Q`&$<=onMp&qqxkWv-B7O|6wG^!dyhE8 zCxw6b*L9*djr7Xt7J3SF+2DX73z2{K-Tmje`6HbrZS3f%Zwf?c{WV_xC(P$PsW_x~ ziB_R-kOnN+>?iVX>&03ytPNu13o3Jcdlw?dm4PN>mK}~Go}Pq zbP&XyZ{ITifca!fy*xhM@x2?%!x)0J9~-*R$H6CI2nc5XnBayY2~BM%e5%4yIdEZ* z>>4Mzg}0Ef)NO*JDbZY`&m|zjW$%?AiBJ9sf2bM|f`w4&4(H#)-Zcw+yuR@ewo8j2rStaKLVcCU0_%n z39Oy?cED8`Nz7ngHFoXMB}G;62Ys3~LL5tJy*%}jyb5z z)%o&DB~rJg>B(90~0Ugot#c;rr00Q(3Vxph_sMht~FcpedmB?{VzPK}m+`m&XpL zFB}=wcq`blj%dipRm^H9r_AaUI-z+ip1MKwr;nmO zvd1=J2rJ{1O;Gtho$vxaD67x8dt>D1gkmI%8?T>!9e1TjSRCJ;p8bF}IF=(;9A(MG z0@qG#+`r7v#`80_Eey;gY+MV96P05@U|vQ!Avn@dk78xQiI`(a#-WpF1|CsGW- znXpCdOj7QZNkNS#WY3Ii1n&C++Th5XI1uRL65c`@{)O{5pby)MaT&dZ_p9!IT*SY9 zbjg2)eF1Jil>zrw)c)NI<$vG1OAM@Ba5A?sb^MQxkt!u^OB4ZAo`f3d9Sh6Z&sF$e zv7AwQtOF1Qi|7PCeW+k2`I+Dxs_0^B?20_chL7qswV9s_#d{C>EWeW_ZDmo{X{O%H z9-!O6|>~HAr)v2EvD_(;MQPlIF13(p4tVjJ(ROYt*Eum=t8Vh`aQBW ze8n#gl}pM%fXe6jUhlHP4dY?XsP{&!)(6he!5bW-^h+T@d&bY>J4v>^$n?uuoe ztaf3`Kd)YmjUWD*A@xz^7qAjRi-9*_E)z8>0B;Gs5{i%UdsLZuX0q?q1fo;`j_h4?&zNa3u;Vp~8FYGv3+)+ZL{3+? z=tlbmqvE&lH|^3G7K(F`JwL{P#F~iaL_*>=@;&YH*wN;A(zi#R8?XC_4~FCgKTKvE z(JUKm2qKi%`qj&o&6*Id=*n}$XZ}%QGnC8D@IUm_ejgS6A9!lPh8*4h(o^Hg_!pj< z1{34hH+nLmXnupN%ku9?auJd8O?pR}iZTR8Gbzg7I(9z#XD8u$%Pvx9C4G%QNU!7; zC9q-FO!Tu-oVa1scq?hE#E7msN_LkshFEl(EdrPnG!>m1lQGSvjYz3zIya7;1`YvD zH4ZGXFDLXeA(rf=Im2mV*ZaUYe*t!C^;XG=1_P#c#Y)DUce$;GQa1;{#`>_DVxniL zS(V{Ss1`PHXl`;@(}tN4um!gqiIQ(;K85p)7$z3DZ5}v=NCVzgg?B5vEge#r)4DJz zJm!gvD}4#rS2zYE7FN%K(lA<^P4i#k`lLQNkGbihrRh0nwf-G#z0PhJXMfr|()Oo^ zQ9-c~!7n!Ti||Mo7M(=Oi3;Ph+I-Pdmi6M7LSUS~FbnGv!j@3!;~jkKNt#>Ywm%&E zI55uN3Zcz7kc!YqZX+la3v-aG8a!(!5={HWDdIcz_3*h|F!*qV9jpk{*o!9$G+aYI zS*)!mKd>-rI`_uL41Bb3tfJ|FEt}*x-y`9`0Zer_`ek^*E6fdd{xPn5)x{^g<(2h; zKFHP$8UKl0%z%3;zCY;R)3tUtbE_HzNioP0Kl`nu4cG9ulD0>CU`ZQY_rqIB+q+4> zTj6FW>fcM+`r>*5?Kq&aMQz31VxoLO%HlLGx{B#d=2Q=B+`(abk#EBKRS5+Q^kbcf zhv(nwqKuFY8EN=iL1HcA2rlS{m57Jsn8mo^7^4`NfPV&!J+UJKDI|i6j{w62WXQj{ zYv7S1P4AG1NRfA`P|e0!8#)DnVgA-&85laczbT8$707S$eeu3Q_k+nU(l3^mD998ci4X@4X4k2!w{#%zw++8) zOxf{84N#W@Lxd>QrWX{vl7_<8yo+z;x`Dr!>!M@fSuE-O0c?x<4cLa*0xZ`xek<3l z`fItaF|b@$`uB3(X2)8(0Nl=>P~U&3uPuM~ue#MXRA@Yn)h{z~hXghVp#Rw*fCy|5 zK%^?V6l_tdPHl7A*i*1_LYp6m!TqCK_fbFL3CWV!JE@Z96Wilkx2`O(TNk01_8_J} z$$%rjB4X-pO|FuYn|L_|0)vPM$pp(~^m`qOoX^c}sN+5sWHqg#UxxtTtu~-mGm6c0 zlC@n%FU(nUeey;zoVO<4K&*<~=Td&|x7?sy9>5z4{b-6Im=05-_y9KLsqvw;Nzk#z z6?9U{Mm%FLHAEW^H-^3-uh*353&-lJb+yjAyzJN942U z8)KQrhGM)48u#Q4&mc*F_Qr3af8)2T{>g6v zqMNur=WblR{-bn=uOYSk9nfI;ALzQ@@7TYPC;phs68}Hj?EgDm$2aqLT_^l0R>fRm zgKU){s}8@83%k;mm;64rOIQHO>l{d?=;z86mx^@ z&|KC>1L_Rggz3P02iE6s7aG%i>fmd3r$qj1n^efBe?2ukNpT>$re7{diH1AAQ%Ms} zy<(ay|8&c*7FPQxVtola)Gh~cEr`>udG#P~?m(Qe1i{#7i+1`)7`Y2t;PQnxl1&?T zI9L)jV1@}Vo|8nd{5D8|nCh5(o8gCRR(E|1RgB?gm=&$i_7Wb2-Ko51!A@cQ*$}YXe5~%E^@t@w5-LVz} zr~h0fYEUu7T>!gNKT6qp`S|)?=NY5?AO{LK25C4s!;h>E3b+VGe_2S;UU>*CxQthZ z@a>B6R~%V?$~Ci)G^}UpUP-BpQ%f-G9O|&Q5XeH?z;JJ>UaMZSFK9;y|d!g8G*D+T*7>`3WRtA3!NY9mUS?c1&xES_J8;20+Wb+IL{BP}f}%lG!`$K!9yn#^*O zLPNiB>d2`S<%`S5lA}X78!_u3dvliF2VQ)$4_a(!`3b8VG7`IbfQKK!?*?ZcLI_A& z2$gLycQiF~0g>hGBU56-fs~d#_k&3$-*A3%AP~-RK{&v5(M;w7rubq=qrYcpdGs<4 z+2}6qH^^7;l`kH{J1*?EWWr3Q1QHo=IpOLin#2}$@jF@EmN^;K_Qg`Fwt_7cs=y5- zJAL+KJcIrT|8x0Mouz%-C{NjfJR`1GEU(bjwbbW)MByofp?ZyKVtBE;SJcWR*)uAS zK#lfH+3E9F^^YcPS1li()dY`X))(;XGfx}ProVvRj+(CMMiFe1K-KIa_zb>M zlG>a_-U)~jYZsbNFR!-o4rb-!#5X|{n}z18oGi~rpj6l_LFmkeiVqKTLJ_bb4g`iy zZN;x_-iv(#X-R{Mj}B~?1#3xy13p}f8PdF?5FyBD&UzOg76^wdaF&}027HPXyRv^D z>R}LB=PESL<6)IMR6IQanpvQnolmmo^Ou+7oBM1*uVD8bsEYc5?(@Igqxf5y;9sn> zB9%WH**>s}ql-7m6$*n@fd?GLlhfD=$D#KC0)p}z^AR!_th8Mg*P(~rtTWxJp&bsN z^MW@HcGh}>`&%I!`*N1&LD~WD-9!g8u#oKu|6O=#;kgeC6UCbJwhn|)sO2=4$-Kotv9^%hPQm5=pSG%ck z@uK$N@i_$ zl7(r7gxsO04Y>*qo&xWp28f7Ecna;Ra>}R%f0%8SF!jp;VLt!~+ z@vCqqh3D69YjR6J5gW_g_g?Oe#JwtQ>UC!^9&f77^>P3HqbCz{+(;9d#hl^ zYp!(DUD-c0{B#_S02E9b!6stuoGx**atmKVL^*FSFpn(78|2>~^YWcjvPf39puKT! zaSOH`fo|Cs02yazzdxYH$t%h>v>3jfsvI@>%`=-hWu>(_g_OLPNQlO^p!y|I87(AN z*Y_>M+$Nfg~}x>Fj2mc~ z$^E-a?oSV1*v-z?(b>WHPk-!BM&93VJHzns zSYeY1<0LZ6V~JVo`L7cHA*RH{T6ZMXQ)Bu#4zfM}C?(alnwKB!!;)~@OCD0TQo2ym zb50y&loz?9VD>Nqw}CLd6nu=EGkldJV=lf=>JEn&A5}~9HaBk=UST68EK5^%uWFFE z1q(kt_2(}$6#-W56&!BO~-g&+})cLy8h@N_2?1Os80?4Xne@ga5nWZkys*z#xon+ z+T7A&LO#P#0wLK`*VgvHWwU`}PlYSwWW}b|+1FkxV(`kJbR>-wV zi$2ejZV6o`up_P7vo!a38_Po33I<1e9fRYQ`*`F$QV`&wx)lTOQ()}V4F1CI?Xm;m zMkmx<>~?d%e?^PadWE|qDWbXkHQt|RZEHRQxi*~i=d*+TN&Gz(OioI_Xv>asgUL<@ zHFmvgwy%)BPHT4FP$kC*j)vmGSWlJ~U-h~5+6c6Q7J@@M_8#rocW???NX**(Uwi@0 z{xBjxP17OOMwOn4cA&9JfBhp|7I@xqx(k#`Lcn{7```VN{ga`GM*P#kPx=C3_Y3fGoud(zSH39{TAf85XYJLtfp8RlBw6S zph-z2W!F~ zW%}AoZ*4cp zUSYjj&^oI}@n!IQStv7+4(z_(H0n1Phhfr9p*&lq*}jy{;ozFn?*UGS&aZXvRi&o| zORIo4+i=r)X>U6Wtedh!MfM0QH3u&dL-6=8-pLeXiqllCCZu*co;j^x4NL?lb&nzL zSvR|X%M}YElWRUH{q$`Z3nl%6RfK(){0wF`$v!Sq&442jpniFgNnJA|`m};I8f?RK zf{XjrSWq9%SIhjlk3=9&HjGOcXi?t=QFT&ObAEW(F?+f&+5#dg(w`yr6t`IYSkbhi zd-X8<5a_}Bnvt8~h)M$Z0xubmx$&^MVN`p!jIUJ+@Al@<<5$i5JqaWwXIKWaiO|?5S-~L+NJ3W9`HG=n6MJ=OTG!H#c^(5kIWA_zTAN7(h>b7JgYw zK@IZly7kbSRJFY}X#2#UD-Po%E+~RhznMg1Uf39UXU=VG)_a*68RTL5 z^@+og5lIKNPOCVOkk6{_0J8M*d2h~N$9S$~hvd-Osf$L4ir3H>MKzN6ze=+Mr`@LR z0;i?3a&M*6e}!UHy^}PLGWXW_9PtvZrg37+Fa8?f1`176wr;^+w9F4$Gi^nmS!8yL zl0Tpt#2gMBd$JOy5?4Z#18dSqK4NX;&p)LOa_wEci(pRAS5C?|Q`PX!czn7poVug) zrw`^XbANZ4Iw+M;BGVBWTI3si>quZ)M*$($BrupB3s-N17#I_pit5hAbBEo~(iJOZ z>AH`F;UPR2TMr=rib$a)3Zib1fXM$7;4dx55nnO_GKf@*3V+}ck8?)Kv6-;f)*+4% zLj3a6^ZiiI=yk*Q z?-DM0rm*Hs!Z8CSoXo#_cl_>-{T~Xr+fP+ntnSE(0a4*JUxGz;u8bU|ORP-3P1t<- zhk$#`ryd*H&UBpY7<;*YIOXzVWi2P)u>l8Pa~%D}xbV%5yp~&v5R{9A6Z;r@Uc8EFuu&g^CUTjn>P21d@eR73`lo%-BJc=8_UBNEL$2m)Z}nuPtfI zp6e#D*yC{3maT&e9S{2B*pq|G_2{LJja_LIjVnyzs8dwmMZUh=@#1sAA}VX$$_Xy_ zktlsrLwEbtB{IBh%76$-hDv|^oU{IA(6)XUk#z{4OjZ^r`;IWkGE_CjmiK3Go~G_6 z-l7H)9Z8C%9yFZ}==Yw3f4o|zyfF{{zs!^W%RKr2 z#ysIxm)>Cmej{-LHv^>q>sPgtgT9TUiLHY*oeLv913Lpf10$Whv$2D_g1+lp>g~@{ zrfg%a@8D<#q>vdq{C?u9lz<;i{HQO<$;I&UwIJa%HvxLswdN<_nVg+lhxCe0)GMl{ z*bB&{(iU|B_iQg<-epX`MN*uQx*J zTsBIkTlF=ytnT<1?By|1+-1h1I?=9yIWbrR0!!@IKUIbP<%T*|`l_yz@ zdmx2vm5yxk?8mbSFI{!WwO_V!L)|r>gy&A=iV~%5d)sU6(Iy>cBY%CV-?eApD_*_k zp+GS1aN4JatG69G#Ke0R8s4+i#AB@dHI7tj&*g)Ugg5eY~G6CPmTAJQiS13nOeFrilcp_D-<_J%S zGsCRyBj0oy0H(9a=y#nVkBtrVMkD&y_5nD>JUE=1*&UnDG&&Tl(YvSpAF&EImEcZH zGr=H;P#v7$;T(4vXENrYSlt>q?fYn%3ftP*DxHt^G>DFx7g&GF=cTb{9rN+r?a=Kj zMEJl5zF>SM?VdZF;uVS)PDILL=JWTC97i{k9r)&MWX=ZhPOG1K8g5^V&+aysfLkxU zVmXW#*_${lBeDh6USq5%Z1g(sj=|Um!#K4hv>WYkSbmKgM(uN)PqUR(M8OU+?GQm)sLZS=El$QVZztBHDq5qh(|Nc4uU;Ii{tX)xrQGJSO z#!0Dd(LT7-6v0bt#5Z>4fukaq#ub`r5Z(h4#+ldamTB5DRvrO4zshqS#zb#~Jf|F= z-@lN@+)c1rb0DM0N=+;uq@^8fq_sF6oV`3O+WNjr?b!uWXtvnW0QtGK4pzMj@W(OS z=$0PTWEdm)U^?v?2@d*`X@gbHh#E81wB2wEbPy3f5fdGbnsI|gPXBqhn`iI|g4g7^ zzq=$d2lGDj!rz|`qsX7KU?5@9K#qYL8cyenHdj086km2Z6x?2WIx@RbgEq^il~Pg{ zc?H4^92$=#C)&~K+Qu0URLUuTu2Mt0hzjSe$n4jE$_8&^VT|)Bw1B;b9@U z4eYZEp-fAk1BLsng-OuB>SQ=moY_2L0{92oj8OiuzQTsGd;;t`#!54I>zv*6P>-JTx4jkdi zd4hAM%Jip_YU03R-jf7LZBDOM+fBGrx{^Tr?tr#0tVfW=6<;fuiDz?@5-cd%nG%M- zAzgZsP8dVHu>7AtwUxxE?Ub^eA`{g!C zAK4iAt#V8P`wh}DyNG;zVZ&zj`lo!>4UxHWmjw($n7O2WgqjHT>&*Nh|6-VqOLkjl zLKfPQzbtN0!ptT8Bhth)ENj*(b;*5PBvgCKDsd^*WaN5}l(yJ+W7!T<^vE3dB0c(rsXdyF+)Mm9lx@Tj|Ci|vW%U+KFId#TQN}srj_*I-JMnXO6&64P#2T0d z|8IQg|LSJ^PbSEJ|JpfGc)J``D6I|UO3~X1!u2Tf8vMdxLQ@FUtlzh|qbIwR>Cb#l zK-~_0uJS#OoVb6-8#1}=#!3MWTnq}vy!C23San=>beYZR>iYGL9;$i^1On*1ZgJX> zWAu)Hun~9X3eu+#4Zu+TkX*>65FKo%`pxsxTFRxs2MTZ+1wPs+?!<(!52Qt2#F*yh z`}QAX1BU6DqmPTvq8XU`Jw9TBP*Blf$QU^(N+pF;^=2PXK~#NaREfrpSX=nsUWZ|~ zd4wQDnou7uZgZGH!gN5~ViTb?^R?xuQp1Izg?EY1&NA0mkDh}TZaduGTYD+Gvz3D? z^Dg-)6uf@e`T&;=PCtg8yy!S{ThWScS2%oTY4dz|)3Zrv<%q#Jt$N8$)Z^H`e=2=b zbAVnWXS-WrVqGuvRgzXoRg;~hkAzxlF{Pm_BbJL`6u zb!OG3hw6Ohk1&o3ql5k++ErQ?KVFH-3+L*5cyvroi*uCv9U*ac8&3SsDg&s+fvNHr zsP%BxUvGzD^9^JiXy#l@ti#mm%U&n&VgK04PO7F+db z@6btfHuCXVe!o%H-c#mI;L64^u*L-3Ug#E)Dxf;`)UnN)=vbAyMWa*d?4SwJ*tSV? z&yKg>$PZYyD_lU>DpTvHZC`Bj=)sNG-NZw%!HygyvBVWznnQNA!42UoE{yjQvPsPS zm{v1c-N-D-E3sHa?mK@~4aS2MZJuB4w)3DXxps#_9)A@i52Ca_qZ>uIK2^ew+-~Mu zKgORqNi-5zO4@6^6Q@0`r)V=dayR{jInjTs_l>--{|5FHvY}wv$}gs%EKzW0c{3w0M1|{EE5< zbgT~q=4KsnM8?dCNCZxELQz2hcrf0g_XDcr%Wk%NsZIIF7MD}@f@Iut&$u-G;Zip@ zA~MPL<&m>N6K)lqG&+MEr;aRxpO~lJ-oq3*h9g^)%##bR$;KflR_>yj0{IWp z;RcxNA42uv(^C@mhoo0ZUCAMi3=@@6Q4R$%xs5^>MTchjn>VjG{B+`x1obbgrk4a? zp@aTeNMTE=dk7BH6Cpr7@!!;=|5xYwpEQ;K{#a|OY6_#iK#+5Y%i1pGCrePs5qv`K z*0i*+#x{$BR|1WyYU0d<+n#dFJIExsc==Jmdp81!KM$!k|Mg8xqUE!UUvAL9Ff&cQD`I z71I`*oM8eZ)flKIcn0r)YT^KHjOjNu(fzxcFapYop~xJJ`$V9cm;|Z`aFGb~8q!>3 zHPpj)15Xzx!KZKOl;du0;4d?Qbb#xvSdJsn#1xmo2)njRC9!BqVJ`znc zs%%aeDDU67{@u{{rnI`ZRBTzD=?fT_zcC7;K-g6M5b6Z5z**AcE_SSxK9NPiy|UG1 zsRK6h#}RK#49io5G72x9yI*H5abSA7ZDni(RVDt4uC5Bp>fO>Kk;>iAn(QRnWq1v_ zLA;5OI+}US$_Li0xEDb@$hjQb$=GNhBt-FxnzgbHG_`2f4oPHiXMFm!@$x*( z7w)jzR37sl7~t?ImX&zy-E~FWm#sZBKVD`iFh@Ahl$AcrJfz+S97N*T-FA)^5n1%R zKO4ioD1P!`FPPWuVYp!FL?VB&1y|c5)}6~F>d-iw=&h?G-)5>>#P=^i)mp7kE>tY} zM$fFU(#TdKTDtI3A-Q$Qv?*C`n-|__5z?KuzEGH=8DMnrL?difPYs1rFnF64wYusW z&(^=N%Y}};&4pI4W}mqf&4t9(kaTr%AD#J8OhGiW{>y`j3=9T$F9(@j_~9&va7aN@ zEs^QY!+2&W4cp1w^(UR|alstmZ6tE23GlW4pw)epR-_Uw_W^IjivPJhM7P+qqhpSA=n3Am@6<(^Uo zL(E(TL`rEpI`-ptEpER*Kd;0u@GO3Q$En0#!t1&XONc zlF(YPCXQ4avR{oZ07luRC+o%XLY6qLXMCX!%tyW567t!CeZ~yl-O-1FYXu1vRA3Cc zqAvcVsN++R!dF!CE$)66`N&4Dh11^2&hG|Zb9~6xW9gRF%NB%x4xw&S;H%?l51s<8 z$edhg+a@XY@((2eAkh$F0KRc<{-;X9(a^!%0JuwL3haAx{D1k(R#{gB&Q@NvpI51xJ>ZE)j zv=SJE*WXOGS6tHUXpZ9AiOdgjC0;W=%wCjUmu3pe{{kZ9HeGH9c&W6xG_FzExpl5G ziY1Hx`Ym04%1WD?Elb~3+7+X2xlUQq0?>JsW=vLg#7ak|t;v+7JX%e{W>R80F)1}U zMoMR2Vs%22y{o*=n1$ndY;+&4K5Jzv%>-vtf`Mv#khYy**0#m+ZRY-ys< zx1spS;pN?tctPqr(FMxTjih>@Z8$Vbjg1tc2JD`83i*g()NB=J=`gq_aOj+cNpt&T z`er69X|C4ml{(i>1-++3N=U>Gngcu-2D#)C3`n_*{Rz;L!rDqpno{>L>I)W1*WTNN zd&cz&O-{4Q`mixtQgXW5lk(f4reDRh(xZ*f(K2@0)QV&(&TI2_cw+r(UVNL7$~>B0 zEQ_3ViV<+uE3^Uk+rIQl^}DlbQ*bfF97yA5WT~|IT`d^y!j3I4Y>Bj6EXL7C2 zBmv-eU4r$+7!-zmDN0PcjTuK8#|y{KHVW5{A(UklMCDfO>F#TFKQ#O!^yycU({;L9 z`LzYAxbk5>Hh~XJ3Ca4W9yXp=tbauQ1v*Fh)B??!9lj3ZvY*bj&hPZ9j83H&`7-#4 zS6grACHI1whh&7YPIL#cr}I38%T*qqq?o@ot>C27pHL_fWtYBn~oM#>}3~nHPp0bM-Gg?LEZaKLgyJ!`PqG7JPe9eS~{W zAKVQXgC~a*3QOg^V$8<~h?k1kCm*UjKbNA1K0!Z+qF*529DCLC`5zcxjy+^oZz3hd z8gy-QU5-C_dk4#ad>32ESN&gnYdvdyca`($%ipC+{}?PzHFUxj|GCilACjg2&R_X&p(9X+ zse&Y0o1~y6APP1pja=3IEzhHe_EKq}D4d+CANEE2cM^8??I$0E+<{vgB^U%30a%uc z7q^*~llqg35+HEu?UMnPjvx;}xV2!Hx|#~B?%3JGF+q{U2<0+W1WVAw1G(reLKjfxp#QVXSvVE`BXc+efHKEp z_MR))?{6|k>fgv5qt#qxVW6?U4>b0*|L?ZxUyS|#K9?qFZti4iZus{HXaDsJ-lX!E z{5ao6k>fs&7ARe+-ZzZ(K|03-r*gF5VCslCB_wG0Sc?Pta+(o@$9AjVFnWQ(NQAxO zL}uBPM@ow#Fn+7)*&AHj*i%o0`rV%>jipDxX-n#g4#@4!TBDCx)si|Bhjq!+7c`Wo zv)T{Y(r}ism16N{;^nbW+I)hD+AgnQ0cRBl;i-xpRDm3wX9;B5KW(qrJ$B2ychZs| zbKELGO`}|Kq&8{l+Da}$tN^4&D;k!kC`)h1-x1V1cmtaI9rAMBuh%cV? zC?7l75&J)1wG)>yp3dz~->|u3$YnxxkQl1?F*r*-sNdM`B<^dd-5K|rXnZ)>p$**E z^^xtY-K7~CC*>AH*1RbiMB3c*DAypBPHijo zdTfXxbZ4mmd)xsP%FiR#Y^}J88*0u=3tm50g^houhVQLum__$Nh2XI!8a~qctkdCy z{9KNd)9N9FJ7d3oNU!;o=}C&evVMeLkR86KVsAlr^x<%V+qea{9`Yj-MEOAC1a6Bq zA?mQ`1^YtzqFcnAnthr`x^xb<*Hniny^nUydyD`D4KeN5%dH?%1XFUJ+?Y-@1H;;K zo>}))S0%uhgxF7?)ZW+uPcj+L`=stFrc=7}5uV2bw-cG4i%B+nvm3lTBj7gmSAVFOe2MfoL~ngn#HiNma+xuQ)8yKvX#=GnLw9L zRaMMXrjS2WFrA{YW*Ty5vqeIyt}IW8Ez6Z<3^hQHD8YNLHAaLl?e*o)<@e?9i2zV* zN27HB8)OT$FRF!QT5f_%u6AVDhj%H{H@bt@tHej8*X|}xr7LbYO?Bk51AEqT%wDxf zN##SA^;boBdZc8^g_KkSc_8gp8(CH?j(Jdg8x%^6C374@vqqQ0Oi_3b5PjO3=Fx_` zJxP(L`&*fN5?-RZs;H*o3#gV;7&9@KMWbGpiR29(wZ^f!iH=vlSoo9SG@(+SE7-G(V*JA zwmWYwfQ{x1if<$!-#41lYH3|{f#vT725`qMj|^PT(!9JVRRC>c^wgb-T;GO=cwfi9(!7xl9z)bMwCgT*4jlE4ieTp|k{7N@W{EmDzY0bwLCHcGb{HizD{O(&_wbgH! zwPian-Gk~d-9YTK^6wEaVl{j9le>AC86|Us>qC0si#dPBq?StzPraoHk+E(GFZUNq zuuCSUEFOtm%g5EtH6!`~#U2ONLt(J{<4&0lYCbCUtzs=Ub$xRjp`TXeB7)e{{PU(2 z4+T8gQALm5v|J_TMnIq$hA64_5y5R7TC7vS=(gVM6iq+I(x|m2hia);`F7|bFI}zV zwM%R!aV8&#qKIfA#z~th-^--1oSf%rQR*f6kY$F5kHFQ7c8hBbvVwC5&krV6?5?Y$ z%yPNo<wD=f!~Va&hagme9ZflE2DVo4YmgxpBE;*e$DA^%f)y73-m& zIgDr~{XOK%TA!Hl`(8T?C_0#>`{>rv0{!7t5j?9-2c#!C;lVxJ~E` zZrQo-B%(tn#7!_^UKhko5#g=~{B99po-wLJMWEc* zUggYh)iCYvAf?tq4{(i;{(|=S7*`Ohv4~eA5Y(rU?;=0p+JEMV!G6b&bA+)yEoy@G zJuSf;TaYM#V2J?0w9@_EMm{qI4>rWevt2&pFTiY z_d?}}3Oqm;ddN9^b31_+{u~~{1UM-_KUk9UPJuP?>}y(l50ZdFz2HwAb(=FCB^?4e zlKS2EK>fms^8x;kV{kMiH*E(v23>)-!v2FX_}3SRzbhL4n_p}-O=nbbq>tg0ri4zs z6sDL~#Dme)V0cF;2+&nL@_HinG#aqw`Bl9Jt?(`MxSrO1W2W16m*^B zab<#pRJ5-Yh(tS8hZ~Lojw;1x+c`N`IW^v1$Fcqd?=X3vcSMlH{h`cBI73%RuzC%k zPSCrM`r`^P*>oblR3*{Vc##EHMsy?hvx)93I`9SJJXp6P3x1zxNvbo1KZE*_%!?{0 zGge$cVub~7D5I!sIlJFlz)@*PRB5v|?jYwmW8GTZhYUr)Y`efitblEgg97Dp!mMPV zJKkvOPsBr;eLq|)D#@BGjk_GTm-eHB7S6-CgvNn6dD=7)U@C`k(U{39BVLl2W4wAL zF+E0Z?|xzXb+)^ui)4+2?reVOGoGuLvEEBs{jsRogV{jj=>f5(rIL>Wxw znHSkVVtek?L8u3fkf{uEXUx*pdd8a>32akKtej8H z2E=T5M0UH#7$i{AE~~){jci!4H+wY8w^uVsg}5gPtvCyi)Vh`{EU6Uark#1Hw`p|V zTNW#8)@;NB#HVI=7A-Lto3-Sf9>SFjIN!({ypyd9Yh0|(5qoliAjYyrom z*KVNJC+^?@Rx2a(JFNo7yiG`^di;?h#gV4R0x*koO)*c6Vomd^_(babu4Hwf-6rP8 zV2qvfCobtMyc0E*P9D@IHlgpq$=u6xC(JU=tKpb0 z4k|q`P)l`O%{MfX)Do2$ghIa#RfwWQQ!X_;E(6ffz9EFBGG&PG<`i9HdMbCUEYneV-md^)h&3#ZUCfIRem0eU- zR9b~Equ1SfZ>98EeU3M4aOIuxJ71q&Ugn|3_ zUBT#ds+0M7-05o5Du@VMYa@GSXh&Mu`1R_7`;flAh(I)x1mdp>V6_->;LHi2J??&K zBk0c{&cY0n$e^J$a?91=%Nr&c_d6(jcfT0OU5)LTJtOhTDAR1*3`h-sAdA`q(Ie^? zNnr2z#mYBKghxId{fsPrLw%oMl*$ufTvk-W!x>{IwyHcWFX z*9g#qH)rh}X8nj(+({UBCL{r6pVLc2eDcM!e)bRl?d6mW_4}Xv4OHR`4SgV>VH^zv zMD72+P5v!F@^8;B{+p4i?(TuNg#5c}L9&CJu9-xe95jfk-q*@KB`}I^OcsS5hGIh^ zr5sQtXKi`8bXnKo-Yf}9h4#4|5WLM(q>!Z?MG2ix8YkpM#7ESX>VM};l)kog|9#N6 z9wG9rdn=ve&70-^cxux7Y5rWE7d{XDcT65)GaN-ATs`u|FafrAx*qMpmdp;xUKg@T ze~N=7m?~U%Qs4DK-Ip=4w-~>?nE0_oArt^zB|V`y>ZtFhzE67VB=&{_n`Fbv!MiNX9RhGS|B++00i) zUK}LXhO1r7SH@mFQIKi;lm|p5h!f9f3-S}sa0@fz9>HgY%ml`-tx=z4zEY5kxOBqg zjtIJ)LL-a^2UC#ok}1rUm%5lo3urd_WeT)z;4On4lRqRiQ?alYX=*PK1(7a6vy|g( zs7RmGF~IQ@w$sh#N@N&2F3mofDM|8F|42!R;z`MGdB07mOwp+uNNhe2aSBh#@+^rO=&uG6aWclBoN zTGE{w`Q*gk<1-7<;jCjSaJypI#T-izu?LV9yp*Y!P0E_TD_#)ueVSb+Vb?xMFQ>5} z6AzY?ujzFhSdc|O&4^YFWsu?a2Fs9w<_H9F{%klg)ex#dc2a48wD zFkO6melUXqC_)-GO}XvtTKQ@e4eRhW&1&!z=tN02`uPg|xJB~3a2YDs|5vDu% z1WYc&kDLP-%4cyJdl==PYF#TYQ==UryYxMXLc67P$A zt`Dr)B@1{=V09q4IjHn(bAbFnV z|7cQCZC{@;kC{9xrZTW_^L?J}rT`SDdkRM_xxMWZIM6Pyl-3hz;Ywj=9f=)umsZ~= z6IU2}+BV^wLgqWNeE!IUGZ!2{yom@T+!qJEhxK*pGA;LR(}Zc9mS|gnF@~mN+mE95 zKnLdQ#xI^U0}6F1;Mv$v2pwqo*yfYxq7A1Cf@;CUXOwSHecLY!_=gM*SQ;gNX85`?&bB&Q4hVO6i7&AZ1~;4((TtyRcCf&#%vj zBt?Pa+|pcSyRo#2KH)Wc^0bwA=y#9Q&nz@#tFNS~1PnTT`ZqZEBrqQlJyg#;ANjkv z&#ApBYu(86ds2?+*U@pi=m1CupWpw8rkYiNWUTNkz!@kF}Ph2iCv0vux; zVUz%Np8ebiP`07tIa3|tG2L6&#=Cvx?z?4c;=_&ibBN2k|tPuuAty>2mqhs__mgavvZ;1v7Ifv)v)U# zz`CMsC&0Xui)rJY<6?yhw>tV%^es9tjN^EAuKVZc?_!xQ9VfI3xE9}+eEJMpm$n*( z1xq^7wME`S+J`sP%drBBYnNQpkq41ZY0-wZc}B!!fi1%*3K@5p&?$R6wBM&HAT{k- zU$pB9@JXqinH(4jikZ(fawcu9^z2S>fqb2N5`REK?j+9-UwT%i*Xv3Ic{<^mA(zEm z>2ng7SpR{UH?7wFhMHtMK5vfU!78#(<-_3;d5FJY1#fIKx3w+MD5%3yIHH7kfB5ky zZlhP@eY>~||dUf$llvM5Y#jJsPXpyn-*GGr7h`Wrt;U54zoNJUbXx8}Fwk}{9 z-4T>&|6pmt*`hpusZp&bs1;9cET1kET@<+#0*NM)SPdNMQWP2glZZL+tQ~J)N<#^y zku6AFHKma+$eb$L9KOH_mNWyy>?%=gmaS`3aWNFm_~2BZ4e!&YLVHA68Ln-)p=Zq7ycHHJqH&Vwfy= zRXn_taKaH*%YjhqmQk+nQ{$dyRh~a}>3p;R7A3( zPlR=uth$G4#UajN1j4V>b-3mW9pO37XXORr!bg994d>631*fCEygX1D(E<&k|KUEy zzsqp^m1q7B)qsEfA^)x>tBfa#<%h#QSr3PVc^3d3PKuQpasg^JNQ(j;Z{jM6)<5iH zVB?01#mv)?ekQ7LFt!sPWSY!D(`F-8t|YH@G?u%&l!!SIr0UnX)le%iOlnkC@O9ho z_1)w3Z2RT5rl#i;W0brRXAFyCC&2*c^e|(9vtnod>lo#9RH*( z*SNcIvV|$eV@!Zy5&aw@<~Vee_D!67M2J&)9vPT3TXX*vg<89wPL>)|k+dLIC6 zTcEa-^M+O>C-~PXI(fAD`Gc6AU9aMY@tfV*(b?Tu2X6D1JG@jMu~EytRNWEG2DxzW z50n<$JyR^By~D3-Coq%g|e+NXqC(hEgN5wzEk{)pleV{vS98q zH8R5w6Ca6@c#xGa04WyNo>s+fw48Il{y!56OI>))|=AsIs{|V!=>6 z&pa1-g554$TW;ytLF|)GheMf08E8bCrZI>z(8t)>EP$8Oi=(Me-zw6nJTjhx|MYMTb6j>Q+D7~_RvGr1CWqqGgKeh|CahI==+Ln z(r(!>+1yNVeGEgJGSXT>II~^mjfyLsb9v{D&xC8zmO8mHy(k5Fxu2$R7Q+~{yoEA2 z4LLuEWWDM}>1IKb0rYwYK$Tk?6$my*B|JbFI9%}bmKgf^$}q(c33|KJtXl~;M$z*{ zC9%eG(z!zjlsA6#k~A$RCsYQm)XhCbq^HJ=Et&ZO7FI&OQ?Pb7Id-m$TzGtWIk3VM zw>>>4hg^>yHncO>r@+YyrJw?VqCQqDMv8-x$%S0V(z4j({0B_M78*KNUO5JuaKoit z{q|cLt8=wmb(ZZ9V4T#5LIimQ;~V>+#MkuB*2EJ5uJmr}BmjTRZpfyChClJ!-Dw}w zD}jPPyupv7{70~<`9+o=Po#w3wpJz>6gG;YbtM$6AwV98Bz;+4nUHMEa!G{TcArfA zJM$xksfk(F3&mwwnI9CTDp@pLY}Nh`&A5Lzxc;U^ z{sGSY??%_cWO`adomoU*HEdc=}mBGd;GMNkmcEcN2AJBJY zGnZk=o0{tb4~}xtMkSGr^v#BjlWlLi$E#-jZr@*UUq0~#-p`^vh%K2`@hT3%C0NX-Z1ZK^X;U4F(kqYhSqLd3Qb zhnsK^$F3;klZIoH^v-6f07nWMX1ce`76EATgP$n*b_FY6HR8U>eoZ=;@jVl>eVrr&tiPQvc8 za5&8IQPCsw2GDr2U;|vy<%>u9B$eoAFcWFjWAu$6Z`F&$M*;|(wS|UQ zc-3z~E8(^v6B2U{943DH>KUmH;pj2Ryw_xY%NKl%Hv6F_mpNr~M|&xFaT6MlFV`Al zc$DI@km!pedp)Fmqkg*hn|+AUV^J=@fxK1Q%CsGGytqgf3Yo6ej3hY1cN~fRGGToh z#%iItMin>@k%g5X)FWh8ZdfEAg?81gV!zeZXonfjYEL?rmX&q{=BV_ha3Bp8z#`g&EGL#8vx^@^RGOU>wcJKGQ~hNCI=s9}S75!ACO zH>2fW503w!@)9tIKGP_rz)SOz#EacFAG`fxmKMZz z=(Wx$#)L^-0|%$$7EMty`_K<(FEJO8p-R%}f7@cQ5*9nP$B7`mQhK3RziRHElHukz zF}`z!5&gpdNB?!MQI-}N_+{Myng{>Em-XM?hy6ESR@J|jqcEstg*yZC3Uow*m8^u% zqce${VU~!c>V5DttS{95g&-ENI%%*Y|vUI=f$2#$5rtBAMfoGoO*gyGr({q_~ z=y&@)gM9%WF_!yMzSkLpCWD_SVLeLeDL5cX#vtmbDJ~OVP03Yks5OQS-yk(@*;>J_ zubk)!zmlw@z+*2GA5A)4{Sjr4)D<6u!-xvRNJ z<+!7E|7s*+xAAGY%JY3lYklHIZAbIowxrqr3xaNzAe zFguV*g=O|=%vx_ZrVcmeKNeVV7MZs%0b1#5aHyM#g@6buSgf_`EJMN;Ss^4^v#-6M z@?FcI(NtD>=2_Zqm-H12BC}q(a$i&wjJXGUNcM9}E!I#%0Iwa(1KUpi`eHBs(5d~j z28Lj7OPGp6(Ti`%6ysyZY%+JU`)A;3>_ZNCTAI+Qoe6|4(qFxgIz!!+s{{Tfm}IF* zqf*u#k*4WCMMt|s-yqZ!O~P8%>o08ApWnM_9Fb7_R6sEzaJ)n}!=&)sU46qfYG0H$b&=MGe$x9UW z6IO&sWHcCloEPzkLq{29d>ojx!H3TdfbEmI&JT_5V;SxI-DTT9D?S%r4=yV(zu*SU zFZ>6!F9la;3rRZ{Qzti5yZ=4404yik1CKO+lqg^{SAMssd$e1^Xif(2WE1qQ4VNTQ zU7)TpTaBrmV%BzdlYAHF{{c(>mu}*418hEyAX6*i$!qpR4j0Q#xBm-FUZ5^MW^KZ7 zMGRZjd238GtDVR%Gn^LU?(|``!%1-|!Ju-(OroE&@p3n5MDYxZ*a_a-bp~nQxs-Sj zH{kbr_Tf`$*D}nVTc&*}=HG@*W}VOm1g9R?G2FAC@*9(f@by>KcAd+&z5F(Qs7M`c z0gu+!=>aO57(Va02gBjX6TrCskR;QaV1H7L?5Mt}g!AH@#pXW@HMLjHyuwPa?19MT z_~|^x7fU=7Xk}O+1qWM7;sX~;E|cwJ3~3I>^ZSm6b(DnR!S;4B9HEkN`XQ2{a{wOL z>Khm?`?jC&feC|tL1?|o0R4~PCp$y%~kK*zrX0D*Z@)VWrNK65#8IK1{Vg!8XCmdUbScaw(ctvIos^qTAwo(R51 zo1S#63RD~DpnMTVP8`6Cq3T(THQ2eXb9T|kAXWRGXZ3FV&i%5!m*2dw@ z+b<-Ed^v^~!E5CQ*#OaVQI{CjNKO)dTR(_5v^K= z9b;wY6BdAxdK9`H(V5-2)) zQ&N3VepP-yW9PnyTjEl4$ zNC2YSFI(uYxUWfOQZU>>4Ydt>`Cir$*O&E*RrKgn$I;K@e@|P3cT!p9z_po2$`b87 z=b$kFV>O2e?z+e-*bk=~X3uGSQ@)vZE;IY>uN^-nwR(nifOXr8&?O!Jd@SVzejfX z#NuL&cmmpTFotAr*-@CQ*w{9i955qsuCO)wnT1PQlC4ZXKcQQda9HU|jA?`UyjJZJgm}vFH;|=utK;0b*{k)Y6NZJ={))u?5NF^ilRjR%AVH84NE~R+1A~@KslOr?CxlPWLwvkQm$A(DKnjmb4;-*98udbA zs9-#!58*HzK9k89BR4qWEMzOBk>VNIMZ~F?a!vR=&M^js>95*0a(wh*;&E6IlxK8p@fSr0`6`FonmVi;JR z#dsB_>&_Ehe(4#EFVZlJ=2yA2wa$Ci2wBqJ2cX%pLQLh3)QcD1o!|?qt&9U^can4B zJ^AHRXc{T)7CKBQqBD&sR12z#>eJP~!}}Mpu`+|U-d)^W7@ReDFR;&~Ka2Gte$Ox4 zgQ-E;#=y}#S;L;j%x>g0sc6(9a9G}_w#L6aMbc0Q$0bZijhz3PfDJLn6aziHa0{`G zrlAU7Lyv%OUw+HBGz?jEj-x45O+A`3LM)lr<~44`$S?8X()qn##n=#LIrsh*&(dR1 zPkD9urS9`flxJTOHvToG%Wu?m)12A#*R^ZT;b3aw0Q`Fs7CtV1RpQ&E#s=V{wEJyN zZ(XTk0BE#dL5iU{>OhY0TR?%O=_1O0Y|;hrPaL#c@$U{fG}r3`9h*;=Ha>&35f^?@ z@-99RGa75${3Dp$cDvH}`g_*+JGZv*-fpwedg zc%YFwxoWwemW^rIQXRTgpVG%`W*;okEy~zq26>sau;IJ84&^Y&S1hofL8KzWXeW9Cs6r2NgW!80Tu8j!eDVr`{1f zM&|i&5qQX~xP(QA-Lj~?1C#OQfwmOh&{Be$D}J#1nEtJiwzC}7f?417AduRVnWOCd z(B2YmF*mSVj8ULN^t6H`}00 zghwFA734S#RSVe4>k8|NH|7T?f8GB@iestQM6-%^ktTxrb7_u^tjgA))phRYqLjrW zpKV#hDrbmCNwBPJK*_GXMR{NNx$Ayu$BsK2xD+rIr7C3YZ4RxyZttY}DK}iuulDm) zn89bYxZ$6x!D@|hkyERpmtVqV<7W?wSY_2{r`rX$?NA&uo4<}O=dQ-|)P4S)H)8(4 zsM&Dp$>WxAmWVZQ|Dal$Cc@zMwgG&LsZHf=**Cu!fZa?*yIy?f{H8VB9>Fh$usbyV zkwh12aaL+dXLU7it1w^)FA2|J>7gkcvGL4M|G>I?eg7q=SVz|1@B^|g=+f!K>)E>K z5wHKB;o|p?ikqDOwfg=Cd&OU)yTH3JHo(e|gT2%L$KU)L?fH+pZ)Fo*a{>Bamf!p{ zX;f5HEfUH<%dbnODWwGBjXdw;4;RBj#k34CLUmctRRB%Htx_9TWFRvTQ8ump$+0c>=@rUwI?A%rY#KKpPXf(X_f!Y4wi z-PfH6C?K1|BZ>kdXCHgOKU)j{?uwl<(G~Nv-j~=$vW3(0GuE*Xwn74iJBd}VS-u}~ z4Ysz$j}HZ=3po~AI5En@vafKFsl~-l)yOtChpzj8)akgZyY1TDU(bPm$Q+-p6`TH$ zIl#V0^xGdBMY6{Tz5%UO1FPCooiAg=<6+YoxqbXY$JQ<-Mn@?1E;ye-st+LM;4mcr zM&{67OaCjGBl_>j9Oiy_rWyrdy|$+s`K^_shVbC)F>9+B;zP2V5z_2+G7_q%QWrh1 z|Fr*pmh8tp1^OdNz+T&bAkqHes;sKz|DM)$M+K&J<(OR(&Ss6)ofHLNnhtZCK?|r< z*R`TZMYVCjM0q6<&XUGRCqqPad0(Y{=EQxlQ{3qMKoCE^5YGCVfi{s9yAD+)H_UuY zcjx-L-R&O{&U~8O%?BtylL86=nmTigq4LJhGV_&8lhW;ZMvB5ZFuwF5DWuM_Lzp-K zQjLV&RO)JL35jl6OHuj>rp>sANVSdq&DXLUxjeC0!6CXIiA&AqD?r4sHw~zal(N zp-1T0RD22#*ssc-)kfS~CmgKg$zB{>d>BHeFQ`v|48BcHxL^htKZyN<(+v3Xf z=MQFAKNxET-75}0$>7szaIc>->ij08fOS1~o8+*7rI@srovw*Ly!u3*7zwG0xU<>R?U$%GHKBrjz$y9l{SNh0qH*{#%OE;% z`wyL;>Ggw+8L`BN>P6+0t|Wlj#Ul?JzWqclY|4%h;;<{pof!5U_NrjvPPqy{D+ljZ zM>lByHArpD3?+!)g)p>*QDpSS=^=r+!~{j$r}Li0scjMiB{-H;%r`2Uia&-tW^Q`K zk@AyBINz}3R<7t(n6zstL_rlq74gO_+9k3H zF^73=tx>BJCe>7xvFTe{$XL-O@m@Q3i~?{s%~^KV#+p z0{htj!hW!R%i?6%uFfZA!-|M!yBs zyYcHGDcG;<4lc|pjLkXtx?36hTEzc@%juUHNAX5G6et(Pz3+YI&g9cnOHcY1A%p)L z{x^OdC}Vgx8jmkghEc&x5qvO8^H-`jd5v#EtAt|Fr1)_~K}1CZWkXj;1Tcki`=Ld? z8tgiKX^q%pqtr^YMBJT2DV0tX!_4%3Z z&c?z9ro2^3HY05&E;bWwl~G^qAOXpYtaa9TJL4O6e=&_Oz*(^;`97(@FIx4@TrNv) z7}u`WVAZJq>biB0GO32DD#4DzCcbpKwzQBOF39L~vmOlH@;n+slfR2{$Qb7x6)w6R zG1+iH)`rZ3(pa9+<#+CU{I^X|#zl(Qn*(0GdbX`_0b^M62(x-lvaChgs}gO+tWOad zJVy7Eb3}SBpdk(s1mhC>P?Fy8W&!y8RgZ zeD5wNhjYvql}@@khm4d_OK@SOop=dX?&ic3%U@ekGp0Qh-c4t#&EdqCv^*7(<8LTg zKp64pMo`HvyC9*82N*nh{koy-Y(Jrtg5-z_dt}4XU`xdqYW{c+{L8|)(s`@LqPM6S)n$@3LVTwq;E`0Jc*R&$Y#}koN#JmTJTghU` z>eVNq2PCaiw_I1ei&Im~P3}arwkCV;=b{>q0V=yfWjmOS$k#O-n||G^!(Kutlo$bN zb9GV$F;#5AyJJp0Hcz4vW%_)x9ns*>3W$sjV&@5knFf7^{FGWx+#uP$YUwhP9)9MY zC<$k5_;@j=agE(cy;E_GLn7Ko5>`*BmKS8ZC!~~TF_Fx_=7qis)mhbYBME97FfBu5NTw*&TT7(8Ur@jqu!zRg@6>?@l_e+* zso6Nk2*NfSLqfM@zlVFrf7#nnNA8H+l$V$n1obDu=|_5td>31lJBhpK=Q9}?tS+v3 z=}^2!{BMisk6$0b>ln!b6fI)F$^9Qp?LU6Kh`q5Zu(tKT>XkLSKM&grMXtbxp%AVG zYXADOqjXkqv8W)g0$2qaMpK+Rt7GV3a_W9v%TqAsrq?n0`uyn*rS! zU7wR_pZCWX*l*;`Dp`HSc+}MN2N4mKttkUP({@G;$&M?zs)pqF)GA=$z|Y}Wo@{3j z2pLTttU`%8{uB(`nlHo6<2TUzq_VHkj?TW6n&JdWCU<9x3;i7lAQ<}}Pb zYD!Jr%0}|KHPn2+Ni#gK_X~h%IS~&a zBiOj@tCGoZx%@`x2yf0bq9FNs#cgOqV${K0zYhS&ETdv%Tbwh{kb)265HFM^72ra@ zQIQz)4sJs?mg*^|CZSk#z;$Qc93me`{N1PxcYpge6XD70`2H%ORtVx?MtqWyW}x@c z3;#-lbzim1H^H9ac9!_v$Y_=Kh@8`Cms zTK4p54@nmOB(eUMixKT7nnaT@LzvjL>@V4XA!`wr9M;4?R=p4CTUzT3a<*htBqh=k z03>S!^p;mMvd{n#yZSaehyD64N zUg#!~2*oc)gK8;KF}&&M7?91O>~}x()`b9Db(*Gf;U;vdk%KDAgH^iP*Rbiu8M%6) zm+xO6Z%IvSjTe>nIUtjx@HK?g`tfw}TsR~=(x=BQxUC00d#Dq*8~4UwBBM-$XD1c( zgW+Otv^DLt=D@(?m}0>r$PUmurD)L#hro#r*qDAW5a1t{l#@a`XoGk)3&0O-E0ss& z-yk`XAGjhHcpORR1tcw*I}8yY;(}tYLRrR^^Aa7%2Jp4ed5k0^Bm+1Hv-hp~1-m3XVF4w^f#arq z))}79t&stl946~j7`Hq3JB)Cu5Z2w>P|3CyOsH19nsnJYvnDyGq|)f5m971kfC~6Z z4^n?np8JwvPi-4w%6^OF^W!R6To07I?HE(rfFRgep~|o1fbh_7>li;oC72VYXMJl4 zFZa}}bero446TlMzvbDI@>!J1>v%K2K_f_*cw<>TCLbx}1O>5{es7aVw3+IHnn`}U zL1<=uqqd2ZSx3;`kX)zN-slRG5_$n(D2mp%ZzygbRXMW1Svi%xBXD3SiXWG@>-wqR z6aOl@zFj(*RS@2Le0_{h8SvX!2uKJEk`5E*!h7WTRh^4WIZ(_a_xN6Dul*i_7t`2y zJd0&Dwr6ol@O|8ng-IlLr`ONJ5oAf^fFDnc1axo+*(K2}B`g{_|3JhtOJmMrS$F@E zfQTUOQr+mB18;!vbTId{9-B|T%JT39D+YBTl_|)4ELE8?oZw-7;{l1nA;H6L5YYpn z)I#6LB{gRlJ4v}}{ zH{Re<$txm%f>-~%#C54x*SVUQM)Tbl$bVb`rof-b&HrWnc7=MC(%ifJDH7Ad&CQVPC%N+gh&RkjpYkBI}Lryp~RnMj`GxKjX!iCn`DQ z1!<)j&a`-U^QH2cbG+Z4Z@7aD?7~bNa0b)BRPSd5BI_XT0g^a`v67u=!yLg4CELl4 zM4(!VJ5l>}sjk7}m1fC*CeDxga;3xU1tcMokZ8S?OEy=pRc^P3`b3z)R@NLeH%=Uvq)EL>#Ha@(CT3=J^dbFD)hVlPc8~%{8#IG1Hd>+#?8cCk zS(I}Z{P<~`ka>giUm%f&pg$my??8|UlldQz$UG1v@=*|rQt6XjdD^cD$iewFSoN%c z5|cR%8L!F|O(8g0<`JO@sMhj61XpCD;5xB#tnYX92(XwTy|e=&6CLW@U=rfeN)nZr z7`B$Uvu%F_6=c?fyNCCDd0FrCiOmOsL`2&TZi$vt3=ctmt6C9@3S!cFv)CRF0U}N` zlx{&M{(wZ->dG=b&kG|`HPmilYE(P>v;pFwPv4jt$CssXHfc$7tEwXKlI7ptfFO~@ zzkoy>{t6OtyO{C>fFlrRmS&)%{ zgGAh4z8%ij=S!hJp zVaRdL@}UXNV&Cdv&OkGq8G(G4b*g+jt!SmeAha{eA#O=WGl%f)BFgQ3W-ud-kmIAG z7so{QANUc1uUMw&Luju^6o}aS@Uyq9NCXc)2>*|>cW}(JTerR2wDA+$w(X>`ZQHif z@QH0ZjcuEa)7Z8fw>eMOTKn63t?%r;*L(hldEawh*BHMs@^ejs71DgHS(|6Sg6(Ym z^GDtD9w`G0dO1;otoG`E!Q^22_wcfR&~vh;&d!GBAYJ0WbvmeN+v9*@6Up5g9?Y^) zDQuxxsb-9PBrizUrEtM469W4rEwkE_*c*+#Gi=&7UEP-y@BBS>l6yWNBVTL8#nFU) zt_g$GQ+Nj;r?P+u^T6byayrkc@9Fl3S$EkiEU#-@0>1zT*v%0~j5z(7)Q8t85iLvv z{i0MDLK;aJy?-2TMXV_gC&AWy6~;8#O?S%)(qz@uOkQKyzV(2%kw)2LXF4%$096)-1qrgpk0);r*K6RCwLH^_+VuvM(Pv9}pQ@l50`Y8wLyb~kKP#x(avU(FxwX5DJ%uLDin zce^uX?|bow3}C<6wQ{MeSk|sG%{Y}vE&?t&11WVpot%$W*Ah)j<^@I=^|&062886n z;5Ml{9U6>v9)81sz=oJZsvghof#q+qbtH zrh0cW)UASJG#aiQwDc!)AtRLgjV@{fcOC&me%JN)<*n)%F_{&Vt!0LI1T?M1JM5eT zE5a$`#ufRb`E|m1lXbv)5rmeptQOmD60Blg{L`|1nrw_iU`JU#7;*78O9RdWE;9#b z5@iS5jrCTIrRa!S1caHb10axRIc}0%*rN-tIfjng@9czZt@*rj8661hNQek1kz34w zC@j;OuSi1CtFkN&RHn0FG_)+;!5>J@(f4sdUk%Www+&}5Hg>QdVj+$7`%VcpvR5-2 z&0S1|K7D1LLf`RThIyFFnJdyjvaY7el67pBsfQP0@Oz+;yGnP|aiF56WKS1k9&Tyc zn$2+T@+cNnvmuJIcm8HwaGq%CRuw>UQw_myg_Jw93=SrrFY*~=t2|Q6!cCRNdN_vJ(f%>u3b@y-w-!tAbbHZ z!~;lTf_u_@BM46d#K%+`YXZJ}5*c~+i(vQ-Q*ilsr9tv66L`$GfSE&^qYj>CpZeh-yBveAqvrX znCqd=zoty5v(oLidVIhY`f>tbHDrw^d%4*GIwNM-9K?Ps(b`B`QpP+^ha|;ufyw>w z1K)+!+h3T3iSFb5>VZ1bmtFf=+t4AEEa~waNf)&Bsc)p3J@e#RkHYiD z4T3*q?+E*8Jg_&NM8~(iSYLZ83#6_;7NeWDYo(PU4;YyT$L`DqmnGKV`3~2;1ZD7?zCC5pS_^q?=VfyV=Zdz>MEM$m=hO1(a-Tu32S<&F3> zV};B1I64}v<-PXvs%Q7!vhc)1CTI%iOJPitI_{fgqy z)4%fBzZV}-@UgOGhfjzd^~Fsf1fZVY@21`Ji*BK6H0p^QNj8MD?9MNm*UHzuBG0BT zxBAm6HbDM~E6O3Vt|p+32Ne`(@~o86BkPh%X2cX@B`DP;kyFiw%nnulbW|V`#|p4! ztQGN0tplR%hnpGeXQ8RrVYb*H*-_cKaK-39|Ca;$#~bzA%GXE$bU?>Ji!aT;enI|c z)|QB=i=m~>e}6?bsc6fiC?fubPqOQ%3J!!zE{frSvCHoM@#V zlpeFlu50d#vHyNfvx=$o7(Bec*!oi8H~?r__H$q3YxEcaYX=a*b}XA10An@*rfMyJk z>*@WWdqae#)V0b{YqUe82G@$ds9>mZj8jQ5Um!_QyMfV3QnXLkFEIC1468yu|3wp| z+@ph(d*NRK-&qG*{TMj56(@Y>c~Nr;%sV_PFvW_c-b#OL3rbaKHCmfLpQeWb9~e*u z4nLGc_9Y1Y)EZ@U#OJv{3^Mp;JxE%$1`QM%UE63sde?O?f9u`Yv88TLn?32Cd8vDM zNX2O!qFwcT!2z2mkvQVq&;cdngx!H6whp_+%=ua53PirS!t}bX6KW2AUXc$X0ifVJ zWF5>YKn~#TOW=$(@>+_Oph?iU8MrZ?`kXV#D2Z*u%g88hT7EZzV7FaYI-IEACATvr z<7t(Z&^=Z`7x?vG9DRS*wRW|UHUAH6!~eBj>HjjR{ex{t(Vj=7Pl=3hLPC`4gSZ}+ zMJyAl^H(Z;*=CgP_>#stOKN(3^#prg{QWq}zWb>Vce;Cvf#zA|l^zYzhjP5^Na$Q^!r6Q`={$C|RLj&Y5KhPk1Ua z(seUnhq;n`&Q0y8^<5gk>V{P|6wDvg1_JfLf?Ic77hqGu{8Zxs_n+xx1W+SGEZ!EMAfo zXn4pgcIGy>$uzLsV(7r%JhD-$F{VFXD-4j(Le>@#fwE$&Z+T2ItvqP4HV&|?`(2;; zzBwn-eb>;M);&m3hOrx zDqHrUa({i6XR{$5L#%Ezot(n-2Id(w$1T*twL_`>UWzxfNQTSHTwh({a6=Hy&@d45S{fRrUD(}cbfkU6g*^qkA=Hl~J(Nq?aIgA79sh zI9*x{xf~t^w7M;wER0d;ip7Qk_bKubxgLUEXsVl4DC{Xfvbt4d$wwz>LT--}r;KG6 zy5K(zi#nLa@>GYRi4eo?$V+&2(>lpF59`PNmS;v;iTQHk55LU?ag)Hx{MIcLR)lqZ zw?(w!DrEpQe@{R(!4~#}FNQ>3mOw9o9*Xn^@t-r*pDV*K?^sX~bX|mi?6iL&g8u)* zm+f7hjQ^)uO8vwcRTTBzwSG)41$x8@=z!91hT@i33PmeM1XXPVMv7=x+ps1HVP>9^ zu1QLrLz&~T2aYc>CjN6mDTDf#NwVm3>=T0q*}+-5tQ#`9QwjAiy`JB$Jxf<0JMF{p zr2f}WGvO6TRu7cNk$D8(B+H>6!C#Ac^S1MnLi;&!1+zcn#pe|o;zs7-d-rqV_t9E@ z6_cXR6a?3#az-XX1xRvL8i+{IMWGpEa%@%CVdjlRxM^nS0$@8i8Ebj?Usd0lI3$QZLXGQ zW;bWkzgsjnMDuiR(Q0YVQk(}`E*s^>AEog1yXtCC0VNy@rXASO8{KjO7wkLitZo;i zzW9Z1lYqxp z24`4pMVJx7qZonNNNDzZctBeO;wk_vC{WoBK=Fzv%>ryeXXB%&JmJ`#F?nXH$~XrWJl0E@pCdg zx=kqWCre#nCqWyeaXptZ4_>|b<>4*U8$z_|6$P`6Fe{gdaJC+|3FxbrMb z-y^}z#4e}A1y`~;`Bi9Zc>G*=gJKVI`o!(*L!iM}7ETUD+A{1K+M+a}EwfHtY==sO zOxn+&Rq{Ji{l;A66F)z)Uim+4jyw+0F?@5;pLAAk+eYI3;S|Pxp)~A0GCWYjYeM%) zBOLyvH|eXY!L4cD1JWs(By$4W&6$Bf$G}-xm1}h54P{d~WG{pbsb;9GglA$!HL-|9 zZO?AiY&mkdG*rCWo>fy(h^{P_@J8QR*u9E7oo)0KCCJ@QACsSB!@?1QEmUQkCi-%I zoP}H56eQ=WEr&${Tf<&|C6cqdL~4|MF+eA+Nrqy_;_^8J*kHD*r7?8>RPv&>_;SOJC!j z$U!Kj#rI3WGb(LeVikSi*T1Z})jE81ra*shclf`Ah5nQ6@xOoNSE--;@jSkFvD%WK z)M8SOl510)q%?}=DN(v1QI+^7r8MobW;cJDmrPF=iJ*yirQhxTNPQV-f#?;p_0})2 zjnU)vc1kg=2xF8jpBdr`%tS=w>Vr zx<0K0oktN&7=#QsJqW=5q7S94xiUQ-@Szd0e;KRyH=cdZbU=sjY%wAtyyk+4OD*POsPQw`v{JVuAwHYK(dXEr5YfWsD7U?-X^#4U*8 zsTDKGr{Hdv1MVO*e8x%7xa1A4ULD1OS=Wm*TdkEcC!fcG)%Y9Y zj=1)?N9gE;QkQ^vvww|wv#$e;WjLmIj5T?u)ww?2I%9jxLWk|;;v?48j&DFT#~CBI z8PCU)h*^TOTG`2CdpS$58Y>vubjDIXX8zvLbstj1^B8vPP;InKW^XVG)2#jxX8yi! zgIkx!i;Yq9c0GwNxsC!ec($`mgCDVS?`q?K%~X4^K2&=&J{KRj=VLB$@PVT-R&FJk zkfZ%AmGQdK)`x(z2;GY86e-y0decBQG8?+8+Z#0|R=l<}LB?0|G0=2t9`Wb;Y2goS@XeYGyWR;3s8+hj z!;0ie1=ZODjGHv`*r9f1+G^A3*5f8hB_L2G2&|^NTBprb@Z=v z=~l7sjz4H$6LAIL3(|Buk|kq>?e@J=odX<1&AyG4Gj*`FAUAw!fjJpTo8!q*U(vFp z+{!*sZI*L-#`MPG>dq6MKF8bOe%4oLGjHvLjjYS?L%JJ*?7Kp5f@6({M01-lse=!fSFu_ZO?Az#7c97^i>u1tCDRbEm2T^uCYHQ3ygv12f| zuWE;DVZy);;*L4(DqJHjv~?1tjuD}56s3+6p>7bRjy05W(jc9pfEJ-{9R+DjILVus z`W7)cC#<|vqJj@;mRICEiejSh4AT!U;?rA1n$bz{^~-^nLO;is+u`z4fSQ^DZUyxe zBFh`R^9y6>>KbCd(2IRzn3uEyu(-63nb-h}-GHl^FffR6gh^$FMKxSsA*4rv?vRLj zk%;^uUkq2UiZg^8gtCNf)hWFNFyBz9MSfMd`ZSxGz9MnHMl6??UWr~H7`1I@Q^Xk- zZ!tg~dcnUQ#Cg*s^A_P|L+-Z}DUI5vhPthnx}iDAKIal=hV7F&i`e_{fqQ6cmzeIv z3C0*wOA=UyQ6ykMw*Wlx#t3`|`_Fg(pP@Su)_RN)v?}^jw)z)hiY z2xkVS{MinPQaAg5g}MmbXr^W_yAeVrmi$p0#N2uJQ26~6CQlPXDxnLl=B$+9qp>kWUPfRvqSfiC!U|ZB#1af| z(|QKeGn5yKlD%WhMRnuP?ed=0_|tn`lcq;)?WYN$T#%aSDls7PwK&NFd_M5 zVGLOPa+{j)HXWkWDIfQWRFtNp^oM2sh>yM8M*{46Z%_ol&R%KJr~00mUTG|U40?VX zFileqxEl3K?I414FI?xJa7XmE_&Sx2=~kls5kffJzzGZ>EeU>-WAzzFS2ernCXA~6 z2*ffwtzRC3U-0AQmu>0juycb0g}6Q{oy=7j&fuVcXpUJhBwfNu;;FFd4E91?3oT-tbIP|d3Lb2^cdaFJw2bTL3ui`Gm(#QgK7 z`Cs79HDwfa%y&HG`pnia(LS-yb;Q6(=xsby8VyUEYxE(Q0{Sr~T03?}cjJ5x@4Cmx zMXj}O{7?Ndx#uqAauYJ|{trzxze%#o9(X#4zDQIRFb_O;-)&60bD7_b1a0|2&O{S{ zSqSS4kA09chD5C~gu3zLGg1L;Veg)Sn(cHy9vkxQ_A zyg|>DS4`ggMMH?IFXUrb<;EF(vHNp->%3(#XCh_crpV>|l^Ge!7-4$eLJgSk!^r6_ zB0ri=vf^ur%gt^@2H8~y+S8ck<7qasbvrt^JK9N@ChJ2R%TU(G%>a?P%yZ?IvZd`) zlX}1})ve~Oc+}>sva=`ewzckcQ$A3zd~ha!O!<|rstL#5JdO2cHWE`&+nkcT@Z@=0 z_d*f4Al&0}Q^)bh_cW_=OFQR8jT=#`feD9A-mCI9i#E@EU6@$exvxpP%ou}B?yhgV~q7J87I zlRpv3;x?TieZoc0r?L=-6s{Ga_X*UWa-4`EAFB^^zozF>bU?des-#Lr_tPiD>EQ~!) z+7yW`PyM8X2$`$s%(M_264`OBQ-M}L=y2=F$|P*d^{o&vr{SUT!`bD&=DI2HtW_|( zbQ@<~<(kfp>IuFD%_mkH@Js%EdB&7Qzo&37kyp^S!Rf|^$wj~u26Gkv-7UXBTkeXJ z!rTISNU9?Ozl@CZ5t>>K^`J2ezv}=wylvXkzqbE4PI-gMvCmS|)Jwp}ihTmEzWZlg z0d=DQcnd$OFRFGk3w=1bfXaglu?-X6C0C@dAh=VD^Cu97bepzownM4?n_{k%M%Tj? zM#?px8JXA{pG`AEyG7YcTU_Lz6_0^mw?eqsKDCyxU!T#w?!ad@=_^NwYtQ`W!0>2` z;u^Ud^^fFs23jq1^g?k+l{Oua4-EtG^QX>XKL;UD)jwn(6CZzLShlTp8j|&}L`bo+ zt|=QGNDNJ_m4duOBIioug?&%=h5~rLV6R%M?dPu>>Nb=Tua4u}&#duBTJ@{{=!_GW z6~?cyUPMd~uPW44movBk3&5Cw{)_=tnJLQWxb&!k4t8?m=_b`Qr&I;xqC0^9uE~n* zE*y)Slq$uJq(qZE+=(h=_BT>Hn5tcGwunvpVR0?nu=&F+!i(6x`j;daE!p8-E! z=#$SF<~n1c5@*Mn^D{37)Y$zm&Kccm_m+pmX1>!KAnch4CjFvKe&DA!;Cc8m%+MNu zzbkQUic^d6N|}IF@L(v=G_3m;oa*SmNnNTfm+;^|F@;0 z+CO?Nm7EfC^q{J$nj8I5i2^=f17)@843H!#!9**5xN!m;j@xFO4?(!jv7b)L@k_1CYF+z(&LJ?aC@w~t7Y8ncz2GqkS5_UQKKv?fz zJiZ=X9=#s5$Um=HuHZ>zPJs0zt6k`X;qYZpapzTs*lBmcMMDLjOV-lgmVA#a=wOxo z7BD&#H07PRn(Ng6NZf>n2AMHV>abY_s>$ven+bnaYoud*VxGvKgj3OQBnG?d=*@cI zt#>fNq+V?sGb{Ol19`C0Mx8)9t|dbtIHLzYRE!wAS>Lt}fnApS23$`de_gjM|SeZ zG|UxO!khCg7>-AigW4*c99D>y{Dau*&}I+nCKixv>wB*a$5v>+&ew;nU^TJGvRr#Y zL_bf0{|43oha$$+MnY`wNi!;OzyOqHgcUTgCu^<)_&7*gO)ES{! z6mIIMtpYaty64Qchu7e^Ypkyn0oH0|&$n?bLubyL#tl}R#3>i=NP z-#8}THsenKB6(&}`hmIzOko=2BJYGrQ>}7~Dq_LoG%?%Y z1Z=G7xb|1nlUoCNXB}%9AqrM*$>SukZ@Kx|mCOyoZ8D*YSwt>sh3Zh*^T)jT>TF)o zGa=OUYO|8Z35&Yq3&n~Y`S{U#1i0k|96TCB$>;V>KS9CAtFRJ##8Y`FsSfE-rv=Hb zd(>Wx;d)69;L=6DUj}UvO_AasK2^PnM_i*Y-LWv;!aCm4crwYaq`^kba4@lYq1YoS z`+7vRFo~s0w}w6{kS=OD$W9+{Z<3`GB^4knx|iC1dsi*`{a=LdKhq36#S^{+6kp;q(3_fbCusC@};UeMDP?ImVHmc@=F&y#(dpdEn` zulDxx7QZI)fhG9z9w353&>PA;r3Y(4D_G_}Hnn7LZsvY?*!})=3-<+lf*k0;5>AEE z!f0y*u|n#UahRC)qtRfyIXnphjjgGv-XzZ^uYaazUy4J=?0E7J8xW56Rhbd+LzgN? zbP^7!a~lW$Px#G_UJzt;${HyA=7Jjd&2_|nb=`SOd`^+w{nO5}VQ;b59;B>yixM?M zlJr4D7cvxnM1~4cYK#WTX%$1V2URAo!rJ#yZ2mO^WPSpKkf@%-cdg7iD<$OqJt^q&rNRaZ zwjWMq6OEVR0VFxC?MP;FH8zf+S5B}4oYRb(Sb91rSH$`Kt0e(E=$A%Qy?n5D8U~m= zhLM-*u#wmaTp#PHlXkU(+iMgNI{0{m9|rH6x;#p2Y_&>_`udUa85e%9ar84*Ud=tU zuGi<TT^ONvUt;b)Vvj-uCIf6^R$2zQ??-1e;*2W~HyC35bV;1=jJD>~Oh7_=b&&-bdGKmrek`im$U(2_Y1oh1|h%t3ygc1t)Vh3 zENt_CZ_B;ANM|`(dt}i6xKLZX2L^+k;zDaIIs#W|rJ;OZ0@RMEwr;J85+zHjXKYwD z80B^H5$89QK$E5e-n-Q@V3y#-Fz5~HX$RMMu93-hBQ3An-pnZ8eo0S(lpCC}Sq?CF zT;dA%<*9E)fmur+dMtDoJk}I%l5(xkDqE~nuY;1$aT?1cj_?pak0`}?iuc&_=8b}H zJ&UNF${P_*-x0p4Jjd^I85z}iXL~|jm?mraq#t3d$&g)vJn;64#10%elF9b7o-hVZ zetpKX+Sfx2ZC-XS3$z5TppIJdLIiHbP zLN-M(QA&=6BpaeWpkv(rnE|R`IT_+|r#k@BWAyq>V2W@c>NM!UsmHj>h5$yJIc={c z$B;T9f6rZOJ-Y1Y+0d|Mch{iMz(Z(6zF!QLAtNzSsQLh-x0zFP&m>Zuy*UAzagcb30@hFzj0PF zg8WBkGj(4)G3tWBA{vqI!s*5$D$?W$Gh4-SV2*{5d!GI!hJnPxY5VQ3vrT{h5C1RI z`#;#GU@_!9@H$b5E6hk)FqyDV%XQIkDI@^{hjfGZMPdN_=>2r00Me<`^YDh81a11Z z{cV-v{fIKDgCt=m$!Ab7)6vhU!E!_#DAm))m!C^lUB6#kAFp4x5d1#QgxC05^w&aS z_t-{T@aUu-$}af3eDkD+FSd1C{!vS6M1SE z8JT|phUbxp@O)l~T$E)mfO^03OWa7N5s;j_%;{JHHWX{;SBgYmoPks==DKfrwH5`I zRFEtRp!&BSXm8fE5 zvbF%57rz-G%JFSpjGA|8Wz(^(H^bk;jZ{jwNqJawNq*pk;YbW=1Zhp`h3E+ z-2HA$Ag=_$BSuH&$5LW)-iut1e0aQ@*CE(H;i4usuSqfmsS>}C4=1lCVM1GoMF(&_ zi_1syqnVJUNyz)ad|3CT&ZIL?Jv`*6g`?o8hinwYV(f6MCAB2jI=cTRox(tEi$=K- zC96o*n1^n#M$avn1*0jKG4m$kC@?y%4upiMc?u0@f_d9%KP2TlwW-PB0P6{1fcba& zESeeE)JejWE}P8O?Ur5n}q)@v}xi$&?ajT+QcgGJ9(tm`R9*b z1-sSY)e3V9fY_3fEW-?U;$1s!wiNKx=hps6M^21dWL*WtuKo^`R+8YnPLNQb4sYQ81+7Rm6awp)&#P*%tZEnsutb zGg8iKg0WL*5Y(J_*%Qr26oijWRSU3*CZrP?S3$ol5Ly(^nxkEz6lr)q1U4t$7XJ%lfWMs0AE%HWQ>$M^1S2hjl+i9E3xh=2C&AF|tUW%$9 zjtew~NhPTARnJ}4pVp&)b%kf!+8HLc8hcZT<=M8=6!E|3``wOvT0yn0_s&1(v~2Iq zt$^xS>(7}qu;Wj&{TmC8tkvaPl<)iTTC+b*C`pwq7b|2U?xOh)|SO9M`M2UjtQ5d zguxhMI-!QSkJM|{+xeR2&rep%736udLXnZauw#qb-pGAgf{)F=KKAIah4MF zj|~D*5E_4NKPqDAY++9L-WCR7}+(>kohy$FXvx(iDX+7-S*2VSwHm_m z9jvZ9Ez-Dg{dAz_^R#5<<4PXKis=~5o-_(sE5=zrG~Iz&(?pYNGUD1TQ9W#K7?V|A z#sWH2wV9WSuVGOowjAETnZTcMI^6W6U{I&f;J2k~Pym=2gSs_=&WDkrSm->)3T-tV zv6$p~6Vj zzMY#5InaeCxNOfp^*f4g&NKVfHC7d^ve^V@O~N9cA-AtvZO?F54p~T1w98^u=~HZW zW;7O;F~=~QBxxx!pqXVHh8G}R9l>DT@7O?w*21>lr;CZhN6iGl-G7R(y~7JPPUGixfR?X*Mw2@XZrZW4+NNaAvZ9;!nPimi zH{%?yKyPwqJEj~9u^PR!)EI$4Qy(A)z-ce@cNcp0tYOFCZ-Gk5d70{}@&S>CO?QcL zIirGe)fg?oa-y7`t-r8#N4{PFx?)ma!8ojwy6TSaVksWpkOtn~ujsI8VjME%gA7Zv zZvwME_W%4E*+0nUmBq`^Ma;%)4_l(SHd&!+82>O>CuDt3DC)tT;XCU(TJsX8;;Q#uGQ?1uCtK=Q`b{?Eu z9J|VXhF&xY32rzy@YlX>?zg5j9^AgnMyu`*oBfot_?^*A1mC+ug%W!0e0b+n#q;1p zTJuI+QNDTUSRnAVOKNP9m1&Sn*bYwm&{gP7O}0#S{`tTGu!Y1e%O$_7EhJ0yr9Jf;-VugA zVc+4-uHBPE)}2MqHOV|p<)%79`kX=M4d)j>hiu+sr;=XDOQ2A}X2I70$@{l|X*g4I zL-ElA4JbVz_2w@ODgQMwN5#8B$Z+Zqr1#A06cx7#|YwhR23Ag<_D)i30LrwXmPeGSu?N}!OO z^6LBj`k)9;5&VTwWC?6b&9hY5#*S{GgH} zbBbA;G(}?MU2|m0J;r^3b~G3l9v*TmObgm=eFG)&OlT8Q$L4S}hBTU5@PbYm7j8wt z)$>sqHkvTDy1x3FsS7&HmN{89Z8{#~NzpT31C>}Jm3XeR$cvv~rQ8E$#*m%^aVJ*F z4?pi{mI9=ku)vtlbM_oP^wBL}jI`wX1aRUfaNMj5{aQepCcDv2claC*N^}3ulBHom+n?ffn;*b8I|TnzRhK)>0Ml^I7;88CLDi3lKS|cbw07k8+52#y33iO3bGO-r8PVuWRSbOrpBUom8=vRR@g3%lR7rP~bJ_&Z zvSnUaa%$2dF4b)`e~_+I5oR^b@{sO0$CS#7b{x0W1CxnHp1|!;^vTwTQjxp+`Jnap z@CW*io^WS}*gQQ#A;gndXDxm&IGKcf{~ckNX3m9soZ5u@Lrt1ea~$3)tRx+C*O`;q z%bj+}Pt6+ucVJfhs85*o3cXEHrJ$5le|TLI=cH-wCEIy>Tw0)f57(fjoDXGTNh1_4 zHBeyNO76uVZ2AcNHYpvnST;v*j@l4+`tm+Xx>Jx%Azk+^3AyV-KJ#d}?ykzAdD(Iz zJpXAMs+&0Zv2;|v9+K;cvot<6A4IC|%{4SNVPL8nq9#b~p_Cs!%A&22s1&5}4ZiK6 zX7oc*#wpZ`A|=s8@dP{+vUJ94)fnpl-K@wkz7W)BO1{*BYwI4BQ(S-fyu2r2oktye z%FA2ygEJ$QwQqLN@hL_C*wfMOY-(+whd<}*=8D^7lDV}5?WHxMDE<=I+s_L|bEkn? zNMH7S z16NZEV?}yvYT+exQQLBWEqz3LHFIMzR6D;03aX!2Da=T<=gOn}JCs+T3;s@X-Zz6P z^0Q(IZT$FAVQ#rt=k;&3!KtnR>j|Ow-JW?ylw(ZbxTjI zm4&q&EjPZ;Z9OdQkzR^!#8De6R>9Q<5`H)xCD&rr!@TIu;oG6qL)6DQ(~8bK{dqU) zKCkE%))Df)6OwKddPlH;CFs0n(mlb#eLi+u-VDMc{Z#a0E;jdK@amxGBKS)GpEpj( z0o>Hbpp6q8s3PY7fhQ96aIklFbuv{pb#Vb@f&LF~%_h~ezd1%AV7h8y)V>VCVzea% z>P8StAO(ZLpi7p{I&o|x`z*6rNQ z!gBQe?d8`m3V%tPK?f8PBvK;_znw^2li*2TUx3nGvXDO8V$?4wHczTC4pNbLwLe3-|)t*xa*2ah2w2tH=btL|sirm{@Sm9{9tZK=4ij%yR2WYQcd5FpASa zj^LzDktebcefxDgCK-LBbeMFl2i?o`m~0H7F-9?vHifOyAldM=p8pnDTQ;0cMlY&3 zAl*4v3v`96i8mg759KyLRxmHuUZ+3F4B<1J$w*9<*9WqnwC($bYV#M*I}p2{G7x-M zAbMvRjI-?}Qp}gw$u7bYUJ^ZbsR2T(b!i!s{-_VBlm+=CTbq`}PY1izM3t`{Z=EhX zvD#5E4A45%9B`!_UK3cQRas|U5GT`xw3n1?i z3NcWQ2WYE|J|YC=y_65O%HKg1>0uY1lXdt35?aUs;Ci8BVEeJ`X`2@xMc)6VSK_jd zo%By=zaB`nQ26&JIaP# zRUeH0gtxzf`VI9C%>4;Vn(+kEM~7FeKSr|_{G?y;TroE{GY82QzVB~nU!bkI#T+(Ge)V{ zs`DafyYBStyN0rkm76<$8}`*6!!xB_ZXgqGvht)$vwG!>26>T8&7JF9o!yrp<* zP@|?sh8T^l^I5!f5>ZzJTCKxvi4b_zBXnDaeA`Cw#Ggzd_;?es_>1V7Hw!4U1#sx! zy&iara{25$>BT=r(~u5XnGbCHrEDmJPTDvZ8(2z$(gRuW4ul3HP2ruzmTT$-n?+P+h1-x(L>6 zz<227Zx*lERYCE$5Y_WmjUO>duvi^N92=aU_+CJX{md&STTCypNF;WIyAa{?#Pq+x z!__HfTAWt)6^fXc+l&F`{5frzfnsO2$7zJAiKOy|ALl6zAR^Nu`_n8t`swc2R7yZqpZs`VEQdpXK z{`UhxmD;2_4#=g>hdc@?oFC8(A!P|WhiC!z6!LkNJ%pVt09&h;KqGV?2`EQ?@;w;2 zNvp~44UN9tup;xG^2p`nrq!ufyXA8IluPR>6B_YYg*suV<8kA8!~N=Y<8^Z)_UqS2 zs9whId(gM8C-dTnkMSn4U4UT^lYUQ3wx0w!4=Ox5PWaGuAh-%DG4WvB6K|;1N5750 zH0w%3xwQ>wJsn~rs_}Ld9`!`nyeSm+SVyJlq9L!xfE6M2MjO{h6KdRkdYW2DE{K1nuY(3}kMs;jZ2 znrih3=36nSEHNl|H*=@SY#cFQ|He*bEQe$g#Kw+4hL#jNT(KCnqBqKa& zh83n@9M~8BEu2sMWJN0(>?NX}{-|xtb&kRIWd60zZ~8D0HC!>Y_VWPIkFiL@`}ga^ z?sO(~EQsII`K5-o%~)Cq6Son#bmDp9n z7NWNX=~@OQ3Ue$zN=WhE?ibHt60-eN!IfII-nhP!P+%r%FJOw%eCG;HRvESf&o=5~5`nGJPd$#jiPB-66`M7k>6kr1zOsc; zLOzj14Pw$l%*lKRqsn~w1OR={qldJ}-?rNV_2euxyQz2R`ID}ZE@yveMP?{B+U&#x z$2!XQQ#>VcOZEHukncGA^f?&z*lBSKXzR!`(B1*iZh9Y-`w{&f3MFZAK%u#&O{CZY zN$Z+2?Pj@*Oi|~_F75hoc6K>%?ZsI_bA^XQX}_wUB`etZ4=S|abS9T()2q87+BEjD ztNdQl*;Q;cR+nZKcDMMwCj)JbEMU2iN#@YAZLXXf0?K3_Tnar;I)unZ9lP3-l{-u_ zYG+XkL>ZOWQe8rUxN(7^1cn!vjVR?OclVpQmPe`LgU(|s*=$X(tc&iGQ{=k7&|1Pg zxq;o9S-p4nOVV$ry@MB0#srfEq*!Aw*TS{-mD7gUIJCw*FP2F*A0QkuiV%<{!n0N$ z9Z--fiPi~9D|%G}G8?_5QP^XPJ(qSmUJ!pLS$8%F%xDDMe-NlD47Y(4+Yoer=gyF{ zhsLcWoY54t&Wlchf!Ev&&Hf;6^2<16G2zHwX|G~F@*1<=?dSg`X;MGa9j#tpM7NwEGk zjMz5v+n#Dv#42+DULlD2SML<-cJ=7e5?s55(3}DlQ1l?)ZqvS^2qeRI_NDBDA6gW4Hw_J6CFo8Bz1mQJC*olt7Eux6_#{hErOth7av00 za$hm;GiYK*@-y(as`Uj`wi2LBrb*fe_A^ea4NU2fr}`i5R$2h zD48M|D`X~9A(6~OrW~^*k(()FrXs^ZD5X?1sSuGerA(2ODHPF2-+poMI)mN+`Oba1 zy7zJ3-(G94wf5TU-9z5E?q%Wi)*i1S%)MH67ypqq<=naBXiwp{vg0R`f0&Eb4VgSN zERCP|x$N$V^;?$vo*K|SbW-K)!RsD$J6gR?^H8KlSjDaXX>lW zom$BYjXt+uC|LYS2zjq)Y8~+;UOq)E*6j0+ldS?&XF0F03oCNk%ld-F*)!?Y)J5;S zGj(mh7&h;zRP2bf^1IU@>t{T&ha0b(6Fc+c2i-7(UVSnJPJc z9H;Y(m2RFExw(N?xk^W->mE%-z-m{{9#!@iMVlJJHAGeU-Hy2ne?BE6$C?xRSimqb z?Otr+GbWDK@`@J;hbr9LtN890t41gH?T_F4bJ5oQm6_`mkOL>Of#vGMTkiCd1Vt|k zD;MNmG!?LN+u4=W2#-5$LcsB`{*&!q0U552>ptHZSJJfzU!JM@Rk!H+ryCq*&pqxA zORBf}XYH9?mmpyS)+HE<+*o4+b`pq=rKCJR`FrXk|LIlDbe9wa10^ZmoG5#&`NHN# z+DCILbt6HW8yP9ye%r8SS%uY6K3%^Ge5#_V*0Iq(k2q!^tkGm_DifJ3z4>IVr_4>u z;{jz4sn(eIjj+escV3_!PhKnLI9!ra<%zBB(3ZHfszj)h(yVdM)wt@xkGdu1rJ?)Z zwm3*9G+MCMzbbBBJ-7xLt(aH<9j0Pjv{`^vFiHz@< zj)=zw8Q1d8HYQk9J={Qb%R6po$Dn20QPCaJrYqC+UwgT? zhVWI|i0#dk50B>A+_$@$RD9N)?M?`|C2g#1%lPtSvHBomw)5?bx}&n>oy}bp{tPkE zIU3+~z}oLFm*0OptR+x}oszp#IVt^u)pt34 zZFl|^7Lkz}+9;B!dqwUQYxa45&EK0eZ@dc?RvFxVdQ)T1wLSf3OJmQ+4YnM4pcr1+ z?RsxZkCvjl1O}}U-L_AE>M48!hqO%%5FLPl?P&scF z`uX9p4b)F5;%_H&_HV9Nj47%&RF957f1B3M!i3c%{Ky6>=Im`-TX#sJk{LqGWW#N3Z+)fyw>?CTsGKCaX7nqlui2jjNT7+02!G zq%SuC;db_7KSAU`pYevUgywrYs>qET&xnXJaJz|VKe*YC_41_7Gf|rK zqxR&~qr$x}O8hopUZ#%heFV<*skjr2F|0kNS?1ne=d$+hPD2CNErD%nPS!5Ul63CR zbIh`Jj;YAH$|&!#R$=|gqTpKDxsGjiVOs6BuuY0xes22>kfkicsb-t&IY+G|F z>b+yf#C>qLUu@Mag)r%W8v^THgiemEFd4jJRN!DxeIajrC*u><#;;NZUJd=rGs?0) z_|nynQMAyTz4|WywRLcGqfA!;{~5MGmWW~6&hT4N_x87>&}U8frt94-eL4beSF5}k zf0=E2*|Yydx>-GPRwkXa0n2N;x&4#49`!2+2&78o)gOuVC~&KaEIvP$Xu}r~Yiz&L zCrNvFI7g@H#JVi89h_DNSw}6HwPW)e6ZTP86f#aA_ndre*ONReayU4e-@Uyu{yeh6 z=F{HVJ!NNn6ly*mt@Nqi!*s_|xYBu3nK2*5)8i+0XRtW2jW_z#zEudE1QE9-Zfm66 znzJ0YFPMGZK~;olU=lZ!X0t0R5VpMcV0X`>Dd*v6H{;`x-_Lo82kT9yyIcKv|MITw zV1Ln;*UnTL5nEGe+-`wmvTl8vKH!HuCHHM{5J$?djb!UigjlkKS#IF=RnZ1}W6ri~ zYzWyCgROmL6k6nV)k>viB7Gd}jp5j|Lr1ZTO>Bo=2lG`kW-7-%u5CUE?hOq+@w^S$BPW!Hi;q5&;o#z6;{@keipM_k6@KNH$~2W6wW454 zMR4r<)bwJhk66SB{mf$9q?q zZU1V1@y02Jvd5i0TC(4QUbOBJInEo-;K?EX7F_v9m%L3RbNIpD*9q8*;|=CdbR9GoMgw=_Lf}+cPA8+ zxsH8%m6MQe^egq_=j`H?tonfn?w5afC};%wB$>-p>@>4qN2y6A?G4U0U)KLKXl1uQVe^96o3NLdf2lhsRE^MIczZ#nuPBF! zkB@Kfy<1t2M6`B46gqpPSn03yfF4zLeBw*-7>$f@TdQxZpDm6(lCwFK=Aa~wr-+a<)_iQT zsX)AI;N1OW1;5pF<-4ei_1rf8_o?qcc_Wd7jV-HEp6-sx4t(@5u6ZNRt^;LOR_q&S$3daZcBVczYK1;$2B za=xFys4)cG?jMexoY~U=UkASiF4;sXcJX%~xqv#j;ztucN=d#9qzq1ehb=ee$MYR; zD9;;@e3>}^*!ioLt+`r8$lk{rtS&udq370?ABpKm>ah8g1pYla*;^?@rfQj491$Sg ztwXz+p@KfR%s?flStf{D*C-~4ZGqu>GZKM4{;Z&TlX*9|<>WzolHeD0Wv!P)HL z*!M%Cw5C=8aXtnrouev-{4}khj%%NG>#nLE92gHAL zIYB32Yjw`lLHy>{J-_9B_Q61kkL@`UlxooT z(SC@btURkmuQ-~r^J8lNTS+qskE8Y~7II~q<5{2ak41?FY4Wxt_3HNQdhqmSF!NP= zuL#<*`+1kGgRL(pc63j~PkC4ALCWKoqX--*^_RPv;~>$B0eom1{B$= zrEfb}-py?dzFN5Q+BtUajvX1f=RTFYFx+J{jSTUn&%VQ{lVP_hWA(4! z^&vWLW}*5bVed9xDPR=gYLFq%jeT~-^?3oiU(YqFNb>8Gmdi$!+tf!~*KA&Vs^Ubg zCLIQhXi4Deu79{<4mbOSI;`2z037IgDjUn)A}D}$Zr<)lDQ_q*ugy=MA^t!y_H=-} zUH(uMZNIDdeRq$*FA0CJrVW_Sl9S7(R{JYQdU_~4*4ymD_|j}x6m$8vIL1cYzx3}Q z=jm-Obeds%8ec_MPne{w2Wr>aShp^6Zmm<54@RWvi`SNTy8~s{1 z?Hf(?^Ni#jiZ`zIgqrunUEJ{Whe)`L!pJ4Ni|=FQ2!RC)XH#M~HTr=p=qKVN9b#0Ap_weLAtUjWpX`L+^ zo0R+Qj7v>JI|I$9M^ObOzJ`p$$16Q5Ebc$c`W<>CKI#^&(ZgLfKV(lN|7QDWmr^dwkMahX)C`0 zwn9risyIK&w)%l?THkR&Z%r?G#-q~D@;kolZFjx$%c3K<=BDA!Lu=W32lAS@I(wzS z`3$rQjsm(oUyqv1l2c~LH@n*ZgPJG!$%OtuL!Y6+)fGdBDc|3FpjJ+&_`<_X zk5y^vI+LO*v)vmv8U0OdBTWq6C7-Oay0{KIY!B=4-m&UHMf)yA#me}b+uX*B)@Q$Z zk*;{aYTJ0;mNgg;MUFnNGme~EU&A+Hmhm3RHaT&s@hitGw?E;gZVw)-2N&#drJc;% z)W~u-zyEcLtWI{B*h~NG>kEog#fAp9-W_nG?hg4=Sn6)75ZSUqofeaFX|*h8!51UX zp!c8b%=$$cw;Fxnsb9H^eXpVZBDAkNGsIVt41h$cw5SReHrIwC+akqf^X3 zE!PRRt6h3}@UT({JBLS9T}U>+`$YZEFZJMX3AYml_ZUyNcQ4zMy@76EgfY>l%a#Ls zIGKBkcZ(OrM9%d`$`;p4z1Y9oHBpe4{0O&XQebsr`y0p=q+;~U>$5I}EM3q_lL;N6 z^c#_zof$e#QCy4Sh&1_X;3n_4=bl<$a^$a0^V5cf-Q`}NeJFOb6|45eM>_HHvi+!1 z5qGKlk$K^R!nb;_b!-`yXr5=j|QEuDbr?TzZ3d&#U(H^8KyrWLR|zpG1vR z2XveD&;&Og-jC6BEn$1xQI}v}mw2s6B}Zz=ou8^ful=F#`e;jUmf9#sHJ&n-vi5gV zvI_Tx#;J`ytMC+L=A?cZ@p={UJhiODcUV1zx57;#uBc6^@@uNYaCL%;WI%0}5XbKw zNdZ2rnw6UO5>13gIZp`g@;enO*${Y`&n&ups=ihB&asSrp{H&pouy=2-#oQRByMWr zQNQde-tyHZ)oJS4QE$$qVJcc=K60~GYP?doqmiVU8vTkR{K?S|Bdb~*jIXAtH7AqZ z2x9Z5s44AHkRLSowQs;Iyks}FCTX|j?bTuKFIaVWOfzkHnoYBGzO7Mz`)sZ@3Fa3d z@d3Rx_gMq}rm1*PPC)g5l8~brxYk|>mnGrUm(lMh>4TlMSnWr-|rNNtt(?R(f`td{my z<3m%<9~wXDTep&5|0l3+)gHs<--+HMlkX~JD%M!9Wzh&Zc<{@l)7}Ahil=(fI;kU` zm;I+yi{H@2J(DTZaJku;vi7xKlv}ras9wwf*?G+EPR`>dwDiec+ukz>x=3w}j*|2l z{lVH1;q&^o5=L0BsD6*Mbl6Leh<69Bzfm^j+8`SkxRyirXp08*C0(~P+A$TZA-mA^ zT`Ud_iMcO!DrBx()}bjSN3XSC>Fqj};PNW-rtU*(B}`T)5_xhH_b1kSKey=dy1=2X zsVwn&pV0}g&>V?_En)O}stv5(Y_FHOe5QQ4Y@mm!hEEL!do%Cc5R_`yx8)YQCTv=s&za184-1&oPc!X9_ zBtdM$U{~h*6taU_U#M3HYs4KEW{S;d>T>TrUHI5GcORo-Pn@Mr@8r*#Fw@c!iNC+P z6UMsA+7imvIKL9||1~&z-@yOx&$7MFr+oi@QjRj7`ZIao8N9ap75S1X!OtLK@SvTl zRy8;}TJq)dAQzL6eODv|n+*GMu=Jt!n|k%hHYf9_xm@j~q?Sy&u-&bCyOP-PZyY|W zPBN$|4o7XvJm^B#9Od?1FC)rRD?-RPP`re(=Gw`|Y_2=suga%nFBh?82_E=BcJxVk zyZ+Q_`=4(-C|us1<3C8#q(s%YEaO__?yHLQZ^T0COEPqHH$8W~oGALVhwIk<8b&d; zhUX^!C*60qMtJObWHA0EMZYcaOFYLT!869^E-~;u3EwZd(a&m!zFEY`%a9aXp?jVY zT3jaJdhIGc1G>IlE$v6$Wkzc(&hnq|4qHPbu(K{<`$QosHd*3 z{>5+_efc-}&w{czTLcgPW<7KJ%+AdU`S%Kfj~t?lfy`^)ZX8GngpGl#Ocw;1la6H(lG|M26esV&v2jC!o&c-wZjC7cp+66*?uI=m9sS($!`qOJ;jP!Crmg8pwF(2u2)?B={bJ<(P8ViSA{rR^|xt!ivvQz$ztM@+j+MMQ9cB7qUm~L235QECt6O}Ty z$IH3feI6b4xYc|j&d*9`@&);usXv-il(=ZRk_?%1uKD=X&l$uoH}GfA{}{(yT%BF4 zT;1%fFg#U-tDXwelhw(Zo~V=Dq#7-s9vjFfaeJ@J)|~xAiUq1^{@1(MO+7bneIn1` zByC*Cknfbce4XVDiefXFxAndfFKN66ui0}Ssg{xapmCimX0VqdC(0mjq{u*@kEcT< zu5(IxZ(;hoZgmUBRRdsE@G^2H3a~{1d=`%*Akm-w(31_xA%C44Rp!4oqXXB8lZE!+ z7XrW^Cge9~KiB|X@VB|IY04c?RZ`SDD5$A4{{%8Jq+o{o2J#aO3bP*sTn7FQh9oe0 z%r|xMH^3_91>g8M`;D1V$O41Qc zbhfl|AlZ&BsK9cJ_E#nP(P^$dRjSP}42L>(pV53uwT0y|UaTCjt27RNoe(+FQ)#IC|`_eCPF zzQe#0IAs)A2P_tX2ICb0h)Rnn)PGFlD zNcCr4cafm6UwS~k3edWN#h|sSzzRj1v7za=6sQAWaHgaQE+rsrMb?4chrfajRlw`e zVsfRSjXe#@5L3Sd)!L@F^RFVOoE5CsqSF(}0{xD0N=l z4h6&YclR-BsqL^HQP|WFtiny(nxYuh$BM@RW%Ud-Yvw@gg zK&L7wWICAtLU<-lO#IP>gc12(G&7|ER6C$tITZDp7!;M5hZ5Fn2@kd3B=E{YkaiiN zaO)(Xa4=z(8@IUtiN5&lK$IPjoEE+li0zGMQ{hrj?U?o*V#`$sGb?*omPG=aY6Rn& z8A|reAeD#cU_^G@!88ju#4Q|a^xVz0U7f*V1Pn&i$=Vr1SOv(4cf;aC93@b}PM`uA zRC9!ZAwV>T!24sug5S96Svjk zAdtiz3BMB&y=w5cH6wvS1(*vm^Td6y0pf?CfpeS9acae9A>J99>C2=K^f?Op5FH9r z!0vVk;c%f4x)%`%IUXmSP6iUb!^^`CgGE9AK-IOf0ZZ7x)+QqThlse+n2|vQ!1VFr zt~Q7b5U^>JA#j8bzD5z*3N4Cq--5Wy1GI{4!Nq;B0bQ0*IJ_Kl=Dspq9=1eEFFcat zvl2+F2c$*k3%oW^c*0JJFDs&2dFDO#NVsVS;btFBQ1BBQ5Dv-)5URx=(nxe9%ez0h zSU{r(G<3Xq=JXFV=s_Fl&71Z2#^izX2LtC4UGgd8)0`(OjS+@ZKL_cM{os3FGgu@51Adw}#ufb?Lbn)_e_nmnOeG1I^Jt-u!= zQFiaOQHgh;gS$X*M|P^1M`v`kJIH#4XCYk-!ttsq0;$csSK z8W4SDQKAk7LsQ}Az|@uWN^b!w9Jnlce)b_03bnw1NJNIG@gp~pRizh!ovNZFVvK~s z;6||pQlX+Qe)l2aZ`C0GSTDd@1L@H2@h}<+OYCk+!Z^M%mrPlL-bir)3Ws;l*Q}`! z#@VUR^0t5wBm@jp52e)02~fDDluD{vgQ)k%+uczLKwkXnRDTj=10299JMevq#Gu;} z%oGQJ#WJm0>>SaTprC|Y5?{dxit;}pHf?~~4p8W!S}F}1gU;CXc+(Bu^jc9g1~IDB@Hs%ftZ91Q?1uiYERTiZ(s-nJHW9S}k45OAd^swgx;6ARRhstuBM& z;iMy2KE&m5Gq>XsueMxVb;=hRHr9dk2Gj)RKEP}%|KD0c*kj&wuexXq&^v+0psN!H zt0B?TBNlQByA_Cg5bhFp^PFxH(0K)r79Dri)IPL56{e_BT#AA0<%(-94IE-H@zx)jfOF&M-0W}u1)GBRddS8C+y@(Qi+mYOZ4lR$vktQ8 z{PfuXPTZ9I19rdn21*|QZBW9&!B1>}93>QgaR;MJ7+=#!=wWVllN$l%yAniHbfn{2 z0mamDw{rDHCtM^{Y)e_?Kn-yCZxkJ9pl~=9FD~8_mhNw(fSen!qj(VR)KD62S`CGp zks(scCc$HuPL8nw3)k zE#I3(Ed%s=3G|~n%6{Ux;c4?h2xULSMo&b{Oi}B0T>w4<3|AQimga*3&l%86Vm>D< zDJZq_Sr%acl>*YDt!R`V3OcP@T{BNay|}3WVS}~kEjJzjC<=f=PdogCpiqnC!_D=G z^d+KFUD{N4;}J5TzuL=sd6yRg@3d$U~8E zHZt#jxFmp-7m%$1J0<}(56l_SF9233L17mtl8AJOIbykN)=&fUNCvt@r#RnKp)fO3 z)7k0bAv;T)!;zdPa(!Q6*9wG-1Oo+HI13FZ>ViTX3E?Iyb}O3z;lx3tMu)FBZ79s# zyc@5kKsbFuH2QmhE=>=}wgJRUbbhR_2M=95E)n*E1N)M0A*_9Xg-)9&4WL=L9A@Ei z9m2R$UFwr(-3!mvz5-zfKqE?2m zetT@7XbU_MTE9qGJvpd%1UV1{|Fw#YJrsDRV<9qAgm$Y^VhxfB-vL1!9p-Wzp=hWu zH@A{x?r32Au0*I#Exm&Az+a|7{6YH*#|bDZ&W08ht+@$D9|U>(316NOKyC*}1(fwL zyFnodte7Ji$^$E!E+L^j8H93a6tK<%3W$?&I>R7gsg9W|Kc@o_8vvn$IfXA2h-eoQ zfgCb8|DZutidQ z3^F(qkrP45a*wvf08|rRK)n&%I_M*g`KJ5*@;D&dMIhVmxsF6i z#I+?*$T`O(Vx9;jENI|961SfL2znxQ=OGkiro;!O!_zm$>HI-pQvxjXi%aYiC>A0R zj$AabMEY&gD#VlF*1U1IeVqUFjo2@%5P^ZpG~D~Qy=3F|qxWvC2^X`g_b z>_h2UqYa9NziyL+hW8dF=8*vl!q>23Cln2DZPBbZ&JV~C8cy$6?}#j9$6ri&|2pFDh&;O?SO6pkPZ-@eH)kbRrRXX}bB_ z%X-KP$!=iqM^IMRy9Sy*ZSeC`H3BbVmu^VD?%Ao!pcB3W3qVg9GZ~>9f>(`Snp<`D za$+aoy5mh%^VUIg@k+)^bJuQ8HZ%oEM>W&Tf&Dn$V*|c&`~!DpH4ee~4@<`6fYHZ*!3#Z}_-%tG<6I7vPLpOMLv($S z<_-qHZUfp!v$qRCvkA^Hmu5@Kma>Zhck=-5h7R&M!q9ADC8wqF@6>8eBln!01hsVZ zLM$~=X#9Tsavn^iMY^4z?wiwcAUXxu!dl)r`?ED1$96`PhU`yTq*G(UNCK zLz8FX-1OB0=u*wnd~z4ULG1`Uv!4@7kX+^_iJ<3?2zIQ}%x5$Qq$)V04F3I?z4>jmPO=KC?kDb6L78oNk0& zCp^?p9sP%9pq3EAs=zF*PfiDje-^}AbV?m)2F;!u+)*#YmKI$9{z>DP0PYE@a_BKu z&gLKCi?(nt&5orx{u~UZ({niVAmi%@%_cAnUz*(5p`CsNNF4=Ku7a{UW*2BOqVj(l z+E$h_{Ezx?~) z;-uQ~6UnFSf!5Ko3xXrAA>q@*IwJa9krc+qkSMps%eCtd!2zZo)ZQWScvaJ-4eiBO z;d(y64Fn+`U8&u57MhF7Ch!-4EZquSkF_U{0>zgCb4M$`G31|Gf$R5$uNjucFTN8S z=Ww9V2M&CKR6Z`o6RS)u-HgR|2hTU-Zwz!Z@b+rKTHxXvUFYe&7oh3Wmauqz-qMmU zzAbT{z2YJ?8`lBzgY5j9URWh8zWi>!Ax~1E8!{aQh@CCAv@#aoW;Wjjx3qt2!xCo$ zl5Pr;{4BniYQ8C=nb1u^mD^!EV)5lX^W?m2Xfo+iF=_FUpuG4Rllewa=0P_CXO{m% z{=N8)g?WD8HG+KH3Al^v!eEXJ#KC{8jK7a5s?iPUgQ;ZjXnGN;j zI{Yt#kU4)V0P*Jtqn@+!23{i;JcrmV0l23Vz9#?&7z)t;AD%vYYrx`@br&Dvje}qV ixNiTu2nb~UNN;U*N|61Kk=25KEI}EyA3Twa?Ee6w3MFO$ literal 0 HcmV?d00001 diff --git a/lib/ccc.jar b/lib/ccc.jar new file mode 100644 index 0000000000000000000000000000000000000000..10594df35d01be758980fbf35ce0ff7d384afb3e GIT binary patch literal 1018039 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�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