Repository: u014427391/taoshop Branch: master Commit: e3a5b4fb137b Files: 342 Total size: 2.2 MB Directory structure: gitextract_58r9gm9n/ ├── .gitignore ├── LICENSE ├── README.md ├── docs/ │ ├── taoshop.sql │ ├── 数据库设计文档.docx │ ├── 架构图.pos │ ├── 电商平台设计.mdl │ ├── 电商平台设计.md~ │ └── 阿里巴巴Java开发手册.doc └── src/ ├── ReadMe.md ├── pom.xml ├── taoshop-cms/ │ ├── ReadMe.md │ ├── pom.xml │ └── src/ │ └── main/ │ └── webapp/ │ ├── WEB-INF/ │ │ └── web.xml │ └── index.jsp ├── taoshop-common/ │ ├── ReadMe.md │ ├── pom.xml │ ├── taoshop-common-cache/ │ │ ├── ReadMe.md │ │ └── pom.xml │ ├── taoshop-common-core/ │ │ ├── ReadMe.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── muses/ │ │ │ └── taoshop/ │ │ │ └── common/ │ │ │ └── core/ │ │ │ ├── base/ │ │ │ │ ├── Constants.java │ │ │ │ └── ResultStatus.java │ │ │ ├── database/ │ │ │ │ ├── annotation/ │ │ │ │ │ ├── AnnotationConstants.java │ │ │ │ │ ├── MybatisRepository.java │ │ │ │ │ └── TypeAliasesPackageScanner.java │ │ │ │ ├── config/ │ │ │ │ │ ├── BaseConfig.java │ │ │ │ │ ├── DataSourceConfig.java │ │ │ │ │ ├── MybatisConfig.java │ │ │ │ │ └── MybatisSqlInterceptor.java │ │ │ │ └── typehandlers/ │ │ │ │ ├── Spring2BooleanTypeHandler.java │ │ │ │ └── UnixLong2DateTypeHandler.java │ │ │ ├── exception/ │ │ │ │ └── CommonException.java │ │ │ └── util/ │ │ │ ├── DateUtils.java │ │ │ ├── JsonDateSerializer.java │ │ │ ├── SerializeUtils.java │ │ │ └── UUIDGenerator.java │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── muses/ │ │ └── commo/ │ │ ├── AppTest.java │ │ ├── MybatisSqlInterceptor.java │ │ └── RedisWithReentrantLock.java │ ├── taoshop-common-rpc/ │ │ ├── ReadMe.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── muses/ │ │ │ └── common/ │ │ │ └── App.java │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── muses/ │ │ └── common/ │ │ └── AppTest.java │ └── taoshop-security-core/ │ ├── ReadMe.md │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── muses/ │ └── taoshop/ │ └── common/ │ ├── cas/ │ │ ├── casRealm/ │ │ │ └── ShiroCasRealm.java │ │ ├── config/ │ │ │ └── CasConfiguration.java │ │ └── constant/ │ │ └── CasConsts.java │ └── security/ │ └── core/ │ ├── filter/ │ │ └── SysAccessControllerFilter.java │ ├── shiro/ │ │ └── realm/ │ │ └── CommonShiroRealm.java │ └── utils/ │ └── AESUtil.java ├── taoshop-manager/ │ ├── ReadMe.md │ ├── pom.xml │ ├── taoshop-manager-api/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── muses/ │ │ │ └── taoshop/ │ │ │ └── manager/ │ │ │ ├── entity/ │ │ │ │ ├── ItemOrders.java │ │ │ │ ├── Menu.java │ │ │ │ ├── Operation.java │ │ │ │ ├── Permission.java │ │ │ │ ├── SysRole.java │ │ │ │ └── SysUser.java │ │ │ └── service/ │ │ │ ├── IItemOrdersService.java │ │ │ ├── IMenuService.java │ │ │ ├── ISysPermissionService.java │ │ │ ├── ISysRoleService.java │ │ │ └── ISysUserService.java │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── muses/ │ │ └── taoshop/ │ │ └── AppTest.java │ ├── taoshop-manager-service/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── muses/ │ │ │ │ └── taoshop/ │ │ │ │ └── manager/ │ │ │ │ ├── mapper/ │ │ │ │ │ ├── ItemOrdersMapper.java │ │ │ │ │ ├── SysMenuMapper.java │ │ │ │ │ ├── SysPermissionMapper.java │ │ │ │ │ ├── SysRoleMapper.java │ │ │ │ │ └── SysUserMapper.java │ │ │ │ └── service/ │ │ │ │ ├── ItemOrdersServiceImpl.java │ │ │ │ ├── MenuServiceImpl.java │ │ │ │ ├── SysPermissionServiceImpl.java │ │ │ │ ├── SysRoleServiceImpl.java │ │ │ │ └── SysUserServiceImpl.java │ │ │ └── resources/ │ │ │ └── mybatis/ │ │ │ ├── SysMenuMapper.xml │ │ │ ├── SysPermissionMapper.xml │ │ │ ├── SysRoleMapper.xml │ │ │ └── SysUserMapper.xml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── muses/ │ │ └── taoshop/ │ │ └── AppTest.java │ └── taoshop-manager-web/ │ ├── ReadMe.md │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── muses/ │ │ └── taoshop/ │ │ └── manager/ │ │ ├── WebApplication.java │ │ ├── config/ │ │ │ ├── MybatisConfig.java │ │ │ ├── ShiroConfig.java │ │ │ ├── ThymeleafConfig.java │ │ │ └── WebConfig.java │ │ ├── core/ │ │ │ ├── Constants.java │ │ │ └── shiro/ │ │ │ └── ShiroRealm.java │ │ ├── util/ │ │ │ └── MenuTreeUtil.java │ │ └── web/ │ │ └── controller/ │ │ ├── BaseController.java │ │ ├── CodeController.java │ │ ├── LoginController.java │ │ ├── item/ │ │ │ └── OrderController.java │ │ ├── menu/ │ │ │ └── MenuController.java │ │ └── userCenter/ │ │ └── UserController.java │ ├── resources/ │ │ ├── application.yml │ │ ├── plugins/ │ │ │ ├── datepicker/ │ │ │ │ ├── css/ │ │ │ │ │ ├── bootstrap-datepicker.css │ │ │ │ │ └── bootstrap.css │ │ │ │ └── js/ │ │ │ │ └── bootstrap-datepicker.js │ │ │ └── select2/ │ │ │ ├── css/ │ │ │ │ └── select2.css │ │ │ └── js/ │ │ │ ├── i18n/ │ │ │ │ ├── ar.js │ │ │ │ ├── az.js │ │ │ │ ├── bg.js │ │ │ │ ├── ca.js │ │ │ │ ├── cs.js │ │ │ │ ├── da.js │ │ │ │ ├── de.js │ │ │ │ ├── en.js │ │ │ │ ├── es.js │ │ │ │ ├── et.js │ │ │ │ ├── eu.js │ │ │ │ ├── fa.js │ │ │ │ ├── fi.js │ │ │ │ ├── fr.js │ │ │ │ ├── gl.js │ │ │ │ ├── he.js │ │ │ │ ├── hi.js │ │ │ │ ├── hr.js │ │ │ │ ├── hu.js │ │ │ │ ├── id.js │ │ │ │ ├── is.js │ │ │ │ ├── it.js │ │ │ │ ├── ja.js │ │ │ │ ├── ko.js │ │ │ │ ├── lt.js │ │ │ │ ├── lv.js │ │ │ │ ├── mk.js │ │ │ │ ├── ms.js │ │ │ │ ├── nb.js │ │ │ │ ├── nl.js │ │ │ │ ├── pl.js │ │ │ │ ├── pt-BR.js │ │ │ │ ├── pt.js │ │ │ │ ├── ro.js │ │ │ │ ├── ru.js │ │ │ │ ├── sk.js │ │ │ │ ├── sr-Cyrl.js │ │ │ │ ├── sr.js │ │ │ │ ├── sv.js │ │ │ │ ├── th.js │ │ │ │ ├── tr.js │ │ │ │ ├── uk.js │ │ │ │ ├── vi.js │ │ │ │ ├── zh-CN.js │ │ │ │ └── zh-TW.js │ │ │ ├── select2.full.js │ │ │ └── select2.js │ │ ├── static/ │ │ │ ├── css/ │ │ │ │ ├── backend.css │ │ │ │ ├── page/ │ │ │ │ │ └── backend/ │ │ │ │ │ ├── account_center.css │ │ │ │ │ ├── login.css │ │ │ │ │ └── order_manage.css │ │ │ │ └── style.css │ │ │ └── js/ │ │ │ ├── common.js │ │ │ ├── jquery.cookie.js │ │ │ ├── jquery.js │ │ │ ├── jquery.pagination.js │ │ │ └── jquery.tips.js │ │ └── templates/ │ │ ├── admin/ │ │ │ ├── frame/ │ │ │ │ ├── common.html │ │ │ │ ├── index.html │ │ │ │ ├── nav.html │ │ │ │ └── sider_bar_bk.html │ │ │ ├── order/ │ │ │ │ ├── order_content_wrap.html │ │ │ │ └── order_list.html │ │ │ └── user/ │ │ │ ├── user_center.html │ │ │ └── user_content_wrap.html │ │ └── login.html │ └── webapp/ │ ├── WEB-INF/ │ │ └── web.xml │ └── index.jsp ├── taoshop-order/ │ ├── ReadMe.md │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── muses/ │ │ └── taoshop/ │ │ └── order/ │ │ ├── OrderApplication.java │ │ └── web/ │ │ └── controller/ │ │ ├── BaseController.java │ │ └── OrderController.java │ ├── resources/ │ │ └── application.yml │ └── webapp/ │ ├── WEB-INF/ │ │ └── web.xml │ └── index.jsp ├── taoshop-portal/ │ ├── ReadMe.md │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── muses/ │ │ │ └── taoshop/ │ │ │ ├── PortalApplication.java │ │ │ ├── aop/ │ │ │ │ └── OperationRecordLog.java │ │ │ ├── base/ │ │ │ │ ├── ConfigConsts.java │ │ │ │ ├── SessionConsts.java │ │ │ │ └── ViewNameConsts.java │ │ │ ├── config/ │ │ │ │ └── WebConfig.java │ │ │ ├── util/ │ │ │ │ └── CategoryTreeUtils.java │ │ │ └── web/ │ │ │ └── controller/ │ │ │ ├── BaseController.java │ │ │ ├── CodeController.java │ │ │ ├── LoginController.java │ │ │ ├── cart/ │ │ │ │ └── ShopCartController.java │ │ │ ├── portal/ │ │ │ │ ├── IndexController.java │ │ │ │ ├── ItemCategoryController.java │ │ │ │ └── ItemDetailController.java │ │ │ └── user/ │ │ │ └── UserController.java │ │ ├── resources/ │ │ │ ├── application-dev.properties │ │ │ ├── application-prod.properties │ │ │ ├── application-uat.properties │ │ │ ├── application.properties │ │ │ ├── application.yml │ │ │ ├── logback_spring.xml.bat │ │ │ ├── static/ │ │ │ │ ├── css/ │ │ │ │ │ ├── cart.css │ │ │ │ │ ├── category.css │ │ │ │ │ ├── detail.css │ │ │ │ │ ├── index.css │ │ │ │ │ ├── jqzoom.css │ │ │ │ │ ├── public.css │ │ │ │ │ ├── reg-login.css │ │ │ │ │ ├── user.css │ │ │ │ │ └── you_like.css │ │ │ │ └── js/ │ │ │ │ ├── html5.js │ │ │ │ ├── jquery.cookie.js │ │ │ │ ├── jquery.js │ │ │ │ ├── jquery.tips.js │ │ │ │ ├── jqzoom.js │ │ │ │ └── popbox.js │ │ │ └── templates/ │ │ │ ├── footer.html │ │ │ ├── header_main.html │ │ │ ├── header_nav.html │ │ │ ├── index.html │ │ │ ├── index_header_nav.html │ │ │ ├── item/ │ │ │ │ ├── item_category.html │ │ │ │ └── item_detail.html │ │ │ ├── login.html │ │ │ ├── shopcart/ │ │ │ │ └── add_shopcart_success.html │ │ │ ├── test.html │ │ │ ├── top_bar.html │ │ │ └── user/ │ │ │ └── portal_user_center.html │ │ └── webapp/ │ │ ├── WEB-INF/ │ │ │ └── web.xml │ │ └── index.jsp │ └── test/ │ └── java/ │ └── com/ │ └── muses/ │ └── taoshop/ │ ├── Attachment.java │ ├── Client.java │ ├── Email.java │ ├── JDBCFacade.java │ ├── ParseDateTest.java │ └── ThreadLocalTest.java ├── taoshop-provider/ │ ├── ReadMe.md │ ├── pom.xml │ ├── taoshop-provider-item/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── muses/ │ │ │ └── taoshop/ │ │ │ └── item/ │ │ │ ├── mapper/ │ │ │ │ ├── ItemBrandMapper.java │ │ │ │ ├── ItemCategoryMapper.java │ │ │ │ ├── ItemMapper.java │ │ │ │ └── ItemSpecMapper.java │ │ │ └── service/ │ │ │ ├── ItemBrankServiceImpl.java │ │ │ ├── ItemCategoryServiceImpl.java │ │ │ ├── ItemServiceImpl.java │ │ │ └── ItemSpecServiceImpl.java │ │ └── resources/ │ │ └── mybatis/ │ │ ├── ItemBrandMapper.xml │ │ ├── ItemCategoryMapper.xml │ │ ├── ItemMapper.xml │ │ └── ItemSpecMapper.xml │ ├── taoshop-provider-order/ │ │ └── pom.xml │ ├── taoshop-provider-shop/ │ │ └── pom.xml │ └── taoshop-provider-usc/ │ ├── ReadMe.md │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── muses/ │ │ └── taoshop/ │ │ └── user/ │ │ ├── mapper/ │ │ │ └── UserMapper.java │ │ └── service/ │ │ └── UserServiceImpl.java │ └── resources/ │ └── mybatis/ │ └── UserMapper.xml ├── taoshop-provider-api/ │ ├── ReadMe.md │ ├── pom.xml │ ├── taoshop-provider-api-item/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── muses/ │ │ └── taoshop/ │ │ └── item/ │ │ ├── entity/ │ │ │ ├── ItemBrand.java │ │ │ ├── ItemCategory.java │ │ │ ├── ItemDetail.java │ │ │ ├── ItemDto.java │ │ │ ├── ItemList.java │ │ │ ├── ItemPortal.java │ │ │ ├── ItemSku.java │ │ │ ├── ItemSkuSpecValue.java │ │ │ ├── ItemSpec.java │ │ │ ├── ItemSpecValue.java │ │ │ ├── ItemSpu.java │ │ │ └── ItemSpuSpec.java │ │ └── service/ │ │ ├── IItemBrankService.java │ │ ├── IItemCategoryService.java │ │ ├── IItemService.java │ │ └── IItemSpecService.java │ ├── taoshop-provider-api-order/ │ │ ├── ReadMe.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── muses/ │ │ │ └── provider/ │ │ │ └── api/ │ │ │ └── App.java │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── muses/ │ │ └── provider/ │ │ └── api/ │ │ └── AppTest.java │ ├── taoshop-provider-api-shop/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── muses/ │ │ └── taoshop/ │ │ └── item/ │ │ └── entity/ │ │ ├── ShopInfo.java │ │ └── ShopInfoExample.java │ └── taoshop-provider-api-usc/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── muses/ │ └── taoshop/ │ └── user/ │ ├── entity/ │ │ └── User.java │ └── service/ │ └── IUserService.java ├── taoshop-quartz/ │ ├── ReadMe.md │ └── pom.xml ├── taoshop-search/ │ ├── ReadMe.md │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── muses/ │ │ └── base/ │ │ └── search/ │ │ ├── LuceneConstants.java │ │ ├── TestLucene.java │ │ └── biz/ │ │ ├── LuceneIndexer.java │ │ └── SearchBuilder.java │ └── test/ │ └── java/ │ └── com/ │ └── test/ │ ├── lucene/ │ │ ├── LuceneIndexer.java │ │ └── SearchBuilder.java │ ├── pattern/ │ │ ├── CurrentConditionsDisplay.java │ │ ├── DisplayElement.java │ │ ├── ForecastDisplay.java │ │ ├── Observer.java │ │ ├── Singleton.java │ │ ├── StatisticsDisplay.java │ │ ├── Subject.java │ │ ├── WeatherData.java │ │ └── WeatherStation.java │ └── thread/ │ └── ThreadTest.java └── taoshop-sso/ ├── pom.xml └── src/ └── main/ ├── java/ │ ├── ReadMe.txt │ ├── com/ │ │ └── muses/ │ │ └── taoshop/ │ │ └── sso/ │ │ └── authentication/ │ │ └── UsernamePasswordAuthenticationHandler.java │ └── org/ │ └── jasig/ │ └── cas/ │ ├── CentralAuthenticationServiceImpl.java │ ├── adaptors/ │ │ └── jdbc/ │ │ ├── AbstractJdbcUsernamePasswordAuthenticationHandler.java │ │ └── QueryDatabaseAuthenticationHandler.java │ ├── authentication/ │ │ └── UsernamePasswordCredential.java │ ├── support/ │ │ └── rest/ │ │ └── TicketsResource.java │ └── web/ │ └── flow/ │ ├── AuthenticationExceptionHandler.java │ └── AuthenticationViaFormAction.java ├── resources/ │ ├── application.properties │ ├── application.yml │ └── services/ │ ├── Apereo-10000002.json │ └── HTTPSandIMAPS-10000001.json └── webapp/ └── WEB-INF/ ├── cas_dev.properties ├── index.jsp ├── spring-configuration/ │ └── propertyFileConfigurer.xml └── view/ └── jsp/ ├── authorizationFailure.jsp ├── default/ │ └── ui/ │ ├── casAcceptableUsagePolicyView.jsp │ ├── casAccountDisabledView.jsp │ ├── casAccountLockedView.jsp │ ├── casBadHoursView.jsp │ ├── casBadWorkstationView.jsp │ ├── casConfirmView.jsp │ ├── casExpiredPassView.jsp │ ├── casGenericSuccessView.jsp │ ├── casLoginMessageView.jsp │ ├── casLoginView.jsp │ ├── casLogoutView.jsp │ ├── casMustChangePassView.jsp │ ├── serviceErrorSsoView.jsp │ └── serviceErrorView.jsp └── errors.jsp ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # ---> Java *.class # Mobile Tools for Java (J2ME) .mtj.tmp/ # Package Files # *.jar *.war *.ear # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* # ---> Eclipse *.pydevproject .metadata .gradle bin/ tmp/ *.tmp *.bak *.swp *~.nib local.properties .settings/ .loadpath # Eclipse Core .project # External tool builders .externalToolBuilders/ # Locally stored "Eclipse launch configurations" *.launch # CDT-specific .cproject # JDT-specific (Eclipse Java Development Tools) .classpath # Java annotation processor (APT) .factorypath # PDT-specific .buildpath # sbteclipse plugin .target # TeXlipse plugin .texlipse # ---> Maven target/ out/ overlays/ pom.xml.tag pom.xml.releaseBackup pom.xml.versionsBackup pom.xml.next release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties # ---> TortoiseGit # Project-level settings /.tgitconfig # ---> SVN .svn/ # IDEA *.iml .idea/ /*.iml ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed 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. ================================================ FILE: README.md ================================================ [![Build Status](https://travis-ci.org/crossoverJie/JCSprout.svg?branch=master)](https://travis-ci.org/crossoverJie/taoshop) # 电子商务项目 ## 电商项目简介 电子商务项目[taoshop](https://github.com/u014427391/taoshop)
代码已经捐赠给开源中国社区:https://www.oschina.net/p/taoshop 项目releases链接:https://github.com/u014427391/taoshop/releases 本开源电商项目,SpringBoot+Dubbo技术栈实现微服务,实现一款分布式集群的电商系统。(开发中...) ## 开源协议 taoshop使用Apache2.0开源协议 ## 功能 ### [门户网站] - [ ] 商品搜索(Lucene) - [x] 最新上架 - [ ] 购物车功能 - [x] 品目商品搜索 - [ ] 优惠券秒杀(高并发处理) - [ ] 商品详情 - [x] 商品品类多级联动 ### [运营平台] - [ ] 会员中心 - [ ] 订单系统 - [ ] 店铺管理 - [ ] 评论管理 - [ ] 风控系统 - [ ] 采购平台 - [ ] 内容管理 ## 技术栈 * 模板引擎:Thymeleaf * 搜索引擎:Lucene * 负载均衡:Nginx * 缓存处理:Redis * 后台主要框架:SpringBoot、Mybatis * 微服务搭建:Dubbo ## 平台工程目录 ``` ├─taoshop----------------------------父项目,公共依赖 │ │ │ ├─taoshop-search--------------------------全局搜索 │ │ │ ├─taoshop-quartz-----------------------任务调度系统 │ │ │ ├─taoshop-sso-------------------------单点登录工程 │ │ │ ├─taoshop-portal--------------------------门户网站 │ │ │ ├─taoshop-cms--------------------------平台cms系统 | | | |─taoshop-order--------------------------平台订单系统 │ │ │ ├─paascloud-provider │ │ │ │ │ │ │ │ ├─taoshop-provider-usc------------------用户信息服务中心 | | | | | |-taoshop-provider-item------------------商品信息服务中心 | | | | | |-taoshop-provider-shop------------------商铺信息服务中心 │ │ │ │ │ └─taoshop-provider-order------------------订单信息服务中心 │ │ │ ├─taoshop-provider-api │ │ │ │ │ │-taoshop-provider-api-usc------------------用户信息服务API | | | | | |-taosho-provider-api-item------------------商品信息服务API | | | | | |-taoshop-provider-api-shop------------------商铺信息服务API | | | │ │ └─taoshop-provider-api-order------------------订单信息服务API │ │ │ ├─taoshop-common │ │ │ │ │ ├─taoshop-common-core------------------平台核心依赖服务 │ │ │ │ │ ├─taoshop-common-zk------------------zookeeper配置工程 │ │ │ │ │ ├─taoshop-common-quartz------------------任务调度服务 │ │ │ │ │ ├─taoshop-security-core------------------安全服务核心服务 │ │ │ │ │ └─taoshop-security-auth2------------------API认证授权服务 │ │ ``` ## 架构设计 ![Image text](https://github.com/u014427391/taoshop/raw/master/screenshot/架构图20180409.png) ## 平台功能演示 运营系统登录 ![Image text](https://github.com/u014427391/taoshop/raw/master/screenshot/运营平台登录.png) 订单管理页面 ![Image text](https://github.com/u014427391/taoshop/raw/master/screenshot/订单管理.png) ## 附录 ### 一、分布式基本知识 #### 1.1) 架构演变 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181103230911558.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70) 先给出dubbo官方的图,图片表示了架构的演变。然后我说一下自己的理解。 应用最开始是单体应用,即一个应用包括了所有应用模块。 随后就是垂直应用架构,也就是将系统拆分为多个应用模块。 随后就是RPC架构,之前的垂直应用架构其实可以说是在一个进程内的通讯,而RPC就是一种进步,RPC是进程之间的通讯,远程过程调用就是这么来的。 有了RPC之后,虽然可以实现进程之间的通讯,但是服务器集群后的服务器资源利用有些时候容易造成浪费,比如有个系统,一般情况都是不能很好地预估需要分配多少机器的,很容易造成一种情况就是业务访问很频繁的模块分配了不足的机器,而访问不是很频繁的模块分配了太多的机器,这种情况就不能实现资源的很好利用,所以针对这种情况就有了SOA(Service Oriented Architecture)的出现,SOA其实就是一个服务注册中心,可以实现资源调度,合理地分配资源,提高资源调度,是一个治理中心。 #### 1.2)、分布式基本概念 所以我们了解了架构演变之后,就可以更好的理解分布式,分布式其实就是一种可以实现不同进程之间通讯的架构,然后进程之间怎么通讯的?一般都是通过RPC框架实现。比如Java方面的,Dubbo框架或者Spring Cloud。 ### 二、RCP简介 #### 2.1) RPC概念 RPC:全称远程过程调用,是一种**进程间的通信的方式**,它所做的事情就是实现进程内的通信,允许调用另外一个地址空间,可以是共享网络里的另外一台机器。 #### 2.2) RPC核心模块 RPC有两个核心模块:通信和序列化 ### 三、Dubbo原理简介 #### 3.1) Dubbo简介 Dubbo是阿里巴巴开源的一款Java RPC框架,现在已经捐赠给Apache 官网:http://dubbo.apache.org/ #### 3.2) 核心功能 a、智能容错和负载均衡 b、服务注册和发现 c、面向接口的远程方法调用 #### 3.3) 原理简介 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181104105820112.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70) 上图是Dubbo官方的图 **角色** Provider:暴露服务的服务提供者 Container:服务运行的容器 Consumer:调用远程服务的消费者 Registry:服务注册和发现的注册中心 Minitor:统计服务调用次数和时间的监控中心 **调用** 下面根据我的理解说明一下 0:服务器容器负责启动、加载、运行服务提供者 1:服务提供者在启动后就可以向注册中心暴露服务 2:服务消费者在启动后就可以向注册中心订阅想要的服务 3:注册中心向服务消费者返回服务调用列表 4:服务消费者基于软负载均衡算法调用服务提供者的服务,这个服务提供者有可能是一个服务提供者列表,调用那个服务提供者就是根据负载均衡来调用了 5:服务提供者和服务消费者定时将保存在内存中的服务调用次数和服务调用时间推送给监控中心 ## 博客记录 为了帮助学习者更好地理解代码,下面给出自己写的一些博客链接 ### 单点登录 * [CAS单点登录简单介绍](https://blog.csdn.net/u014427391/article/details/82083995) ### 消息队列 * [RocketMQ入门手册](https://blog.csdn.net/u014427391/article/details/79914331) ### 搜索引擎 * [Apache Lucene全局搜索引擎入门教程](https://blog.csdn.net/u014427391/article/details/80006401) ### Dubbo * [Dubbo学习笔记](https://blog.csdn.net/u014427391/article/details/83716884) * [SpringBoot+Dubbo搭建微服务](https://blog.csdn.net/u014427391/article/details/84455282) ### 分布式锁 * [Redis学习笔记之分布式锁](https://blog.csdn.net/u014427391/article/details/84934045) ### SpringBoot * [电商门户网站商品品类多级联动SpringBoot+Thymeleaf实现](https://blog.csdn.net/u014427391/article/details/83685901) ### Mybatis * [Mybatis+Thymeleaf前端显示时间格式问题解决方法](https://blog.csdn.net/u014427391/article/details/83686014) * [Mybatis3.2不支持Ant通配符的TypeAliasesPackage扫描解决方案](https://blog.csdn.net/u014427391/article/details/84723292) ### 缓存 * [Redis学习笔记之基本数据结构](https://blog.csdn.net/u014427391/article/details/82860694) * [Redis学习笔记之位图](https://blog.csdn.net/u014427391/article/details/87923407) * [Redis学习笔记之延时队列](https://blog.csdn.net/u014427391/article/details/87905450) * [Redis学习笔记之分布式锁](https://blog.csdn.net/u014427391/article/details/84934045) * [SpringBoot集成Redis实现缓存处理(Spring AOP技术)](http://blog.csdn.net/u014427391/article/details/78799623) ### 设计模式 创建型 * [设计模式之观察者模式(行为型)](https://blog.csdn.net/u014427391/article/details/81156661) * [设计模式之桥接模式(结构型)](https://blog.csdn.net/u014427391/article/details/88412075) * [设计模式之适配器模式(结构型)](https://blog.csdn.net/u014427391/article/details/88412105) * [设计模式之建造者模式(创建型)](https://blog.csdn.net/u014427391/article/details/80061566) * [设计模式之简单工厂模式(创建型)](https://blog.csdn.net/u014427391/article/details/85543283) * [设计模式之抽象工厂模式(创建型)](https://blog.csdn.net/u014427391/article/details/85543242) * [设计模式之单例模式(创建型)](https://blog.csdn.net/u014427391/article/details/80019048) * [设计模式之工厂方法模式(创建型)](https://blog.csdn.net/u014427391/article/details/85543251) * [设计模式之原型模式(创建型)](https://blog.csdn.net/u014427391/article/details/87539023) 结构型 * [设计模式之桥接模式(结构型)](https://blog.csdn.net/u014427391/article/details/88412075) * [设计模式之适配器模式(结构型)](https://blog.csdn.net/u014427391/article/details/88412105) 行为型 * [设计模式之观察者模式(行为型)](https://blog.csdn.net/u014427391/article/details/81156661) * [设计模式之命令模式(行为型)](https://blog.csdn.net/u014427391/article/details/89289375) * [设计模式之备忘录模式(行为型)](https://blog.csdn.net/u014427391/article/details/88598079) * [设计模式之访问者模式(行为型)](https://blog.csdn.net/u014427391/article/details/88562267) ### Oracle知识 * [Oracle知识整理笔录](https://blog.csdn.net/u014427391/article/details/82317376) * [Oracle笔记之锁表和解锁](https://blog.csdn.net/u014427391/article/details/83046148) * [Oracle递归查询start with connect by prior](https://blog.csdn.net/u014427391/article/details/84996259) * [Oracle列转行函数vm_concat使用](https://blog.csdn.net/u014427391/article/details/84981114) * [Oracle笔记之修改表字段类型](https://blog.csdn.net/u014427391/article/details/83046006) * [Oracle的nvl函数和nvl2函数](https://blog.csdn.net/u014427391/article/details/84996009) ================================================ FILE: docs/taoshop.sql ================================================ /* SQLyog v10.2 MySQL - 5.1.32-community : Database - taoshop ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; CREATE DATABASE /*!32312 IF NOT EXISTS*/`taoshop` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `taoshop`; /*Table structure for table `item_brand` */ DROP TABLE IF EXISTS `item_brand`; CREATE TABLE `item_brand` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `brand_name` varchar(20) DEFAULT NULL, `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; /*Data for the table `item_brand` */ insert into `item_brand`(`id`,`brand_name`,`last_modify_time`,`create_time`) values (1,'荣耀','2018-07-24 23:21:20','2018-06-24 20:42:37'); /*Table structure for table `item_category` */ DROP TABLE IF EXISTS `item_category`; CREATE TABLE `item_category` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `category_name` varchar(20) DEFAULT NULL, `sjid` bigint(11) DEFAULT NULL, `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8; /*Data for the table `item_category` */ insert into `item_category`(`id`,`category_name`,`sjid`,`last_modify_time`,`create_time`) values (1,'家用电器',0,'2018-06-24 18:59:07','2018-06-24 15:52:04'),(2,'手机数码',0,'2018-06-24 19:01:39','2018-06-24 16:27:48'),(3,'电脑办公',0,'2018-06-24 19:01:33','2018-06-24 16:27:50'),(4,'家居家具',0,'2018-06-24 19:01:24','2018-06-24 16:27:52'),(5,'品牌衣饰',0,'2018-06-24 19:02:18','2018-06-24 16:27:54'),(6,'美妆洗护',0,'2018-06-24 19:03:08','2018-06-24 16:27:56'),(7,'珠宝眼镜',0,'2018-06-24 19:03:23','2018-06-24 16:27:58'),(8,'学习书籍',0,'2018-06-24 19:03:46','2018-06-24 16:28:00'),(9,'电视',1,'2018-06-24 19:04:11','2018-06-24 17:35:18'),(10,'空调',1,'2018-06-24 19:04:20','2018-06-24 18:27:28'),(11,'洗衣机',1,'2018-06-24 19:04:19','2018-06-24 18:44:41'),(12,'冰箱',1,'2018-06-24 19:06:05','2018-06-24 19:06:04'),(13,'手机通讯',2,'2018-06-24 19:06:07','2018-06-24 19:06:06'),(14,'手机配件',2,'2018-06-24 19:06:09','2018-06-24 19:06:07'),(15,'电脑整机',3,'2018-06-24 19:06:12','2018-06-24 19:06:09'),(16,'曲面电视',9,'2018-06-24 19:08:07','2018-06-24 19:08:05'),(17,'超薄电视',9,'2018-06-24 19:08:08','2018-06-24 19:08:07'),(18,'HDR电视',9,'2018-06-24 19:08:26','2018-06-24 19:08:09'),(19,'人工智能电视',9,'2018-06-24 19:08:36','2018-06-24 19:08:10'),(20,'柜式空调',10,'2018-07-24 22:42:34','2018-07-24 22:42:30'),(21,'中央空调',10,'2018-07-24 22:42:36','2018-07-24 22:42:35'),(22,'变频空调',10,'2018-07-24 22:42:39','2018-07-24 22:42:37'),(23,'滚筒洗衣机',11,'2018-07-24 22:43:40','2018-07-24 22:43:42'),(24,'迷你洗衣机',11,'2018-07-24 22:43:54','2018-07-24 22:43:56'),(25,'洗衣机配件',11,'2018-07-24 22:44:14','2018-07-24 22:44:15'),(26,'酒柜',12,'2018-07-24 22:45:41','2018-07-24 22:45:00'),(27,'多门',12,'2018-07-24 22:45:49','2018-07-24 22:45:51'),(28,'冷柜',12,'2018-07-24 22:46:12','2018-07-24 22:46:14'),(29,'冰箱配件',12,'2018-07-24 22:46:38','2018-07-24 22:46:40'),(30,'手机',13,'2018-07-24 22:48:23','2018-07-24 22:48:25'),(31,'游戏手机',13,'2018-07-24 22:48:29','2018-07-24 22:48:27'),(32,'对讲机',13,'2018-07-24 22:49:24','2018-07-24 22:49:27'),(33,'手机壳',14,'2018-07-25 23:22:38','2018-07-25 23:22:43'),(34,'数据线',14,'2018-07-25 23:23:01','2018-07-25 23:23:03'),(35,'充电器',14,'2018-07-25 23:23:30','2018-07-25 23:23:32'),(36,'手机饰品',14,'2018-07-25 23:24:33','2018-07-25 23:24:35'),(37,'电脑办公',3,'2018-07-25 23:25:36','2018-07-25 23:25:38'),(38,'电脑配件',3,'2018-07-25 23:25:44','2018-07-25 23:25:40'),(39,'外设产品',3,'2018-07-25 23:26:16','2018-07-25 23:26:18'); /*Table structure for table `item_sku` */ DROP TABLE IF EXISTS `item_sku`; CREATE TABLE `item_sku` ( `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'id,主键', `sku_code` varchar(50) NOT NULL COMMENT 'sku编号,唯一', `sku_name` varchar(50) DEFAULT NULL COMMENT 'sku名称,冗余spu_name', `price` decimal(9,2) NOT NULL COMMENT '商城售价', `promotion_price` decimal(9,2) DEFAULT NULL COMMENT '促销售价', `stock` int(11) NOT NULL COMMENT '库存', `shop_id` bigint(11) NOT NULL COMMENT '商铺id,为0表示自营', `spu_id` bigint(11) NOT NULL COMMENT 'spu id,外键', `img_path` varchar(50) DEFAULT NULL COMMENT '图片路径', `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; /*Data for the table `item_sku` */ insert into `item_sku`(`id`,`sku_code`,`sku_name`,`price`,`promotion_price`,`stock`,`shop_id`,`spu_id`,`img_path`,`last_modify_time`,`create_time`) values (1,'112233','112233','1122.00','999.00',111,1,1,'/static/picture/img_small_350x350.jpg','2018-07-24 22:21:07','2018-06-30 15:50:10'),(2,'112234','test','1123.00','999.00',111,2,2,'/static/picture/img_small_350x350.jpg','2018-07-24 22:21:09','2018-06-30 15:55:27'),(3,'112235','112223','1234.00','999.00',123,3,2,'/static/picture/img_small_350x350.jpg','2018-07-24 22:21:13','2018-07-01 16:56:47'); /*Table structure for table `item_sku_spec_value` */ DROP TABLE IF EXISTS `item_sku_spec_value`; CREATE TABLE `item_sku_spec_value` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `sku_id` bigint(20) NOT NULL COMMENT 'sku_id', `spec_value_id` bigint(20) NOT NULL COMMENT '规格值id', `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='sku规格值'; /*Data for the table `item_sku_spec_value` */ insert into `item_sku_spec_value`(`id`,`sku_id`,`spec_value_id`,`last_modify_time`,`create_time`) values (1,1,1,'2018-07-28 17:20:31','2018-07-28 17:20:34'),(2,1,2,'2018-07-28 17:20:42','2018-07-28 17:20:44'); /*Table structure for table `item_spec` */ DROP TABLE IF EXISTS `item_spec`; CREATE TABLE `item_spec` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `spec_no` varchar(50) NOT NULL COMMENT '规格编号', `spec_name` varchar(50) NOT NULL COMMENT '规格名称', `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='规格表'; /*Data for the table `item_spec` */ insert into `item_spec`(`id`,`spec_no`,`spec_name`,`last_modify_time`,`create_time`) values (1,'test','系统','2018-07-28 13:56:14','2018-07-28 13:56:16'),(2,'test11','网络','2018-07-28 13:57:00','2018-07-28 13:57:02'); /*Table structure for table `item_spec_value` */ DROP TABLE IF EXISTS `item_spec_value`; CREATE TABLE `item_spec_value` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `spec_id` bigint(20) DEFAULT NULL COMMENT '外键', `spec_value` varchar(50) NOT NULL COMMENT '规格值', `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='规格值表'; /*Data for the table `item_spec_value` */ insert into `item_spec_value`(`id`,`spec_id`,`spec_value`,`last_modify_time`,`create_time`) values (1,NULL,'苹果(IOS)','2018-07-28 17:19:12','2018-07-28 17:19:14'),(2,NULL,'联通4G','2018-07-28 17:19:59','2018-07-28 17:20:00'); /*Table structure for table `item_spu` */ DROP TABLE IF EXISTS `item_spu`; CREATE TABLE `item_spu` ( `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '商品id,主键', `spu_code` varchar(50) NOT NULL COMMENT '商品编号,唯一', `item_name` varchar(50) NOT NULL COMMENT '商品名称', `category_id` bigint(11) NOT NULL COMMENT '分类id', `brand_id` bigint(11) NOT NULL COMMENT '品牌id', `shop_id` bigint(11) NOT NULL COMMENT '商铺id', `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` timestamp NOT NULL DEFAULT '1978-01-01 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; /*Data for the table `item_spu` */ insert into `item_spu`(`id`,`spu_code`,`item_name`,`category_id`,`brand_id`,`shop_id`,`last_modify_time`,`create_time`) values (1,'112233','荣耀10 GT游戏加速 AIS手持夜景',1,1,1,'2018-07-24 23:31:29','2018-06-30 15:49:26'),(2,'112234','小米MIX2S 全面屏游戏手机',2,1,1,'2018-07-24 23:31:36','1978-01-01 00:00:00'); /*Table structure for table `item_spu_spec` */ DROP TABLE IF EXISTS `item_spu_spec`; CREATE TABLE `item_spu_spec` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `spu_id` bigint(20) NOT NULL COMMENT 'spu_id', `spec_id` bigint(20) NOT NULL COMMENT 'spec_id', `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='spu规格表'; /*Data for the table `item_spu_spec` */ insert into `item_spu_spec`(`id`,`spu_id`,`spec_id`,`last_modify_time`,`create_time`) values (1,1,1,'2018-07-28 13:57:38','2018-07-28 13:57:40'),(2,1,2,'2018-07-28 13:57:44','2018-07-28 13:57:42'); /*Table structure for table `shop_info` */ DROP TABLE IF EXISTS `shop_info`; CREATE TABLE `shop_info` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `shop_name` varchar(50) NOT NULL COMMENT '店铺名称', `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='店铺表'; /*Data for the table `shop_info` */ insert into `shop_info`(`id`,`shop_name`,`last_modify_time`,`create_time`) values (1,'小米官方旗舰店','2018-07-24 23:31:02','2018-07-24 23:30:58'); /*Table structure for table `sys_menu` */ DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE `sys_menu` ( `menuId` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单Id', `parentId` int(11) DEFAULT NULL COMMENT '上级Id', `menuName` varchar(100) DEFAULT NULL COMMENT '菜单名称', `menuIcon` varchar(30) DEFAULT NULL COMMENT '菜单图标', `menuUrl` varchar(100) DEFAULT NULL COMMENT '菜单链接', `menuType` varchar(10) DEFAULT NULL COMMENT '菜单类型', `menuOrder` varchar(10) DEFAULT NULL COMMENT '菜单排序', `menuStatus` varchar(10) DEFAULT NULL COMMENT '菜单状态', PRIMARY KEY (`menuId`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8; /*Data for the table `sys_menu` */ insert into `sys_menu`(`menuId`,`parentId`,`menuName`,`menuIcon`,`menuUrl`,`menuType`,`menuOrder`,`menuStatus`) values (1,0,'用户管理','','#','1','1','1'),(2,1,'管理员管理','','user/queryAll.do','2','2','1'),(3,1,'用户统计','','test','2','3','1'),(4,0,'在线管理','','#','1','4','1'),(5,4,'在线情况','',NULL,'2','5','1'),(6,4,'在线聊天','','article/list.do','2','6','1'),(7,0,'系统管理','','#','1','7','1'),(8,7,'角色管理','','role/queryAll.do','2','8','1'),(9,7,'权限管理','','permission/queryAll.do','2','9','1'),(10,7,'菜单管理','','menu/getMenus.do','2','10','1'),(11,0,'平台资料','','#','1','11','1'); /*Table structure for table `sys_operation` */ DROP TABLE IF EXISTS `sys_operation`; CREATE TABLE `sys_operation` ( `id` int(11) NOT NULL COMMENT '操作Id,主键', `desc` varchar(100) DEFAULT NULL COMMENT '操作描述', `name` varchar(100) DEFAULT NULL COMMENT '操作名称', `operation` varchar(100) DEFAULT NULL COMMENT '操作标志', PRIMARY KEY (`id`), UNIQUE KEY `uk_o_1` (`operation`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Data for the table `sys_operation` */ insert into `sys_operation`(`id`,`desc`,`name`,`operation`) values (1,'创建操作','创建','create'),(2,'编辑权限','编辑','edit'),(3,'删除权限','删除','delete'),(4,'浏览权限','浏览','view'); /*Table structure for table `sys_permission` */ DROP TABLE IF EXISTS `sys_permission`; CREATE TABLE `sys_permission` ( `id` int(11) NOT NULL COMMENT '权限Id', `pdesc` varchar(100) DEFAULT NULL COMMENT '权限描述', `name` varchar(100) DEFAULT NULL COMMENT '权限名称', `menuId` int(11) DEFAULT NULL COMMENT '菜单Id', PRIMARY KEY (`id`), KEY `p_fk_1` (`menuId`), CONSTRAINT `p_fk_1` FOREIGN KEY (`menuId`) REFERENCES `sys_menu` (`menuId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Data for the table `sys_permission` */ insert into `sys_permission`(`id`,`pdesc`,`name`,`menuId`) values (1,'用户管理的权限','用户管理',1),(2,'管理员管理的权限','管理员管理',2),(3,'用户统计的权限','用户统计',3),(4,'在线管理的权限','在线管理',4),(5,'在线情况的权限','在线情况',5),(6,'在线聊天的权限','在线聊天',6),(7,'系统管理的权限','系统管理',7),(8,'角色管理的权限','角色管理',8),(9,'权限管理的权限','权限管理',9),(10,'菜单管理的权限','菜单管理',10),(11,'平台资料的权限','平台资料',11); /*Table structure for table `sys_permission_operation` */ DROP TABLE IF EXISTS `sys_permission_operation`; CREATE TABLE `sys_permission_operation` ( `permissionId` int(11) NOT NULL, `operationId` int(11) NOT NULL, PRIMARY KEY (`permissionId`,`operationId`), KEY `po_fk_1` (`operationId`), CONSTRAINT `po_fk_1` FOREIGN KEY (`operationId`) REFERENCES `sys_operation` (`id`), CONSTRAINT `po_fk_2` FOREIGN KEY (`permissionId`) REFERENCES `sys_permission` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Data for the table `sys_permission_operation` */ insert into `sys_permission_operation`(`permissionId`,`operationId`) values (1,1),(2,2),(3,3); /*Table structure for table `sys_role` */ DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( `roleId` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色Id', `roleName` varchar(100) DEFAULT NULL COMMENT '角色名称', `roleDesc` varchar(100) DEFAULT NULL COMMENT '角色描述', `role` varchar(100) DEFAULT NULL COMMENT '角色标志', PRIMARY KEY (`roleId`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; /*Data for the table `sys_role` */ insert into `sys_role`(`roleId`,`roleName`,`roleDesc`,`role`) values (1,'超级管理员','超级管理员拥有所有权限','role'),(2,'用户管理员','用户管理权限','role'),(3,'角色管理员','角色管理权限','role'),(4,'资源管理员','资源管理权限','role'),(6,'操作权限管理员','操作权限管理','role'),(7,'查看员','查看系统权限','role'),(9,'用户','可以查看','role'); /*Table structure for table `sys_role_permission` */ DROP TABLE IF EXISTS `sys_role_permission`; CREATE TABLE `sys_role_permission` ( `rpId` varchar(12) NOT NULL COMMENT '表Id', `roleId` int(11) NOT NULL COMMENT '角色Id', `permissionId` int(11) NOT NULL COMMENT '权限Id', PRIMARY KEY (`rpId`), KEY `rp_fk_2` (`permissionId`), KEY `rp_fk_1` (`roleId`), CONSTRAINT `rp_fk_1` FOREIGN KEY (`roleId`) REFERENCES `sys_role` (`roleId`), CONSTRAINT `rp_fk_2` FOREIGN KEY (`permissionId`) REFERENCES `sys_permission` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Data for the table `sys_role_permission` */ insert into `sys_role_permission`(`rpId`,`roleId`,`permissionId`) values ('02a97146f6f4',2,1),('0bc217ced57a',1,1),('1623edee1d80',1,2),('2897c5ff0aa8',1,3),('421ddf008a05',1,4),('4b76f155fd74',9,1),('4dcadb89531b',1,7),('55eb164457e2',9,2),('59084a9f6914',2,2),('5a2b34b2f1a7',1,10),('63a5d5a8dae6',1,9),('9ad0b2c3be28',1,8),('9fa9725142c1',2,3),('ba83ae853640',1,6),('d5aec431edf6',1,5); /*Table structure for table `sys_user` */ DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户Id', `username` varchar(100) NOT NULL COMMENT '用户名', `password` varchar(100) NOT NULL COMMENT '密码', `phone` varchar(11) DEFAULT NULL COMMENT '手机', `sex` varchar(6) DEFAULT NULL COMMENT '性别', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `mark` varchar(100) DEFAULT NULL COMMENT '备注', `rank` varchar(10) DEFAULT NULL COMMENT '账号等级', `lastLogin` date DEFAULT NULL COMMENT '最后一次登录时间', `loginIp` varchar(30) DEFAULT NULL COMMENT '登录ip', `imageUrl` varchar(100) DEFAULT NULL COMMENT '头像图片路径', `regTime` date NOT NULL COMMENT '注册时间', `locked` tinyint(1) DEFAULT NULL COMMENT '账号是否被锁定', `rights` varchar(100) DEFAULT NULL COMMENT '权限(没有使用)', PRIMARY KEY (`id`), UNIQUE KEY `uk_u_1` (`username`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; /*Data for the table `sys_user` */ insert into `sys_user`(`id`,`username`,`password`,`phone`,`sex`,`email`,`mark`,`rank`,`lastLogin`,`loginIp`,`imageUrl`,`regTime`,`locked`,`rights`) values (1,'admin','28dca2a7b33b7413ad3bce1d58c26dd679c799f1','1552323312','男','313222@foxmail.com','超级管理员','admin','2017-08-12','127.0.0.1','/static/images/','2017-03-15',0,NULL),(2,'sys','e68feeafe796b666a2e21089eb7aae9c678bf82d','1552323312','男','313222@foxmail.com','系统管理员','sys','2017-08-25','127.0.0.1','/static/images/','2017-03-15',0,NULL),(3,'user','adf8e0d0828bde6e90c2bab72e7a2a763d88a0de','1552323312','男','313222@foxmail.com','用户','user','2017-08-18','127.0.0.1','/static/images/','2017-03-15',0,NULL),(9,'test','123','12332233212','保密','2312@qq.com','没有备注','user','2017-11-25','127.0.0.1',NULL,'2017-11-25',0,NULL); /*Table structure for table `sys_user_role` */ DROP TABLE IF EXISTS `sys_user_role`; CREATE TABLE `sys_user_role` ( `userId` int(11) NOT NULL COMMENT '用户Id,联合主键', `roleId` int(11) NOT NULL COMMENT '角色Id,联合主键', PRIMARY KEY (`userId`,`roleId`), KEY `ur_fk_2` (`roleId`), CONSTRAINT `ur_fk_1` FOREIGN KEY (`userId`) REFERENCES `sys_user` (`id`), CONSTRAINT `ur_fk_2` FOREIGN KEY (`roleId`) REFERENCES `sys_role` (`roleId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Data for the table `sys_user_role` */ insert into `sys_user_role`(`userId`,`roleId`) values (1,1),(1,2),(2,2),(1,3),(2,3),(3,3),(1,4),(3,4),(1,6),(1,7),(3,7),(9,9); /*Table structure for table `tb_user` */ DROP TABLE IF EXISTS `tb_user`; CREATE TABLE `tb_user` ( `username` varchar(11) DEFAULT NULL, `password` varchar(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Data for the table `tb_user` */ insert into `tb_user`(`username`,`password`) values ('user','11'); /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; ================================================ FILE: docs/架构图.pos ================================================ {"diagram":{"image":{"height":841,"pngdata":"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bdqmbfm2zd4cLBaLxd6VEBEREREREZG8p+79IiIiIiIiIsWUgn4RERERERGRYkpBv4iIiIiIiEgxpaBfREREREREpJhS0C8iIiIiIiJSTCnoFxERERERESmmnOxdAZE79TewC6gHdLVzXURERERERAoTtfRLkZYW8AOcTH0sIiIiIiIiVgr6pchKH/Cn2YUCfxERERERkTQK+qVIyirgT6PAX0RERERExEpBvxQ5Nwv40yjwFxERERERUdAvRUxOAv40CvxFRERERKSkU9AvRUZuAv40CvxFRERERKQkU9AvRcLtBPxpFPiLiIiIiEhJ5WTvCojcyp0E/GnS9m98h8cR+7AAgVinZbwOxNu3OpJLboAPUA9oADgU4Ln12hHJG6Wwvo+bA1UK8Lx6Dxdt9vz8F5F/OFgsFou9KyGSnbwI+NPriAL/osYCbATO2bsikidqAj0pmB9+eu2I5I+7gRYFcB69h4uXgvz8FxFb6t4vhVZeB/ygrv5FUSD6wVecBGN9TguCXjsiec8B2A+EF8C59B4uXgry819EbCnol0IpPwL+NAr8i5aT9q6A5LmCek712hHJexbADJwugHPpPVz86DkVsQ8F/VLo5GfAn0aBf9Fx3d4VkDxXUM+pXjsi+acg3l96Dxc/ek5F7ENBvxQqBRHwp1HgXzQoaVPxU1DPqV47IvmnIN5feg8XP3pORexDQb8UGscouIA/za7U84qIiIiIiBRHCvql0PithJ1XREREREQkvznZuwIiaXoA5wHnm5Q5kMtjugDNbrI9CaiUy2OKiIiIiIgUFQr6pdComvrvZlyAPbk4pj83D/pFRERERESKM3XvFxERERERESmm1NIvIiIixd6n/v7G8pClSynboIEdayMiIlJw1NIvIiIiIiIiUkwp6BcREREREREpphT0i4iIiIiIiBRTCvpFREREREREiikl8hMREREbGZPeRZw7x59ffEH46dN4lC1Lo0GDaDVmDIk3bvDbJ58QtH07cREReNeoQZunnsIvIACAUxs28PNrrxnHenTdOjwrVjQen//1V9Y9+ywAZRs0YMjSpYQeOMCRpUsJO3yYhMhInD098a5ZkxajRxvHTRP4008cXb6c62fO4OjqSs3Onal///2sefJJo8y4Awfy4S8kIiJSdCjoFxERkWz9uWgRpzZsMB7fCAvj93nzSElMJGj7dsJPnza2hZ8+zabJkxm4aBHlGzWiVrduuJUpQ3xkJABBO3fS5MEHjfJnt20zlhv068fxVavYMX06WCzG+oSoKMKOHCHsyBGboH/Pf//L4SVLjMfJCQmcWLOGkH378vT6RUREijp17xcREZFsndm8meYjRtDmqadwLV3aWP/HZ59x49Il2jz5JM1HjMDBZP1JYTGbOb5qFQCOLi7U79fP2Cdo+/Z/DmyxELxjBwAmJyfq3Xcf+z/91Aj4yzduTLuJE2n7/PPU6dkTJ1dXY9eQ336zCfirt2tH+xdfpF6fPsRcuZLnfwMREZGiTC39IiIikq0Wjz1Gm9Tu8u4+PuycMcPY1unVV6nbuzcAiTExHPv+ewCup2v9bzxoEIcXLwYg9MABEmNicPH0JOzwYWKvXQOgRseOuHl7Ex8RYezXetw4anTs+E9F0rX+/71ihbFcvX17+nz8MTg4AOBaujR/LVuWJ9cuIiJSHKilX0RERLJVo317Y7lcw4Y22/y6dDGWyzdqZCwnxsYay2Vq1qRKao4Ac1IS53fvBuBsulb/Bqm9Aaq3a2es2zJlCrtnziTsyBHritSgHiDs8GFjudGgQTbb6vbsmfOLExERKQEU9IuIiEi2nNzcjGWTo6PtNnf3f7Y5O/+zIV2rPKQG5qmCUrv0p3X1d/PxMVr0A/79b2r36AEODiTFxvLXsmWsGj2alY88YtN7IC483FguValStvUVERERBf0iIiKSz2p164abtzcA53bt4lpgIJHnzgFQ7777MDlZRxu6li7Nve+/z/Aff+Tup582Avqrx4+zfsIEzCkpADimG9+fEBVlc664dEMEREREREG/iIiI5DNHFxfq9+0LQOKNG/zx+efGtgb9+xvLaWP6S1etSst//YsBX35pbIsODSX6wgUAvGvWNNafXLfO5lxpSQRFRETESon8REREJN+lT+gXlDpVX7kGDShbr55RZsn991Ozc2fKN26MycnJZvo9k6Mjbj4+ANTu0YMrx44BcGLNGsxJSVS86y5Cfv/ddoYAEYbt0hAAACAASURBVBERUdAvIiIi+S8toV/ogQNGN/30rfwAyfHxnN60idObNmXav8Xo0caUgU2HD+f0pk1cDQwE4NTGjZzauBGwJgM8v2dPfl6KiIhIkaLu/SIiIlIg0if0Mzk5GdP9pWk2fDi+derg5OqKg8mEu68vNTp0oNesWbR56imjnJOrK/0WLKDZ8OF4VqyIydmZMjVq0G7iRO5+9tkCux4REZGiQC39IiIiYmPcgQNZri/boEG22xr062dMvZed2GvXjOWanToZyf3StH/xxRzX0aVUKdq/+GKmfa6ltv5nlF29RUREiju19IuIiEi+S0lM5Ojy5cbjxg8+aMfaiIiIlBxq6RcREZF888s771C6enXObttGVEgIAJVbtqTaPffYuWYiIiIlg4J+ERERyTd/r1xp89jd15eu06bZqTYiIiIlj7r3i4iISL7xqlIFB5MJl1KlqNOzJwMXLcKralV7V0tERKTEUEu/iIiI5JuHf/qpQM93s2SDIiIiJZFa+kVERESkxDm1cSMRQUE3LbPykUf4rGNHPuvYsWAqdRO/z5tHyG+/2ayLj4hg//z5JMXG3tYxLWYzx3/8kUOLFvH7vHlgseRFVUWkkFFLv4iIiIiUGOaUFLZPncrJ9esp17AhA7/8EpOzMxazGXNysk3ZpLg4kuPiAOsMFBk5urgA8Km//x3Xy7tmTR76/vsstwVt384fCxfyx8KFVGndmn6ffsrZrVvZNnUqSbGxxEdG0vHll3N9TgeTieOrVhF2+DAA1dq2pXLLlnd0HSJS+CjoFxHB+mPuamAgV48do8EDD+Dk6prrYwRt387V48cpVakS1dq1o1TFinlWv4Xt2hk/OPOi63LQ9u0Ebd9OlzffxMGkTl8iUnKYHB1xTP2Mv3r8OPsXLODup5/m8JIl7J09O9v9FrZrl2ldQQwlib9+nV/efdd4XK9PHwAqNG1qrDv63Xf4BQRkOStGbm5IrH788Ztu7zRlCo2HDMnx8USkcFDQLyIlXkJUFF/36mUE1S5eXtS7775cHePCvn1sfvllzMnJlK5WDb+uXbNsFcoorZWoIP02dy4Hv/gCgNLVqtHqFj/yRIqra4GBrHj4YeNxWgCXPkgasnQpZRs0KPC6Sf7qMHkyFw8eJDI4mENffUWdHj3y5LhuPj60GDUqV/vc7EaDOSWFLa+9RuzVqwBUatGCBv36AeBZoQJ3P/00u2fOBIuFLa+8wsAvv6RMzZo2x3Byd8/dRVgs4OCQ5SaTk0IHkaJI71wRKTFOrl9PQlRUltvcfXy4ERYGwJElS7ItB9D0oYdsHgfv3GkE/ABRFy7wVbdut6yPu68vIzdvzmn180y9++/n8JIlpCQmsv/TT6nSpg2Vmjcv8HqIiNiLk5sbXV5/nTVPPolfQAAOjo40GjSI2t2725RbM348USEhQM6TUlpSUgBoPHgwLl5etyyfbdBvsfDLjBmE7NsHgIunJ92mT7fpndX0oYc4t2sX5/fsISEqinXPPUe/BQtsepqN2bULgMToaAAcXV0J3b+f3+fPp9nw4dS5914jmL/y99/snDGDJg8+SMMBA2z2scdNahHJGwr6RaTE+OP//o+I4OBblrty7BhXjh3Ldnv6oP/w4sXs+/hjzKk/8nLDIZuWlPzmU6sWrceNY9+cOVjMZra+8QYPLluGs4eHXeojImIPlVu1YuTmzbiWLs2Vv//mi86db1p+aWoLe3qeFSrw6Pr1PPjttwAc/vpr9s2ZA1hb/Z3c3G5Zj1ZjxlC9QwfcfXyMdRazmZ0zZnD8xx8B69j7bjNm4FW5su3ODg50mz6d70eMIDo0lKgLF1j9+OP0nT+f0hmmxvwiIAAA/7FjsZjNXAsMZOvrr7N39mwaDx7M9bNnOb15M1gsnNq4kYYPPGCzT+tx4255LSJSOCnoFxG5DTfCwvjlnXc4l9qCkqZ0tWp0nTaNSi1a2Ky//Ndf7Pv4Y0JTuw+7lCpFp1dftSmz+L77iLl8+Zbnzm585s2SQIE183NaD4b2L77IiXXruH76NNEhIfw6axZd3njjlucWESnqTm3YYHNjt0KTJpSuVu2Ojulbpw5gTfyXZsdbb+V4/zq9elGmRg3rMWJj+fm11wjeudPY3mHyZGp26pTlvm7e3vSePZvVjz9OQlQU0aGh/DBiBN2mT6d6+/ZZ7tPmySep2qYN26dNIzo0lP2ffmpsu+uRR2g7YUK2XfxFpOhR0C8iJVLG5EsxV65gTkoCwKtKlUzllw8aZNNL4ODnnxsBf7V77qHxkCHseu89oi5c4McxY/ALCKDp0KFEhYYS+NNPhB06ZOxbq2tXOkyejGceJvrLTvTFi0bLUODq1cZNhY4vv0zHl1/mp7FjMTk64urlddNxnCIixcW5Xbs4uX698bh+3750fu01Hlq5kjM//8zfK1fSbPhwanTsmG2PrHXPPEP0xYuZErZGnT9/R3VLio1l5aOPEpn2fePgQIfJk2kydOhN9/OtU4c+c+ey9sknSYyJIT4yknXPPceDy5cbNyTSpCQm8s0DDxB14QIAHmXLUrd3b66fOcP5vXs5vGQJZ7ZsoefMmXd0LSJSeCjoF5ESw+smLTlrxo0jIjgYB5OJsb//fst9O02ZgruvL95+ftTt1QuAis2bs+GFF7hy9KiRHd/mGFWr0uW116iaRXbljLwzJGKKOHfOmD85/TYL/PPjMIOokBC+6d8fj3LluOvRRzNtr+LvT+tx46jVvbvxozAhKorA1asJ3b+f3h9+qJsARUjG5HMR587x5xdfEH76NB5ly9Jo0CBajRlD4o0b/PbJJwRt305cRATeNWrQ5qmn8Evtxpve5aNHObJ0KRcPHiTu2jWc3N0pV78+DQcMsCa7TPf6yHj+aydPcnjxYiKCg3EtXZr6999Pm6efxuToaHOOwNWr+Wv5cq6fOYOzuzt+AQHUve8+1owfb5TJeJMuN/VKc2LtWut5Tp3C0dWVGh07GgnRbuXUhg0cWrSI62fP4lKqFDU7deLuZ57B3dc3R/tL4efo4oK3nx/nd+8mJiyMvbNnc3LdOjq+/DK/zZ1LVEgIDiYTj6xdS0RwMNEXLwJQOUPPq7RA2i8gIFe9p1xLlwbA2cODWl278ueXX1o3WCzs/s9/2P2f/+T4WCZnZ8xJSTQaODBTwJ92rX4BASRGR1O7Rw+qtW1r5AmICAriyNKlnN22jTJ+fjk+p4gUbgr6RaTE6PPxx8RHRrJ//nySYmNtxrAnpCYrcvP2zrRfYnQ0dXv2pP799xvBRPTFi1Ru1YqIoCB2vfceV0+c4FpgIMnx8dmePzokhDVPP41n+fKUqlQJd19f3Ly9KVuvHk2HDbMpm7Gbfvop+9JvS4qN5fNsunymzbsce/Wq0YshI/+xY20eb3zxRS6mBljBv/xCzVuMcZXC6c9Fizi1YYPx+EZYGL/Pm0dKYiJB27cTfvq0sS389Gk2TZ7MwEWLKN+okbH+yNKl7PnwQyxms7EuMTqa0AMHCD1wgKAdO+jx7rtZTvl4aPFiTq5bZzyOvXqVP7/6ChwcuOfZZ431v86axZGlS43HKYmJHP/xR87/+mu213Y79do7ezaHvv7aeJyckMDJdeu4dPBgtudJc3jJEk6sXWs8jgsP5/iPP3Lxzz8ZvHixcmEUQd2mT6fb9OmZhkolREXR4733OLluHX99+y3XTpzAYrFwIyyMmMuXjalcw0+exLNiRWIuX6ZKumPER0SQGBMDWF+TpzZuzFW96vfpg4uXF22eeorIc+ewmM2Zbh7nRO///pdDX39N+0mTstx+YMECYzktZ0BWbpXjQESKDgX9xVRKSgpBQUHUyXCHNygoCFdXVypnTAST6vTp0/j5+eGYoSVGpDiICA5m3bPPEh0SwvUzZ+gzZw6OLi6YU1KIj4gAMgf9KYmJbHjhBS4ePMiJtWsJmDqVUpUqsfGFF7h28mSW5ylTowY1O3WiZufORJ47R9COHVw6eND6Y9BiIebyZZux+51fey1frjf9kIJy6YK5m2k8eLAR9B9atEhBfxF1ZvNmmo8YgYuXF4cXLzZyOfzx2We4eHrS5sknSbxxg8NLlmAxm7GYzRxftcoI+i8ePMiv//2v0bukZufOVLvnHiLPn+fY99+TkpjImS1bONS4cZbTk53asIEmQ4fiVbkyfy1fzo1LlwD4e+VK7n76aRxMJkJ+/90m4K/eoQPV27Xj6vHjnFizJsvrup16he7fbxPw1+jYkert2nHl779tgvnsnFi71jjP1ePHCUzN4B4ZHMzhJUvwf+KJWx5Dioa9H33E2a1bqd29O93ffpv4qCgqt2xJUmog71KqFAC1e/Sgdo8eJMfFYUqX0T6tlR8wbkLlRs3OnXHx8sLk6EjPmTM59sMPRJw9C1iHoCXFxgJQqlIl4wZEmsjz540bYRWbNaPvvHmZju9WpkyW5028cQNzSgomZ2dcsrmJlZOEhCJSeCnoL0aOHj3KihUrmDx5MnFxcQwdOpQDBw6wePFiGjVqhL+/P++88w533303j2czL/fQoUPZtGkTZcuWpUuXLiTeYp7xrVu34u7uTnR0NAFZdA29mQO5/DIUuVMevr7Gj7bQ/fvZ+sYb9Hj3XaJDQowfS1EXLpCSmGi9GZCczJYpU7iY2hoYGRxstPQ3e+QRtv/735icnPCpU4cKjRtTsXlzqvj72+QEqNK6NY0GDcJiNhN++jRXjx/n+unTRJ47R/SlSyTHxlK/b998ud7QP/4ArFmfKzZrlqN9avfowd6PPiImLIyLBw9y5dgxm9ZfKRpaPPYYbZ58ErBOR7lzxgxjW6dXX6Vu794AJMbEcCy158j1dK3/hxcvNgLr2t27c2+6rsXefn7seu89AP765pssg/4Wo0Zx9zPPAFC+SRN+Su1RkhgdzY2wMLwqV+bvFSuM8jU6duS+jz4yHrt6eXHkm28yHfd26nX0u++MMjU7daJ3uunRXMuUsbnxkJW6vXvTPd3fz8nNzTjm2W3bFPQXIzGXL5MQFcWxH37g2A8/0GL0aGp26kR86k0zj/Llbco7ubvbPE4f9N8O5wyBdaOBA2k0cCAAqx9/3Pguuu+jj/CtW9em7BedOxu9DJyyCdxHbd2aaV3MlSssGzgQc1wcAVOnWofHiEixo6C/GGnQoAHh4eHMmDGDiRMnAtYbAT/++CODBw8mMTGRY8eOMXXq1BwdLzExkTVr1lC2bNkst/v7+2NJ/fGVZseOHbhn+BLM6PLly/TNpyBH5GZcvLy4f+5cfvzXv4g8f54zW7bwa7lyNnPUpyQmEvLbb1S75x42v/KK0bXSrUwZ+nzyiZG0qW6vXpRv1IhNL71E+MmThJ88edNuklnxCwjIt0RJ8devc/3MGQB869Y1bnbcisnRkSZDhvDbJ58AcOz77ymfTz0RJP/USJexu1zDhjbb/Lp0MZbLN2pEWg7zxNRWRPhnaAhAg/79bfav06OHEVzHXLlCTFhYpqSU6XuIVGja1GZb4o0bmc7RcMAA23P07Jll0H879Urf4yXTee6995ZBf1rQlaZ2jx5G0B957txN95Wipf2kSUQMHszR777jwr59lK1Xj5DffzduNLn7+hIRFGSzj5ObG6UqVQKsN4jSbqjl1LdDhxo33BwztN6nlz6RrGeFCpm2JyckWI/h4pIpbwZkP+tLeltff52tr7+e7fb6ffvSddq0Wx5HRAofBf3FiJOTEzNnzsRkMhEZGQlAo0aNmDt3Lu7u7uzYsYPY2Fj6Z/ih5O/vT7NmzfgyNWlMz549AXBJ12Utp0wm0y2HBpiyGP8pUlDcfX3pM3cuP4waRXxEBJHBwSSmjudP89e335IYE0PQjh2ANcFSn08+wadWLaOMo4sLvnXr4gA2Y4tz42b73ewHWk5+vF3Yt8/4oVq1TZtc1at+3778Pm8eFrOZUxs20H7ixEwtWlK4pe+KmzEASP9cmpyd/9mQ7iZuQup3CIB7hhu/rhm6CCfGxOCZ8fzpgpeM3ZBJfd3HhYcbq9KCpmz3uYN6pT9PxpsT2Z3H5rheXjaP04/hzy5XhhQ9yQkJLB882GbdzxlueJ7/9VeWZ8g3Udnfnzr33ntb3wNNH3qIlNRgHbLvQn/l6FHjdexZvryR9C+NOTkZc3IyAM6eGd+NthxdXIybwEmxsSTHx2NycjKOmRAdDRaLzTnSv4dEpGhS0F+MtGvXzlhOTv3w79ChAwBz5sxhxYoVTJw4kUceeQSAmTNncunSJWbNmkViYiKjR48mICCA77//Hl9fX3r27JnrFvlO2SQUEylMSlerRq9Zszj63Xd0eOklvslwI+z87t00GzaM3v/9L7vef59es2Zlai3NSvoM4/vmzDGyL2fMPJ6ToP1Ond+zx1iu1rZtjvY5vXkzfl264FmhAlXvvpsLe/fi7uNDVEhIpq6kUry5eHkZeS7S/k+TMQBw9/G5rXOYnJ2NQCUt54BxjuvX86xejq6umFN7MSRmOE/stWu3rGdyhmFu0aGh/5wjm55wUrTEhIXx47/+ddv77/7Pf2476E9L/mpyds4yKWZKYiK70/UIy2r2l/Q3rl1v0aurTs+edJ02jctHj7L+2WdJSUzk3v/8B78uXYgJC+P7ESOIj4ig3cSJRlf/gvjOEpH8paC/GNmT+iP/t99+47XXXiM8PJy33nqLe++9l7/++otff/2VRunG5l66dIkqqWOPXVxcjJb9UqVK4ZXaspG+e39SUhJr165lQGr3yF9//RW3DHelc9K9Pzo6mjlz5uTBFYvcvkotWlCpRQv2fPih0d3YLyDA2rpvsbBt6lQGfPklw1evzrKrZH67kyn7LGazkf3c2cODKq1b3/J8SbGxbHnlFVxLl6ZOz560GjOGZsOHU719+yx/iErxVrFZM4J/+QWwJuWrnu6m8ulNm4xlbz8/3G4z6PepVYsrf/8NwMm1a6mWLpg59sMPeVYvbz8/4zynNm60CZqOZZglIytnt279JyeGxWIzjCenuTKkcAtJnaa167Rp/+RYsVg4tHgxez/6yPjs9QsIoPmIEVRq0cJm/wW57E2VxmI2Gze8nLP47RQTFsaWV18l7MgR6woHB5oOG4bFbLb5XL6ebshBxl4AWbl89Cg//utfmJOTMTk6su3NN0mKjbW5cbHtzTcxJyVlGkYjIkWTgv5iJC4ujs8//5yffvqJl156iVdeeYUffviBwMBAjh07hq+vL6fTJWo6deqU0RMgJ+Lj43n77beNoL99ujGjaWP7c5L138vLizdyMXetSH45+u23HF6yBLB2q+z48su4eXtzfNUq4sLD+emJJ+j94YeUbdAgR8fLrjXkdlpJ7mTKPgeTiXvfe8+amdzBAcccDNVJm3M6ISqK0N9/p9OUKbmusxQfTYcPN4LrE2vWkBwfT+WWLYk8f56/V640yjUfOfK2z1Hn3nuNYPzE2rWkJCVRqXlzQn77zRhakxf1Sn+e4z/+SHJCAhWbNePCvn0E79x5y3oe+vprEiIjKVu/Pud277aZTrDJgw/m/sKlUEhLepfGwWTC2cODxJgYgnfs4MjSpVw5dsymTND27QRt3065hg2565FHqNOzJyYnJ8am3jS4mbSAOi1YN6ekcOjrr43P9fRDXOIjIvhr+XIOL15sZOwHaDFyJOUbNWLzyy9zbvduXL28cHJzI/bqVaNMxiEsWSlbrx5O7u4kRkdjTkkh8cYNXDw9cfPxsQ5nMZm4cvQoO6dPt5mSUESKLgX9xURsbCxDhw6lSZMmLF261AjCZ8+ezZQpUxg5ciTh4eHMmjULs9lMZGQkFy5coFm6VoqY1C/AadOm4e/vT3JysjG+Pz3/dF8AU6ZMYciQIcZwAmdnZ+6+++5b1vfbb7/NNJ2gSEGJv36dPR9+aDNd1z3PPotnhQq0mziRS3/+SURQEDfCwvhh9GiajxxJi1Gjbjkfd/oW+Ljr140WnEyt9hla5tP0/7//M7o755SzuzsjUls40/dIqOzvT+WMP9ZSZx4AuH72rE2Ogkt//mksV1DrZYlX7Z57aD1+PPvnzwfgzJYtnNmyxaZMkwcfpOEDD9z2OZoOG8bpTZuMwOr0pk1Ga32trl05u22btWC61+3t1KvpsGGc3LCBa4GBgLWHwKkNGwCo3KoVF1NnuciOZ7lyWSbpbDZ8eI560UjhdGHvXmPZzdubxoMHc/CLL9jyyiuYU1KMbWXr1aP7u+9yZssWjixdSkJUFFePH2frG2+wb84cmj38MM1HjLjl+c5u3crml1/GwWTC5OSEJSXF5jzV0zWkBK5ezYEFC2z2bzRwoDEjRulq1UiOiyM5Li7TeWp163bLuji6uHDPs89icnKifMOGlK5e3eb7LTkujm8feojW48aRlDr8ADLnBxGRokNBfzHh4eHBvHnzqF69On/++SdvvvkmW7duxcXFhVmzZgEQERFBZGQkhw4d4ty5c5QrV84IvBcuXMjnn38OQNWqVWnTpg1ms5lffvkFj9QvgrRp+bKaai8qKgo3NzecnJw0FZ8UWlEhIfz93Xf8vXKlTetJ4yFDaDpsGAAunp70mTuXNePHG9P3/bFwIX998w31+vShVteuVGrZMsvW8/Qt8OnH9Gdstc+u5b90tWq5vygHBzxyOK7YrUwZYsLCAFj79NP4de6Mo6srsVevcjbdVE5q2REA/yeeoFLz5vy1bBlhR46QEBmJS6lSlG/ShMZDhtjMAnA7HF1c6Dt/Pvvnz+fMli3ERURQumpVmg0fTtn69Y2gP+PME7mtl6OLC/0//ZTf58/n7M8/E3f9Ol6VK9Nw4ECq3n033z/66E3r2W36dE6uX0/Qtm0kxcXhXasWTYcOzTQTgBQtNTp0wKd2bbBYuO/jj/EoV45TGzYYgbijiwtNhw2j9fjxOLm64v/EE9z1yCP8vWIFfy5aRPz168RcvmzTyn4zlVq2BKwt/ikZ8kR4+/nRcvRo43HzkSO5evw4pzZuxLV0adpOmGBzI6tM9eo4mEw23fHdfX1p9vDDOZ5yr3GGpIXpHVi4kOiQELa9+abN+tv6jhKRQsHBknHONSmy2rVrh8ViITk52SaLfkpKCrt27cLFxYUJEybg5uZGSEgILVq0YNKkSQCsWrWKsmXLMmHCBDZt2kRiYiKDBw/m13TdGG8W9O/Zs4eZM2eyfPnyTNP4ZcdkMuHklLv7TkeAPbcs9Y92gNosi7YFty6SIxHBwXw3dKhNS7qDyUTrceNoNWaMTWsiWHsDbH3jDZuEeGAdIz946VLKVK8OwPJBg7Jtub8Vv4AAeqXelLuV9N37MyYGzKn98+dz4P/+76ZlXDw9eXjNmhyNC70TY/P16FZ59dqRgvfXsmVG8rLyTZowaNEiO9dIMqoE5Pdo7/x+D0cEB+Pu42N83p35+Wf2z59P3V69aDhgAB7lymW5X3JcHEeWLePCnj30mTs3R0OoAHa8/TaJN25YW/sdHXF0daVsvXo06N8/U0+ypNhYjn3/PQ0feACXDDNIpLGYzZiTk43eAzeTdrM5J9Pund+9mw2TJoHFgsnRESd3d6q0bk2XN97I8fSvN1MQn/8iYkst/cXInj17mDp1KqGhoXz66aeYTCYCAwOZMWOGkaTvscceY8yYMTg6OvL+++8b+w7I0GJx9uxZqlWrZgT6afu7uLjYzBKQljwwMDCQunXr8vjjj/PXX3/lqL5333038+bNu6NrFskp75o1afX440a34ApNm9LxpZco36RJluXdfHzoM3cuJ9evZ/+8eUSFhADWeZzTAv6McvrDL2MrT0FpNWYMiTExnNqwwZodPe0GnYMDLp6eVGzWjDZPPpnvAb8IWKcZiw4JoUyG4S83Ll0yeskA+HXuXMA1k5Ii49Cr2t27U7t791vu5+TuTsvHHqPlY4/l6nxdcpHPyNnDg7tu0QvFwWTK8fdO2jCwnExTWb1DB55IN/xBRIo+Bf3FSGRkJNeuXSM0NJQvvviC++67j7feeotx48YZZcqUKYOzszOlSpXC9SYf/AcPHrTJ9L8nQ2vntWvXbKbz27t3LwEBAQxL7SIdGxvL+PHj8fPzY+rUqTg6OrJixQpatmypsfxiNy1GjSI6NJQ6995rM37yZurddx91e/UieOdOwo4cydSlt92kSUb2/7q9euXomKc2bgSgVA4SLqUJmDr1tqaESs/k7Ez7SZNon9rDR8SeUhITWT5kCNXatqVyy5Y4e3gQee4cJ9atM6Yg8yxfniZDh9q5piJFX06HgYlI8aSgvxgpU6YMc+fOJSgoiHfffZf//e9/1KxZk+bNmwMQGhrKM888wz333ENoaChjx47l448/pmrVqjbHsVgsbN682eZmwc1cvHiRP/74g3//+98AhIWF8eKLL9K+fXvGjx+PQ2q3aT8/PyZOnMjYsWO5//778+7CRXLI0cWFgKlTc72fg8mEX0AAfgEBmbbVyMUMGGlyenPAZp/evXO9j0hhlza9ZPqM+Gk8K1ak94cfqueJiIjIHVLQX4xcv36dvXv3sn79es6cOcPEiRP5+++/efbZZ3nhhRd46aWXaNWqFW+//TbR0dE8/fTTPPzww7zwwgu0adOGsNQEX1u2bCEiIoKAgAAjK3/Hjh1tzpV+3P78+fPp0KEDlSpVYt++fUyYMIHk5GQuXLjA8uXLSUlJISUlheTkZMxmM1OnTuXkyZM8//zzxg0BEREpWRxdXWk6bBgh+/YRHRpKSlISrl5eeNeqRc3OnWk8eHCejB8WEREp6RT0FxMRERH069eP5s2b07t3b2bOnGl0379y5QpjxozhkUceYdSoUTg4OFC2bFm++OILPvjgAy5dusSOHTtYsGABffv2xc3NjdGjR+Pu7k50ahfLXbt22Zwvfff+Vq1a0SR1XHSTJk2YOXMm5cuXp1SpUri7uxtZ/Z2dnXFwcODUqVPMnTuX6OhoSqsFR0SkRDI5OtJh37k4RwAAIABJREFU8mR7V0NERKTYU/b+YiQpKQlnZ+cstyUmJhrJ+HLCbDZjMpnyqmp5Rtn7Sx5lYC+elL1fpGgrDtn7xT6UvV+k4BW+qE5uW3YBP5CrgB8olAG/iIiIiIiI5I6694uIiEixFH3xIr/NmYPFYqFCkyZZToEWERxsTOXpVbky9zz3XEFXU0REJF8p6BcRESkhPvX3N5aHLF1K2QYN8rR8YbPr3Xc5t3s3ODhkO+f5wc8/53TqHOa5mUddRESkqFDQLyIiIsXOkW++sQb8ABYLP4wcmalM9xkzOLV+vfF4x9tvs+Ptt23KPLZ9Oy5eXvlaVxERkfykoF9ERESKlQt797L3ww8BcPH0xM3Hh+jQUNy8vXH28LAWsljYN2cO5pQUHEwmvKpUIebyZVISEyldtSqkTinr4Ohor8sQERHJEwr6RUREpNgwJyezc8YMI5i//3//I+S33/jtk0/wqlyZBz77DJOzM+GnTxut/02GDqVur16s+te/AKjVrRttJ0yw52WIiIjkGaVoFxERkWLD5OTEfbNn41amDK3HjaNC06ZUa9sWk6MjVwMDuXz0KNunTePXDz7Ao1w5KjZrRpvx46l4113U7t4dgKDt20mIirLzlYiIiOQNtfSLiIiUUMd//JHDixcTef48Hr6+1O/Xj9bjxuGQzbStpzZs4NCiRVw/exaXUqWo2akTdz/zDO6+vjblrp85w4k1a7h48CDXz54lOS4Od19fqvj70+rxx/H287MpH3rgAEeWLiXs8GESIiNx9vTEu2ZNWowejV9AgE3ZK0ePcvDLL7n4xx8kxsTgWb48NTt3xv/xx3Hz8QHAp04d+s6fT6lKlUiMjqZM9eo0HzmS8k2a4FunDpf+/JPIc+cAGPT11wAkRkfTdsIEHJ2dafP00zikdu8XEREp6hwsFovF3pUQyakjwJ5clG8HNMunukjBWGDvCki+GFsA59BrJ7P02fjr3HsvpzdvzlSm1ZgxtHnqqUzl699/PyfWrs1UvkzNmgxevPifsfLA8sGDiQgKyrIOzh4eDPzqK3xq1wbg+KpV7Jg+HbL4OdJi9GjuefZZ43HgTz+x8+23MaekZCrrVbkyAxctMm5A/P6///HHZ59lWYecGnfgwB3tX5xVAvrn8zn0Hi6eCuLzX0RsqXu/iIhICXTm559p+tBDtHvhBWviulRHv/sOi9mcqfyJtWup2bkzHSZPpkG/fsb6yOBgDi9ZYlvYYsG3Th3uevRROkyejP8TTxjBeFJsLAcW/BPO7f/0UyPgL9+4Me0mTqTt889Tp2dPnFxdjXLXTpxg5/TpmFNScPbwoPmIEbSdMIFyqdMIRl+8yJ7U5H0iIiLyD3XvFxERKYFaPvaY0aJfsVkzI4ldQlQUNy5dwqtKFZvydXv3pvuMGcZjJzc3jn73HQBnt23D/4knjG3d33mHcg0b2uxftn59Nk2eDFi786eJj4gwlluPG0eNjh3/2Sld6/+hr7/GnJwMQNe33qJW167WevXqxeL77rPW4+efMb/5JokxMTR7+GGaPfxwlte+avRoIs+fB2DUzz9n/QdKrZtLqVKYnPRzSUREii59i4mIiJRA6YPr8o0b22xLjInJVL7RwIE2j2v36GEE/Wnj49OUa9CAS3/+yaVDh4g8d47o0FCbMukD/ert2hG0YwcAW6ZMoUH//tTt3ZuKzZoZ0+YBhO7fbyxvevHFLK8pOSGB6EuXWDZgQNYXnYWvUpP3Zafv//5H1XvuyfHxREREChsF/SIiIiVQ+q7zJmdn241ZdO939fKyeZx+DL85KclYjrlyhY2TJnHl6FFjnVuZMrh6exuP0w8fCPj3v9k5YwZnfv6ZpNhY/lq2jL+WLaNcw4Z0e+stfOrUASDu2rUcXVdyXFyOyomIiJQUCvpFRETklpITE20eR4eGGsvuZcsay7+8844R8Nfv25d2L7yAm7c3V44d4/tHH810XNfSpbn3/feJCgnh9MaN/L1yJTcuXeLq8eOsnzCBYatWYXJ0xMnDg8ToaMCa4M+rcuUs6+lZsSLjDhwgJiwsx9e2euxYoi5cAODRdeuM9Q6OjniUK5fj44iIiBRGCvpFRETkls5u3Wrtcg9gsXD8xx+NbcZ6IGTfPmO54QMP4Jbawn9h794sjxsfEYGbtzelq1al5b/+Rf1+/VjcuzdgvbEQfeECZWrWpFz9+kYuABdPTxoPGWJzHIvZjMVsNsbfL+7T57auM/1+bmXKMGrr1ts6joiISGGhoF9ERERu6dDXX5MQGUnZ+vU5t3s353/91djW5MEHjWVHV1eSExIA2D1zJg369SPy/Hn+XrEiy+Muuf9+anbuTPnGjTE5OdncNDA5OuLm4wNAw4EDjaD/93nzCD91igpNm+JgMhF14QLBv/xCr//+F9/U4QAiIiJipaBfREREbsmzXDmb1v00zYYPp0rr1sbjevfdx1/LlwPWafZ+nTULsCb+O7NlS6b9k+PjOb1pE6c3bcq0rcXo0biWLm0c98LevZxYswaL2cypjRs5tXFjtvUdl3qDIPzUKVY+/DDmlBRKV6vGg8uW4eTublN2+aBBRAQH2+wnIiJSXJjsXQEREREp/LpNn07DAQNwK1MGRxcXyjZoQJc33qB9hkz67V54gRajR+NZoQImJye8a9ak05QptEqdEjCjZsOH41unDk6urjiYTLj7+lKjQwd6zZplTCmYpuu0aXSbPp0q/v64eHnhYDLhWro0lVq0oP2kSZSpXj3T8X3r1uWuESMAiLpwgT2zZ2NOSTGmA4wLD+fG5ct58ScSEREplBwslnST4IoUckeAPbko3w5odstSUpgtsHcFJF+MLYBz6LUjaZLj4lg2aBAODg50efNNokND2TljBo4uLpiTk43ZBJxcXRmTbtiCZK8S0D+fz6H3cPFUEJ//ImJL3ftFRESkWHNyd6fnzJl4+/nhUqoU106cACAlw4wE1dq1s0f1RERE8pWCfhERESn2KjRtaiz71KlD7R49cHBw+P/27j086urO4/hnbsnM5H6DhIQkQAARUe5LuBW1ahW3LWip1uLuIyyl3aqsuLjdXVe366N12227lVrbfRR1XasstLtqvQGiIogiCBphw00ugZAQbklIQjIzv/1jyMAwuV/m8pv363l4zJxzfr/zTSIzfGbO7/xksdlktduVWlCgMbffHsEKAQDoH4R+AAAQV6w2m657/PFIlwEAQFgQ+hE1jkg6LMnRwZjPu3nOrZKaO+hvkTRYUn43zwsAAAAAsYDQj6ixVtK5Pj5ns/zBvyM7JbW9pzQAAAAAxDZu2YeoMTlC87K7PwAAAACz4pN+RI1RkgxJH4RxzumSLg/jfAAAAAAQTnzSj6hyufxBPBwI/LHBGekC0OfC9TvlXW2g/4Tj7xfP/+bD7xSIDEI/ok44gj+BP3ZkRLoA9Llw/U7TwzQPEI/C8feY53/z4XcKRAahH1GpP4M/gT+2DI90Aehz4fqdFoRpHiAeheOuNzz/mw+/UyAyCP2IWv0R/An8sWekpMJIF4E+UyTpsjDNNU5ScpjmAuKBcf6/QxSe52We/80lnM//AIJZDMMwOh8GRM5O9c3mfgT+2GVIKpe0R9IpSU2RLQfd5JR/Sedw+f8Rbwnj3E2SPpS0T5IvjPMCZmSXNFbSVZJsYZqT5//YFsnnfwAXEPoRE3ob/An8QHzzSTojqTHShQAxyCL/qplkEdoAIBYR+hEzehr8CfwAAAAA4hXX9CNm9OQafwI/AAAAgHhG6EdM6U7wJ/ADAAAAiHeEfsScrgR/Aj8AAAAAEPoRozoK/gR+AAAAAPAj9CNmtRX8CfwAAAAAcIE90gUAvXG5/LcP+ljSJBH4AQAAAOBi3LIPAAAAAACTYnk/AAAAAAAmFTfL+x9//PGQtgceeIA++uijjz766KOPPvroo48++vqtL9JY3g8AAAAAgEmxvB8AAAAAAJMi9AMAAAAAYFKEfsS89V9K33tVem57pCsBAAAAgOhC6EdMW/+l9FKZ/+tNh6UNByNbDwAAAABEE0I/YtbFgb/VC58R/AEAAACgFaEfMamtwN+K4A8AAAAAfoR+xJyOAn8rgj8AAAAAEPoRY7oS+FsR/AEAAADEO0I/YkZ3An8rgj8AAACAeEboR0zoSeBvRfAHAAAAEK8I/Yh6vQn8rQj+AAAAAOIRoR9RrS8CfyuCPwAAAIB4Q+hH1OrLwN+K4A8AAAAgnhD6EZX6I/C3IvgDAAAAiBeEfkSd/gz8rQj+AAAAAOIBoR9RJRyBvxXBHwAAAIDZEfoRNd49EL7A3+qFz6SNh8I7JwAAAACEC6EfUeN//y8y875SHpl5AQAAAKC/WQzDMCJdBCBJ5TXSrhopwdb+mNd2S15f18+Z7pS+Utx+f7NXGp4ljc7p+jkBAAAAIFbYI10A0Gpktv9PRxJt0sovun7O2SOkmUW9qwsAAAAAYhWhH0DUMwxp42Fpc4VUWSfVN0e6IgAA0JnkBCkvRZpSIE0bLFkska4IiE+EfgBRzTCkJ7dIn1VFuhIAANAd9c3SnhP+PzuOST+YRPAHIoGN/ABEtY2HCfwAAMS6z6qkTYcjXQUQnwj9AKLa5opIVwAAAPoCr+lAZBD6AUS1yrpIVwAAAPrCUV7TgYgg9AOIamzaBwCAOfCaDkQGoR8AAAAAAJMi9AMAAAAAYFKEfgAAAAAATIrQDwAAAACASRH6AQAAAAAwKUI/AAAAAAAmRegHAAAAAMCkCP0AAAAAAJgUoR8AAAAAAJMi9AMAAAAAYFKEfgAAAAAATIrQDwAAAACASRH6AQAAAAAwKUI/AAAAAAAmRegHAAAAAMCkCP0AAAAAAJgUoR8AAAAAAJMi9AMAAAAAYFKEfgAAAAAATIrQDwAAAACASRH6AQAAAAAwKUI/AAAAAAAmRegHAAAAAMCkCP0AAAAAAJgUoR8AAAAAAJOyR7oAAACA/tRcW6WDrzwiw+cJtOXNXKiU4gkRrAoAgPAg9KNT1dXVGjBgQEj7pk2bNG7cOLlcrghUBQDoKp+nuV/Oa7FYZbGF/lOi/NlFnR6bM/FWZV5xvT55uOfBe8y9rygxI7/DMT5Ps/a+tFQNR3cF2lKHTlZK0fgezwsAQCwh9MehRYsWaevWrR2Oae2vrKzU/PnztWbNGlksFu3evVvDhw+XxWLR3XffrdWrV6u4uDjk+Lq6Os2aNatbdXVWEwCgZ7Y9Utov500dOlkj7vxNSHvdgc6fz9NGzOh9ARZLh92Gt0X7V/0oKPBbbHZlj/+m6g5u69GUyYOvavONDgAAohWvWiZWXV2t2bNnS5J8Pp+sVv8WDlu2bAmMOXHihK6//vp2A/f69es1ceJEWSwWffnll7rjjju0Zs0apaend6mG9957r9OVANXV1br55pu7dD4AAFpZrO3/M8bXck57X16q2r0fBrUbXo/2r/r7Hs85dtk62d1dew0EACAaEPpNbMCAAdqyZYs+/PBD3XPPPXrzzTeVlZXVrXO8+uqrmj9/viRp8+bNGjNmTJcDvyRZrVbZbLZOxwAAkJiRr5xJ32q70zBUsebfg5qs9sQ2h547fVT7Vz6gs0d39nWJAADEHEJ/HNiyZYsmTZoUCPytS+9dLpcMw5AkTZ8+XZLU2NioDRs2yO12q6ysTLt379aoUaMkSWvXrtWOHTs0YcKF6y9vueWWwNeTJ0/Wb34TvMxzxow+WL4JAIhZeTMXKP+aH0hSp9fvJ6TlKnfq/Db7vI21IaHflpgUMu7M7g3a/8d/krextocVd8LCG9UAgNhC6I8D69at07Jly0LaP/jgg8Dy/g8++ECSggL9ihUrJCmwtL+srExvvfWWMjIyJPlD/sqVKwPX9FvauLayK8v76+rq9MQTT/ToewMAdG7iw7G1Z4rP0yyrzR4UsGu2vxI0xu5OC7q23nP2pA6/9XOd+OyNNs9psVo1cModGnT1Ylkdznbn9jTW6sg7v1bN1j/I8PkuOt6mwpsekN2V2tNvCwCAiCD0m9z27dtVUVGh+++/P9D29ttvS5Lmzp0r3/l/0MydOzfouF27dmnTpk2Bx88995xmzJih7OzsoHE2m63N5futKwg6W9ovSSkpKXrwwQe7+B0BAMyuevOLqli3XFaHU1aHU76Wc/I1NwSNSSoYE/ja03BaZb/+ljwNp4PGWOwJMs7fucDw+XRs03/q1K53VHjj34ZsJOhrOaeabX/U0Xd/K88lqwQcKdkaOvcRpQyZ1JffJgAAYUHoN7kXX3xRkvThh/6NjC7+JP+ZZ57RiRMn9O1vf1vPPPOMJOnaa6+Vz+fTT37yE82bN08vvPCCJMntdmvOnDldntfj8d8L2eFwaPLkyZ2OX7lypYYNG9bl8wMAYkPdwW06+u5vu3VMctE4yTDka26Ur7mxzTE54y+8Jtnd6cqbuUCH3/y3QFvKkEkaOvcRHT8f5HX+zehzp45oz4tL5M4dodxpf6HkwnE6/skqHd+6Wp6GMyHzZIy6RkU3/0j2pMxufQ8AAEQLQr+J7dq1S5s3b263Pz09XU1NTXI4HEGb83m9XrW0tGjhwoWB0L906dJA38W8Xm9QW+sn+7W1tXI6nbLb7dyKDwDiWP3BT1V/8NNuHePOHelf2m/42uzPnXan0i+bFdQ2cMp31Fi1RyfL3lL+1T/QwNLvSBarBn3lr5SUd5kOvPqIWupqAuMbju3W/tX/0G4NiZmDNfiGv1H6yK90q3YAAKINod/ETp8+rQULFuhXv/pVULvFYpHL5dL06dPl8/nU0tIS2MhP8n86/9RTTyklJSXQ1t6n9fPmzQt6/PTTT2vs2LGqrKzUwIED1dLSEljq3xmr1Sq7nf8lAaAvXLocvr9ZHS6pjb1denYupwbfcJ+8TXWS/NfjW2wJsrtSlVw0Ts6sojaPK5z9I+XNXKjEjPyg9pTiCSq8cZkOvPJjeZvqO53fNWCYCr56j1wDS/wrBPro+wIAIBJIWCZWWlqq0tLSkNCfnJysxx57TC6XS3V1dVqxYoWef/55SdJdd90lm80mt9sddExbn9ZPmDBBq1evDmzkd7Hy8nKVlJRo4cKFKisr61K9be3+DwDomW2PhvfuKWOWvKrE9EG9Ooen4bRO/9+7kqTE9DxJeSFjmo5/qabjX0qSnFlFcuYM8XcYhrxN9fI0nNbZis/VdPKwGqv3qrFqr5pOHGp31UBbGqv3ac+L90qSrAkuObMKZU/KlN2ZItv5PxmjrlFS/uhefb8AAIQDoT9ONTQ0aPny5Zo8ebLGjLmwGVLrtf29tXnzZs2aNUu33XZbYL7FixeruLhYDz30kGw2m1atWqVx48ZxLT8AmMjFO95LUt7Mhcq/5vuSOr9lX2P1Pu19aWmX52q9HeDp8ve0b+UyGV5Pt2pNSBsoq8OlppoD7Y7xNTeqobI8uNFiVc6EuW0fAABAlCH0x4nS0lJJUkJCgiTphhtu0MaNG/X73/9ejz76aJ/OVVlZqW3btunhhx+WJFVVVen+++/X1KlTtXjx4sCt/YqLi3Xfffdp0aJFmj17dp/WAACIkEs/UQ/Dyvi0kmlyJGWpubaq44EWq9x5I5VWMlXpl81S0qDLJflXD5za9Y5q923W2SNl8p3f8b/9+UpDLiEAACBaEfrjQGlpqZYvXy5J8vl82rlzp9avX69PP/1Ud955p5YvX66nn35aV111lYYOHarc3FxNnz69x9fXP/XUU5o2bZpyc3P10UcfacmSJfJ4PKqoqNDLL78c2PzP4/HI5/PpoYce0p49e3TvvfcG3hAAAMSoS0K/xWLt9yktNrsGTJ6nirVPBLVbE1xy512mpPzRSikcp5Si8dq36u9Uf2i76g9tlyQVzv47uXKGKi9ngfJmLpDhadbZozt19sgXgcsDGmsOBO2RkDPx1n7/ngAA6CuE/jjQGvgl6bHHHtPGjRt144036tlnn1VWVpZ++MMf6uOPP9aGDRv0pz/9SVOnTtWsWbN6PN/48eM1erT/OsfRo0frpz/9qXJycpScnCyXyxXY1d/hcMhisWjv3r1avny56urqlJqa2ttvFwAgaeLDHd855dzpo9r51O0hG9sVXL9EuVPnB7UZPp8s1q6Fd5+3JbjBMDr95LxVUsEYDZv3uAyvR6d3rZcjJdt/+77zjr77O9Vs+5/A48TMwYGvs8d/Uw3HyuXMHiJnzhC5BgyTK7vYfxeA81rqalS776OgOW2JSUGPLfYEJReOVXLh2KB2T8MZNZ85pubaKqUNny4AAGIFoT/OLFu2TA6HI6jNarVqypQpmjJlSsj4jz/+OHAbvku1dyu+b3zjG4Gvk5OTg+4M0JaSkhL98pe/7Kx0AEAfMXxe7V/19yGBP33kTOWWfjfw2NtUryPrf6Pa/R/psruekd3V+Ruzl15Xf/S9/9DR9/6jS3VZ7Qmq+fQVHd/y32qpP6GU4gnKHPO18zX7dGb3hsBYi9Wq9BEXNiu0u9M19NbHOjx/Q9Xu4PkS3EpIGdCl2uzuNNndaXLnjezSeAAAogWhP85cGvg7017gBwDEriPrlutsxedBbc7sIg2Z8y/+29MZhmp2vKaKNb+S5+xJSdK+l+/XiPm/lsXW8euIr6WxV7U1Vu1VS/0JSVLdga1qqCyXO2+kzux+P9AuSSlDJsnuTg88rlj7hI598Gy35vI1N+iTf57YrWNG/dXz7NoPAIgp/X+hHQAAiBondrymYxufD2qzuVJVcvsvZHMmB9rOlL8fCPySP4AfeOWRTs/vPXe2V/UNLP1O0ONDb/yrDJ9XR955Mqg9e9w3ezVPT9ldaRGZFwCAniL0AwAQJ+oPfhoS3C02h0q+/TM5s4ouarRoyJwfy507ImjsiR2vqXLDig7n8DbVBT3OuvImFVy/RAXXL+lSjcmDrwr6JL3+0Hbt+a971Fi9L9CWkDpQGaOu7tL5+prdTegHAMQWlvcDABAHzh75Qnt+v0TGxRvtWSwq/sY/KaV4Qsh4a4JLJbf/Qjt/Nz/oE/8j7zwp14ChSh/5lTbnuXgJvuQP/akl/tvGVrzdtf1bCq67V+XPLgo8rt23Oag/d/pfhFxmkFI0XoYveD+Bi5387I2g2mzOZGWP73i1wNmKssAu/5J/HwFbYnIHRwAAEH0I/QAAmNzZozu1+z//OnSn/q/eo6wrb2r3uIS0XJXc9jOVP/u9C28WGD7tX/2PGrVghVwDS0KOufgTeUmy9eCT8dYN/E5+/mZInzOrSDkT5oa0pw2fprTh09o836mda1W16YWgtuxx39Tg6/+mwzqOrFseFPptzlT/ngcAAMQQlvcDAGBitfs/1u7nvx+y7H5g6XeVO+3O0AMMQ76WJnnOnlLz6UrZnanKmXhL0BBfc4P2vrxU3sbakMMbjpUHPXYkZfWo7rwZd7XZnjPpW51uJnixUzvXav8fHgxqsyW6Q25L2JaWs6eCHrO0HwAQi/ikHwAAk6r59H918LVHQ26jJ0mnvlijk2VvyvB6ZPi8Mnwe/9cXL//vwLmTFdq/+h80/I5/lyznP0MwDJ09UhYYY0tMUkKq/5Z4vpZzXa678fh+7X1paZt9FW//Qt5z9cqbcZcs1vbvMOM9d1ZH1v1a1VtWSoYR1Fdw3b1ypGR3XkfVnqDHdld6OyMBAIhehH4AAEzq5Odvthn4Jam5tqrX5z+zd5OOvPtb5V/9fUlS3YFP1FJXE+h3ZhfL03BK1oQk1Wz7Y6fnM7weVW5Yocr3fiefp7ntMT6vjq5/Sic/e115Mxcoc8xNslgvLFz0NJzW8a1/UNWHL8jTcCbk+JwJc5Uz8VZ5zzWosXqP7M5U2VxpsiU4ZbElSBarWuqqdfyTVTp75IugY505Q7r0cwEAIJoQ+gEAMKn8a3+o2v1tLOHvQ5XvP6OUwnFKHTZFNTteC+pLLhyrz5+YE7KXgCTZnSkhbfWHd6j+8I6Qdqs9IeRNgKYTh3TojZ8pdeifSRabzux+X6fL39OZvZvafaNjwOR5KrxxmST/pfnlzy5qd2xb0oaVdnksAADRgmv6AQAwqaT80cq4/NpuH2exWmVNcMuRnKnEjHy5BgxT0qDLlVI0XqnDplxYzi9Jhk+H3/w3yfApfeSsoL7MK25oNyi7Bg4PaXPmDJHNmRzSdsXdf1Tu9L8MGT/4hvvkSMmRr7lBFWuf0Ony99sM8bZEt4bM+WcV3vRAYCM+a4JbyQVXduGn4ZdUMKZHP0sAACKNT/oBADCx/Gv+Wo1Ve5SYUaCEtIGyJ2XJkZQhmytVdleabAluWROTZEtM8n+d4JbVkdjhOY+886Qq339akpQ+cqaK/vxByWJVxqirVfi1pTr0xk/lzC5SUv5oJReO1ckv1gQdnzZiupLyR4ec15GUqQGTvqVDr/+rJP9KgZLbfi67O00FX71bruwhOvj64/I1NyilaLyyx31dkpSYWaCS23+u8ucWy7hoRYDFZlf22K9r0NWL5UgO3VAwafCVqju4rdOfYfrImRoy58fs3A8AiEmEfgAATMyZXaQr7u78evruGDTre6o/tF2ZY25UzoQ5QX0D/uw21R3YqswrbpAkJReNk3vQKNmdKUrMyFdy0Xhljr6u3XPnTLxVx7esUsbo65Q3c2HQ9fpZY29WSvEEHXz9Jyr46j1BxyUPvkqFX7tfB197VImZBcoac6NyJt4iR0pOu3OllUxVw7FyGZ5mGT6vZLHIanPImuCW3Z0uZ+ZgpQ6bInfeZT35MQEAEBUshnHJlrZAFFu3X1r5RefjWt1xpTSzqP/qQf/73quRrgBAd3nPNciW6O7x8b6WJlkdzh4d21RzUM5snviBaPXbP490BUD84Zp+AADQp3oT+CX1OPBLIvADAHAJQj8AAAAAACZF6AcAAAAAwKQI/QAAAAAAmBShHwAAAAAAkyL0AwAAAABgUoR+AAAAAABMitAPAAAAAIBJEfoBAAAAADApQj/4z1Z6AAADMElEQVQAAAAAACZF6AcAAAAAwKQI/QAAAAAAmBShHwAAAAAAkyL0AwAAAABgUoR+AAAAAABMitAPAAAAAIBJEfoBAAAAADApQj8AAAAAACZF6AcAAAAAwKQI/QAAAAAAmBShHwAAAAAAkyL0AwAAAABgUoR+AFEtOSHSFQAAgL7AazoQGYR+AFEtLyXSFQAAgL4wiNd0ICLskS4AaFVeI+2qkRJs7Y9Zu7975/zTbqm+uf3+Zq80eoA0PLN750X4TCmQ9pyIdBUAAKC3phREugIgPlkMwzAiXQQgSXe/7g/h4ZbkkH7+tfDPi64xDOnJLdJnVZGuBAAA9NSVA6UfTJYskS4EiEOEfkSN9V9KL5WFf96vj5Rmjwj/vOg6w5A2HZY2V0hH6zpevQEAAKJDcoJ/Sf+UAmnqYMlC4gcigtCPqBLu4P/dK6UZReGbDwAAAADCiY38EFWuHiLddkV45iLwAwAAADA7Qj+iTjiCP4EfAAAAQDwg9CMq9WfwJ/ADAAAAiBeEfkSt/gj+BH4AAAAA8YTQj6jWl8GfwA8AAAAg3hD6EfX6IvgT+AEAAADEI0I/YkJvgj+BHwAAAEC8IvQjZvQk+BP4AQAAAMQzQj9iSneCP4EfAAAAQLwj9CPmdCX4E/gBAAAAgNCPGNVR8CfwAwAAAIAfoR8xq63gT+AHAAAAgAsshmEYkS4C6I13D0hv7JG+PlKaVhjpagAAAAAgehD6AQAAAAAwKZb3AwAAAABgUoR+AAAAAABMitAPAAAAAIBJEfoBAAAAADApQj8AAAAAACZF6AcAAAAAwKQI/QAAAAAAmBShHwAAAAAAkyL0AwAAAABgUoR+AAAAAABMitAPAAAAAIBJEfoBAAAAADApQj8AAAAAACZF6AcAAAAAwKQI/QAAAAAAmBShHwAAAAAAkyL0AwAAAABgUoR+AAAAAABMitAPAAAAAIBJEfoBAAAAADApQj8AAAAAACZF6AcAAAAAwKQI/QAAAAAAmBShHwAAAAAAkyL0AwAAAABgUoR+AAAAAABMitAPAAAAAIBJEfoBAAAAADApQj8AAAAAACZF6AcAAAAAwKT+HwX2sQCd0yM1AAAAAElFTkSuQmCC","width":1021,"y":373,"x":12},"elements":{"page":{"showGrid":true,"gridSize":15,"orientation":"portrait","height":1500,"backgroundColor":"255,255,255","width":1050,"padding":60},"elements":{"1562bc6ba340d1":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":""}],"lineStyle":{"lineColor":"51,153,255"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"1562bc6dfdc6b3","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc6dfdc5f8","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc6dfdc05d","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc6dfdc099","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc6dfdc131","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc6ba340d1","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"圆角矩形","category":"basic","name":"roundRectangle","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x1":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,255,255","type":"solid"},"locked":false,"group":"","props":{"w":51.65032372043129,"y":672.2098765432096,"h":105.54179121117159,"angle":0,"zindex":63,"x":223}},"14b0a4eb0f2775":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"集群"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"14b0a4eb1bd3aa","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a4eb1bd057","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a4eb1bd655","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a4eb1bd8a6","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a4eb1bdc2a","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a4eb0f2775","anchors":[],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":122.35240224323547,"angle":4.71238898038469,"h":46.07544607414468,"y":840.5009907044904,"x":187.8375189387583,"zindex":18}},"14b0a584a934d9":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"......"}],"lineStyle":{"lineColor":"204,255,230"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"14b0a584b6e8f1","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a584b6e548","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a584b6e546","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a584b6e5e2","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a584b6e26a","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a584a934d9","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"204,255,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":84.88964346349745,"angle":0,"h":50.49180327868852,"y":849.7377049180329,"x":707.0747028862479,"zindex":35}},"155de392891e64":{"id":"155de392891e64","to":{"id":"14b0a37e265e7e","y":615.0823719894753,"angle":0,"x":571.4380305602718},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":615.0823719894753,"x":552.6689303904925},{"y":615.0823719894753,"x":552.6689303904925}],"locked":false,"dataAttributes":[],"from":{"id":"14b0a37e17b76d","y":615.0823719894753,"angle":3.141592653589793,"x":533.8998302207132},"group":"","props":{"zindex":47}},"14b0a584a9346b":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"redis"}],"lineStyle":{"lineColor":"204,255,230"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"14b0a584b6e84a","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a584b6eca2","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a584b6e1d","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a584b6ee25","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a584b6e624","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a584a9346b","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"204,255,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":84.88964346349745,"angle":0,"h":50.49180327868852,"y":849.7377049180329,"x":449.0101867572157,"zindex":33}},"1562bc6ba34463":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"im"}],"lineStyle":{"lineColor":"204,255,230"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"1562bc6dfdc502","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc6dfdcda","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc6dfdcbce","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc6dfdc88f","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc6dfdc6f5","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc6ba34463","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"204,255,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":84.88964346349745,"angle":0,"h":50.49180327868852,"y":716.9475814612425,"x":449.0101867572157,"zindex":66}},"14b0a5b4bb9a02":{"textBlock":[],"lineStyle":{"lineColor":"136,136,136","lineStyle":"dashed","lineWidth":1},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["l","r"],"fontStyle":{},"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"14b0a5b4bb9a02","anchors":[],"title":"水平线","category":"ui","name":"uiHLine","path":[{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"lineWidth%2==0 ? Math.round(h/2) : h/2","x":0},{"action":"line","y":"lineWidth%2==0 ? Math.round(h/2) : h/2","x":"w"}]},{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":931,"y":656,"h":21,"angle":0,"zindex":-2,"x":63}},"14b0a9d19da23f":{"textBlock":[{"position":{"w":"w*1.4","y":"h*0.38","h":"h*0.24","x":"-w*0.2"},"text":""}],"lineStyle":{"lineColor":"153,255,153"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a9d1b8e60d","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a9d1b8e3ab","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a9d1b8eaac","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a9d1b8ec45","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a9d1b8e25a","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a9d19da23f","anchors":[{"y":"0","x":"w*0.5"},{"y":"h","x":"w*0.5"}],"title":"上下箭头","category":"basic","name":"doubleVerticalArrow","path":[{"actions":[{"action":"move","y":"0","x":"w*0.5"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"h","x":"w*0.5"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"0","x":"w*0.5"},{"action":"close"}]}],"fillStyle":{"color":"153,255,153","type":"solid"},"locked":false,"group":"","props":{"w":29,"y":796.1234567901226,"h":128.7550678287355,"angle":0,"zindex":44,"x":169}},"1562bc9635d9ef":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"横向扩增"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"1562bc966ddf64","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc966dd906","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc966ddfd3","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc966dd0fc","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc966ddc3f","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc9635d9ef","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":160,"y":704.9807721487954,"h":40,"angle":4.71238898038469,"zindex":75,"x":169.01372006037604}},"14b0a52268da0c":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"mysql\nmongodb\nhbase等"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"14b0a522979f53","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a522979568","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a52297939b","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a522979882","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a5229793a7","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a52268da0c","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":135.82342954159594,"y":981.5737704918033,"h":28.85245901639344,"angle":0,"zindex":20,"x":485.08822772465936}},"14b0a584a93271":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"mq"}],"lineStyle":{"lineColor":"204,255,230"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"14b0a584b6eb52","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a584b6ea4b","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a584b6e0ce","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a584b6ea01","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a584b6ec9b","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a584a93271","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"圆角矩形","category":"basic","name":"roundRectangle","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x1":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,204","type":"solid"},"locked":false,"group":"","props":{"w":92.23089983022061,"y":849.737704918033,"h":50.491803278688394,"angle":0,"zindex":32,"x":326.7691001697794}},"155de395248aa1":{"id":"155de395248aa1","to":{"id":"14b0a37e17b76d","y":615.0823719894753,"angle":0,"x":449.0101867572157},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":615.0823719894753,"x":430.33446519524625},{"y":615.0823719894753,"x":430.33446519524625}],"locked":false,"dataAttributes":[],"from":{"id":"14b0a37b6c3e8a","y":615.0823719894753,"angle":3.141592653589793,"x":411.65874363327686},"group":"","props":{"zindex":50}},"14b0a5291fc8ec":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{"lineColor":"153,255,255"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a5292b789","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a5292b76d2","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a5292b7731","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a5292b7edb","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a5292b7f2e","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a5291fc8ec","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"153,255,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":116,"angle":0,"h":88.00000000000011,"y":952,"x":303,"zindex":21}},"14b0a584a93a8d":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"核心组件"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"14b0a584b6e9ff","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a584b6e673","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a584b6eafb","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a584b6eb71","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a584b6ed74","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a584a93a8d","anchors":[],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":135.82342954159594,"angle":0,"h":36.393442622950815,"y":810,"x":491.87945670628187,"zindex":36}},"1562bc6ba3448c":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":""}],"lineStyle":{"lineColor":"255,153,51"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"1562bc6dfdd305","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc6dfdd3cc","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc6dfdd41b","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc6dfddc41","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc6dfdd662","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc6ba3448c","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"圆角矩形","category":"basic","name":"roundRectangle","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x1":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,255,255","type":"solid"},"locked":false,"group":"","props":{"w":49.66666666666663,"y":675.2716049382709,"h":111,"angle":0,"zindex":72,"x":816.9994324770992}},"14b0a37ec25377":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"......."}],"lineStyle":{"lineColor":"255,204,204"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"14b0a37f5498b8","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a37f549443","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a37f549d79","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a37f54908a","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a37f5495e5","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a37ec25377","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"圆角矩形","category":"basic","name":"roundRectangle","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x1":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,204,204","type":"solid"},"locked":false,"group":"","props":{"w":95.96434634974537,"y":589.8364703501311,"h":50.49180327868851,"angle":0,"zindex":5,"x":696.0000000000001}},"14b0a9d8910683":{"textBlock":[{"position":{"w":"w*1.4","y":"h*0.38","h":"h*0.24","x":"-w*0.2"},"text":""}],"lineStyle":{"lineColor":"102,178,255"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a9d89db29e","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a9d89db4af","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a9d89db5b1","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a9d89dbc08","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a9d89db478","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a9d8910683","anchors":[{"y":"0","x":"w*0.5"},{"y":"h","x":"w*0.5"}],"title":"上下箭头","category":"basic","name":"doubleVerticalArrow","path":[{"actions":[{"action":"move","y":"0","x":"w*0.5"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"h","x":"w*0.5"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"0","x":"w*0.5"},{"action":"close"}]}],"fillStyle":{"color":"102,178,255","type":"solid"},"locked":false,"group":"","props":{"w":28.969510976942104,"y":1056,"h":118,"angle":0,"zindex":46,"x":169.01524451152895}},"1562bc6ba34bbc":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"微服务"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"1562bc6dfddc1f","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc6dfdd6b1","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc6dfddfd1","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc6dfddfb3","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc6dfdde6d","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc6ba34bbc","anchors":[],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":135.82342954159594,"angle":0,"h":36.393442622950815,"y":677.2098765432096,"x":491.87945670628187,"zindex":69}},"14b0a52e0f5957":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"灾备中心"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"14b0a52e1d0acd","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a52e1d098c","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a52e1d0719","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a52e1d0241","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a52e1d057f","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a52e0f5957","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":135.82342954159594,"y":981.436596280555,"h":28.85245901639344,"angle":0,"zindex":22,"x":293.08828522920203}},"1562bc9e4be1cf":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"tcp-haproxy"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":15},"dataAttributes":[{"id":"1562bc9eb2400d","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc9eb24f63","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc9eb24cac","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc9eb2401b","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc9eb24d8","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc9e4be1cf","anchors":[],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":160,"angle":1.5707963267948966,"h":40,"y":710.7716049382709,"x":761.8323885130817,"zindex":76}},"1562bc808ac2ed":{"textBlock":[],"lineStyle":{"lineColor":"136,136,136","lineStyle":"dashed","lineWidth":1},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["l","r"],"fontStyle":{},"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1562bc808ac2ed","anchors":[],"category":"ui","title":"水平线","name":"uiHLine","fillStyle":{},"path":[{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"lineWidth%2==0 ? Math.round(h/2) : h/2","x":0},{"action":"line","y":"lineWidth%2==0 ? Math.round(h/2) : h/2","x":"w"}]},{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":931,"angle":0,"h":21,"y":780,"x":59,"zindex":73}},"155de39844bc1a":{"id":"155de39844bc1a","to":{"id":"14b0a37ec25377","y":615.0823719894753,"angle":0,"x":696.0000000000001},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":615.0823719894753,"x":676.1638370118847},{"y":615.0823719894753,"x":676.1638370118847}],"locked":false,"dataAttributes":[],"from":{"id":"14b0a37e265e7e","y":615.0823719894753,"angle":3.141592653589793,"x":656.3276740237693},"group":"","props":{"zindex":52}},"155de45d709d5e":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{"lineColor":"255,153,51"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"155de45d935ae4","category":"default","name":"序号","value":"","type":"number"},{"id":"155de45d935eca","category":"default","name":"名称","value":"","type":"string"},{"id":"155de45d935fba","category":"default","name":"所有者","value":"","type":"string"},{"id":"155de45d9358f1","category":"default","name":"连接","value":"","type":"link"},{"id":"155de45d935c2c","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"155de45d709d5e","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"255,255,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":49.66666666666663,"angle":0,"h":111,"y":808.0617283950613,"x":816.9994324770992,"zindex":55}},"14b0a548ba4f98":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"云服务"}],"lineStyle":{"lineColor":"102,178,255"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":30},"dataAttributes":[{"id":"14b0a548c5f624","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a548c5f9d6","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a548c5f956","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a548c5f85e","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a548c5f0cd","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a548ba4f98","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"102,178,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":500,"angle":0,"h":86,"y":1074.0000000000002,"x":303.00701112618987,"zindex":25}},"14b0a3c2513d8c":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{"lineColor":"51,153,255"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a3c262c453","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a3c262c189","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a3c262cfed","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a3c262cd14","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a3c262c5b7","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a3c2513d8c","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"255,255,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":51.65032372043123,"angle":0,"h":105.73560996273523,"y":812.1158015760096,"x":223.1885582001604,"zindex":16}},"14b0a521054425":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{"lineColor":"153,255,255"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a52110f32","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a52110fc8c","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a52110f926","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a52110f935","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a52110f6e7","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a521054425","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"153,255,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":214.77079796264798,"angle":0,"h":88.24691358024711,"y":951.8902606310014,"x":445.62161214502873,"zindex":19}},"155de3970fa6ae":{"id":"155de3970fa6ae","to":{"id":"14b0a37b6c3e8a","y":615.0823719894753,"angle":3.141592653589793,"x":411.65874363327686},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":615.0823719894753,"x":430.33446519524625},{"y":615.0823719894753,"x":430.33446519524625}],"locked":false,"dataAttributes":[],"from":{"id":"14b0a37e17b76d","y":615.0823719894753,"angle":0,"x":449.0101867572157},"group":"","props":{"zindex":51}},"1562bc6ba34ff8":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"微服务层"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":false,"size":15},"dataAttributes":[{"id":"1562bc6dfdddf4","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc6dfdd6e6","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc6dfddab6","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc6dfdd754","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc6dfddf8a","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc6ba34ff8","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":160,"y":707.7098765432096,"h":40,"angle":0,"zindex":70,"x":63}},"155de4992de8fb":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"读写分离"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"155de49960a75c","category":"default","name":"序号","value":"","type":"number"},{"id":"155de49960ab7b","category":"default","name":"名称","value":"","type":"string"},{"id":"155de49960a8cb","category":"default","name":"所有者","value":"","type":"string"},{"id":"155de49960a8a6","category":"default","name":"连接","value":"","type":"link"},{"id":"155de49960a1a4","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"155de4992de8fb","anchors":[],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":135.82342954159594,"angle":0,"h":28.85245901639344,"y":979.3820314276365,"x":681.1779522510583,"zindex":62}},"14b0a3aa7c2f3e":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"软负载7层nginx,4层lvs"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"14b0a3aa88d1e8","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a3aa88dac6","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a3aa88defa","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a3aa88d48a","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a3aa88df32","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a3aa7c2f3e","anchors":[],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":263.22222222222223,"angle":0,"h":36.11111111111114,"y":455.44444444444446,"x":287.4016694963216,"zindex":10}},"155de495432e8b":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{"lineColor":"153,255,255"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"155de4956c3b6a","category":"default","name":"序号","value":"","type":"number"},{"id":"155de4956c3ccf","category":"default","name":"名称","value":"","type":"string"},{"id":"155de4956c35e5","category":"default","name":"所有者","value":"","type":"string"},{"id":"155de4956c38d2","category":"default","name":"连接","value":"","type":"link"},{"id":"155de4956c39e9","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"155de495432e8b","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"153,255,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":116,"angle":0,"h":88.00000000000011,"y":952.013717421125,"x":687.0070111263527,"zindex":61}},"14b0a5d59c035d":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"硬件层"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":false,"size":15},"dataAttributes":[{"id":"14b0a5d96163ef","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a5d96165ff","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a5d9616211","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a5d9616dc5","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a5d9616061","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a5d59c035d","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":160,"y":1092.8888888888896,"h":40,"angle":0,"zindex":41,"x":66.44002647727805}},"155de39987581":{"id":"155de39987581","to":{"id":"14b0a37e265e7e","y":615.0823719894753,"angle":3.141592653589793,"x":656.3276740237693},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":615.0823719894753,"x":676.1638370118847},{"y":615.0823719894753,"x":676.1638370118847}],"locked":false,"dataAttributes":[],"from":{"id":"14b0a37ec25377","y":615.0823719894753,"angle":0,"x":696.0000000000001},"group":"","props":{"zindex":53}},"14b0a348331073":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":""}],"lineStyle":{"lineColor":"255,153,153"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a3483317e","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a348331d9f","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a348331285","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a3483314d8","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a348331851","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a348331073","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"圆角矩形","category":"basic","name":"roundRectangle","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x1":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,153,153","type":"solid"},"locked":false,"group":"","props":{"w":500,"y":546.2098765432096,"h":111,"angle":0,"zindex":1,"x":303}},"14b0a38678b86f":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"业务系统"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"14b0a38678b813","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a38678b7dc","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a38678b826","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a38678ba34","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a38678b03e","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a38678b86f","anchors":[],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":135.82342954159594,"angle":0,"h":36.393442622950815,"y":550.0987654320986,"x":481.879456706282,"zindex":6}},"1564fca6a2f58":{"textBlock":[],"lineStyle":{"lineColor":"136,136,136","lineStyle":"dashed","lineWidth":1},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["l","r"],"fontStyle":{},"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1564fca6a2f58","anchors":[],"category":"ui","title":"水平线","name":"uiHLine","fillStyle":{},"path":[{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"lineWidth%2==0 ? Math.round(h/2) : h/2","x":0},{"action":"line","y":"lineWidth%2==0 ? Math.round(h/2) : h/2","x":"w"}]},{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":931,"angle":0,"h":21,"y":924.8785246188581,"x":63,"zindex":79}},"14b0a5b96961d8":{"textBlock":[],"lineStyle":{"lineColor":"136,136,136","lineStyle":"dashed","lineWidth":1},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["l","r"],"fontStyle":{},"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"14b0a5b96961d8","anchors":[],"category":"ui","title":"水平线","name":"uiHLine","fillStyle":{},"path":[{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"lineWidth%2==0 ? Math.round(h/2) : h/2","x":0},{"action":"line","y":"lineWidth%2==0 ? Math.round(h/2) : h/2","x":"w"}]},{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":931,"angle":0,"h":21,"y":1041,"x":63,"zindex":-3}},"155de45f6c225e":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"tcp-haproxy"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":15},"dataAttributes":[{"id":"155de45f8331d2","category":"default","name":"序号","value":"","type":"number"},{"id":"155de45f833ce8","category":"default","name":"名称","value":"","type":"string"},{"id":"155de45f833ef3","category":"default","name":"所有者","value":"","type":"string"},{"id":"155de45f833413","category":"default","name":"连接","value":"","type":"link"},{"id":"155de45f83323a","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"155de45f6c225e","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":160,"y":840.5009907044904,"h":40,"angle":1.5707963267948966,"zindex":56,"x":761.8323885130817}},"14b0a37e17b76d":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"用户系统"}],"lineStyle":{"lineColor":"255,204,204"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"14b0a37e26535e","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a37e265462","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a37e265ee2","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a37e265fd2","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a37e265c2f","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a37e17b76d","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"255,204,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":84.88964346349745,"angle":0,"h":50.49180327868852,"y":589.8364703501311,"x":449.0101867572157,"zindex":3}},"14b0a37b6c3e8a":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"主站系统"}],"lineStyle":{"lineColor":"255,204,204"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"14b0a37b6c3732","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a37b6c320a","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a37b6c3cb9","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a37b6c3252","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a37b6c31e4","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a37b6c3e8a","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"255,204,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":84.88964346349745,"angle":0,"h":50.49180327868852,"y":589.8364703501311,"x":326.7691001697794,"zindex":2}},"14b0a9ce0343f3":{"textBlock":[{"position":{"w":"w*1.4","y":"h*0.38","h":"h*0.24","x":"-w*0.2"},"text":""}],"lineStyle":{"lineColor":"255,179,102"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a9ce0ff91a","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a9ce0ff492","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a9ce0ff18e","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a9ce0ff6c7","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a9ce0ff592","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a9ce0343f3","anchors":[{"y":"0","x":"w*0.5"},{"y":"h","x":"w*0.5"}],"title":"上下箭头","category":"basic","name":"doubleVerticalArrow","path":[{"actions":[{"action":"move","y":"0","x":"w*0.5"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"h","x":"w*0.5"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"0","x":"w*0.5"},{"action":"close"}]}],"fillStyle":{"color":"255,179,102","type":"solid"},"locked":false,"group":"","props":{"w":29,"y":540,"h":113.11111126124933,"angle":0,"zindex":43,"x":169}},"1562bc6ba3451c":{"textBlock":[{"position":{"w":"w*1.4","y":"h*0.38","h":"h*0.24","x":"-w*0.2"},"text":""}],"lineStyle":{"lineColor":"153,255,153"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"1562bc6dfdd35d","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc6dfdd9bd","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc6dfdd82d","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc6dfdd0db","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc6dfdde5b","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc6ba3451c","anchors":[{"y":"0","x":"w*0.5"},{"y":"h","x":"w*0.5"}],"title":"上下箭头","category":"basic","name":"doubleVerticalArrow","path":[{"actions":[{"action":"move","y":"0","x":"w*0.5"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"h","x":"w*0.5"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"0","x":"w*0.5"},{"action":"close"}]}],"fillStyle":{"color":"153,255,153","type":"solid"},"locked":false,"group":"","props":{"w":29,"y":669.9615442975908,"h":110.03845570240924,"angle":0,"zindex":71,"x":169}},"14b0a584a93e29":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{"lineColor":"153,255,153","lineWidth":2},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a584b5e547","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a584b5ed3a","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a584b5ee1","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a584b5e62d","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a584b5e083","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a584a93e29","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"153,255,153","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":500,"angle":0,"h":111,"y":805.0009907044904,"x":303.0070111263527,"zindex":31}},"1562bc6ba341e":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{"lineColor":"153,255,153","lineWidth":2},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"1562bc6dfdc64a","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc6dfdc4ce","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc6dfdc42","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc6dfdcee2","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc6dfdc456","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc6ba341e","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"153,255,153","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":500,"angle":0,"h":111,"y":672.2098765432096,"x":303.0070111263527,"zindex":64}},"1562bc6ba342aa":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"pushy"}],"lineStyle":{"lineColor":"204,255,230"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"1562bc6dfdca4f","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc6dfdcc08","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc6dfdc998","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc6dfdc70e","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc6dfdc583","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc6ba342aa","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"204,255,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":97.86323335219788,"angle":0,"h":50.491803278688394,"y":716.9475814612426,"x":568.8888888888889,"zindex":67}},"14b0a584a93aaf":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"zookeeper"}],"lineStyle":{"lineColor":"204,255,230"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"14b0a584b6e40c","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a584b6ee61","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a584b6e6bb","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a584b6e3e7","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a584b6e005","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a584a93aaf","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"204,255,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":97.86323335219788,"angle":0,"h":50.491803278688394,"y":849.737704918033,"x":568.8888888888889,"zindex":34}},"1562bc6ba3434":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"......"}],"lineStyle":{"lineColor":"204,255,230"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"1562bc6dfdc7aa","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc6dfdc5fc","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc6dfdc572","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc6dfdce2e","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc6dfdcdfa","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc6ba3434","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"圆角矩形","category":"basic","name":"roundRectangle","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x1":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,204","type":"solid"},"locked":false,"group":"","props":{"w":84.88964346349745,"y":716.9475814612425,"h":50.49180327868852,"angle":0,"zindex":68,"x":707.0747028862479}},"155de480edb44":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"横向扩增"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"155de480fec1c9","category":"default","name":"序号","value":"","type":"number"},{"id":"155de480fec67a","category":"default","name":"名称","value":"","type":"string"},{"id":"155de480fec114","category":"default","name":"所有者","value":"","type":"string"},{"id":"155de480fecc7e","category":"default","name":"连接","value":"","type":"link"},{"id":"155de480fec53","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"155de480edb44","anchors":[],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":160,"angle":4.71238898038469,"h":40,"y":581.9952097989626,"x":169.01372006037604,"zindex":60}},"14b0a5b044efeb":{"textBlock":[],"lineStyle":{"lineColor":"136,136,136","lineStyle":"dashed","lineWidth":1},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["l","r"],"fontStyle":{},"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"14b0a5b044efeb","anchors":[],"title":"水平线","category":"ui","name":"uiHLine","path":[{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"lineWidth%2==0 ? Math.round(h/2) : h/2","x":0},{"action":"line","y":"lineWidth%2==0 ? Math.round(h/2) : h/2","x":"w"}]},{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":931,"y":527,"h":21,"angle":0,"zindex":0,"x":63}},"14b0a5d4e0d048":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"业务系统层"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":false,"size":15},"dataAttributes":[{"id":"14b0a5d4eb892d","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a5d4eb8ea1","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a5d4eb86ad","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a5d4eb81e7","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a5d4eb8c29","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a5d4e0d048","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":160,"y":572,"h":40,"angle":0,"zindex":38,"x":52.888888888888886}},"1562bccf45daf1":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"硬负载F5"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":20},"dataAttributes":[{"id":"1562bccf689ee4","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bccf68966f","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bccf6896df","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bccf6899ca","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bccf6892aa","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bccf45daf1","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":263.22222222222223,"y":455.44444444444446,"h":36.11111111111114,"angle":0,"zindex":78,"x":538.2343897377854}},"14b0a3a623478b":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{"lineColor":"255,179,102"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a3a62df863","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a3a62df477","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a3a62dffb3","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a3a62dfa1c","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a3a62df79b","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a3a623478b","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"255,179,102","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":238.4432182607054,"angle":0,"h":88,"y":429.5,"x":299.79117147707996,"zindex":8}},"14b0a9d5d7eaa":{"textBlock":[{"position":{"w":"w*1.4","y":"h*0.38","h":"h*0.24","x":"-w*0.2"},"text":""}],"lineStyle":{"lineColor":"153,255,255"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a9d5e587d6","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a9d5e5840d","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a9d5e58692","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a9d5e58b69","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a9d5e584ed","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a9d5d7eaa","anchors":[{"y":"0","x":"w*0.5"},{"y":"h","x":"w*0.5"}],"title":"上下箭头","category":"basic","name":"doubleVerticalArrow","path":[{"actions":[{"action":"move","y":"0","x":"w*0.5"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"h","x":"w*0.5"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"0","x":"w*0.5"},{"action":"close"}]}],"fillStyle":{"color":"153,255,255","type":"solid"},"locked":false,"group":"","props":{"w":29,"y":944,"h":104.00000000000011,"angle":0,"zindex":45,"x":169}},"155de47576368f":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":""}],"lineStyle":{"lineColor":"51,153,255"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"155de475a5bd34","category":"default","name":"序号","value":"","type":"number"},{"id":"155de475a5bdf7","category":"default","name":"名称","value":"","type":"string"},{"id":"155de475a5bdc6","category":"default","name":"所有者","value":"","type":"string"},{"id":"155de475a5b9d","category":"default","name":"连接","value":"","type":"link"},{"id":"155de475a5b128","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"155de47576368f","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"圆角矩形","category":"basic","name":"roundRectangle","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x1":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,255,255","type":"solid"},"locked":false,"group":"","props":{"w":51.807957619401975,"y":550.8888860362604,"h":102.22222522498896,"angle":0,"zindex":59,"x":223.09602382955023}},"14b0a3a210003d":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{"lineColor":"255,153,51"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a3a21f9586","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a3a21f9075","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a3a21f9f07","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a3a21f936f","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a3a21f96e7","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a3a210003d","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"255,255,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":49.66666666666663,"angle":0,"h":111,"y":547.4444444444442,"x":819.2222222222224,"zindex":7}},"155de393bda1c1":{"id":"155de393bda1c1","to":{"id":"14b0a37e17b76d","y":615.0823719894753,"angle":3.141592653589793,"x":533.8998302207132},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":615.0823719894753,"x":552.6689303904925},{"y":615.0823719894753,"x":552.6689303904925}],"locked":false,"dataAttributes":[],"from":{"id":"14b0a37e265e7e","y":615.0823719894753,"angle":0,"x":571.4380305602718},"group":"","props":{"zindex":48}},"1562bccbf7b586":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":""}],"lineStyle":{"lineColor":"255,179,102"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"1562bccc24d038","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bccc24d9f4","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bccc24d517","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bccc24d312","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bccc24d263","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bccbf7b586","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"圆角矩形","category":"basic","name":"roundRectangle","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x1":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,179,102","type":"solid"},"locked":false,"group":"","props":{"w":249.45661196000765,"y":429.5,"h":88,"angle":0,"zindex":77,"x":552}},"1562bc86c97986":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"sms"}],"lineStyle":{"lineColor":"204,255,230"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"1562bc870de709","category":"default","name":"序号","value":"","type":"number"},{"id":"1562bc870de057","category":"default","name":"名称","value":"","type":"string"},{"id":"1562bc870ded98","category":"default","name":"所有者","value":"","type":"string"},{"id":"1562bc870de4f8","category":"default","name":"连接","value":"","type":"link"},{"id":"1562bc870de117","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1562bc86c97986","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"圆角矩形","category":"basic","name":"roundRectangle","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x1":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,204","type":"solid"},"locked":false,"group":"","props":{"w":84.88964346349745,"y":716.9475814612426,"h":50.49180327868852,"angle":0,"zindex":74,"x":329.01372006037604}},"14b0a9c6c223ae":{"textBlock":[{"position":{"w":"w*1.4","h":"h*0.24","y":"h*0.38","x":"-w*0.2"},"text":""}],"lineStyle":{"lineColor":"255,153,153"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{},"dataAttributes":[{"id":"14b0a9c6c222c3","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a9c6c22e91","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a9c6c221d4","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a9c6c22347","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a9c6c22207","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a9c6c223ae","anchors":[{"y":"0","x":"w*0.5"},{"y":"h","x":"w*0.5"}],"category":"basic","title":"上下箭头","name":"doubleVerticalArrow","fillStyle":{"color":"255,153,153","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"w*0.5"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.67"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w"},{"action":"line","y":"h","x":"w*0.5"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"h-Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"w*0.33"},{"action":"line","y":"Math.min(w*0.5,h*0.45)","x":"0"},{"action":"line","y":"0","x":"w*0.5"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":29,"angle":0,"h":121,"y":413,"x":169,"zindex":42}},"155de39ef02b85":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"RCP内部调用"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":true,"size":15},"dataAttributes":[{"id":"155de39f6f8bad","category":"default","name":"序号","value":"","type":"number"},{"id":"155de39f6f83f9","category":"default","name":"名称","value":"","type":"string"},{"id":"155de39f6f8b0b","category":"default","name":"所有者","value":"","type":"string"},{"id":"155de39f6f84b1","category":"default","name":"连接","value":"","type":"link"},{"id":"155de39f6f807d","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"155de39ef02b85","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":160,"y":581.9999986487549,"h":40,"angle":1.5707963267948966,"zindex":54,"x":761.5857828662754}},"14b0a5d5905132":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"组件层"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":false,"size":15},"dataAttributes":[{"id":"14b0a5d59c0a0c","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a5d59c02b","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a5d59c01ea","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a5d59c024d","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a5d59c02e7","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a5d5905132","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":160,"y":840.5,"h":40,"angle":0,"zindex":40,"x":63}},"14b0a5d4ec802e":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"数据层"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":false,"size":15},"dataAttributes":[{"id":"14b0a5d59050dc","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a5d5905ca5","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a5d5905e12","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a5d590540a","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a5d590510f","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a5d4ec802e","anchors":[],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":160,"angle":0,"h":40,"y":981.5737704918033,"x":63,"zindex":39}},"14b0a37e265e7e":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"搜索系统"}],"lineStyle":{"lineColor":"255,204,204"},"link":"","parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"size":15},"dataAttributes":[{"id":"14b0a37ec15a87","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a37ec1549e","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a37ec15844","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a37ec15b84","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a37ec150bf","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a37e265e7e","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"圆角矩形","name":"roundRectangle","fillStyle":{"color":"255,204,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x":"0","x1":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":84.88964346349745,"angle":0,"h":50.49180327868852,"y":589.8364703501311,"x":571.4380305602718,"zindex":4}},"14b0a5cecdb5c8":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"应用层"}],"lineStyle":{},"link":"","parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"children":[],"resizeDir":["tl","tr","br","bl"],"fontStyle":{"bold":false,"size":15},"dataAttributes":[{"id":"14b0a5cecdbed4","category":"default","name":"序号","value":"","type":"number"},{"id":"14b0a5cecdb3ac","category":"default","name":"名称","value":"","type":"string"},{"id":"14b0a5cecdba13","category":"default","name":"所有者","value":"","type":"string"},{"id":"14b0a5cecdb6a5","category":"default","name":"连接","value":"","type":"link"},{"id":"14b0a5cecdbe86","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"14b0a5cecdb5c8","anchors":[],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":160,"y":458.2295081967213,"h":40,"angle":0,"zindex":37,"x":64}}}}},"meta":{"id":"5acb19b8e4b00dc8a037046c","member":"57dcb1fae4b0ba3ecb1939e8","exportTime":"2018-04-09 15:44:37","diagramInfo":{"category":"uncategorized","title":"架构图","created":"2018-04-09 15:43:52","creator":"57dcb1fae4b0ba3ecb1939e8","modified":"2018-04-09 15:43:52"},"type":"ProcessOn Schema File","version":"1.0"}} ================================================ FILE: docs/电商平台设计.mdl ================================================ (object Petal version 50 _written "Rose 8.2.0310.2800" charSet 134) (object Design "Logical View" is_unit TRUE is_loaded TRUE attributes (list Attribute_Set (object Attribute tool "Java" name "IDE" value "Internal Editor") (object Attribute tool "Java" name "UserDefineTagName1" value "") (object Attribute tool "Java" name "UserDefineTagText1" value "") (object Attribute tool "Java" name "UserDefineTagApply1" value "") (object Attribute tool "Java" name "UserDefineTagName2" value "") (object Attribute tool "Java" name "UserDefineTagText2" value "") (object Attribute tool "Java" name "UserDefineTagApply2" value "") (object Attribute tool "Java" name "UserDefineTagName3" value "") (object Attribute tool "Java" name "UserDefineTagText3" value "") (object Attribute tool "Java" name "UserDefineTagApply3" value "") (object Attribute tool "Data Modeler" name "DatabaseCounter" value "1") (object Attribute tool "Data Modeler" name "DomainPackageCounter" value "0") (object Attribute tool "Data Modeler" name "SchemaCounter" value "1") (object Attribute tool "Data Modeler" name "DomainCounter" value 0) (object Attribute tool "Data Modeler" name "TableCounter" value 11) (object Attribute tool "Data Modeler" name "ViewCounter" value 0) (object Attribute tool "Data Modeler" name "JoinCounter" value 0) (object Attribute tool "Data Modeler" name "ColumnCounter" value "23") (object Attribute tool "Data Modeler" name "TriggerCounter" value 0) (object Attribute tool "Data Modeler" name "IndexCounter" value 0) (object Attribute tool "Data Modeler" name "ConstraintCounter" value 49) (object Attribute tool "Data Modeler" name "PrimaryKeyCounter" value 0) (object Attribute tool "Data Modeler" name "ForeignKeyCounter" value 0) (object Attribute tool "Data Modeler" name "StoredProcedurePackageCounter" value "0") (object Attribute tool "Data Modeler" name "StoredProcedureCounter" value "0") (object Attribute tool "Data Modeler" name "StoredProcedureParameterCounter" value "0")) quid "39C9260C00D4" enforceClosureAutoLoad FALSE defaults (object defaults rightMargin 0.250000 leftMargin 0.250000 topMargin 0.250000 bottomMargin 0.500000 pageOverlap 0.250000 clipIconLabels TRUE autoResize TRUE snapToGrid TRUE gridX 16 gridY 16 defaultFont (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) showMessageNum 1 showClassOfObject TRUE notation "Unified") root_usecase_package (object Class_Category "Use Case View" quid "39C9260C00D6" exportControl "Public" global TRUE logical_models (list unit_reference_list) logical_presentations (list unit_reference_list (object UseCaseDiagram "Main" quid "39C9261001B7" title "Main" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list)))) root_category (object Class_Category "Logical View" quid "39C9260C00D5" exportControl "Public" global TRUE subsystem "Component View" quidu "39C9260C00D7" logical_models (list unit_reference_list (object Class_Category "javax" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2ee_javax.cat" quid "39C926610018") (object Class_Category "java" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2se_1_3_java.cat" quid "39C92661003B") (object Class_Category "org" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2se_1_3_org.cat" quid "39C92693036F") (object Class_Category "Global Data Types" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsRootDomainPackage" value TRUE) (object Attribute tool "Data Modeler" name "dmDomainPackage" value "Data Modeler")) quid "5B1AA85A03AD" exportControl "Public" logical_models (list unit_reference_list) logical_presentations (list unit_reference_list)) (object Class_Category "Schemas" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsRootSchema" value TRUE) (object Attribute tool "Data Modeler" name "dmSchema" value "Data Modeler")) quid "5B1AA85A03B2" exportControl "Public" logical_models (list unit_reference_list (object Class_Category "S_0" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsSchema" value TRUE) (object Attribute tool "Data Modeler" name "dmSchema" value "Data Modeler") (object Attribute tool "Data Modeler" name "DMName" value "S_0") (object Attribute tool "Data Modeler" name "CodeName" value "")) quid "5B1AA8CD02FA" stereotype "Schema" exportControl "Public" logical_models (list unit_reference_list (object Class "SPU" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "SPU") (object Attribute tool "Data Modeler" name "CodeName" value "item_spu") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1AA9510260" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AACB2038A" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "Ʒ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "Ʒ") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 30) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AACB203AD" type "VARCHAR(30)" exportControl "Neither") (object ClassAttribute "Ʒid" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "Ʒid") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 3) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AACB203CB" type "SMALLINT" exportControl "Neither")) language "Data Modeler") (object Class "SKU" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "SKU") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1AA9BA0234" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5D5800C5" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "spu_id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "spu_id") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5D5800E3" type "VARCHAR(10)" exportControl "Neither")) language "Data Modeler") (object Class "Ʒ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "Ʒ") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1AAA6501AC" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AAAC90295" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "Ʒ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "Ʒ") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 30) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AAAC902B9" type "VARCHAR(30)" exportControl "Neither")) language "Data Modeler") (object Class "" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1AACBF0283" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AAD45002A" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AAD45004B" type "SMALLINT" exportControl "Neither")) language "Data Modeler") (object Class "ֵ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "ֵ") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1B57A8023E" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B58BD0041" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B58BD0062" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "ֵ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "ֵ") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 3) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value") (object Attribute tool "Data Modeler" name "Length" value 10)) quid "5B1B58BD0081" type "VARCHAR(10)" exportControl "Neither")) language "Data Modeler") (object Class "Ʒ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "Ʒ") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1B59C80320" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5A9D02FA" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 1) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5A9D0318" type "VARCHAR(1)" exportControl "Neither")) language "Data Modeler") (object Class "SPU-" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "SP-U") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1B5D7901E2" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "spu_id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "spu_id") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 1) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5E150171" type "VARCHAR(1)" exportControl "Neither") (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5E150198" type "VARCHAR(10)" exportControl "Neither")) language "Data Modeler") (object Class "SKU-ֵ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "SKU-ֵ") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1B5E01011A" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "sku_id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "sku_id") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5E5E01E4" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "ֵid" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "ֵid") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5E5E0207" type "VARCHAR(10)" exportControl "Neither")) language "Data Modeler") (object Class "" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1B5E8F0382" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5EB5001C" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 30) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5EB5003C" type "VARCHAR(30)" exportControl "Neither")) language "Data Modeler") (object Class "sku_ֵ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "sku_ֵ") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1B5ECD0127" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "sku_id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "sku_id") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5F02025F" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "ֵid" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "ֵid") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5F020282" type "VARCHAR(10)" exportControl "Neither")) language "Data Modeler") (object Class "ֵ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "ֵ") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1B5F09010A" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5F38013A" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 1) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1B5F380166" type "VARCHAR(1)" exportControl "Neither")) language "Data Modeler") (object Association "TC_Ʒ3" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsRelationship" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "TC_Ʒ3") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "RIMethod" value "DRI") (object Attribute tool "Data Modeler" name "ParentUpdateRule" value "No Action") (object Attribute tool "Data Modeler" name "ParentDeleteRule" value "No Action") (object Attribute tool "Data Modeler" name "ChildMultiplicity" value FALSE) (object Attribute tool "Data Modeler" name "ParentUpdateRuleName" value "") (object Attribute tool "Data Modeler" name "ParentDeleteRuleName" value "") (object Attribute tool "Data Modeler" name "ChildInsertRestrict" value FALSE) (object Attribute tool "Data Modeler" name "ChildInsertRestrictName" value "") (object Attribute tool "Data Modeler" name "ChildMultiplicityName" value "")) quid "5B1B5AC502CA" stereotype "Identifying" roles (list role_list (object Role "$UNNAMED$0" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5AC600DF" supplier "Logical View::Schemas::S_0::SPU" quidu "5B1AA9510260" client_cardinality (value cardinality "0..*") Containment "By Value" is_navigable TRUE) (object Role "$UNNAMED$1" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5AC600E5" supplier "Logical View::Schemas::S_0::Ʒ" quidu "5B1B59C80320" client_cardinality (value cardinality "0..1") is_navigable TRUE is_aggregate TRUE))) (object Association "$UNNAMED$2" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsRelationship" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "TC_Ʒ8") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "RIMethod" value "DRI") (object Attribute tool "Data Modeler" name "ParentUpdateRule" value "No Action") (object Attribute tool "Data Modeler" name "ParentDeleteRule" value "No Action") (object Attribute tool "Data Modeler" name "ChildMultiplicity" value FALSE) (object Attribute tool "Data Modeler" name "ParentUpdateRuleName" value "") (object Attribute tool "Data Modeler" name "ParentDeleteRuleName" value "") (object Attribute tool "Data Modeler" name "ChildInsertRestrict" value FALSE) (object Attribute tool "Data Modeler" name "ChildInsertRestrictName" value "") (object Attribute tool "Data Modeler" name "ChildMultiplicityName" value "")) quid "5B1B5AD0025B" stereotype "Identifying" roles (list role_list (object Role "$UNNAMED$3" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5AD10028" supplier "Logical View::Schemas::S_0::SPU" quidu "5B1AA9510260" client_cardinality (value cardinality "0..*") Containment "By Value" is_navigable TRUE) (object Role "$UNNAMED$4" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5AD1002E" supplier "Logical View::Schemas::S_0::Ʒ" quidu "5B1B59C80320" client_cardinality (value cardinality "0..1") is_navigable TRUE is_aggregate TRUE))) (object Association "TC_Ʒ15" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsRelationship" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "TC_Ʒ15") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "RIMethod" value "DRI") (object Attribute tool "Data Modeler" name "ParentUpdateRule" value "No Action") (object Attribute tool "Data Modeler" name "ParentDeleteRule" value "No Action") (object Attribute tool "Data Modeler" name "ChildMultiplicity" value FALSE) (object Attribute tool "Data Modeler" name "ParentUpdateRuleName" value "") (object Attribute tool "Data Modeler" name "ParentDeleteRuleName" value "") (object Attribute tool "Data Modeler" name "ChildInsertRestrict" value FALSE) (object Attribute tool "Data Modeler" name "ChildInsertRestrictName" value "") (object Attribute tool "Data Modeler" name "ChildMultiplicityName" value "")) quid "5B1B5ADB0301" stereotype "Identifying" roles (list role_list (object Role "$UNNAMED$5" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5ADC003A" supplier "Logical View::Schemas::S_0::SPU" quidu "5B1AA9510260" client_cardinality (value cardinality "0..*") Containment "By Value" is_navigable TRUE) (object Role "$UNNAMED$6" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5ADC0041" supplier "Logical View::Schemas::S_0::Ʒ" quidu "5B1B59C80320" client_cardinality (value cardinality "0..1") is_navigable TRUE is_aggregate TRUE))) (object Association "TC_Ʒ24" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsRelationship" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "TC_Ʒ24") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "RIMethod" value "DRI") (object Attribute tool "Data Modeler" name "ParentUpdateRule" value "No Action") (object Attribute tool "Data Modeler" name "ParentDeleteRule" value "No Action") (object Attribute tool "Data Modeler" name "ChildMultiplicity" value FALSE) (object Attribute tool "Data Modeler" name "ParentUpdateRuleName" value "") (object Attribute tool "Data Modeler" name "ParentDeleteRuleName" value "") (object Attribute tool "Data Modeler" name "ChildInsertRestrict" value FALSE) (object Attribute tool "Data Modeler" name "ChildInsertRestrictName" value "") (object Attribute tool "Data Modeler" name "ChildMultiplicityName" value "")) quid "5B1B5AE7038D" stereotype "Identifying" roles (list role_list (object Role "$UNNAMED$7" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5AE80320" supplier "Logical View::Schemas::S_0::SPU" quidu "5B1AA9510260" client_cardinality (value cardinality "0..*") Containment "By Value" is_navigable TRUE) (object Role "$UNNAMED$8" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5AE80328" supplier "Logical View::Schemas::S_0::Ʒ" quidu "5B1B59C80320" client_cardinality (value cardinality "0..1") is_navigable TRUE is_aggregate TRUE))) (object Association "TC_SPU35" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsRelationship" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "TC_SPU35") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "RIMethod" value "DRI") (object Attribute tool "Data Modeler" name "ParentUpdateRule" value "No Action") (object Attribute tool "Data Modeler" name "ParentDeleteRule" value "No Action") (object Attribute tool "Data Modeler" name "ChildMultiplicity" value FALSE) (object Attribute tool "Data Modeler" name "ParentUpdateRuleName" value "") (object Attribute tool "Data Modeler" name "ParentDeleteRuleName" value "") (object Attribute tool "Data Modeler" name "ChildInsertRestrict" value FALSE) (object Attribute tool "Data Modeler" name "ChildInsertRestrictName" value "") (object Attribute tool "Data Modeler" name "ChildMultiplicityName" value "")) quid "5B1B5AF10125" stereotype "Identifying" roles (list role_list (object Role "$UNNAMED$9" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5AF10320" supplier "Logical View::Schemas::S_0::Ʒ" quidu "5B1B59C80320" client_cardinality (value cardinality "0..*") Containment "By Value" is_navigable TRUE) (object Role "$UNNAMED$10" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5AF1032C" supplier "Logical View::Schemas::S_0::SPU" quidu "5B1AA9510260" client_cardinality (value cardinality "0..1") is_navigable TRUE is_aggregate TRUE))) (object Association "TC_SPU-48" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsRelationship" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "TC_SPU-48") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "RIMethod" value "DRI") (object Attribute tool "Data Modeler" name "ParentUpdateRule" value "No Action") (object Attribute tool "Data Modeler" name "ParentDeleteRule" value "No Action") (object Attribute tool "Data Modeler" name "ChildMultiplicity" value FALSE) (object Attribute tool "Data Modeler" name "ParentUpdateRuleName" value "") (object Attribute tool "Data Modeler" name "ParentDeleteRuleName" value "") (object Attribute tool "Data Modeler" name "ChildInsertRestrict" value FALSE) (object Attribute tool "Data Modeler" name "ChildInsertRestrictName" value "") (object Attribute tool "Data Modeler" name "ChildMultiplicityName" value "")) quid "5B1B5E6C03E4" stereotype "Identifying" roles (list role_list (object Role "$UNNAMED$11" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5E6D0149" supplier "Logical View::Schemas::S_0::SPU" quidu "5B1AA9510260" client_cardinality (value cardinality "0..*") Containment "By Value" is_navigable TRUE) (object Role "$UNNAMED$12" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "ConstraintName" value "")) quid "5B1B5E6D0153" supplier "Logical View::Schemas::S_0::SPU-" quidu "5B1B5D7901E2" client_cardinality (value cardinality "0..1") is_navigable TRUE is_aggregate TRUE)))) logical_presentations (list unit_reference_list (object ClassDiagram "NewDiagram" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value "True")) quid "5B1AA92C02F1" title "NewDiagram" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list (object ClassView "Class" "Logical View::Schemas::S_0::SKU" @1 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (1296, 768) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @1 location (985, 703) fill_color 13434879 nlines 1 max_width 622 justify 0 label "SKU") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1AA9BA0234" compartment (object Compartment Parent_View @1 location (985, 764) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 16777215 anchor 2 nlines 3 max_width 472) width 640 height 330 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::Ʒ" @2 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (2176, 544) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @2 location (1831, 478) fill_color 13434879 nlines 1 max_width 690 justify 0 label "Ʒ") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1AAA6501AC" compartment (object Compartment Parent_View @2 location (1831, 539) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 3 max_width 559) width 708 height 332 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::" @3 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (384, 720) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @3 location (78, 655) fill_color 13434879 nlines 1 max_width 612 justify 0 label "") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1AACBF0283" compartment (object Compartment Parent_View @3 location (78, 716) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 3 max_width 457) width 630 height 330 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::ֵ" @4 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (400, 1248) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @4 location (89, 1158) fill_color 13434879 nlines 1 max_width 622 justify 0 label "ֵ") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1B57A8023E" compartment (object Compartment Parent_View @4 location (89, 1219) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 4 max_width 509) width 640 height 380 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::Ʒ" @5 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (2176, 160) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @5 location (1845, 95) fill_color 13434879 nlines 1 max_width 662 justify 0 label "Ʒ") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1B59C80320" compartment (object Compartment Parent_View @5 location (1845, 156) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 3 max_width 537) width 680 height 330 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::SKU-ֵ" @6 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (1296, 1248) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @6 location (959, 1183) fill_color 13434879 nlines 1 max_width 674 justify 0 label "SKU-ֵ") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1B5E01011A" compartment (object Compartment Parent_View @6 location (959, 1244) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 3 max_width 515) width 692 height 330 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::SPU-" @7 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (400, 272) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @7 location (89, 207) fill_color 13434879 nlines 1 max_width 622 justify 0 label "SPU-") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1B5D7901E2" compartment (object Compartment Parent_View @7 location (89, 268) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 3 max_width 490) width 640 height 330 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::SPU" @8 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (1184, 272) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @8 location (839, 182) fill_color 13434879 nlines 1 max_width 690 justify 0 label "SPU") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1AA9510260" compartment (object Compartment Parent_View @8 location (839, 243) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 4 max_width 559) width 708 height 380 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::" @9 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (2160, 960) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @9 location (1815, 895) fill_color 13434879 nlines 1 max_width 690 justify 0 label "") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1B5E8F0382" compartment (object Compartment Parent_View @9 location (1815, 956) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 3 max_width 526) width 708 height 330 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::sku_ֵ" @10 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (2176, 1328) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @10 location (1812, 1263) fill_color 13434879 nlines 1 max_width 728 justify 0 label "sku_ֵ") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1B5ECD0127" compartment (object Compartment Parent_View @10 location (1812, 1324) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 3 max_width 559) width 746 height 330 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::ֵ" @11 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (2976, 1312) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @11 location (2645, 1247) fill_color 13434879 nlines 1 max_width 662 justify 0 label "ֵ") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1B5F09010A" compartment (object Compartment Parent_View @11 location (2645, 1308) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 3 max_width 504) width 680 height 330 annotation 8 autoResize TRUE)))))) logical_presentations (list unit_reference_list))) logical_presentations (list unit_reference_list (object ClassDiagram "Package Hierarchy" quid "39C9261001B8" title "Package Hierarchy" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list (object CategoryView "Logical View::java" @12 location (208, 272) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @12 location (64, 188) nlines 2 max_width 288 justify 0 label "java") icon_style "Icon" line_color 3342489 fill_color 16777215 quidu "39C92661003B" width 300 height 180) (object CategoryView "Logical View::javax" @13 location (656, 272) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @13 location (512, 188) nlines 2 max_width 288 justify 0 label "javax") icon_style "Icon" line_color 3342489 fill_color 16777215 quidu "39C926610018" width 300 height 180) (object CategoryView "Logical View::org" @14 location (1104, 272) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @14 location (960, 188) nlines 2 max_width 288 justify 0 label "org") icon_style "Icon" line_color 3342489 fill_color 16777215 quidu "39C92693036F" width 300 height 180))) (object ClassDiagram "Legend" quid "39CD51840059" title "Legend" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list (object NoteView @15 location (224, 624) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) line_color 3342489 fill_color 12632256 width 300 height 132) (object NoteView @16 location (704, 624) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) line_color 3342489 fill_color 8421631 width 300 height 132) (object NoteView @17 location (1200, 624) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) line_color 3342489 fill_color 12615680 width 300 height 132) (object NoteView @18 location (1664, 624) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) line_color 3342489 fill_color 16777215 width 300 height 132) (object Label @19 location (81, 369) font (object Font size 12 face "Arial" bold TRUE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) nlines 1 max_width 1163 label "J2EE: Java 2 Platform, Enterprise Edition - v 1.2.1") (object Label @20 location (96, 608) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) nlines 1 max_width 268 label "Abstract Class") (object Label @21 location (592, 608) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) nlines 1 max_width 225 label "Final Class") (object Label @22 location (1104, 608) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) nlines 1 max_width 206 label "Interface") (object Label @23 location (1552, 608) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) nlines 1 max_width 144 label "Class"))))) root_subsystem (object SubSystem "Component View" quid "39C9260C00D7" physical_models (list unit_reference_list (object SubSystem "javax" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2ee_javax.sub" quid "39C9266003D8") (object SubSystem "java" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2se_1_3_java.sub" quid "39C92661002C") (object SubSystem "org" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2se_1_3_org.sub" quid "39C9268C01C9") (object SubSystem "DB_0" quid "5B1AA85B0069" physical_models (list unit_reference_list (object module "DB_0" "NotAModuleType" "NotAModulePart" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsDatabase" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "DB_0") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Location" value "") (object Attribute tool "Data Modeler" name "TargetDatabase" value "Oracle 9i")) quid "5B1AA85B006B" stereotype "Database" visible_modules (list dependency_list (object Module_Visibility_Relationship attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value "True") (object Attribute tool "Data Modeler" name "IsTableSpaceDependency" value "True") (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "CodeName" value "")) quid "5B1AA93E014D" supplier "Component View::DB_0::TSP_0" quidu "5B1AA93E0140" supplier_is_spec TRUE)) language "Data Modeler") (object module "TSP_0" "NotAModuleType" "NotAModulePart" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTableSpace" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "TSP_0") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "DatabaseId" value "5B1AA85B006B") (object Attribute tool "Data Modeler" name "IsDefault" value "False") (object Attribute tool "Data Modeler" name "BufferPool" value "") (object Attribute tool "Data Modeler" name "ExtentSize" value 1) (object Attribute tool "Data Modeler" name "PrefetchSize" value 1) (object Attribute tool "Data Modeler" name "PageSize" value 0) (object Attribute tool "Data Modeler" name "TableSpaceType" value "Permanent") (object Attribute tool "Data Modeler" name "ManagedBy" value "Database") (object Attribute tool "Data Modeler" name "ContainerList" value "")) quid "5B1AA93E0140" stereotype "Tablespace" language "Data Modeler")) physical_presentations (list unit_reference_list))) physical_presentations (list unit_reference_list (object Module_Diagram "Main" quid "39C9261001B6" title "Main" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list))) category "Logical View" quidu "5B1AA7B60127") process_structure (object Processes quid "39C9260C00D8" ProcsNDevs (list (object Process_Diagram "Deployment View" quid "39C9260C00DA" title "Deployment View" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list)))) properties (object Properties attributes (list Attribute_Set (object Attribute tool "CORBA" name "propertyId" value "809135966") (object Attribute tool "CORBA" name "default__Project" value (list Attribute_Set (object Attribute tool "CORBA" name "CreateMissingDirectories" value TRUE) (object Attribute tool "CORBA" name "Editor" value ("EditorType" 100)) (object Attribute tool "CORBA" name "IncludePath" value "") (object Attribute tool "CORBA" name "StopOnError" value TRUE) (object Attribute tool "CORBA" name "EditorType" value (list Attribute_Set (object Attribute tool "CORBA" name "BuiltIn" value 100) (object Attribute tool "CORBA" name "WindowsShell" value 101))) (object Attribute tool "CORBA" name "PathSeparator" value ""))) (object Attribute tool "CORBA" name "default__Class" value (list Attribute_Set (object Attribute tool "CORBA" name "ArrayDimensions" value "") (object Attribute tool "CORBA" name "ConstValue" value "") (object Attribute tool "CORBA" name "ImplementationType" value ""))) (object Attribute tool "CORBA" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "CORBA" name "AdditionalIncludes" value (value Text "")) (object Attribute tool "CORBA" name "CmIdentification" value (value Text " %X% %Q% %Z% %W%")) (object Attribute tool "CORBA" name "CopyrightNotice" value (value Text "")) (object Attribute tool "CORBA" name "InclusionProtectionSymbol" value "AUTO GENERATE"))) (object Attribute tool "CORBA" name "default__Module-Body" value (list Attribute_Set (object Attribute tool "CORBA" name "AdditionalIncludes" value (value Text "")) (object Attribute tool "CORBA" name "CmIdentification" value (value Text " %X% %Q% %Z% %W%")) (object Attribute tool "CORBA" name "CopyrightNotice" value (value Text "")) (object Attribute tool "CORBA" name "InclusionProtectionSymbol" value "AUTO GENERATE"))) (object Attribute tool "CORBA" name "default__Operation" value (list Attribute_Set (object Attribute tool "CORBA" name "Context" value "") (object Attribute tool "CORBA" name "OperationIsOneWay" value FALSE))) (object Attribute tool "CORBA" name "default__Attribute" value (list Attribute_Set (object Attribute tool "CORBA" name "ArrayDimensions" value "") (object Attribute tool "CORBA" name "CaseSpecifier" value "") (object Attribute tool "CORBA" name "IsReadOnly" value FALSE) (object Attribute tool "CORBA" name "Order" value ""))) (object Attribute tool "CORBA" name "default__Role" value (list Attribute_Set (object Attribute tool "CORBA" name "ArrayDimensions" value "") (object Attribute tool "CORBA" name "CaseSpecifier" value "") (object Attribute tool "CORBA" name "GenerateForwardReference" value FALSE) (object Attribute tool "CORBA" name "IsReadOnly" value FALSE) (object Attribute tool "CORBA" name "Order" value "") (object Attribute tool "CORBA" name "BoundedRoleType" value ("AssocTypeSet" 47)) (object Attribute tool "CORBA" name "AssocTypeSet" value (list Attribute_Set (object Attribute tool "CORBA" name "Array" value 24) (object Attribute tool "CORBA" name "Sequence" value 47))))) (object Attribute tool "CORBA" name "default__Uses" value (list Attribute_Set (object Attribute tool "CORBA" name "GenerateForwardReference" value FALSE))) (object Attribute tool "CORBA" name "HiddenTool" value FALSE) (object Attribute tool "Data Modeler" name "propertyId" value "809135966") (object Attribute tool "Data Modeler" name "default__Project" value (list Attribute_Set (object Attribute tool "Data Modeler" name "project" value "") (object Attribute tool "Data Modeler" name "TableCounter" value 0) (object Attribute tool "Data Modeler" name "DomainCounter" value 0) (object Attribute tool "Data Modeler" name "SPPackageCounter" value 0) (object Attribute tool "Data Modeler" name "TriggerCounter" value 0) (object Attribute tool "Data Modeler" name "IndexCounter" value 0) (object Attribute tool "Data Modeler" name "ConstraintCounter" value 0) (object Attribute tool "Data Modeler" name "StoreProcedureCounter" value 0) (object Attribute tool "Data Modeler" name "PrimaryKeyCounter" value 0) (object Attribute tool "Data Modeler" name "ForeignKeyCounter" value 0) (object Attribute tool "Data Modeler" name "TablePrefix" value "") (object Attribute tool "Data Modeler" name "DomainPrefix" value "") (object Attribute tool "Data Modeler" name "TriggerPrefix" value "") (object Attribute tool "Data Modeler" name "IndexPrefix" value "") (object Attribute tool "Data Modeler" name "ConstraintPrefix" value "") (object Attribute tool "Data Modeler" name "StoreProcedurePrefix" value "") (object Attribute tool "Data Modeler" name "PrimaryKeyPrefix" value "") (object Attribute tool "Data Modeler" name "ForeignKeyPrefix" value "") (object Attribute tool "Data Modeler" name "ViewCounter" value 0) (object Attribute tool "Data Modeler" name "JoinCounter" value 0) (object Attribute tool "Data Modeler" name "TableSpaceCounter" value 0) (object Attribute tool "Data Modeler" name "cONTAINERCounter" value 0) (object Attribute tool "Data Modeler" name "ViewPrefix" value "") (object Attribute tool "Data Modeler" name "TableSpacePrefix" value ""))) (object Attribute tool "Data Modeler" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "IsDatabase" value FALSE) (object Attribute tool "Data Modeler" name "TargetDatabase" value "") (object Attribute tool "Data Modeler" name "Location" value "") (object Attribute tool "Data Modeler" name "IsTableSpace" value FALSE) (object Attribute tool "Data Modeler" name "TableSpaceType" value "") (object Attribute tool "Data Modeler" name "IsDeault" value FALSE) (object Attribute tool "Data Modeler" name "BufferPool" value "") (object Attribute tool "Data Modeler" name "ExtentSize" value 1) (object Attribute tool "Data Modeler" name "PrefetchSize" value 1) (object Attribute tool "Data Modeler" name "PageSize" value 4) (object Attribute tool "Data Modeler" name "ManagedBy" value "") (object Attribute tool "Data Modeler" name "ContainerList" value ""))) (object Attribute tool "Data Modeler" name "default__Category" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "dmSchema" value "") (object Attribute tool "Data Modeler" name "dmDomainPackage" value "") (object Attribute tool "Data Modeler" name "IsSchema" value FALSE) (object Attribute tool "Data Modeler" name "IsDomainPackage" value FALSE) (object Attribute tool "Data Modeler" name "IsRootSchema" value FALSE) (object Attribute tool "Data Modeler" name "IsRootDomainPackage" value FALSE) (object Attribute tool "Data Modeler" name "IsSchemaPackage" value FALSE) (object Attribute tool "Data Modeler" name "DatabaseID" value "") (object Attribute tool "Data Modeler" name "DBMS" value ""))) (object Attribute tool "Data Modeler" name "default__Class" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "IsTable" value FALSE) (object Attribute tool "Data Modeler" name "IsView" value FALSE) (object Attribute tool "Data Modeler" name "IsDomain" value FALSE) (object Attribute tool "Data Modeler" name "IsSPPackage" value FALSE) (object Attribute tool "Data Modeler" name "Synonymns" value "") (object Attribute tool "Data Modeler" name "TableSpace" value "") (object Attribute tool "Data Modeler" name "SourceId" value "") (object Attribute tool "Data Modeler" name "SourceType" value "") (object Attribute tool "Data Modeler" name "SelectClause" value "") (object Attribute tool "Data Modeler" name "IsUpdatable" value FALSE) (object Attribute tool "Data Modeler" name "CheckOption" value "None") (object Attribute tool "Data Modeler" name "PersistToServer" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "CorrelationName" value "") (object Attribute tool "Data Modeler" name "IsUpdateable" value TRUE) (object Attribute tool "Data Modeler" name "IsSnapShot" value FALSE) (object Attribute tool "Data Modeler" name "IsDistinct" value FALSE) (object Attribute tool "Data Modeler" name "IsPackage" value FALSE))) (object Attribute tool "Data Modeler" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 0) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "IsUnique" value FALSE) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "DataTypeName" value "") (object Attribute tool "Data Modeler" name "Length" value 0) (object Attribute tool "Data Modeler" name "Scale" value 0) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "DefaultValueType" value "") (object Attribute tool "Data Modeler" name "DefaultValue" value "") (object Attribute tool "Data Modeler" name "SourceId" value "") (object Attribute tool "Data Modeler" name "SourceType" value "") (object Attribute tool "Data Modeler" name "OID" value FALSE))) (object Attribute tool "Data Modeler" name "default__Association" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "IsRelationship" value FALSE) (object Attribute tool "Data Modeler" name "SourceId" value "") (object Attribute tool "Data Modeler" name "SourceType" value "") (object Attribute tool "Data Modeler" name "RIMethod" value "") (object Attribute tool "Data Modeler" name "ParentUpdateRule" value "") (object Attribute tool "Data Modeler" name "ParentUpdateRuleName" value "") (object Attribute tool "Data Modeler" name "ParentDeleteRule" value "") (object Attribute tool "Data Modeler" name "ParentDeleteRuleName" value "") (object Attribute tool "Data Modeler" name "ChildInsertRestrict" value FALSE) (object Attribute tool "Data Modeler" name "ChildInsertRestrictName" value "") (object Attribute tool "Data Modeler" name "ChildMultiplicity" value FALSE) (object Attribute tool "Data Modeler" name "ChildMultiplicityName" value ""))) (object Attribute tool "Data Modeler" name "default__Role" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "ConstraintName" value ""))) (object Attribute tool "Data Modeler" name "default__Operation" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "IsConstraint" value FALSE) (object Attribute tool "Data Modeler" name "ConstraintType" value "") (object Attribute tool "Data Modeler" name "IsIndex" value FALSE) (object Attribute tool "Data Modeler" name "IsTrigger" value FALSE) (object Attribute tool "Data Modeler" name "IsStoredProcedure" value FALSE) (object Attribute tool "Data Modeler" name "IsCluster" value FALSE) (object Attribute tool "Data Modeler" name "TableSpace" value "") (object Attribute tool "Data Modeler" name "FillFactor" value 0) (object Attribute tool "Data Modeler" name "KeyList" value "") (object Attribute tool "Data Modeler" name "CheckPredicate" value "") (object Attribute tool "Data Modeler" name "IsUnique" value FALSE) (object Attribute tool "Data Modeler" name "DeferalMode" value "") (object Attribute tool "Data Modeler" name "InitialCheckTime" value "") (object Attribute tool "Data Modeler" name "TriggerType" value "") (object Attribute tool "Data Modeler" name "IsInsertEvent" value FALSE) (object Attribute tool "Data Modeler" name "IsUpdateEvent" value FALSE) (object Attribute tool "Data Modeler" name "IsDeleteEvent" value FALSE) (object Attribute tool "Data Modeler" name "RefOldTable" value "") (object Attribute tool "Data Modeler" name "RefNewTable" value "") (object Attribute tool "Data Modeler" name "RefOldRow" value "") (object Attribute tool "Data Modeler" name "RefNewRow" value "") (object Attribute tool "Data Modeler" name "IsRow" value FALSE) (object Attribute tool "Data Modeler" name "WhenClause" value "") (object Attribute tool "Data Modeler" name "Language" value "SQL") (object Attribute tool "Data Modeler" name "ProcType" value "Procedure") (object Attribute tool "Data Modeler" name "IsDeterministic" value FALSE) (object Attribute tool "Data Modeler" name "ParameterStyle" value "") (object Attribute tool "Data Modeler" name "ReturnedNull" value FALSE) (object Attribute tool "Data Modeler" name "ExternalName" value "") (object Attribute tool "Data Modeler" name "ReturnTypeName" value "") (object Attribute tool "Data Modeler" name "Length" value "") (object Attribute tool "Data Modeler" name "Scale" value "") (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "DefaultValue" value "") (object Attribute tool "Data Modeler" name "DefaultValueType" value ""))) (object Attribute tool "Data Modeler" name "default__Parameter" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "IsInParameter" value TRUE) (object Attribute tool "Data Modeler" name "IsOutParameter" value FALSE) (object Attribute tool "Data Modeler" name "Ordinal" value "") (object Attribute tool "Data Modeler" name "DataTypeName" value "") (object Attribute tool "Data Modeler" name "Length" value "") (object Attribute tool "Data Modeler" name "Scale" value "") (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "DefaultValueType" value "") (object Attribute tool "Data Modeler" name "DefaultValue" value "") (object Attribute tool "Data Modeler" name "OperationID" value ""))) (object Attribute tool "Data Modeler" name "HiddenTool" value FALSE) (object Attribute tool "Data Modeler Communicator" name "HiddenTool" value FALSE) (object Attribute tool "framework" name "HiddenTool" value FALSE) (object Attribute tool "Java" name "propertyId" value "809135966") (object Attribute tool "Java" name "default__Project" value (list Attribute_Set (object Attribute tool "Java" name "RootDir" value "") (object Attribute tool "Java" name "CreateMissingDirectories" value TRUE) (object Attribute tool "Java" name "StopOnError" value FALSE) (object Attribute tool "Java" name "UsePrefixes" value FALSE) (object Attribute tool "Java" name "AutoSync" value FALSE) (object Attribute tool "Java" name "ShowCodegenDlg" value FALSE) (object Attribute tool "Java" name "JavadocDefaultAuthor" value "") (object Attribute tool "Java" name "JavadocDefaultVersion" value "") (object Attribute tool "Java" name "JavadocDefaultSince" value "") (object Attribute tool "Java" name "JavadocNumAsterisks" value 0) (object Attribute tool "Java" name "MaxNumChars" value 80) (object Attribute tool "Java" name "Editor" value ("EditorType" 100)) (object Attribute tool "Java" name "VM" value ("VMType" 200)) (object Attribute tool "Java" name "ClassPath" value "") (object Attribute tool "Java" name "EditorType" value (list Attribute_Set (object Attribute tool "Java" name "BuiltIn" value 100))) (object Attribute tool "Java" name "VMType" value (list Attribute_Set (object Attribute tool "Java" name "Sun" value 200))) (object Attribute tool "Java" name "InstanceVariablePrefix" value "") (object Attribute tool "Java" name "ClassVariablePrefix" value "") (object Attribute tool "Java" name "DefaultAttributeDataType" value "int") (object Attribute tool "Java" name "DefaultOperationReturnType" value "void") (object Attribute tool "Java" name "NoClassCustomDlg" value FALSE) (object Attribute tool "Java" name "GlobalImports" value (value Text "")) (object Attribute tool "Java" name "OpenBraceClassStyle" value TRUE) (object Attribute tool "Java" name "OpenBraceMethodStyle" value TRUE) (object Attribute tool "Java" name "UseTabs" value FALSE) (object Attribute tool "Java" name "UseSpaces" value TRUE) (object Attribute tool "Java" name "SpacingItems" value 3) (object Attribute tool "Java" name "RoseDefaultCommentStyle" value TRUE) (object Attribute tool "Java" name "AsteriskCommentStyle" value TRUE) (object Attribute tool "Java" name "JavaCommentStyle" value TRUE) (object Attribute tool "Java" name "JavadocAuthor" value FALSE) (object Attribute tool "Java" name "JavadocSince" value FALSE) (object Attribute tool "Java" name "JavadocVersion" value FALSE) (object Attribute tool "Java" name "FundamentalType" value "boolean; char; byte; short; int; long; float; double; Boolean; Byte; Character; Double; Float; Integer; Long; Object; Short; String; StringBuffer; Void; java.math.BigDecimal; java.math.BigInteger; java.sql.Date; java.sql.Time; java.sql.Timestamp; java.util.AbstractCollection; java.util.AbstractList;java.util.AbstractMap; java.util.AbstractSequentialList; java.util.AbstractSet; java.util.ArrayList; java.util.Arrays; java.util.BitSet; java.util.Calendar; java.util.Collections; java.util.Date; java.util.Date; java.util.Dictionary; java.util.EventObject; java.util.GregorianCalendar; java.util.HashMap; java.util.HashSet; java.util.Hashtable; java.util.LinkedList; java.util.ListResourceBundle; java.util.Locale; java.util.Observable; java.util.Properties; java.util.PropertyPermission; java.util.PropertyResourceBundle; java.util.Random; java.util.ResourceBundle; java.util.SimpleTimeZone; java.util.Stack; java.util.StringTokenizer; java.util.Timer; java.util.TimerTask; java.util.TimeZone; java.util.TreeMap; java.util.TreeSet; java.util.Vector; java.util.WeakHashMap") (object Attribute tool "Java" name "NotShowRoseIDDlg" value FALSE) (object Attribute tool "Java" name "GenerateRoseID" value TRUE) (object Attribute tool "Java" name "GenerateDefaultJ2EEJavadoc" value TRUE) (object Attribute tool "Java" name "GenerateDefaultReturnLine" value TRUE) (object Attribute tool "Java" name "UserDefineJavaDocTags" value "") (object Attribute tool "Java" name "ReferenceClasspath" value "") (object Attribute tool "Java" name "VAJavaWorkingFolder" value "") (object Attribute tool "Java" name "BeanPrefix" value "") (object Attribute tool "Java" name "BeanSuffix" value "") (object Attribute tool "Java" name "RemotePrefix" value "") (object Attribute tool "Java" name "RemoteSuffix" value "") (object Attribute tool "Java" name "HomePrefix" value "") (object Attribute tool "Java" name "HomeSuffix" value "") (object Attribute tool "Java" name "LocalPrefix" value "") (object Attribute tool "Java" name "LocalSuffix" value "") (object Attribute tool "Java" name "LocalHomePrefix" value "") (object Attribute tool "Java" name "LocalHomeSuffix" value "") (object Attribute tool "Java" name "PrimaryKeyPrefix" value "") (object Attribute tool "Java" name "PrimaryKeySuffix" value "") (object Attribute tool "Java" name "EJBDTDLocation" value "") (object Attribute tool "Java" name "ServletDTDLocation" value "") (object Attribute tool "Java" name "DefaultEJBVersion" value "") (object Attribute tool "Java" name "DefaultServletVersion" value "") (object Attribute tool "Java" name "SourceControl" value FALSE) (object Attribute tool "Java" name "SCCSelected" value FALSE) (object Attribute tool "Java" name "SCCProjectSourceRoot" value "") (object Attribute tool "Java" name "SCCProjectName" value "") (object Attribute tool "Java" name "SCCComment" value FALSE))) (object Attribute tool "Java" name "default__Class" value (list Attribute_Set (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Static" value FALSE) (object Attribute tool "Java" name "GenerateDefaultConstructor" value TRUE) (object Attribute tool "Java" name "ConstructorIs" value ("Ctor_Set" 62)) (object Attribute tool "Java" name "Ctor_Set" value (list Attribute_Set (object Attribute tool "Java" name "public" value 62) (object Attribute tool "Java" name "protected" value 63) (object Attribute tool "Java" name "private" value 64) (object Attribute tool "Java" name "package" value 65))) (object Attribute tool "Java" name "GenerateFinalizer" value FALSE) (object Attribute tool "Java" name "GenerateStaticInitializer" value FALSE) (object Attribute tool "Java" name "GenerateInstanceInitializer" value FALSE) (object Attribute tool "Java" name "GenerateCode" value TRUE) (object Attribute tool "Java" name "DisableAutoSync" value FALSE) (object Attribute tool "Java" name "ReadOnly" value FALSE) (object Attribute tool "Java" name "Strictfp" value FALSE) (object Attribute tool "Java" name "ServletName" value "") (object Attribute tool "Java" name "ServletContextRef" value FALSE) (object Attribute tool "Java" name "IsSingleThread" value FALSE) (object Attribute tool "Java" name "ServletInitParameter" value "") (object Attribute tool "Java" name "ServletInitParameterNames" value FALSE) (object Attribute tool "Java" name "ServletIsSecure" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcher" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcherPath" value "") (object Attribute tool "Java" name "DispatcherInclude" value FALSE) (object Attribute tool "Java" name "DispatcherForward" value FALSE) (object Attribute tool "Java" name "ServletSecurityRoles" value "") (object Attribute tool "Java" name "ServletgetInfo" value "") (object Attribute tool "Java" name "ServletXMLFilePath" value "") (object Attribute tool "Java" name "Generate_XML_DD" value TRUE) (object Attribute tool "Java" name "EJBCmpField" value "") (object Attribute tool "Java" name "EJBEnvironmentProperties" value "") (object Attribute tool "Java" name "EJBCnxFactory" value "") (object Attribute tool "Java" name "EJBReferences" value "") (object Attribute tool "Java" name "EJBSecurityRoles" value "") (object Attribute tool "Java" name "EJBNameInJAR" value "") (object Attribute tool "Java" name "EJBSessionType" value ("EJBSessionType_Set" 200)) (object Attribute tool "Java" name "EJBSessionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 200) (object Attribute tool "Java" name "Stateless" value 201) (object Attribute tool "Java" name "Stateful" value 202))) (object Attribute tool "Java" name "EJBTransactionType" value ("EJBTransactionType_Set" 211)) (object Attribute tool "Java" name "EJBTransactionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "Container" value 211) (object Attribute tool "Java" name "Bean" value 212))) (object Attribute tool "Java" name "EJBPersistenceType" value ("EJBPersistenceType_Set" 220)) (object Attribute tool "Java" name "EJBPersistenceType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 220) (object Attribute tool "Java" name "Bean" value 221) (object Attribute tool "Java" name "Container" value 222))) (object Attribute tool "Java" name "EJBReentrant" value FALSE) (object Attribute tool "Java" name "EJBSessionSync" value FALSE) (object Attribute tool "Java" name "EJBVersion" value ("EJBVersion_Set" 230)) (object Attribute tool "Java" name "EJBVersion_Set" value (list Attribute_Set (object Attribute tool "Java" name "2.0" value 230) (object Attribute tool "Java" name "1.x" value 231))) (object Attribute tool "Java" name "EJBXMLFilePath" value ""))) (object Attribute tool "Java" name "Default_Servlet__Class" value (list Attribute_Set (object Attribute tool "Java" name "ServletName" value "") (object Attribute tool "Java" name "ServletContextRef" value FALSE) (object Attribute tool "Java" name "IsSingleThread" value FALSE) (object Attribute tool "Java" name "ServletInitParameter" value "") (object Attribute tool "Java" name "ServletInitParameterNames" value FALSE) (object Attribute tool "Java" name "ServletIsSecure" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcher" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcherPath" value "") (object Attribute tool "Java" name "DispatcherInclude" value FALSE) (object Attribute tool "Java" name "DispatcherForward" value FALSE) (object Attribute tool "Java" name "ServletSecurityRoles" value "") (object Attribute tool "Java" name "ServletgetInfo" value "") (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Static" value FALSE) (object Attribute tool "Java" name "GenerateDefaultConstructor" value TRUE) (object Attribute tool "Java" name "ConstructorIs" value ("Ctor_Set" 62)) (object Attribute tool "Java" name "Ctor_Set" value (list Attribute_Set (object Attribute tool "Java" name "public" value 62) (object Attribute tool "Java" name "protected" value 63) (object Attribute tool "Java" name "private" value 64) (object Attribute tool "Java" name "package" value 65))) (object Attribute tool "Java" name "GenerateFinalizer" value FALSE) (object Attribute tool "Java" name "GenerateStaticInitializer" value FALSE) (object Attribute tool "Java" name "GenerateInstanceInitializer" value FALSE) (object Attribute tool "Java" name "GenerateCode" value TRUE) (object Attribute tool "Java" name "DisableAutoSync" value FALSE) (object Attribute tool "Java" name "ReadOnly" value FALSE) (object Attribute tool "Java" name "Strictfp" value FALSE) (object Attribute tool "Java" name "ServletXMLFilePath" value "") (object Attribute tool "Java" name "Generate_XML_DD" value TRUE) (object Attribute tool "Java" name "EJBCmpField" value "") (object Attribute tool "Java" name "EJBEnvironmentProperties" value "") (object Attribute tool "Java" name "EJBCnxFactory" value "") (object Attribute tool "Java" name "EJBReferences" value "") (object Attribute tool "Java" name "EJBSecurityRoles" value "") (object Attribute tool "Java" name "EJBNameInJAR" value "") (object Attribute tool "Java" name "EJBSessionType" value ("EJBSessionType_Set" 200)) (object Attribute tool "Java" name "EJBSessionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 200) (object Attribute tool "Java" name "Stateless" value 201) (object Attribute tool "Java" name "Stateful" value 202))) (object Attribute tool "Java" name "EJBTransactionType" value ("EJBTransactionType_Set" 211)) (object Attribute tool "Java" name "EJBTransactionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "Container" value 211) (object Attribute tool "Java" name "Bean" value 212))) (object Attribute tool "Java" name "EJBPersistenceType" value ("EJBPersistenceType_Set" 220)) (object Attribute tool "Java" name "EJBPersistenceType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 220) (object Attribute tool "Java" name "Bean" value 221) (object Attribute tool "Java" name "Container" value 222))) (object Attribute tool "Java" name "EJBReentrant" value FALSE) (object Attribute tool "Java" name "EJBSessionSync" value FALSE) (object Attribute tool "Java" name "EJBVersion" value ("EJBVersion_Set" 230)) (object Attribute tool "Java" name "EJBVersion_Set" value (list Attribute_Set (object Attribute tool "Java" name "2.0" value 230) (object Attribute tool "Java" name "1.x" value 231))) (object Attribute tool "Java" name "EJBXMLFilePath" value ""))) (object Attribute tool "Java" name "Http_Servlet__Class" value (list Attribute_Set (object Attribute tool "Java" name "ServletRequestAttribute" value "") (object Attribute tool "Java" name "ServletRequestAttributesNames" value FALSE) (object Attribute tool "Java" name "MethodForRequestAttributes" value "") (object Attribute tool "Java" name "ServletRequestParameter" value "") (object Attribute tool "Java" name "ServletRequestParameterNames" value FALSE) (object Attribute tool "Java" name "MethodForRequestParameters" value "") (object Attribute tool "Java" name "ServletHeader" value "") (object Attribute tool "Java" name "ServletHeaderNames" value FALSE) (object Attribute tool "Java" name "MethodForHeaders" value "") (object Attribute tool "Java" name "ServletIntHeader" value FALSE) (object Attribute tool "Java" name "ServletDateHeader" value FALSE) (object Attribute tool "Java" name "ServletCookie" value FALSE) (object Attribute tool "Java" name "MethodForCookie" value "") (object Attribute tool "Java" name "ServletContentType" value "") (object Attribute tool "Java" name "GenerateHTML" value FALSE) (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Static" value FALSE) (object Attribute tool "Java" name "GenerateDefaultConstructor" value TRUE) (object Attribute tool "Java" name "ConstructorIs" value ("Ctor_Set" 62)) (object Attribute tool "Java" name "Ctor_Set" value (list Attribute_Set (object Attribute tool "Java" name "public" value 62) (object Attribute tool "Java" name "protected" value 63) (object Attribute tool "Java" name "private" value 64) (object Attribute tool "Java" name "package" value 65))) (object Attribute tool "Java" name "GenerateFinalizer" value FALSE) (object Attribute tool "Java" name "GenerateStaticInitializer" value FALSE) (object Attribute tool "Java" name "GenerateInstanceInitializer" value FALSE) (object Attribute tool "Java" name "GenerateCode" value TRUE) (object Attribute tool "Java" name "DisableAutoSync" value FALSE) (object Attribute tool "Java" name "ReadOnly" value FALSE) (object Attribute tool "Java" name "Strictfp" value FALSE) (object Attribute tool "Java" name "ServletName" value "") (object Attribute tool "Java" name "ServletContextRef" value FALSE) (object Attribute tool "Java" name "IsSingleThread" value FALSE) (object Attribute tool "Java" name "ServletInitParameter" value "") (object Attribute tool "Java" name "ServletInitParameterNames" value FALSE) (object Attribute tool "Java" name "ServletIsSecure" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcher" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcherPath" value "") (object Attribute tool "Java" name "DispatcherInclude" value FALSE) (object Attribute tool "Java" name "DispatcherForward" value FALSE) (object Attribute tool "Java" name "ServletSecurityRoles" value "") (object Attribute tool "Java" name "ServletgetInfo" value "") (object Attribute tool "Java" name "ServletXMLFilePath" value "") (object Attribute tool "Java" name "Generate_XML_DD" value TRUE) (object Attribute tool "Java" name "EJBCmpField" value "") (object Attribute tool "Java" name "EJBEnvironmentProperties" value "") (object Attribute tool "Java" name "EJBCnxFactory" value "") (object Attribute tool "Java" name "EJBReferences" value "") (object Attribute tool "Java" name "EJBSecurityRoles" value "") (object Attribute tool "Java" name "EJBNameInJAR" value "") (object Attribute tool "Java" name "EJBSessionType" value ("EJBSessionType_Set" 200)) (object Attribute tool "Java" name "EJBSessionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 200) (object Attribute tool "Java" name "Stateless" value 201) (object Attribute tool "Java" name "Stateful" value 202))) (object Attribute tool "Java" name "EJBTransactionType" value ("EJBTransactionType_Set" 211)) (object Attribute tool "Java" name "EJBTransactionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "Container" value 211) (object Attribute tool "Java" name "Bean" value 212))) (object Attribute tool "Java" name "EJBPersistenceType" value ("EJBPersistenceType_Set" 220)) (object Attribute tool "Java" name "EJBPersistenceType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 220) (object Attribute tool "Java" name "Bean" value 221) (object Attribute tool "Java" name "Container" value 222))) (object Attribute tool "Java" name "EJBReentrant" value FALSE) (object Attribute tool "Java" name "EJBSessionSync" value FALSE) (object Attribute tool "Java" name "EJBVersion" value ("EJBVersion_Set" 230)) (object Attribute tool "Java" name "EJBVersion_Set" value (list Attribute_Set (object Attribute tool "Java" name "2.0" value 230) (object Attribute tool "Java" name "1.x" value 231))) (object Attribute tool "Java" name "EJBXMLFilePath" value ""))) (object Attribute tool "Java" name "Default_EJB__Class" value (list Attribute_Set (object Attribute tool "Java" name "Generate_XML_DD" value TRUE) (object Attribute tool "Java" name "EJBCmpField" value "") (object Attribute tool "Java" name "EJBEnvironmentProperties" value "") (object Attribute tool "Java" name "EJBCnxFactory" value "") (object Attribute tool "Java" name "EJBReferences" value "") (object Attribute tool "Java" name "EJBSecurityRoles" value "") (object Attribute tool "Java" name "EJBNameInJAR" value "") (object Attribute tool "Java" name "EJBSessionType" value ("EJBSessionType_Set" 200)) (object Attribute tool "Java" name "EJBSessionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 200) (object Attribute tool "Java" name "Stateless" value 201) (object Attribute tool "Java" name "Stateful" value 202))) (object Attribute tool "Java" name "EJBTransactionType" value ("EJBTransactionType_Set" 211)) (object Attribute tool "Java" name "EJBTransactionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "Container" value 211) (object Attribute tool "Java" name "Bean" value 212))) (object Attribute tool "Java" name "EJBPersistenceType" value ("EJBPersistenceType_Set" 220)) (object Attribute tool "Java" name "EJBPersistenceType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 220) (object Attribute tool "Java" name "Bean" value 221) (object Attribute tool "Java" name "Container" value 222))) (object Attribute tool "Java" name "EJBReentrant" value FALSE) (object Attribute tool "Java" name "BMP_Extend_CMP" value FALSE) (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Static" value FALSE) (object Attribute tool "Java" name "GenerateDefaultConstructor" value TRUE) (object Attribute tool "Java" name "ConstructorIs" value ("Ctor_Set" 62)) (object Attribute tool "Java" name "Ctor_Set" value (list Attribute_Set (object Attribute tool "Java" name "public" value 62) (object Attribute tool "Java" name "protected" value 63) (object Attribute tool "Java" name "private" value 64) (object Attribute tool "Java" name "package" value 65))) (object Attribute tool "Java" name "GenerateFinalizer" value FALSE) (object Attribute tool "Java" name "GenerateStaticInitializer" value FALSE) (object Attribute tool "Java" name "GenerateInstanceInitializer" value FALSE) (object Attribute tool "Java" name "GenerateCode" value TRUE) (object Attribute tool "Java" name "DisableAutoSync" value FALSE) (object Attribute tool "Java" name "ReadOnly" value FALSE) (object Attribute tool "Java" name "Strictfp" value FALSE) (object Attribute tool "Java" name "ServletName" value "") (object Attribute tool "Java" name "ServletContextRef" value FALSE) (object Attribute tool "Java" name "IsSingleThread" value FALSE) (object Attribute tool "Java" name "ServletInitParameter" value "") (object Attribute tool "Java" name "ServletInitParameterNames" value FALSE) (object Attribute tool "Java" name "ServletIsSecure" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcher" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcherPath" value "") (object Attribute tool "Java" name "DispatcherInclude" value FALSE) (object Attribute tool "Java" name "DispatcherForward" value FALSE) (object Attribute tool "Java" name "ServletSecurityRoles" value "") (object Attribute tool "Java" name "ServletgetInfo" value "") (object Attribute tool "Java" name "ServletXMLFilePath" value "") (object Attribute tool "Java" name "EJBSessionSync" value FALSE) (object Attribute tool "Java" name "EJBVersion" value ("EJBVersion_Set" 230)) (object Attribute tool "Java" name "EJBVersion_Set" value (list Attribute_Set (object Attribute tool "Java" name "2.0" value 230) (object Attribute tool "Java" name "1.x" value 231))) (object Attribute tool "Java" name "EJBXMLFilePath" value ""))) (object Attribute tool "Java" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Java" name "CmIdentification" value (value Text "")) (object Attribute tool "Java" name "CopyrightNotice" value (value Text "")))) (object Attribute tool "Java" name "default__Module-Body" value (list Attribute_Set (object Attribute tool "Java" name "CmIdentification" value (value Text "")) (object Attribute tool "Java" name "CopyrightNotice" value (value Text "")))) (object Attribute tool "Java" name "default__Operation" value (list Attribute_Set (object Attribute tool "Java" name "Abstract" value FALSE) (object Attribute tool "Java" name "Static" value FALSE) (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Native" value FALSE) (object Attribute tool "Java" name "Synchronized" value FALSE) (object Attribute tool "Java" name "GenerateFullyQualifiedReturn" value FALSE) (object Attribute tool "Java" name "ReplaceExistingCode" value TRUE) (object Attribute tool "Java" name "Strictfp" value FALSE))) (object Attribute tool "Java" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Transient" value FALSE) (object Attribute tool "Java" name "Volatile" value FALSE) (object Attribute tool "Java" name "PropertyType" value ("BeanProperty_Set" 71)) (object Attribute tool "Java" name "BeanProperty_Set" value (list Attribute_Set (object Attribute tool "Java" name "Not A Property" value 71) (object Attribute tool "Java" name "Simple" value 72) (object Attribute tool "Java" name "Bound" value 73) (object Attribute tool "Java" name "Constrained" value 74))) (object Attribute tool "Java" name "IndividualChangeMgt" value FALSE) (object Attribute tool "Java" name "Read/Write" value ("Read/Write_Set" 81)) (object Attribute tool "Java" name "Read/Write_Set" value (list Attribute_Set (object Attribute tool "Java" name "Read & Write" value 81) (object Attribute tool "Java" name "Read Only" value 82) (object Attribute tool "Java" name "Write Only" value 83))) (object Attribute tool "Java" name "GenerateFullyQualifiedTypes" value FALSE))) (object Attribute tool "Java" name "default__Role" value (list Attribute_Set (object Attribute tool "Java" name "ContainerClass" value "") (object Attribute tool "Java" name "InitialValue" value "") (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Transient" value FALSE) (object Attribute tool "Java" name "Volatile" value FALSE) (object Attribute tool "Java" name "PropertyType" value ("BeanProperty_Set" 71)) (object Attribute tool "Java" name "BeanProperty_Set" value (list Attribute_Set (object Attribute tool "Java" name "Not A Property" value 71) (object Attribute tool "Java" name "Simple" value 72) (object Attribute tool "Java" name "Bound" value 73) (object Attribute tool "Java" name "Constrained" value 74))) (object Attribute tool "Java" name "IndividualChangeMgt" value FALSE) (object Attribute tool "Java" name "Read/Write" value ("Read/Write_Set" 81)) (object Attribute tool "Java" name "Read/Write_Set" value (list Attribute_Set (object Attribute tool "Java" name "Read & Write" value 81) (object Attribute tool "Java" name "Read Only" value 82) (object Attribute tool "Java" name "Write Only" value 83))) (object Attribute tool "Java" name "GenerateFullyQualifiedTypes" value FALSE) (object Attribute tool "Java" name "IsNavigable" value TRUE))) (object Attribute tool "Java" name "HiddenTool" value FALSE) (object Attribute tool "R2Editor" name "HiddenTool" value FALSE) (object Attribute tool "Rose Web Publisher" name "HiddenTool" value FALSE) (object Attribute tool "COM" name "propertyId" value "783606378") (object Attribute tool "COM" name "default__Class" value (list Attribute_Set (object Attribute tool "COM" name "TypeKinds" value (list Attribute_Set (object Attribute tool "COM" name "enum" value 100) (object Attribute tool "COM" name "record" value 101) (object Attribute tool "COM" name "module" value 102) (object Attribute tool "COM" name "interface" value 103) (object Attribute tool "COM" name "dispinterface" value 104) (object Attribute tool "COM" name "coclass" value 105) (object Attribute tool "COM" name "alias" value 106) (object Attribute tool "COM" name "union" value 107) (object Attribute tool "COM" name "max" value 108) (object Attribute tool "COM" name "(none)" value 109))) (object Attribute tool "COM" name "Generate" value TRUE) (object Attribute tool "COM" name "kind" value ("TypeKinds" 109)) (object Attribute tool "COM" name "uuid" value "") (object Attribute tool "COM" name "version" value "") (object Attribute tool "COM" name "helpstring" value "") (object Attribute tool "COM" name "helpcontext" value "") (object Attribute tool "COM" name "attributes" value "") (object Attribute tool "COM" name "dllname" value "") (object Attribute tool "COM" name "alias" value ""))) (object Attribute tool "COM" name "default__Operation" value (list Attribute_Set (object Attribute tool "COM" name "Generate" value TRUE) (object Attribute tool "COM" name "id" value "") (object Attribute tool "COM" name "helpstring" value "") (object Attribute tool "COM" name "attributes" value ""))) (object Attribute tool "COM" name "default__Attribute" value (list Attribute_Set (object Attribute tool "COM" name "Generate" value TRUE) (object Attribute tool "COM" name "id" value "") (object Attribute tool "COM" name "helpstring" value "") (object Attribute tool "COM" name "attributes" value ""))) (object Attribute tool "COM" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "COM" name "Generate" value TRUE) (object Attribute tool "COM" name "filename" value "") (object Attribute tool "COM" name "library" value "") (object Attribute tool "COM" name "uuid" value "") (object Attribute tool "COM" name "version" value "") (object Attribute tool "COM" name "helpstring" value "") (object Attribute tool "COM" name "helpfile" value "") (object Attribute tool "COM" name "helpcontext" value "") (object Attribute tool "COM" name "lcid" value "") (object Attribute tool "COM" name "attributes" value ""))) (object Attribute tool "COM" name "default__Param" value (list Attribute_Set (object Attribute tool "COM" name "attributes" value ""))) (object Attribute tool "COM" name "HiddenTool" value FALSE) (object Attribute tool "VC++" name "propertyId" value "809135966") (object Attribute tool "VC++" name "default__Project" value (list Attribute_Set (object Attribute tool "VC++" name "UpdateATL" value TRUE) (object Attribute tool "VC++" name "SmartPointersOnAssoc" value TRUE) (object Attribute tool "VC++" name "GenerateImports" value TRUE) (object Attribute tool "VC++" name "PutImportsIn" value "stdafx.h") (object Attribute tool "VC++" name "FullPathInImports" value TRUE) (object Attribute tool "VC++" name "UseImportAttributes" value TRUE) (object Attribute tool "VC++" name "ImportAttributes" value "no_namespace named_guids") (object Attribute tool "VC++" name "ImportProjTypeLib" value TRUE) (object Attribute tool "VC++" name "DefaultTypeLib" value TRUE) (object Attribute tool "VC++" name "TypeLibLocation" value "") (object Attribute tool "VC++" name "CompileProjTypeLib" value TRUE) (object Attribute tool "VC++" name "IdlInterfaceAttributes" value (value Text |endpoint("") |local |object |pointer_default() |uuid("") |version("") |encode |decode |auto_handle |implicit_handle("") |code |nocode )) (object Attribute tool "VC++" name "IdlCoClassAttributes" value (value Text |uuid("") |helpstring("") |helpcontext("") |licensed |version("") |control |hidden |appobject )) (object Attribute tool "VC++" name "IdlCoClassInterfaceAttributes" value (value Text |default |source )) (object Attribute tool "VC++" name "IdlParameterAttributes" value (value Text |in |out |retval )) (object Attribute tool "VC++" name "IdlMethodAttributes" value (value Text |id(1) |helpstring("") |call_as("") |callback |helpcontext("") |hidden |local |restricted |source |vararg )) (object Attribute tool "VC++" name "IdlPropertyAttributes" value (value Text |id() |helpstring("") |call_as("") |helpcontext("") |hidden |local |restricted |source |vararg |bindable |defaultbind |defaultcallelem |displaybind |immediatebind |nonbrowseable |requestedit )) (object Attribute tool "VC++" name "RvcPtyVersion" value "1.3") (object Attribute tool "VC++" name "ModelIDStyle" value 2) (object Attribute tool "VC++" name "DocStyle" value 1) (object Attribute tool "VC++" name "GenerateIncludes" value TRUE) (object Attribute tool "VC++" name "ApplyPattern" value FALSE) (object Attribute tool "VC++" name "CreateBackupFiles" value TRUE) (object Attribute tool "VC++" name "SupportCodeName" value FALSE) (object Attribute tool "VC++" name "DocRevEngineer" value TRUE) (object Attribute tool "VC++" name "CreateOverviewDiagrams" value TRUE) (object Attribute tool "VC++" name "UpdateModelIDsInCode" value TRUE) (object Attribute tool "VC++" name "AttributeTypes" value (value Text |attr1=bool |attr2=short |attr3=int |attr4=long |attr5=char |attr6=float |attr7=double |attr8=void |attr9=clock_t |attr10=_complex |attr11=_dev_t |attr12=div_t |attr13=_exception |attr14=FILE |attr15=_finddata_t |attr16=_FPIEEE_RECORD |attr17=fpos_t |attr18=_HEAPINFO |attr19=jmp_buf |attr20=lconv |attr21=ldiv_t |attr22=_off_t |attr23=_onexit_t |attr24=_PNH |attr25=ptrdiff_t |attr26=sig_atomic_t |attr27=size_t |attr28=_stat |attr29=time_t |attr30=_timeb |attr31=tm |attr32=_utimbuf |attr33=va_list |attr34=wchar_t |attr35=wctrans_t |attr36=wctype_t |attr37=_wfinddata_t |attr38=_wfinddatai64_t |attr39=wint_t |attr40=ABORTPROC |attr41=ACMDRIVERENUMCB |attr42=ACMDRIVERPROC |attr43=ACMFILTERCHOOSEHOOKPROC |attr44=ACMFILTERENUMCB |attr45=ACMFILTERTAGENUMCB |attr46=ACMFORMATCHOOSEHOOKPROC |attr47=ACMFORMATENUMCB |attr48=ACMFORMATTAGENUMCB |attr49=APPLET_PROC |attr50=ATOM |attr51=BOOL |attr52=BOOLEAN |attr53=BYTE |attr54=CALINFO_ENUMPROC |attr55=CALLBACK |attr56=CHAR |attr57=COLORREF |attr58=CONST |attr59=CRITICAL_SECTION |attr60=CTRYID |attr61=DATEFMT_ENUMPROC |attr62=DESKTOPENUMPROC |attr63=DLGPROC |attr64=DRAWSTATEPROC |attr65=DWORD |attr66=EDITWORDBREAKPROC |attr67=ENHMFENUMPROC |attr68=ENUMRESLANGPROC |attr69=ENUMRESNAMEPROC |attr70=ENUMRESTYPEPROC |attr71=FARPROC |attr72=FILE_SEGMENT_ELEMENT |attr73=FLOAT |attr74=FONTENUMPROC |attr75=GOBJENUMPROC |attr76=GRAYSTRINGPROC |attr77=HACCEL |attr78=HANDLE |attr79=HBITMAP |attr80=HBRUSH |attr81=HCOLORSPACE |attr82=HCONV |attr83=HCONVLIST |attr84=HCURSOR |attr85=HDC |attr86=HDDEDATA |attr87=HDESK |attr88=HDROP |attr89=HDWP |attr90=HENHMETAFILE |attr91=HFILE |attr92=HFONT |attr93=HGDIOBJ |attr94=HGLOBAL |attr95=HHOOK |attr96=HICON |attr97=HIMAGELIST |attr98=HIMC |attr99=HINSTANCE |attr100=HKEY |attr101=HKL |attr102=HLOCAL |attr103=HMENU |attr104=HMETAFILE |attr105=HMODULE |attr106=HMONITOR |attr107=HOOKPROC |attr108=HPALETTE |attr109=HPEN |attr110=HRGN |attr111=HRSRC |attr112=HSZ |attr113=HTREEITEM |attr114=HWINSTA |attr115=HWND |attr116=INT |attr117=IPADDR |attr118=LANGID |attr119=LCID |attr120=LCSCSTYPE |attr121=LCSGAMUTMATCH |attr122=LCTYPE |attr123=LINEDDAPROC |attr124=LOCALE_ENUMPROC |attr125=LONG |attr126=LONGLONG |attr127=LPARAM |attr128=LPBOOL |attr129=LPBYTE |attr130=LPCCHOOKPROC |attr131=LPCFHOOKPROC |attr132=LPCOLORREF |attr133=LPCRITICAL_SECTION |attr134=LPCSTR |attr135=LPCTSTR |attr136=LPCVOID |attr137=LPCWSTR |attr138=LPDWORD |attr139=LPFIBER_START_ROUTINE |attr140=LPFRHOOKPROC |attr141=LPHANDLE |attr142=LPHANDLER_FUNCTION |attr143=LPINT |attr144=LPLONG |attr145=LPOFNHOOKPROC |attr146=LPPAGEPAINTHOOK |attr147=LPPAGESETUPHOOK |attr148=LPPRINTHOOKPROC |attr149=LPPROGRESS_ROUTINE |attr150=LPSETUPHOOKPROC |attr151=LPSTR |attr152=LPSTREAM |attr153=LPTHREAD_START_ROUTINE |attr154=LPTSTR |attr155=LPVOID |attr156=LPWORD |attr157=LPWSTR |attr158=LRESULT |attr159=LUID |attr160=PBOOL |attr161=PBOOLEAN |attr162=PBYTE |attr163=PCHAR |attr164=PCRITICAL_SECTION |attr165=PCSTR |attr166=PCTSTR |attr167=PCWCH |attr168=PCWSTR |attr169=PDWORD |attr170=PFLOAT |attr171=PFNCALLBACK |attr172=PHANDLE |attr173=PHANDLER_ROUTINE |attr174=PHKEY |attr175=PINT |attr176=PLCID |attr177=PLONG |attr178=PLUID |attr179=PROPENUMPROC |attr180=PROPENUMPROCEX |attr181=PSHORT |attr182=PSTR |attr183=PTBYTE |attr184=PTCHAR |attr185=PTIMERAPCROUTINE |attr186=PTSTR |attr187=PUCHAR |attr188=PUINT |attr189=PULONG |attr190=PUSHORT |attr191=PVOID |attr192=PWCHAR |attr193=PWORD |attr194=PWSTR |attr195=REGISTERWORDENUMPROC |attr196=REGSAM |attr197=SC_HANDLE |attr198=SC_LOCK |attr199=SENDASYNCPROC |attr200=SERVICE_STATUS_HANDLE |attr201=SHORT |attr202=TBYTE |attr203=TCHAR |attr204=TIMEFMT_ENUMPROC |attr205=TIMERPROC |attr206=UCHAR |attr207=UINT |attr208=ULONG |attr209=ULONGLONG |attr210=UNSIGNED |attr211=USHORT |attr212=VOID |attr213=WCHAR |attr214=WINAPI |attr215=WINSTAENUMPROC |attr216=WNDENUMPROC |attr217=WNDPROC |attr218=WORD |attr219=WPARAM |attr220=YIELDPROC |attr221=CPoint |attr222=CRect |attr223=CSize |attr224=CString |attr225=CTime |attr226=CTimeSpan |attr227=CCreateContext |attr228=CMemoryState |attr229=COleSafeArray |attr230=CPrintInfo |attr231=HRESULT )) (object Attribute tool "VC++" name "Containers" value (value Text |cont1=CArray<$TYPE, $TYPE&> |cont2=CByteArray |cont3=CDWordArray |cont4=CObArray |cont5=CPtrArray |cont6=CStringArray |cont7=CUIntArray |cont8=CWordArray |cont9=CList<$TYPE, $TYPE&> |cont10=CPtrList |cont11=CObList |cont12=CStringList |cont13=CMapWordToPtr |cont14=CMapPtrToWord |cont15=CMapPtrToPtr |cont16=CMapWordToOb |cont17=CMapStringToPtr |cont18=CMapStringToOb |cont19=CMapStringToString |cont20=CTypedPtrArray |cont21=CTypedPtrArray |cont22=CTypedPtrList |cont23=CTypedPtrList |cont24=CComObject<$TYPE> |cont25=CComPtr<$TYPE> |cont26=CComQIPtr<$TYPE> |cont27=CComQIPtr<$TYPE, IID*> )) (object Attribute tool "VC++" name "ClassMethods" value (value Text |*_body=// ToDo: Add your specialized code here and/or call the base class |cm1=$NAME() |cm2=$NAME(orig:const $NAME&) |cm3=<> ~$NAME() |cm4=operator=(rhs:$NAME&):$NAME& |cm4_body=// ToDo: Add your specialized code here and/or call the base class||return rhs; |cm5=<> operator==(rhs:const $NAME&):bool |cm5_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm6=<> operator!=(rhs:$NAME&):bool |cm6_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm7=<> operator<(rhs:$NAME&):bool |cm7_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm8=<> operator>(rhs:$NAME&):bool |cm8_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm9=<> operator<=(rhs:$NAME&):bool |cm9_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm10=<> operator>=(rhs:$NAME&):bool |cm10_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm11=<> operator>>(i:istream&, rhs:$NAME&):istream& |cm11_body=// ToDo: Add your specialized code here and/or call the base class||return i; |cm12=<> operator<<(o:ostream&, rhs:const $NAME&):ostream& |cm12_body=// ToDo: Add your specialized code here and/or call the base class||return o; )) (object Attribute tool "VC++" name "Accessors" value (value Text |agf=<> get_$BASICNAME():const $TYPE |agf_body=return $NAME; |asf=set_$BASICNAME(value:$TYPE):void |asf_body=$NAME = value;|return; |agv=<> get_$BASICNAME():const $TYPE& |agv_body=return $NAME; |asv=set_$BASICNAME(value:$TYPE&):void |asv_body=$NAME = value;|return; |agp=<> get_$BASICNAME():const $TYPE |agp_body=return $NAME; |asp=set_$BASICNAME(value:$TYPE):void |asp_body=$NAME = value;|return; |agr=<> get_$BASICNAME():const $TYPE |agr_body=return $NAME; |asr=set_$BASICNAME(value:$TYPE):void |asr_body=$NAME = value;|return; |aga=<> get_$BASICNAME(index:int):const $TYPE |aga_body=return $NAME[index]; |asa=set_$BASICNAME(index:int, value:$TYPE):void |asa_body=$NAME[index] = value;|return; )) (object Attribute tool "VC++" name "Conditionals" value (value Text |*_decl=#ifdef _DEBUG |*_base=CObject |cond1=<> AssertValid():void |cond1_body=$SUPERNAME::AssertValid(); |cond2=<> Dump(dc:CDumpContext&):void |cond2_body=$SUPERNAME::Dump(dc); )) (object Attribute tool "VC++" name "Patterns" value (value Text |patrn1=cm1,cm3,cond1,cond2 |Patrn1_name=Default )) (object Attribute tool "VC++" name "AtlClassPrefix" value "C") (object Attribute tool "VC++" name "AtlInterfacePrefix" value "I") (object Attribute tool "VC++" name "AtlTypeDescription" value "Class"))) (object Attribute tool "VC++" name "default__Class" value (list Attribute_Set (object Attribute tool "VC++" name "Generate" value TRUE) (object Attribute tool "VC++" name "HeaderFileName" value "") (object Attribute tool "VC++" name "CodeFileName" value ""))) (object Attribute tool "VC++" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "VC++" name "InternalMap" value (value Text |*:AUTO:AUTO | )) (object Attribute tool "VC++" name "ExportMap" value (value Text |*:AUTO:AUTO | )) (object Attribute tool "VC++" name "InitialSourceIncludes" value (value Text |"stdafx.h" )) (object Attribute tool "VC++" name "InitialHeaderIncludes" value (value Text "")) (object Attribute tool "VC++" name "Copyright" value (value Text "Copyright (C) 1991 - 1999 Rational Software Corporation")) (object Attribute tool "VC++" name "KindSet" value (list Attribute_Set (object Attribute tool "VC++" name "(none)" value 300) (object Attribute tool "VC++" name "DLL" value 301) (object Attribute tool "VC++" name "EXE" value 302) (object Attribute tool "VC++" name "MIDL" value 303))) (object Attribute tool "VC++" name "Kind" value ("KindSet" 300)))) (object Attribute tool "VC++" name "default__Role" value (list Attribute_Set (object Attribute tool "VC++" name "Const" value FALSE) (object Attribute tool "VC++" name "Generate" value TRUE) (object Attribute tool "VC++" name "InitialValue" value ""))) (object Attribute tool "VC++" name "default__Uses" value (list Attribute_Set (object Attribute tool "VC++" name "Generate" value TRUE))) (object Attribute tool "VC++" name "default__Category" value (list Attribute_Set (object Attribute tool "VC++" name "IsDirectory" value FALSE) (object Attribute tool "VC++" name "Directory" value ""))) (object Attribute tool "VC++" name "default__Attribute" value (list Attribute_Set (object Attribute tool "VC++" name "Generate" value TRUE))) (object Attribute tool "VC++" name "default__Operation" value (list Attribute_Set (object Attribute tool "VC++" name "Generate" value TRUE) (object Attribute tool "VC++" name "Inline" value FALSE) (object Attribute tool "VC++" name "DefaultBody" value (value Text "")))) (object Attribute tool "VC++" name "HiddenTool" value FALSE) (object Attribute tool "VisualStudio" name "HiddenTool" value FALSE) (object Attribute tool "Web Modeler" name "HiddenTool" value FALSE) (object Attribute tool "XML_DTD" name "propertyId" value "809135966") (object Attribute tool "XML_DTD" name "default__Project" value (list Attribute_Set (object Attribute tool "XML_DTD" name "CreateMissingDirectories" value TRUE) (object Attribute tool "XML_DTD" name "Editor" value ("EditorType" 100)) (object Attribute tool "XML_DTD" name "StopOnError" value TRUE) (object Attribute tool "XML_DTD" name "EditorType" value (list Attribute_Set (object Attribute tool "XML_DTD" name "BuiltIn" value 100) (object Attribute tool "XML_DTD" name "WindowsShell" value 101))))) (object Attribute tool "XML_DTD" name "default__Class" value (list Attribute_Set (object Attribute tool "XML_DTD" name "Entity_SystemID" value "") (object Attribute tool "XML_DTD" name "Entity_PublicID" value "") (object Attribute tool "XML_DTD" name "NotationValue" value "") (object Attribute tool "XML_DTD" name "InternalValue" value "") (object Attribute tool "XML_DTD" name "ParameterEntity" value FALSE) (object Attribute tool "XML_DTD" name "ExternalEntity" value FALSE) (object Attribute tool "XML_DTD" name "Notation_SystemID" value "") (object Attribute tool "XML_DTD" name "Notation_PublicID" value ""))) (object Attribute tool "XML_DTD" name "default__Attribute" value (list Attribute_Set (object Attribute tool "XML_DTD" name "DefaultDeclType" value ""))) (object Attribute tool "XML_DTD" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "XML_DTD" name "Assign All" value FALSE) (object Attribute tool "XML_DTD" name "ComponentPath" value ""))) (object Attribute tool "XML_DTD" name "HiddenTool" value FALSE) (object Attribute tool "Cplusplus" name "propertyId" value "809135966") (object Attribute tool "Cplusplus" name "default__Role" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "CodeName" value "") (object Attribute tool "Cplusplus" name "InitialValue" value ""))) (object Attribute tool "Cplusplus" name "default__Inherit" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE))) (object Attribute tool "Cplusplus" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "RevEngRootDirectory" value "") (object Attribute tool "Cplusplus" name "RootPackage" value "C++ Reverse Engineered") (object Attribute tool "Cplusplus" name "RevEngDirectoriesAsPackages" value FALSE) (object Attribute tool "Cplusplus" name "HeaderFileExtension" value ".h") (object Attribute tool "Cplusplus" name "ImplementationFileExtension" value ".cpp") (object Attribute tool "Cplusplus" name "NewHeaderFileDirectory" value "") (object Attribute tool "Cplusplus" name "NewImplementationFileDirectory" value "") (object Attribute tool "Cplusplus" name "FileCapitalization" value ("FileCapitalizationSet" 0)) (object Attribute tool "Cplusplus" name "CodeGenExtraDirectories" value ("CodeGenExtraDirectoriesSet" 0)) (object Attribute tool "Cplusplus" name "StripClassPrefix" value "") (object Attribute tool "Cplusplus" name "UseTabs" value FALSE) (object Attribute tool "Cplusplus" name "TabWidth" value 8) (object Attribute tool "Cplusplus" name "IndentWidth" value 4) (object Attribute tool "Cplusplus" name "AccessIndentation" value -2) (object Attribute tool "Cplusplus" name "CreateBackupFiles" value FALSE) (object Attribute tool "Cplusplus" name "ModelIdCommentRules" value ("ModelIdCommentRulesSet" 1)) (object Attribute tool "Cplusplus" name "CommentRules" value ("CommentRulesSet" 1)) (object Attribute tool "Cplusplus" name "PageWidth" value 80) (object Attribute tool "Cplusplus" name "ClassMemberOrder" value ("MemberOrderSet" 1)) (object Attribute tool "Cplusplus" name "OneParameterPerLine" value FALSE) (object Attribute tool "Cplusplus" name "NamespaceBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "ClassBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "FunctionBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "Copyright" value (value Text "")) (object Attribute tool "Cplusplus" name "InitialHeaderIncludes" value (value Text "")) (object Attribute tool "Cplusplus" name "InitialBodyIncludes" value (value Text "")) (object Attribute tool "Cplusplus" name "CodeGenExtraDirectoriesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "None" value 0) (object Attribute tool "Cplusplus" name "Namespaces" value 1) (object Attribute tool "Cplusplus" name "Packages" value 2))) (object Attribute tool "Cplusplus" name "FileCapitalizationSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Same as model" value 0) (object Attribute tool "Cplusplus" name "Lower case" value 1) (object Attribute tool "Cplusplus" name "Upper case" value 2) (object Attribute tool "Cplusplus" name "Lower case with underscores" value 3))) (object Attribute tool "Cplusplus" name "BraceStyleSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "B1" value 1) (object Attribute tool "Cplusplus" name "B2" value 2) (object Attribute tool "Cplusplus" name "B3" value 3) (object Attribute tool "Cplusplus" name "B4" value 4) (object Attribute tool "Cplusplus" name "B5" value 5))) (object Attribute tool "Cplusplus" name "MemberOrderSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Public First" value 1) (object Attribute tool "Cplusplus" name "Private First" value 2) (object Attribute tool "Cplusplus" name "Order by kind" value 3) (object Attribute tool "Cplusplus" name "Unordered" value 4))) (object Attribute tool "Cplusplus" name "ModelIdCommentRulesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Code generation only" value 1) (object Attribute tool "Cplusplus" name "Code generation and reverse engineering" value 2) (object Attribute tool "Cplusplus" name "Never generate model IDs" value 3))) (object Attribute tool "Cplusplus" name "CommentRulesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Always synchronize" value 1) (object Attribute tool "Cplusplus" name "Code generation only" value 2) (object Attribute tool "Cplusplus" name "Reverse engineering only" value 3) (object Attribute tool "Cplusplus" name "Never synchronize" value 4))))) (object Attribute tool "Cplusplus" name "default__Module-Body" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "RevEngRootDirectory" value "") (object Attribute tool "Cplusplus" name "RootPackage" value "C++ Reverse Engineered") (object Attribute tool "Cplusplus" name "RevEngDirectoriesAsPackages" value FALSE) (object Attribute tool "Cplusplus" name "HeaderFileExtension" value ".h") (object Attribute tool "Cplusplus" name "ImplementationFileExtension" value ".cpp") (object Attribute tool "Cplusplus" name "NewHeaderFileDirectory" value "") (object Attribute tool "Cplusplus" name "NewImplementationFileDirectory" value "") (object Attribute tool "Cplusplus" name "FileCapitalization" value ("FileCapitalizationSet" 0)) (object Attribute tool "Cplusplus" name "CodeGenExtraDirectories" value ("CodeGenExtraDirectoriesSet" 0)) (object Attribute tool "Cplusplus" name "StripClassPrefix" value "") (object Attribute tool "Cplusplus" name "UseTabs" value FALSE) (object Attribute tool "Cplusplus" name "TabWidth" value 8) (object Attribute tool "Cplusplus" name "IndentWidth" value 4) (object Attribute tool "Cplusplus" name "AccessIndentation" value -2) (object Attribute tool "Cplusplus" name "CreateBackupFiles" value FALSE) (object Attribute tool "Cplusplus" name "ModelIdCommentRules" value ("ModelIdCommentRulesSet" 1)) (object Attribute tool "Cplusplus" name "CommentRules" value ("CommentRulesSet" 1)) (object Attribute tool "Cplusplus" name "PageWidth" value 80) (object Attribute tool "Cplusplus" name "ClassMemberOrder" value ("MemberOrderSet" 1)) (object Attribute tool "Cplusplus" name "OneParameterPerLine" value FALSE) (object Attribute tool "Cplusplus" name "NamespaceBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "ClassBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "FunctionBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "Copyright" value (value Text "")) (object Attribute tool "Cplusplus" name "InitialHeaderIncludes" value (value Text "")) (object Attribute tool "Cplusplus" name "InitialBodyIncludes" value (value Text "")) (object Attribute tool "Cplusplus" name "CodeGenExtraDirectoriesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "None" value 0) (object Attribute tool "Cplusplus" name "Namespaces" value 1) (object Attribute tool "Cplusplus" name "Packages" value 2))) (object Attribute tool "Cplusplus" name "FileCapitalizationSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Same as model" value 0) (object Attribute tool "Cplusplus" name "Lower case" value 1) (object Attribute tool "Cplusplus" name "Upper case" value 2) (object Attribute tool "Cplusplus" name "Lower case with underscores" value 3))) (object Attribute tool "Cplusplus" name "BraceStyleSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "B1" value 1) (object Attribute tool "Cplusplus" name "B2" value 2) (object Attribute tool "Cplusplus" name "B3" value 3) (object Attribute tool "Cplusplus" name "B4" value 4) (object Attribute tool "Cplusplus" name "B5" value 5))) (object Attribute tool "Cplusplus" name "MemberOrderSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Public First" value 1) (object Attribute tool "Cplusplus" name "Private First" value 2) (object Attribute tool "Cplusplus" name "Order by kind" value 3) (object Attribute tool "Cplusplus" name "Unordered" value 4))) (object Attribute tool "Cplusplus" name "ModelIdCommentRulesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Code generation only" value 1) (object Attribute tool "Cplusplus" name "Code generation and reverse engineering" value 2) (object Attribute tool "Cplusplus" name "Never generate model IDs" value 3))) (object Attribute tool "Cplusplus" name "CommentRulesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Always synchronize" value 1) (object Attribute tool "Cplusplus" name "Code generation only" value 2) (object Attribute tool "Cplusplus" name "Reverse engineering only" value 3) (object Attribute tool "Cplusplus" name "Never synchronize" value 4))))) (object Attribute tool "Cplusplus" name "default__Param" value (list Attribute_Set (object Attribute tool "Cplusplus" name "CodeName" value ""))) (object Attribute tool "Cplusplus" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "CodeName" value ""))) (object Attribute tool "Cplusplus" name "default__Operation" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "CodeName" value "") (object Attribute tool "Cplusplus" name "InitialCodeBody" value "") (object Attribute tool "Cplusplus" name "Inline" value FALSE) (object Attribute tool "Cplusplus" name "GenerateFunctionBody" value ("GenerateFunctionBodySet" 2)) (object Attribute tool "Cplusplus" name "GenerateFunctionBodySet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Default" value 2) (object Attribute tool "Cplusplus" name "True" value 1) (object Attribute tool "Cplusplus" name "False" value 0))))) (object Attribute tool "Cplusplus" name "default__Class" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "CodeName" value "") (object Attribute tool "Cplusplus" name "ImplementationType" value "") (object Attribute tool "Cplusplus" name "HeaderSourceFile" value "") (object Attribute tool "Cplusplus" name "BodySourceFile" value ""))) (object Attribute tool "Cplusplus" name "default__Category" value (list Attribute_Set (object Attribute tool "Cplusplus" name "CodeName" value "") (object Attribute tool "Cplusplus" name "IsNamespace" value FALSE))) (object Attribute tool "Cplusplus" name "default__Uses" value (list Attribute_Set (object Attribute tool "Cplusplus" name "BodyReferenceOnly" value FALSE))) (object Attribute tool "Cplusplus" name "HiddenTool" value FALSE) (object Attribute tool "ANSIConvert" name "HiddenTool" value FALSE) (object Attribute tool "Ada83" name "propertyId" value "838326200") (object Attribute tool "Ada83" name "default__Project" value (list Attribute_Set (object Attribute tool "Ada83" name "SpecFileExtension" value "1.ada") (object Attribute tool "Ada83" name "SpecFileBackupExtension" value "1.ad~") (object Attribute tool "Ada83" name "SpecFileTemporaryExtension" value "1.ad#") (object Attribute tool "Ada83" name "BodyFileExtension" value "2.ada") (object Attribute tool "Ada83" name "BodyFileBackupExtension" value "2.ad~") (object Attribute tool "Ada83" name "BodyFileTemporaryExtension" value "2.ad#") (object Attribute tool "Ada83" name "CreateMissingDirectories" value TRUE) (object Attribute tool "Ada83" name "GenerateBodies" value TRUE) (object Attribute tool "Ada83" name "GenerateAccessorOperations" value TRUE) (object Attribute tool "Ada83" name "GenerateStandardOperations" value TRUE) (object Attribute tool "Ada83" name "DefaultCodeBody" value "[statement]") (object Attribute tool "Ada83" name "ImplicitParameter" value TRUE) (object Attribute tool "Ada83" name "CommentWidth" value 60) (object Attribute tool "Ada83" name "StopOnError" value FALSE) (object Attribute tool "Ada83" name "ErrorLimit" value 30) (object Attribute tool "Ada83" name "UseFileName" value FALSE) (object Attribute tool "Ada83" name "Directory" value "$ROSEADA83_SOURCE"))) (object Attribute tool "Ada83" name "default__Class" value (list Attribute_Set (object Attribute tool "Ada83" name "CodeName" value "") (object Attribute tool "Ada83" name "ClassName" value "Object") (object Attribute tool "Ada83" name "ClassAccess" value ("ImplementationSet" 43)) (object Attribute tool "Ada83" name "ImplementationType" value (value Text "")) (object Attribute tool "Ada83" name "IsSubtype" value FALSE) (object Attribute tool "Ada83" name "PolymorphicUnit" value FALSE) (object Attribute tool "Ada83" name "HandleName" value "Handle") (object Attribute tool "Ada83" name "HandleAccess" value ("ImplementationSet" 45)) (object Attribute tool "Ada83" name "Discriminant" value "") (object Attribute tool "Ada83" name "Variant" value "") (object Attribute tool "Ada83" name "EnumerationLiteralPrefix" value "A_") (object Attribute tool "Ada83" name "RecordFieldPrefix" value "The_") (object Attribute tool "Ada83" name "GenerateAccessorOperations" value TRUE) (object Attribute tool "Ada83" name "GenerateStandardOperations" value TRUE) (object Attribute tool "Ada83" name "ImplicitParameter" value TRUE) (object Attribute tool "Ada83" name "ClassParameterName" value "This") (object Attribute tool "Ada83" name "DefaultConstructorKind" value ("ConstructorKindSet" 199)) (object Attribute tool "Ada83" name "DefaultConstructorName" value "Create") (object Attribute tool "Ada83" name "InlineDefaultConstructor" value FALSE) (object Attribute tool "Ada83" name "CopyConstructorKind" value ("ConstructorKindSet" 199)) (object Attribute tool "Ada83" name "CopyConstructorName" value "Copy") (object Attribute tool "Ada83" name "InlineCopyConstructor" value FALSE) (object Attribute tool "Ada83" name "DestructorName" value "Free") (object Attribute tool "Ada83" name "InlineDestructor" value FALSE) (object Attribute tool "Ada83" name "ClassEqualityOperation" value "") (object Attribute tool "Ada83" name "HandleEqualityOperation" value "") (object Attribute tool "Ada83" name "InlineEquality" value FALSE) (object Attribute tool "Ada83" name "IsTask" value FALSE) (object Attribute tool "Ada83" name "Representation" value (value Text "")) (object Attribute tool "Ada83" name "ImplementationSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Public" value 45) (object Attribute tool "Ada83" name "Private" value 43) (object Attribute tool "Ada83" name "LimitedPrivate" value 200) (object Attribute tool "Ada83" name "DoNotCreate" value 201))) (object Attribute tool "Ada83" name "ConstructorKindSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Procedure" value 202) (object Attribute tool "Ada83" name "Function" value 199) (object Attribute tool "Ada83" name "DoNotCreate" value 201))))) (object Attribute tool "Ada83" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Ada83" name "Generate" value TRUE) (object Attribute tool "Ada83" name "CopyrightNotice" value (value Text "")) (object Attribute tool "Ada83" name "FileName" value "") (object Attribute tool "Ada83" name "ReturnType" value "") (object Attribute tool "Ada83" name "GenericFormalParameters" value (value Text "")) (object Attribute tool "Ada83" name "AdditionalWiths" value (value Text "")))) (object Attribute tool "Ada83" name "default__Module-Body" value (list Attribute_Set (object Attribute tool "Ada83" name "Generate" value TRUE) (object Attribute tool "Ada83" name "CopyrightNotice" value (value Text "")) (object Attribute tool "Ada83" name "FileName" value "") (object Attribute tool "Ada83" name "ReturnType" value "") (object Attribute tool "Ada83" name "AdditionalWiths" value (value Text "")) (object Attribute tool "Ada83" name "IsSubunit" value FALSE))) (object Attribute tool "Ada83" name "default__Operation" value (list Attribute_Set (object Attribute tool "Ada83" name "CodeName" value "") (object Attribute tool "Ada83" name "SubprogramImplementation" value ("SubprogramImplementationSet" 2)) (object Attribute tool "Ada83" name "Renames" value "") (object Attribute tool "Ada83" name "ClassParameterMode" value ("ParameterModeSet" 203)) (object Attribute tool "Ada83" name "Inline" value FALSE) (object Attribute tool "Ada83" name "EntryCode" value (value Text "")) (object Attribute tool "Ada83" name "ExitCode" value (value Text "")) (object Attribute tool "Ada83" name "InitialCodeBody" value "${default}") (object Attribute tool "Ada83" name "Representation" value (value Text "")) (object Attribute tool "Ada83" name "SubprogramImplementationSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Spec" value 224) (object Attribute tool "Ada83" name "Body" value 2) (object Attribute tool "Ada83" name "Renaming" value 222) (object Attribute tool "Ada83" name "Separate" value 223))) (object Attribute tool "Ada83" name "ParameterModeSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Default" value 232) (object Attribute tool "Ada83" name "In" value 204) (object Attribute tool "Ada83" name "Out" value 205) (object Attribute tool "Ada83" name "InOut" value 203) (object Attribute tool "Ada83" name "FunctionReturn" value 206) (object Attribute tool "Ada83" name "DoNotCreate" value 201))))) (object Attribute tool "Ada83" name "default__Param" value (list Attribute_Set (object Attribute tool "Ada83" name "Mode" value ("ParameterModeSet" 232)) (object Attribute tool "Ada83" name "GenericFormal" value ("GenericFormalSet" 1)) (object Attribute tool "Ada83" name "AssociationMapping" value ("AssociationMappingSet" 1)) (object Attribute tool "Ada83" name "ParameterModeSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Default" value 232) (object Attribute tool "Ada83" name "In" value 204) (object Attribute tool "Ada83" name "Out" value 205) (object Attribute tool "Ada83" name "InOut" value 203))) (object Attribute tool "Ada83" name "GenericFormalSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Default" value 1) (object Attribute tool "Ada83" name "Object" value 2) (object Attribute tool "Ada83" name "Type" value 3) (object Attribute tool "Ada83" name "Procedure" value 4) (object Attribute tool "Ada83" name "Function" value 5))) (object Attribute tool "Ada83" name "AssociationMappingSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Name" value 1) (object Attribute tool "Ada83" name "Type" value 2))))) (object Attribute tool "Ada83" name "default__Has" value (list Attribute_Set (object Attribute tool "Ada83" name "CodeName" value "") (object Attribute tool "Ada83" name "NameIfUnlabeled" value "The_${supplier}") (object Attribute tool "Ada83" name "DataMemberName" value "${relationship}") (object Attribute tool "Ada83" name "GetName" value "Get_${relationship}") (object Attribute tool "Ada83" name "InlineGet" value TRUE) (object Attribute tool "Ada83" name "SetName" value "Set_${relationship}") (object Attribute tool "Ada83" name "InlineSet" value TRUE) (object Attribute tool "Ada83" name "IsConstant" value FALSE) (object Attribute tool "Ada83" name "InitialValue" value "") (object Attribute tool "Ada83" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada83" name "Variant" value "") (object Attribute tool "Ada83" name "ContainerGeneric" value "List") (object Attribute tool "Ada83" name "ContainerType" value "") (object Attribute tool "Ada83" name "ContainerDeclarations" value (value Text "")) (object Attribute tool "Ada83" name "SelectorName" value "") (object Attribute tool "Ada83" name "SelectorType" value "") (object Attribute tool "Ada83" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Before" value 233) (object Attribute tool "Ada83" name "After" value 234))))) (object Attribute tool "Ada83" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Ada83" name "CodeName" value "") (object Attribute tool "Ada83" name "DataMemberName" value "${attribute}") (object Attribute tool "Ada83" name "GetName" value "Get_${attribute}") (object Attribute tool "Ada83" name "InlineGet" value TRUE) (object Attribute tool "Ada83" name "SetName" value "Set_${attribute}") (object Attribute tool "Ada83" name "InlineSet" value TRUE) (object Attribute tool "Ada83" name "IsConstant" value FALSE) (object Attribute tool "Ada83" name "InitialValue" value "") (object Attribute tool "Ada83" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada83" name "Variant" value "") (object Attribute tool "Ada83" name "Representation" value (value Text "")) (object Attribute tool "Ada83" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Before" value 233) (object Attribute tool "Ada83" name "After" value 234))))) (object Attribute tool "Ada83" name "default__Association" value (list Attribute_Set (object Attribute tool "Ada83" name "NameIfUnlabeled" value "The_${targetClass}") (object Attribute tool "Ada83" name "GetName" value "Get_${association}") (object Attribute tool "Ada83" name "InlineGet" value FALSE) (object Attribute tool "Ada83" name "SetName" value "Set_${association}") (object Attribute tool "Ada83" name "InlineSet" value FALSE) (object Attribute tool "Ada83" name "GenerateAssociate" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada83" name "AssociateName" value "Associate") (object Attribute tool "Ada83" name "InlineAssociate" value FALSE) (object Attribute tool "Ada83" name "GenerateDissociate" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada83" name "DissociateName" value "Dissociate") (object Attribute tool "Ada83" name "InlineDissociate" value FALSE) (object Attribute tool "Ada83" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Procedure" value 202) (object Attribute tool "Ada83" name "DoNotCreate" value 201))) (object Attribute tool "Ada83" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Function" value 199) (object Attribute tool "Ada83" name "DoNotCreate" value 201))))) (object Attribute tool "Ada83" name "default__Role" value (list Attribute_Set (object Attribute tool "Ada83" name "CodeName" value "") (object Attribute tool "Ada83" name "NameIfUnlabeled" value "The_${targetClass}") (object Attribute tool "Ada83" name "DataMemberName" value "${target}") (object Attribute tool "Ada83" name "GetName" value "Get_${target}") (object Attribute tool "Ada83" name "InlineGet" value TRUE) (object Attribute tool "Ada83" name "SetName" value "Set_${target}") (object Attribute tool "Ada83" name "InlineSet" value TRUE) (object Attribute tool "Ada83" name "IsConstant" value FALSE) (object Attribute tool "Ada83" name "InitialValue" value "") (object Attribute tool "Ada83" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada83" name "Representation" value (value Text "")) (object Attribute tool "Ada83" name "ContainerGeneric" value "List") (object Attribute tool "Ada83" name "ContainerType" value "") (object Attribute tool "Ada83" name "ContainerDeclarations" value (value Text "")) (object Attribute tool "Ada83" name "SelectorName" value "") (object Attribute tool "Ada83" name "SelectorType" value "") (object Attribute tool "Ada83" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Procedure" value 202) (object Attribute tool "Ada83" name "DoNotCreate" value 201))) (object Attribute tool "Ada83" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Before" value 233) (object Attribute tool "Ada83" name "After" value 234))))) (object Attribute tool "Ada83" name "default__Subsystem" value (list Attribute_Set (object Attribute tool "Ada83" name "Directory" value "AUTO GENERATE"))) (object Attribute tool "Ada83" name "HiddenTool" value FALSE) (object Attribute tool "Ada95" name "propertyId" value "838326200") (object Attribute tool "Ada95" name "default__Project" value (list Attribute_Set (object Attribute tool "Ada95" name "SpecFileExtension" value "1.ada") (object Attribute tool "Ada95" name "SpecFileBackupExtension" value "1.ad~") (object Attribute tool "Ada95" name "SpecFileTemporaryExtension" value "1.ad#") (object Attribute tool "Ada95" name "BodyFileExtension" value "2.ada") (object Attribute tool "Ada95" name "BodyFileBackupExtension" value "2.ad~") (object Attribute tool "Ada95" name "BodyFileTemporaryExtension" value "2.ad#") (object Attribute tool "Ada95" name "CreateMissingDirectories" value TRUE) (object Attribute tool "Ada95" name "UseColonNotation" value TRUE) (object Attribute tool "Ada95" name "GenerateBodies" value TRUE) (object Attribute tool "Ada95" name "GenerateAccessorOperations" value TRUE) (object Attribute tool "Ada95" name "GenerateStandardOperations" value TRUE) (object Attribute tool "Ada95" name "DefaultCodeBody" value "[statement]") (object Attribute tool "Ada95" name "ImplicitParameter" value TRUE) (object Attribute tool "Ada95" name "CommentWidth" value 60) (object Attribute tool "Ada95" name "StopOnError" value FALSE) (object Attribute tool "Ada95" name "ErrorLimit" value 30) (object Attribute tool "Ada95" name "UseFileName" value FALSE) (object Attribute tool "Ada95" name "Directory" value "$ROSEADA95_SOURCE"))) (object Attribute tool "Ada95" name "default__Class" value (list Attribute_Set (object Attribute tool "Ada95" name "CodeName" value "") (object Attribute tool "Ada95" name "TypeName" value "Object") (object Attribute tool "Ada95" name "TypeVisibility" value ("TypeVisibilitySet" 43)) (object Attribute tool "Ada95" name "TypeImplementation" value ("TypeImplementationSet" 208)) (object Attribute tool "Ada95" name "IncompleteType" value ("IncompleteTypeSet" 1)) (object Attribute tool "Ada95" name "TypeControl" value ("TypeControlSet" 225)) (object Attribute tool "Ada95" name "TypeControlName" value "Controlled_${type}") (object Attribute tool "Ada95" name "TypeControlVisibility" value ("TypeVisibilitySet" 43)) (object Attribute tool "Ada95" name "TypeDefinition" value (value Text "")) (object Attribute tool "Ada95" name "RecordImplementation" value ("RecordImplementationSet" 209)) (object Attribute tool "Ada95" name "RecordKindPackageName" value "${class}_Record_Kinds") (object Attribute tool "Ada95" name "IsLimited" value FALSE) (object Attribute tool "Ada95" name "IsSubtype" value FALSE) (object Attribute tool "Ada95" name "GenerateAccessType" value ("GenerateAccessTypeSet" 230)) (object Attribute tool "Ada95" name "AccessTypeName" value "Handle") (object Attribute tool "Ada95" name "AccessTypeVisibility" value ("TypeVisibilitySet" 45)) (object Attribute tool "Ada95" name "AccessTypeDefinition" value (value Text "")) (object Attribute tool "Ada95" name "AccessClassWide" value TRUE) (object Attribute tool "Ada95" name "MaybeAliased" value FALSE) (object Attribute tool "Ada95" name "ParameterizedImplementation" value ("ParameterizedImplementationSet" 11)) (object Attribute tool "Ada95" name "ParentClassName" value "Superclass") (object Attribute tool "Ada95" name "EnumerationLiteralPrefix" value "A_") (object Attribute tool "Ada95" name "RecordFieldPrefix" value "The_") (object Attribute tool "Ada95" name "ArrayOfTypeName" value "Array_Of_${type}") (object Attribute tool "Ada95" name "AccessArrayOfTypeName" value "Access_Array_Of_${type}") (object Attribute tool "Ada95" name "ArrayOfAccessTypeName" value "Array_Of_${access_type}") (object Attribute tool "Ada95" name "AccessArrayOfAccessTypeName" value "Access_Array_Of_${access_type}") (object Attribute tool "Ada95" name "ArrayIndexDefinition" value "Positive range <>") (object Attribute tool "Ada95" name "GenerateAccessorOperations" value TRUE) (object Attribute tool "Ada95" name "GenerateStandardOperations" value TRUE) (object Attribute tool "Ada95" name "ImplicitParameter" value TRUE) (object Attribute tool "Ada95" name "ImplicitParameterName" value "This") (object Attribute tool "Ada95" name "GenerateDefaultConstructor" value ("SubprogramKindSet" 199)) (object Attribute tool "Ada95" name "DefaultConstructorName" value "Create") (object Attribute tool "Ada95" name "InlineDefaultConstructor" value FALSE) (object Attribute tool "Ada95" name "GenerateCopyConstructor" value ("SubprogramKindSet" 199)) (object Attribute tool "Ada95" name "CopyConstructorName" value "Copy") (object Attribute tool "Ada95" name "InlineCopyConstructor" value FALSE) (object Attribute tool "Ada95" name "GenerateDestructor" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "DestructorName" value "Free") (object Attribute tool "Ada95" name "InlineDestructor" value FALSE) (object Attribute tool "Ada95" name "GenerateTypeEquality" value ("FunctionKindSet" 201)) (object Attribute tool "Ada95" name "TypeEqualityName" value (value Text |"=" )) (object Attribute tool "Ada95" name "InlineEquality" value FALSE) (object Attribute tool "Ada95" name "Representation" value (value Text "")) (object Attribute tool "Ada95" name "TypeImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Tagged" value 208) (object Attribute tool "Ada95" name "Record" value 210) (object Attribute tool "Ada95" name "Mixin" value 211) (object Attribute tool "Ada95" name "Protected" value 44) (object Attribute tool "Ada95" name "Task" value 212))) (object Attribute tool "Ada95" name "IncompleteTypeSet" value (list Attribute_Set (object Attribute tool "Ada95" name "DoNotDeclare" value 1) (object Attribute tool "Ada95" name "NoDiscriminantPart" value 2) (object Attribute tool "Ada95" name "UnknownDiscriminantPart" value 3) (object Attribute tool "Ada95" name "KnownDiscriminantPart" value 4))) (object Attribute tool "Ada95" name "RecordImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "SingleType" value 209) (object Attribute tool "Ada95" name "MultipleTypes" value 213))) (object Attribute tool "Ada95" name "ParameterizedImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Generic" value 11) (object Attribute tool "Ada95" name "Unconstrained" value 214))) (object Attribute tool "Ada95" name "TypeVisibilitySet" value (list Attribute_Set (object Attribute tool "Ada95" name "Public" value 45) (object Attribute tool "Ada95" name "Private" value 43))) (object Attribute tool "Ada95" name "SubprogramKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "TypeControlSet" value (list Attribute_Set (object Attribute tool "Ada95" name "None" value 225) (object Attribute tool "Ada95" name "InitializationOnly" value 226) (object Attribute tool "Ada95" name "AssignmentFinalizationOnly" value 227) (object Attribute tool "Ada95" name "All" value 228))) (object Attribute tool "Ada95" name "GenerateAccessTypeSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Always" value 229) (object Attribute tool "Ada95" name "Auto" value 230))))) (object Attribute tool "Ada95" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Ada95" name "Generate" value TRUE) (object Attribute tool "Ada95" name "CopyrightNotice" value (value Text "")) (object Attribute tool "Ada95" name "FileName" value "") (object Attribute tool "Ada95" name "ReturnType" value "") (object Attribute tool "Ada95" name "GenericFormalParameters" value (value Text "")) (object Attribute tool "Ada95" name "AdditionalWiths" value (value Text "")) (object Attribute tool "Ada95" name "IsPrivate" value FALSE))) (object Attribute tool "Ada95" name "default__Module-Body" value (list Attribute_Set (object Attribute tool "Ada95" name "Generate" value TRUE) (object Attribute tool "Ada95" name "CopyrightNotice" value (value Text "")) (object Attribute tool "Ada95" name "FileName" value "") (object Attribute tool "Ada95" name "ReturnType" value "") (object Attribute tool "Ada95" name "AdditionalWiths" value (value Text "")) (object Attribute tool "Ada95" name "IsSubunit" value FALSE))) (object Attribute tool "Ada95" name "default__Operation" value (list Attribute_Set (object Attribute tool "Ada95" name "CodeName" value "") (object Attribute tool "Ada95" name "SubprogramImplementation" value ("SubprogramImplementationSet" 2)) (object Attribute tool "Ada95" name "Renames" value "") (object Attribute tool "Ada95" name "GenerateOverriding" value TRUE) (object Attribute tool "Ada95" name "ImplicitParameterMode" value ("ParameterModeSet" 203)) (object Attribute tool "Ada95" name "ImplicitParameterClassWide" value FALSE) (object Attribute tool "Ada95" name "GenerateAccessOperation" value FALSE) (object Attribute tool "Ada95" name "Inline" value FALSE) (object Attribute tool "Ada95" name "EntryCode" value (value Text "")) (object Attribute tool "Ada95" name "ExitCode" value (value Text "")) (object Attribute tool "Ada95" name "InitialCodeBody" value "${default}") (object Attribute tool "Ada95" name "EntryBarrierCondition" value "True") (object Attribute tool "Ada95" name "Representation" value (value Text "")) (object Attribute tool "Ada95" name "SubprogramImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Spec" value 224) (object Attribute tool "Ada95" name "Body" value 2) (object Attribute tool "Ada95" name "Abstract" value 221) (object Attribute tool "Ada95" name "Renaming" value 222) (object Attribute tool "Ada95" name "RenamingAsBody" value 231) (object Attribute tool "Ada95" name "Separate" value 223))) (object Attribute tool "Ada95" name "ParameterModeSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Default" value 232) (object Attribute tool "Ada95" name "In" value 204) (object Attribute tool "Ada95" name "Out" value 205) (object Attribute tool "Ada95" name "InOut" value 203) (object Attribute tool "Ada95" name "Access" value 220) (object Attribute tool "Ada95" name "DoNotCreate" value 201))))) (object Attribute tool "Ada95" name "default__Param" value (list Attribute_Set (object Attribute tool "Ada95" name "Mode" value ("ParameterModeSet" 232)) (object Attribute tool "Ada95" name "GenericFormal" value ("GenericFormalSet" 1)) (object Attribute tool "Ada95" name "AssociationMapping" value ("AssociationMappingSet" 1)) (object Attribute tool "Ada95" name "ParameterModeSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Default" value 232) (object Attribute tool "Ada95" name "In" value 204) (object Attribute tool "Ada95" name "Out" value 205) (object Attribute tool "Ada95" name "InOut" value 203) (object Attribute tool "Ada95" name "Access" value 220))) (object Attribute tool "Ada95" name "GenericFormalSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Default" value 1) (object Attribute tool "Ada95" name "Object" value 2) (object Attribute tool "Ada95" name "Type" value 3) (object Attribute tool "Ada95" name "Procedure" value 4) (object Attribute tool "Ada95" name "Function" value 5) (object Attribute tool "Ada95" name "Package" value 6))) (object Attribute tool "Ada95" name "AssociationMappingSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Name" value 1) (object Attribute tool "Ada95" name "Type" value 2))))) (object Attribute tool "Ada95" name "default__Has" value (list Attribute_Set (object Attribute tool "Ada95" name "CodeName" value "") (object Attribute tool "Ada95" name "NameIfUnlabeled" value "The_${supplier}") (object Attribute tool "Ada95" name "RecordFieldImplementation" value ("RecordFieldImplementationSet" 216)) (object Attribute tool "Ada95" name "AccessDiscriminantClassWide" value FALSE) (object Attribute tool "Ada95" name "RecordFieldName" value "${relationship}") (object Attribute tool "Ada95" name "GenerateGet" value ("FunctionKindSet" 199)) (object Attribute tool "Ada95" name "GenerateAccessGet" value ("FunctionKindSet" 201)) (object Attribute tool "Ada95" name "GetName" value "Get_${relationship}") (object Attribute tool "Ada95" name "InlineGet" value TRUE) (object Attribute tool "Ada95" name "GenerateSet" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "GenerateAccessSet" value ("ProcedureKindSet" 201)) (object Attribute tool "Ada95" name "SetName" value "Set_${relationship}") (object Attribute tool "Ada95" name "InlineSet" value TRUE) (object Attribute tool "Ada95" name "IsAliased" value FALSE) (object Attribute tool "Ada95" name "IsConstant" value FALSE) (object Attribute tool "Ada95" name "InitialValue" value "") (object Attribute tool "Ada95" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada95" name "ContainerImplementation" value ("ContainerImplementationSet" 217)) (object Attribute tool "Ada95" name "ContainerGeneric" value "List") (object Attribute tool "Ada95" name "ContainerType" value "") (object Attribute tool "Ada95" name "ContainerDeclarations" value (value Text "")) (object Attribute tool "Ada95" name "SelectorName" value "") (object Attribute tool "Ada95" name "SelectorType" value "") (object Attribute tool "Ada95" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Before" value 233) (object Attribute tool "Ada95" name "After" value 234))) (object Attribute tool "Ada95" name "RecordFieldImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Component" value 216) (object Attribute tool "Ada95" name "Discriminant" value 218) (object Attribute tool "Ada95" name "AccessDiscriminant" value 219))) (object Attribute tool "Ada95" name "ContainerImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Array" value 217) (object Attribute tool "Ada95" name "Generic" value 11))) (object Attribute tool "Ada95" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))))) (object Attribute tool "Ada95" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Ada95" name "CodeName" value "") (object Attribute tool "Ada95" name "RecordFieldImplementation" value ("RecordFieldImplementationSet" 216)) (object Attribute tool "Ada95" name "AccessDiscriminantClassWide" value FALSE) (object Attribute tool "Ada95" name "RecordFieldName" value "${attribute}") (object Attribute tool "Ada95" name "GenerateGet" value ("FunctionKindSet" 199)) (object Attribute tool "Ada95" name "GenerateAccessGet" value ("FunctionKindSet" 201)) (object Attribute tool "Ada95" name "GetName" value "Get_${attribute}") (object Attribute tool "Ada95" name "InlineGet" value TRUE) (object Attribute tool "Ada95" name "GenerateSet" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "GenerateAccessSet" value ("ProcedureKindSet" 201)) (object Attribute tool "Ada95" name "SetName" value "Set_${attribute}") (object Attribute tool "Ada95" name "InlineSet" value TRUE) (object Attribute tool "Ada95" name "IsAliased" value FALSE) (object Attribute tool "Ada95" name "IsConstant" value FALSE) (object Attribute tool "Ada95" name "InitialValue" value "") (object Attribute tool "Ada95" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada95" name "Representation" value (value Text "")) (object Attribute tool "Ada95" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Before" value 233) (object Attribute tool "Ada95" name "After" value 234))) (object Attribute tool "Ada95" name "RecordFieldImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Component" value 216) (object Attribute tool "Ada95" name "Discriminant" value 218) (object Attribute tool "Ada95" name "AccessDiscriminant" value 219))) (object Attribute tool "Ada95" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))))) (object Attribute tool "Ada95" name "default__Association" value (list Attribute_Set (object Attribute tool "Ada95" name "NameIfUnlabeled" value "The_${targetClass}") (object Attribute tool "Ada95" name "GenerateGet" value ("FunctionKindSet" 199)) (object Attribute tool "Ada95" name "GetName" value "Get_${association}") (object Attribute tool "Ada95" name "InlineGet" value FALSE) (object Attribute tool "Ada95" name "GenerateSet" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "SetName" value "Set_${association}") (object Attribute tool "Ada95" name "InlineSet" value FALSE) (object Attribute tool "Ada95" name "GenerateAssociate" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "AssociateName" value "Associate") (object Attribute tool "Ada95" name "InlineAssociate" value FALSE) (object Attribute tool "Ada95" name "GenerateDissociate" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "DissociateName" value "Dissociate") (object Attribute tool "Ada95" name "InlineDissociate" value FALSE) (object Attribute tool "Ada95" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))))) (object Attribute tool "Ada95" name "default__Role" value (list Attribute_Set (object Attribute tool "Ada95" name "CodeName" value "") (object Attribute tool "Ada95" name "NameIfUnlabeled" value "The_${targetClass}") (object Attribute tool "Ada95" name "RecordFieldImplementation" value ("RecordFieldImplementationSet" 216)) (object Attribute tool "Ada95" name "AccessDiscriminantClassWide" value FALSE) (object Attribute tool "Ada95" name "RecordFieldName" value "${target}") (object Attribute tool "Ada95" name "GenerateGet" value ("FunctionKindSet" 199)) (object Attribute tool "Ada95" name "GenerateAccessGet" value ("FunctionKindSet" 201)) (object Attribute tool "Ada95" name "GetName" value "Get_${target}") (object Attribute tool "Ada95" name "InlineGet" value TRUE) (object Attribute tool "Ada95" name "GenerateSet" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "GenerateAccessSet" value ("ProcedureKindSet" 201)) (object Attribute tool "Ada95" name "SetName" value "Set_${target}") (object Attribute tool "Ada95" name "InlineSet" value TRUE) (object Attribute tool "Ada95" name "IsAliased" value FALSE) (object Attribute tool "Ada95" name "IsConstant" value FALSE) (object Attribute tool "Ada95" name "InitialValue" value "") (object Attribute tool "Ada95" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada95" name "Representation" value (value Text "")) (object Attribute tool "Ada95" name "ContainerImplementation" value ("ContainerImplementationSet" 217)) (object Attribute tool "Ada95" name "ContainerGeneric" value "List") (object Attribute tool "Ada95" name "ContainerType" value "") (object Attribute tool "Ada95" name "ContainerDeclarations" value (value Text "")) (object Attribute tool "Ada95" name "SelectorName" value "") (object Attribute tool "Ada95" name "SelectorType" value "") (object Attribute tool "Ada95" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Before" value 233) (object Attribute tool "Ada95" name "After" value 234))) (object Attribute tool "Ada95" name "RecordFieldImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Component" value 216) (object Attribute tool "Ada95" name "Discriminant" value 218) (object Attribute tool "Ada95" name "AccessDiscriminant" value 219))) (object Attribute tool "Ada95" name "ContainerImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Array" value 217) (object Attribute tool "Ada95" name "Generic" value 11))) (object Attribute tool "Ada95" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))))) (object Attribute tool "Ada95" name "default__Subsystem" value (list Attribute_Set (object Attribute tool "Ada95" name "Directory" value "AUTO GENERATE"))) (object Attribute tool "Ada95" name "HiddenTool" value FALSE) (object Attribute tool "CORBA" name "default__Param" value (list Attribute_Set (object Attribute tool "CORBA" name "Direction" value ("ParamDirectionTypeSet" 102)) (object Attribute tool "CORBA" name "ParamDirectionTypeSet" value (list Attribute_Set (object Attribute tool "CORBA" name "in" value 102) (object Attribute tool "CORBA" name "inout" value 103) (object Attribute tool "CORBA" name "out" value 104))))) (object Attribute tool "Deploy" name "HiddenTool" value FALSE) (object Attribute tool "Oracle8" name "propertyId" value "360000002") (object Attribute tool "Oracle8" name "default__Project" value (list Attribute_Set (object Attribute tool "Oracle8" name "DDLScriptFilename" value "DDL1.SQL") (object Attribute tool "Oracle8" name "DropClause" value FALSE) (object Attribute tool "Oracle8" name "PrimaryKeyColumnName" value "_ID") (object Attribute tool "Oracle8" name "PrimaryKeyColumnType" value "NUMBER(5,0)") (object Attribute tool "Oracle8" name "SchemaNamePrefix" value "") (object Attribute tool "Oracle8" name "SchemaNameSuffix" value "") (object Attribute tool "Oracle8" name "TableNamePrefix" value "") (object Attribute tool "Oracle8" name "TableNameSuffix" value "") (object Attribute tool "Oracle8" name "TypeNamePrefix" value "") (object Attribute tool "Oracle8" name "TypeNameSuffix" value "") (object Attribute tool "Oracle8" name "ViewNamePrefix" value "") (object Attribute tool "Oracle8" name "ViewNameSuffix" value "") (object Attribute tool "Oracle8" name "VarrayNamePrefix" value "") (object Attribute tool "Oracle8" name "VarrayNameSuffix" value "") (object Attribute tool "Oracle8" name "NestedTableNamePrefix" value "") (object Attribute tool "Oracle8" name "NestedTableNameSuffix" value "") (object Attribute tool "Oracle8" name "ObjectTableNamePrefix" value "") (object Attribute tool "Oracle8" name "ObjectTableNameSuffix" value ""))) (object Attribute tool "Oracle8" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Oracle8" name "IsSchema" value FALSE))) (object Attribute tool "Oracle8" name "default__Class" value (list Attribute_Set (object Attribute tool "Oracle8" name "OID" value "") (object Attribute tool "Oracle8" name "WhereClause" value "") (object Attribute tool "Oracle8" name "CheckConstraint" value "") (object Attribute tool "Oracle8" name "CollectionTypeLength" value "") (object Attribute tool "Oracle8" name "CollectionTypePrecision" value "") (object Attribute tool "Oracle8" name "CollectionTypeScale" value "") (object Attribute tool "Oracle8" name "CollectionOfREFS" value FALSE))) (object Attribute tool "Oracle8" name "default__Operation" value (list Attribute_Set (object Attribute tool "Oracle8" name "MethodKind" value ("MethodKindSet" 1903)) (object Attribute tool "Oracle8" name "OverloadID" value "") (object Attribute tool "Oracle8" name "OrderNumber" value "") (object Attribute tool "Oracle8" name "IsReadNoDataState" value FALSE) (object Attribute tool "Oracle8" name "IsReadNoProcessState" value FALSE) (object Attribute tool "Oracle8" name "IsWriteNoDataState" value FALSE) (object Attribute tool "Oracle8" name "IsWriteNoProcessState" value FALSE) (object Attribute tool "Oracle8" name "IsSelfish" value FALSE) (object Attribute tool "Oracle8" name "TriggerType" value ("TriggerTypeSet" 1801)) (object Attribute tool "Oracle8" name "TriggerEvent" value ("TriggerEventSet" 1601)) (object Attribute tool "Oracle8" name "TriggerText" value "") (object Attribute tool "Oracle8" name "TriggerReferencingNames" value "") (object Attribute tool "Oracle8" name "TriggerForEach" value ("TriggerForEachSet" 1701)) (object Attribute tool "Oracle8" name "TriggerWhenClause" value "") (object Attribute tool "Oracle8" name "MethodKindSet" value (list Attribute_Set (object Attribute tool "Oracle8" name "MapMethod" value 1901) (object Attribute tool "Oracle8" name "OrderMethod" value 1902) (object Attribute tool "Oracle8" name "Function" value 1903) (object Attribute tool "Oracle8" name "Procedure" value 1904) (object Attribute tool "Oracle8" name "Operator" value 1905) (object Attribute tool "Oracle8" name "Constructor" value 1906) (object Attribute tool "Oracle8" name "Destructor" value 1907) (object Attribute tool "Oracle8" name "Trigger" value 1908) (object Attribute tool "Oracle8" name "Calculated" value 1909))) (object Attribute tool "Oracle8" name "TriggerTypeSet" value (list Attribute_Set (object Attribute tool "Oracle8" name "AFTER" value 1801) (object Attribute tool "Oracle8" name "BEFORE" value 1802) (object Attribute tool "Oracle8" name "INSTEAD OF" value 1803))) (object Attribute tool "Oracle8" name "TriggerForEachSet" value (list Attribute_Set (object Attribute tool "Oracle8" name "ROW" value 1701) (object Attribute tool "Oracle8" name "STATEMENT" value 1702))) (object Attribute tool "Oracle8" name "TriggerEventSet" value (list Attribute_Set (object Attribute tool "Oracle8" name "INSERT" value 1601) (object Attribute tool "Oracle8" name "UPDATE" value 1602) (object Attribute tool "Oracle8" name "DELETE" value 1603) (object Attribute tool "Oracle8" name "INSERT OR UPDATE" value 1604) (object Attribute tool "Oracle8" name "INSERT OR DELETE" value 1605) (object Attribute tool "Oracle8" name "UPDATE OR DELETE" value 1606) (object Attribute tool "Oracle8" name "INSERT OR UPDATE OR DELETE" value 1607))))) (object Attribute tool "Oracle8" name "default__Role" value (list Attribute_Set (object Attribute tool "Oracle8" name "OrderNumber" value ""))) (object Attribute tool "Oracle8" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Oracle8" name "OrderNumber" value "") (object Attribute tool "Oracle8" name "IsUnique" value FALSE) (object Attribute tool "Oracle8" name "NullsAllowed" value TRUE) (object Attribute tool "Oracle8" name "Length" value "") (object Attribute tool "Oracle8" name "Precision" value "2") (object Attribute tool "Oracle8" name "Scale" value "6") (object Attribute tool "Oracle8" name "IsIndex" value FALSE) (object Attribute tool "Oracle8" name "IsPrimaryKey" value FALSE) (object Attribute tool "Oracle8" name "CompositeUnique" value FALSE) (object Attribute tool "Oracle8" name "CheckConstraint" value ""))) (object Attribute tool "Oracle8" name "HiddenTool" value FALSE) (object Attribute tool "ComponentTest" name "HiddenTool" value FALSE) (object Attribute tool "Rose Model Integrator" name "HiddenTool" value FALSE) (object Attribute tool "TopLink" name "HiddenTool" value FALSE) (object Attribute tool "Version Control" name "HiddenTool" value FALSE) (object Attribute tool "Visual Basic" name "propertyId" value "783606378") (object Attribute tool "Visual Basic" name "default__Class" value (list Attribute_Set (object Attribute tool "Visual Basic" name "UpdateCode" value TRUE) (object Attribute tool "Visual Basic" name "UpdateModel" value TRUE) (object Attribute tool "Visual Basic" name "InstancingSet" value (list Attribute_Set (object Attribute tool "Visual Basic" name "Private" value 221) (object Attribute tool "Visual Basic" name "PublicNotCreatable" value 213) (object Attribute tool "Visual Basic" name "SingleUse" value 214) (object Attribute tool "Visual Basic" name "GlobalSingleUse" value 215) (object Attribute tool "Visual Basic" name "MultiUse" value 219) (object Attribute tool "Visual Basic" name "GlobalMultiUse" value 220))) (object Attribute tool "Visual Basic" name "BaseSet" value (list Attribute_Set (object Attribute tool "Visual Basic" name "(none)" value 222) (object Attribute tool "Visual Basic" name "0" value 223) (object Attribute tool "Visual Basic" name "1" value 224))) (object Attribute tool "Visual Basic" name "OptionBase" value ("BaseSet" 222)) (object Attribute tool "Visual Basic" name "OptionExplicit" value TRUE) (object Attribute tool "Visual Basic" name "OptionCompare" value ("CompareSet" 202)) (object Attribute tool "Visual Basic" name "Instancing" value ("InstancingSet" 219)) (object Attribute tool "Visual Basic" name "CompareSet" value (list Attribute_Set (object Attribute tool "Visual Basic" name "(none)" value 202) (object Attribute tool "Visual Basic" name "Binary" value 203) (object Attribute tool "Visual Basic" name "Text" value 204))))) (object Attribute tool "Visual Basic" name "default__Operation" value (list Attribute_Set (object Attribute tool "Visual Basic" name "LibraryName" value "") (object Attribute tool "Visual Basic" name "AliasName" value "") (object Attribute tool "Visual Basic" name "IsStatic" value FALSE) (object Attribute tool "Visual Basic" name "ProcedureID" value "") (object Attribute tool "Visual Basic" name "ReplaceExistingBody" value FALSE) (object Attribute tool "Visual Basic" name "DefaultBody" value (value Text "")))) (object Attribute tool "Visual Basic" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Visual Basic" name "New" value FALSE) (object Attribute tool "Visual Basic" name "WithEvents" value FALSE) (object Attribute tool "Visual Basic" name "ProcedureID" value "") (object Attribute tool "Visual Basic" name "PropertyName" value "") (object Attribute tool "Visual Basic" name "Subscript" value ""))) (object Attribute tool "Visual Basic" name "default__Role" value (list Attribute_Set (object Attribute tool "Visual Basic" name "UpdateCode" value TRUE) (object Attribute tool "Visual Basic" name "New" value FALSE) (object Attribute tool "Visual Basic" name "WithEvents" value FALSE) (object Attribute tool "Visual Basic" name "FullName" value FALSE) (object Attribute tool "Visual Basic" name "ProcedureID" value "") (object Attribute tool "Visual Basic" name "PropertyName" value "") (object Attribute tool "Visual Basic" name "Subscript" value ""))) (object Attribute tool "Visual Basic" name "default__Inherit" value (list Attribute_Set (object Attribute tool "Visual Basic" name "ImplementsDelegation" value TRUE) (object Attribute tool "Visual Basic" name "FullName" value FALSE))) (object Attribute tool "Visual Basic" name "default__Param" value (list Attribute_Set (object Attribute tool "Visual Basic" name "ByVal" value FALSE) (object Attribute tool "Visual Basic" name "ByRef" value FALSE) (object Attribute tool "Visual Basic" name "Optional" value FALSE) (object Attribute tool "Visual Basic" name "ParamArray" value FALSE))) (object Attribute tool "Visual Basic" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Visual Basic" name "ProjectFile" value "") (object Attribute tool "Visual Basic" name "UpdateCode" value TRUE) (object Attribute tool "Visual Basic" name "UpdateModel" value TRUE) (object Attribute tool "Visual Basic" name "ImportReferences" value TRUE) (object Attribute tool "Visual Basic" name "QuickImport" value TRUE) (object Attribute tool "Visual Basic" name "ImportBinary" value FALSE))) (object Attribute tool "Visual Basic" name "HiddenTool" value FALSE)) quid "39C9260C00D9")) ================================================ FILE: docs/电商平台设计.md~ ================================================ (object Petal version 50 _written "Rose 8.2.0310.2800" charSet 134) (object Design "Logical View" is_unit TRUE is_loaded TRUE attributes (list Attribute_Set (object Attribute tool "Java" name "IDE" value "Internal Editor") (object Attribute tool "Java" name "UserDefineTagName1" value "") (object Attribute tool "Java" name "UserDefineTagText1" value "") (object Attribute tool "Java" name "UserDefineTagApply1" value "") (object Attribute tool "Java" name "UserDefineTagName2" value "") (object Attribute tool "Java" name "UserDefineTagText2" value "") (object Attribute tool "Java" name "UserDefineTagApply2" value "") (object Attribute tool "Java" name "UserDefineTagName3" value "") (object Attribute tool "Java" name "UserDefineTagText3" value "") (object Attribute tool "Java" name "UserDefineTagApply3" value "") (object Attribute tool "Data Modeler" name "DatabaseCounter" value "1") (object Attribute tool "Data Modeler" name "DomainPackageCounter" value "0") (object Attribute tool "Data Modeler" name "SchemaCounter" value "1") (object Attribute tool "Data Modeler" name "DomainCounter" value 0) (object Attribute tool "Data Modeler" name "TableCounter" value 4) (object Attribute tool "Data Modeler" name "ViewCounter" value 0) (object Attribute tool "Data Modeler" name "JoinCounter" value 0) (object Attribute tool "Data Modeler" name "ColumnCounter" value "6") (object Attribute tool "Data Modeler" name "TriggerCounter" value 0) (object Attribute tool "Data Modeler" name "IndexCounter" value 0) (object Attribute tool "Data Modeler" name "ConstraintCounter" value 1) (object Attribute tool "Data Modeler" name "PrimaryKeyCounter" value 0) (object Attribute tool "Data Modeler" name "ForeignKeyCounter" value 0) (object Attribute tool "Data Modeler" name "StoredProcedurePackageCounter" value "0") (object Attribute tool "Data Modeler" name "StoredProcedureCounter" value "0") (object Attribute tool "Data Modeler" name "StoredProcedureParameterCounter" value "0")) quid "39C9260C00D4" enforceClosureAutoLoad FALSE defaults (object defaults rightMargin 0.250000 leftMargin 0.250000 topMargin 0.250000 bottomMargin 0.500000 pageOverlap 0.250000 clipIconLabels TRUE autoResize TRUE snapToGrid TRUE gridX 16 gridY 16 defaultFont (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) showMessageNum 1 showClassOfObject TRUE notation "Unified") root_usecase_package (object Class_Category "Use Case View" quid "39C9260C00D6" exportControl "Public" global TRUE logical_models (list unit_reference_list) logical_presentations (list unit_reference_list (object UseCaseDiagram "Main" quid "39C9261001B7" title "Main" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list)))) root_category (object Class_Category "Logical View" quid "39C9260C00D5" exportControl "Public" global TRUE subsystem "Component View" quidu "39C9260C00D7" logical_models (list unit_reference_list (object Class_Category "javax" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2ee_javax.cat" quid "39C926610018") (object Class_Category "java" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2se_1_3_java.cat" quid "39C92661003B") (object Class_Category "org" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2se_1_3_org.cat" quid "39C92693036F") (object Class_Category "Global Data Types" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsRootDomainPackage" value TRUE) (object Attribute tool "Data Modeler" name "dmDomainPackage" value "Data Modeler")) quid "5B1AA85A03AD" exportControl "Public" logical_models (list unit_reference_list) logical_presentations (list unit_reference_list)) (object Class_Category "Schemas" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsRootSchema" value TRUE) (object Attribute tool "Data Modeler" name "dmSchema" value "Data Modeler")) quid "5B1AA85A03B2" exportControl "Public" logical_models (list unit_reference_list (object Class_Category "S_0" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsSchema" value TRUE) (object Attribute tool "Data Modeler" name "dmSchema" value "Data Modeler") (object Attribute tool "Data Modeler" name "DMName" value "S_0") (object Attribute tool "Data Modeler" name "CodeName" value "")) quid "5B1AA8CD02FA" stereotype "Schema" exportControl "Public" logical_models (list unit_reference_list (object Class "SPU" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "SPU") (object Attribute tool "Data Modeler" name "CodeName" value "item_spu") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1AA9510260" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AACB2038A" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "Ʒ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "Ʒ") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 30) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AACB203AD" type "VARCHAR(30)" exportControl "Neither") (object ClassAttribute "Ʒid" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "Ʒid") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 3) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AACB203CB" type "SMALLINT" exportControl "Neither")) language "Data Modeler") (object Class "SKU" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "T_1") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1AA9BA0234" stereotype "Table" language "Data Modeler") (object Class "Ʒ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "Ʒ") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1AAA6501AC" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AAAC90295" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "Ʒ" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "Ʒ") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "Length" value 30) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AAAC902B9" type "VARCHAR(30)" exportControl "Neither")) language "Data Modeler") (object Class "" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTable" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "HasLikeStatemenet" value "False") (object Attribute tool "Data Modeler" name "LikeTableName" value "") (object Attribute tool "Data Modeler" name "LikeIncludeIdentity" value "False") (object Attribute tool "Data Modeler" name "LikeColumnAttr" value "False")) quid "5B1AACBF0283" stereotype "Table" class_attributes (list class_attribute_list (object ClassAttribute "id" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "id") (object Attribute tool "Data Modeler" name "Ordinal" value 1) (object Attribute tool "Data Modeler" name "Length" value 10) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AAD45002A" type "VARCHAR(10)" exportControl "Neither") (object ClassAttribute "" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "ExplicitNullable" value "False") (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 2) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "DefaultValueType" value "No Default Value")) quid "5B1AAD45004B" type "SMALLINT" exportControl "Neither")) language "Data Modeler")) logical_presentations (list unit_reference_list (object ClassDiagram "NewDiagram" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value "True")) quid "5B1AA92C02F1" title "NewDiagram" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list (object ClassView "Class" "Logical View::Schemas::S_0::SPU" @1 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (1200, 368) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @1 location (855, 278) fill_color 13434879 nlines 1 max_width 690 justify 0 label "SPU") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1AA9510260" compartment (object Compartment Parent_View @1 location (855, 339) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 4 max_width 524) width 708 height 380 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::SKU" @2 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (1120, 848) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @2 location (988, 837) fill_color 13434879 nlines 1 max_width 264 justify 0 label "SKU") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1AA9BA0234" width 282 height 222 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::Ʒ" @3 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (2064, 496) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @3 location (1719, 430) fill_color 13434879 nlines 1 max_width 690 justify 0 label "Ʒ") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1AAA6501AC" compartment (object Compartment Parent_View @3 location (1719, 491) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 3 max_width 524) width 708 height 332 annotation 8 autoResize TRUE) (object ClassView "Class" "Logical View::Schemas::S_0::" @4 ShowCompartmentStereotypes TRUE IncludeAttribute TRUE IncludeOperation TRUE location (384, 784) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @4 location (78, 719) fill_color 13434879 nlines 1 max_width 612 justify 0 label "") icon "Table" icon_style "Decoration" line_color 3342489 fill_color 13434879 quidu "5B1AACBF0283" compartment (object Compartment Parent_View @4 location (78, 780) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) icon_style "Icon" fill_color 13434879 anchor 2 nlines 3 max_width 456) width 630 height 330 annotation 8 autoResize TRUE)))))) logical_presentations (list unit_reference_list))) logical_presentations (list unit_reference_list (object ClassDiagram "Package Hierarchy" quid "39C9261001B8" title "Package Hierarchy" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list (object CategoryView "Logical View::java" @5 location (208, 272) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @5 location (64, 188) nlines 2 max_width 288 justify 0 label "java") icon_style "Icon" line_color 3342489 fill_color 16777215 quidu "39C92661003B" width 300 height 180) (object CategoryView "Logical View::javax" @6 location (656, 272) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @6 location (512, 188) nlines 2 max_width 288 justify 0 label "javax") icon_style "Icon" line_color 3342489 fill_color 16777215 quidu "39C926610018" width 300 height 180) (object CategoryView "Logical View::org" @7 location (1104, 272) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) label (object ItemLabel Parent_View @7 location (960, 188) nlines 2 max_width 288 justify 0 label "org") icon_style "Icon" line_color 3342489 fill_color 16777215 quidu "39C92693036F" width 300 height 180))) (object ClassDiagram "Legend" quid "39CD51840059" title "Legend" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list (object NoteView @8 location (224, 624) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) line_color 3342489 fill_color 12632256 width 300 height 132) (object NoteView @9 location (704, 624) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) line_color 3342489 fill_color 8421631 width 300 height 132) (object NoteView @10 location (1200, 624) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) line_color 3342489 fill_color 12615680 width 300 height 132) (object NoteView @11 location (1664, 624) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) line_color 3342489 fill_color 16777215 width 300 height 132) (object Label @12 location (81, 369) font (object Font size 12 face "Arial" bold TRUE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) nlines 1 max_width 1163 label "J2EE: Java 2 Platform, Enterprise Edition - v 1.2.1") (object Label @13 location (96, 608) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) nlines 1 max_width 268 label "Abstract Class") (object Label @14 location (592, 608) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) nlines 1 max_width 225 label "Final Class") (object Label @15 location (1104, 608) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) nlines 1 max_width 206 label "Interface") (object Label @16 location (1552, 608) font (object Font size 10 face "Arial" bold FALSE italics FALSE underline FALSE strike FALSE color 0 default_color TRUE) nlines 1 max_width 144 label "Class"))))) root_subsystem (object SubSystem "Component View" quid "39C9260C00D7" physical_models (list unit_reference_list (object SubSystem "javax" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2ee_javax.sub" quid "39C9266003D8") (object SubSystem "java" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2se_1_3_java.sub" quid "39C92661002C") (object SubSystem "org" is_unit TRUE is_loaded FALSE file_name "$FRAMEWORK_PATH\\Shared Components\\j2se_1_3_org.sub" quid "39C9268C01C9") (object SubSystem "DB_0" quid "5B1AA85B0069" physical_models (list unit_reference_list (object module "DB_0" "NotAModuleType" "NotAModulePart" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsDatabase" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "DB_0") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "Location" value "") (object Attribute tool "Data Modeler" name "TargetDatabase" value "Oracle 9i")) quid "5B1AA85B006B" stereotype "Database" visible_modules (list dependency_list (object Module_Visibility_Relationship attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value "True") (object Attribute tool "Data Modeler" name "IsTableSpaceDependency" value "True") (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "CodeName" value "")) quid "5B1AA93E014D" supplier "Component View::DB_0::TSP_0" quidu "5B1AA93E0140" supplier_is_spec TRUE)) language "Data Modeler") (object module "TSP_0" "NotAModuleType" "NotAModulePart" attributes (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value TRUE) (object Attribute tool "Data Modeler" name "IsTableSpace" value TRUE) (object Attribute tool "Data Modeler" name "DMName" value "TSP_0") (object Attribute tool "Data Modeler" name "CodeName" value "") (object Attribute tool "Data Modeler" name "DatabaseId" value "5B1AA85B006B") (object Attribute tool "Data Modeler" name "IsDefault" value "False") (object Attribute tool "Data Modeler" name "BufferPool" value "") (object Attribute tool "Data Modeler" name "ExtentSize" value 1) (object Attribute tool "Data Modeler" name "PrefetchSize" value 1) (object Attribute tool "Data Modeler" name "PageSize" value 0) (object Attribute tool "Data Modeler" name "TableSpaceType" value "Permanent") (object Attribute tool "Data Modeler" name "ManagedBy" value "Database") (object Attribute tool "Data Modeler" name "ContainerList" value "")) quid "5B1AA93E0140" stereotype "Tablespace" language "Data Modeler")) physical_presentations (list unit_reference_list))) physical_presentations (list unit_reference_list (object Module_Diagram "Main" quid "39C9261001B6" title "Main" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list))) category "Logical View" quidu "5B1AA7B60127") process_structure (object Processes quid "39C9260C00D8" ProcsNDevs (list (object Process_Diagram "Deployment View" quid "39C9260C00DA" title "Deployment View" zoom 100 max_height 28350 max_width 21600 origin_x 0 origin_y 0 items (list diagram_item_list)))) properties (object Properties attributes (list Attribute_Set (object Attribute tool "CORBA" name "propertyId" value "809135966") (object Attribute tool "CORBA" name "default__Project" value (list Attribute_Set (object Attribute tool "CORBA" name "CreateMissingDirectories" value TRUE) (object Attribute tool "CORBA" name "Editor" value ("EditorType" 100)) (object Attribute tool "CORBA" name "IncludePath" value "") (object Attribute tool "CORBA" name "StopOnError" value TRUE) (object Attribute tool "CORBA" name "EditorType" value (list Attribute_Set (object Attribute tool "CORBA" name "BuiltIn" value 100) (object Attribute tool "CORBA" name "WindowsShell" value 101))) (object Attribute tool "CORBA" name "PathSeparator" value ""))) (object Attribute tool "CORBA" name "default__Class" value (list Attribute_Set (object Attribute tool "CORBA" name "ArrayDimensions" value "") (object Attribute tool "CORBA" name "ConstValue" value "") (object Attribute tool "CORBA" name "ImplementationType" value ""))) (object Attribute tool "CORBA" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "CORBA" name "AdditionalIncludes" value (value Text "")) (object Attribute tool "CORBA" name "CmIdentification" value (value Text " %X% %Q% %Z% %W%")) (object Attribute tool "CORBA" name "CopyrightNotice" value (value Text "")) (object Attribute tool "CORBA" name "InclusionProtectionSymbol" value "AUTO GENERATE"))) (object Attribute tool "CORBA" name "default__Module-Body" value (list Attribute_Set (object Attribute tool "CORBA" name "AdditionalIncludes" value (value Text "")) (object Attribute tool "CORBA" name "CmIdentification" value (value Text " %X% %Q% %Z% %W%")) (object Attribute tool "CORBA" name "CopyrightNotice" value (value Text "")) (object Attribute tool "CORBA" name "InclusionProtectionSymbol" value "AUTO GENERATE"))) (object Attribute tool "CORBA" name "default__Operation" value (list Attribute_Set (object Attribute tool "CORBA" name "Context" value "") (object Attribute tool "CORBA" name "OperationIsOneWay" value FALSE))) (object Attribute tool "CORBA" name "default__Attribute" value (list Attribute_Set (object Attribute tool "CORBA" name "ArrayDimensions" value "") (object Attribute tool "CORBA" name "CaseSpecifier" value "") (object Attribute tool "CORBA" name "IsReadOnly" value FALSE) (object Attribute tool "CORBA" name "Order" value ""))) (object Attribute tool "CORBA" name "default__Role" value (list Attribute_Set (object Attribute tool "CORBA" name "ArrayDimensions" value "") (object Attribute tool "CORBA" name "CaseSpecifier" value "") (object Attribute tool "CORBA" name "GenerateForwardReference" value FALSE) (object Attribute tool "CORBA" name "IsReadOnly" value FALSE) (object Attribute tool "CORBA" name "Order" value "") (object Attribute tool "CORBA" name "BoundedRoleType" value ("AssocTypeSet" 47)) (object Attribute tool "CORBA" name "AssocTypeSet" value (list Attribute_Set (object Attribute tool "CORBA" name "Array" value 24) (object Attribute tool "CORBA" name "Sequence" value 47))))) (object Attribute tool "CORBA" name "default__Uses" value (list Attribute_Set (object Attribute tool "CORBA" name "GenerateForwardReference" value FALSE))) (object Attribute tool "CORBA" name "HiddenTool" value FALSE) (object Attribute tool "Data Modeler" name "propertyId" value "809135966") (object Attribute tool "Data Modeler" name "default__Project" value (list Attribute_Set (object Attribute tool "Data Modeler" name "project" value "") (object Attribute tool "Data Modeler" name "TableCounter" value 0) (object Attribute tool "Data Modeler" name "DomainCounter" value 0) (object Attribute tool "Data Modeler" name "SPPackageCounter" value 0) (object Attribute tool "Data Modeler" name "TriggerCounter" value 0) (object Attribute tool "Data Modeler" name "IndexCounter" value 0) (object Attribute tool "Data Modeler" name "ConstraintCounter" value 0) (object Attribute tool "Data Modeler" name "StoreProcedureCounter" value 0) (object Attribute tool "Data Modeler" name "PrimaryKeyCounter" value 0) (object Attribute tool "Data Modeler" name "ForeignKeyCounter" value 0) (object Attribute tool "Data Modeler" name "TablePrefix" value "") (object Attribute tool "Data Modeler" name "DomainPrefix" value "") (object Attribute tool "Data Modeler" name "TriggerPrefix" value "") (object Attribute tool "Data Modeler" name "IndexPrefix" value "") (object Attribute tool "Data Modeler" name "ConstraintPrefix" value "") (object Attribute tool "Data Modeler" name "StoreProcedurePrefix" value "") (object Attribute tool "Data Modeler" name "PrimaryKeyPrefix" value "") (object Attribute tool "Data Modeler" name "ForeignKeyPrefix" value "") (object Attribute tool "Data Modeler" name "ViewCounter" value 0) (object Attribute tool "Data Modeler" name "JoinCounter" value 0) (object Attribute tool "Data Modeler" name "TableSpaceCounter" value 0) (object Attribute tool "Data Modeler" name "cONTAINERCounter" value 0) (object Attribute tool "Data Modeler" name "ViewPrefix" value "") (object Attribute tool "Data Modeler" name "TableSpacePrefix" value ""))) (object Attribute tool "Data Modeler" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "IsDatabase" value FALSE) (object Attribute tool "Data Modeler" name "TargetDatabase" value "") (object Attribute tool "Data Modeler" name "Location" value "") (object Attribute tool "Data Modeler" name "IsTableSpace" value FALSE) (object Attribute tool "Data Modeler" name "TableSpaceType" value "") (object Attribute tool "Data Modeler" name "IsDeault" value FALSE) (object Attribute tool "Data Modeler" name "BufferPool" value "") (object Attribute tool "Data Modeler" name "ExtentSize" value 1) (object Attribute tool "Data Modeler" name "PrefetchSize" value 1) (object Attribute tool "Data Modeler" name "PageSize" value 4) (object Attribute tool "Data Modeler" name "ManagedBy" value "") (object Attribute tool "Data Modeler" name "ContainerList" value ""))) (object Attribute tool "Data Modeler" name "default__Category" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "dmSchema" value "") (object Attribute tool "Data Modeler" name "dmDomainPackage" value "") (object Attribute tool "Data Modeler" name "IsSchema" value FALSE) (object Attribute tool "Data Modeler" name "IsDomainPackage" value FALSE) (object Attribute tool "Data Modeler" name "IsRootSchema" value FALSE) (object Attribute tool "Data Modeler" name "IsRootDomainPackage" value FALSE) (object Attribute tool "Data Modeler" name "IsSchemaPackage" value FALSE) (object Attribute tool "Data Modeler" name "DatabaseID" value "") (object Attribute tool "Data Modeler" name "DBMS" value ""))) (object Attribute tool "Data Modeler" name "default__Class" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "IsTable" value FALSE) (object Attribute tool "Data Modeler" name "IsView" value FALSE) (object Attribute tool "Data Modeler" name "IsDomain" value FALSE) (object Attribute tool "Data Modeler" name "IsSPPackage" value FALSE) (object Attribute tool "Data Modeler" name "Synonymns" value "") (object Attribute tool "Data Modeler" name "TableSpace" value "") (object Attribute tool "Data Modeler" name "SourceId" value "") (object Attribute tool "Data Modeler" name "SourceType" value "") (object Attribute tool "Data Modeler" name "SelectClause" value "") (object Attribute tool "Data Modeler" name "IsUpdatable" value FALSE) (object Attribute tool "Data Modeler" name "CheckOption" value "None") (object Attribute tool "Data Modeler" name "PersistToServer" value "") (object Attribute tool "Data Modeler" name "TableSpaceID" value "") (object Attribute tool "Data Modeler" name "CorrelationName" value "") (object Attribute tool "Data Modeler" name "IsUpdateable" value TRUE) (object Attribute tool "Data Modeler" name "IsSnapShot" value FALSE) (object Attribute tool "Data Modeler" name "IsDistinct" value FALSE) (object Attribute tool "Data Modeler" name "IsPackage" value FALSE))) (object Attribute tool "Data Modeler" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "Ordinal" value 0) (object Attribute tool "Data Modeler" name "IsIdentity" value FALSE) (object Attribute tool "Data Modeler" name "IsUnique" value FALSE) (object Attribute tool "Data Modeler" name "NullsAllowed" value FALSE) (object Attribute tool "Data Modeler" name "DataTypeName" value "") (object Attribute tool "Data Modeler" name "Length" value 0) (object Attribute tool "Data Modeler" name "Scale" value 0) (object Attribute tool "Data Modeler" name "ColumnType" value "Native") (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "DefaultValueType" value "") (object Attribute tool "Data Modeler" name "DefaultValue" value "") (object Attribute tool "Data Modeler" name "SourceId" value "") (object Attribute tool "Data Modeler" name "SourceType" value "") (object Attribute tool "Data Modeler" name "OID" value FALSE))) (object Attribute tool "Data Modeler" name "default__Association" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "IsRelationship" value FALSE) (object Attribute tool "Data Modeler" name "SourceId" value "") (object Attribute tool "Data Modeler" name "SourceType" value "") (object Attribute tool "Data Modeler" name "RIMethod" value "") (object Attribute tool "Data Modeler" name "ParentUpdateRule" value "") (object Attribute tool "Data Modeler" name "ParentUpdateRuleName" value "") (object Attribute tool "Data Modeler" name "ParentDeleteRule" value "") (object Attribute tool "Data Modeler" name "ParentDeleteRuleName" value "") (object Attribute tool "Data Modeler" name "ChildInsertRestrict" value FALSE) (object Attribute tool "Data Modeler" name "ChildInsertRestrictName" value "") (object Attribute tool "Data Modeler" name "ChildMultiplicity" value FALSE) (object Attribute tool "Data Modeler" name "ChildMultiplicityName" value ""))) (object Attribute tool "Data Modeler" name "default__Role" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "ConstraintName" value ""))) (object Attribute tool "Data Modeler" name "default__Operation" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "IsConstraint" value FALSE) (object Attribute tool "Data Modeler" name "ConstraintType" value "") (object Attribute tool "Data Modeler" name "IsIndex" value FALSE) (object Attribute tool "Data Modeler" name "IsTrigger" value FALSE) (object Attribute tool "Data Modeler" name "IsStoredProcedure" value FALSE) (object Attribute tool "Data Modeler" name "IsCluster" value FALSE) (object Attribute tool "Data Modeler" name "TableSpace" value "") (object Attribute tool "Data Modeler" name "FillFactor" value 0) (object Attribute tool "Data Modeler" name "KeyList" value "") (object Attribute tool "Data Modeler" name "CheckPredicate" value "") (object Attribute tool "Data Modeler" name "IsUnique" value FALSE) (object Attribute tool "Data Modeler" name "DeferalMode" value "") (object Attribute tool "Data Modeler" name "InitialCheckTime" value "") (object Attribute tool "Data Modeler" name "TriggerType" value "") (object Attribute tool "Data Modeler" name "IsInsertEvent" value FALSE) (object Attribute tool "Data Modeler" name "IsUpdateEvent" value FALSE) (object Attribute tool "Data Modeler" name "IsDeleteEvent" value FALSE) (object Attribute tool "Data Modeler" name "RefOldTable" value "") (object Attribute tool "Data Modeler" name "RefNewTable" value "") (object Attribute tool "Data Modeler" name "RefOldRow" value "") (object Attribute tool "Data Modeler" name "RefNewRow" value "") (object Attribute tool "Data Modeler" name "IsRow" value FALSE) (object Attribute tool "Data Modeler" name "WhenClause" value "") (object Attribute tool "Data Modeler" name "Language" value "SQL") (object Attribute tool "Data Modeler" name "ProcType" value "Procedure") (object Attribute tool "Data Modeler" name "IsDeterministic" value FALSE) (object Attribute tool "Data Modeler" name "ParameterStyle" value "") (object Attribute tool "Data Modeler" name "ReturnedNull" value FALSE) (object Attribute tool "Data Modeler" name "ExternalName" value "") (object Attribute tool "Data Modeler" name "ReturnTypeName" value "") (object Attribute tool "Data Modeler" name "Length" value "") (object Attribute tool "Data Modeler" name "Scale" value "") (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "DefaultValue" value "") (object Attribute tool "Data Modeler" name "DefaultValueType" value ""))) (object Attribute tool "Data Modeler" name "default__Parameter" value (list Attribute_Set (object Attribute tool "Data Modeler" name "dmItem" value FALSE) (object Attribute tool "Data Modeler" name "DMName" value "") (object Attribute tool "Data Modeler" name "IsInParameter" value TRUE) (object Attribute tool "Data Modeler" name "IsOutParameter" value FALSE) (object Attribute tool "Data Modeler" name "Ordinal" value "") (object Attribute tool "Data Modeler" name "DataTypeName" value "") (object Attribute tool "Data Modeler" name "Length" value "") (object Attribute tool "Data Modeler" name "Scale" value "") (object Attribute tool "Data Modeler" name "ForBitData" value FALSE) (object Attribute tool "Data Modeler" name "DefaultValueType" value "") (object Attribute tool "Data Modeler" name "DefaultValue" value "") (object Attribute tool "Data Modeler" name "OperationID" value ""))) (object Attribute tool "Data Modeler" name "HiddenTool" value FALSE) (object Attribute tool "Data Modeler Communicator" name "HiddenTool" value FALSE) (object Attribute tool "framework" name "HiddenTool" value FALSE) (object Attribute tool "Java" name "propertyId" value "809135966") (object Attribute tool "Java" name "default__Project" value (list Attribute_Set (object Attribute tool "Java" name "RootDir" value "") (object Attribute tool "Java" name "CreateMissingDirectories" value TRUE) (object Attribute tool "Java" name "StopOnError" value FALSE) (object Attribute tool "Java" name "UsePrefixes" value FALSE) (object Attribute tool "Java" name "AutoSync" value FALSE) (object Attribute tool "Java" name "ShowCodegenDlg" value FALSE) (object Attribute tool "Java" name "JavadocDefaultAuthor" value "") (object Attribute tool "Java" name "JavadocDefaultVersion" value "") (object Attribute tool "Java" name "JavadocDefaultSince" value "") (object Attribute tool "Java" name "JavadocNumAsterisks" value 0) (object Attribute tool "Java" name "MaxNumChars" value 80) (object Attribute tool "Java" name "Editor" value ("EditorType" 100)) (object Attribute tool "Java" name "VM" value ("VMType" 200)) (object Attribute tool "Java" name "ClassPath" value "") (object Attribute tool "Java" name "EditorType" value (list Attribute_Set (object Attribute tool "Java" name "BuiltIn" value 100))) (object Attribute tool "Java" name "VMType" value (list Attribute_Set (object Attribute tool "Java" name "Sun" value 200))) (object Attribute tool "Java" name "InstanceVariablePrefix" value "") (object Attribute tool "Java" name "ClassVariablePrefix" value "") (object Attribute tool "Java" name "DefaultAttributeDataType" value "int") (object Attribute tool "Java" name "DefaultOperationReturnType" value "void") (object Attribute tool "Java" name "NoClassCustomDlg" value FALSE) (object Attribute tool "Java" name "GlobalImports" value (value Text "")) (object Attribute tool "Java" name "OpenBraceClassStyle" value TRUE) (object Attribute tool "Java" name "OpenBraceMethodStyle" value TRUE) (object Attribute tool "Java" name "UseTabs" value FALSE) (object Attribute tool "Java" name "UseSpaces" value TRUE) (object Attribute tool "Java" name "SpacingItems" value 3) (object Attribute tool "Java" name "RoseDefaultCommentStyle" value TRUE) (object Attribute tool "Java" name "AsteriskCommentStyle" value TRUE) (object Attribute tool "Java" name "JavaCommentStyle" value TRUE) (object Attribute tool "Java" name "JavadocAuthor" value FALSE) (object Attribute tool "Java" name "JavadocSince" value FALSE) (object Attribute tool "Java" name "JavadocVersion" value FALSE) (object Attribute tool "Java" name "FundamentalType" value "boolean; char; byte; short; int; long; float; double; Boolean; Byte; Character; Double; Float; Integer; Long; Object; Short; String; StringBuffer; Void; java.math.BigDecimal; java.math.BigInteger; java.sql.Date; java.sql.Time; java.sql.Timestamp; java.util.AbstractCollection; java.util.AbstractList;java.util.AbstractMap; java.util.AbstractSequentialList; java.util.AbstractSet; java.util.ArrayList; java.util.Arrays; java.util.BitSet; java.util.Calendar; java.util.Collections; java.util.Date; java.util.Date; java.util.Dictionary; java.util.EventObject; java.util.GregorianCalendar; java.util.HashMap; java.util.HashSet; java.util.Hashtable; java.util.LinkedList; java.util.ListResourceBundle; java.util.Locale; java.util.Observable; java.util.Properties; java.util.PropertyPermission; java.util.PropertyResourceBundle; java.util.Random; java.util.ResourceBundle; java.util.SimpleTimeZone; java.util.Stack; java.util.StringTokenizer; java.util.Timer; java.util.TimerTask; java.util.TimeZone; java.util.TreeMap; java.util.TreeSet; java.util.Vector; java.util.WeakHashMap") (object Attribute tool "Java" name "NotShowRoseIDDlg" value FALSE) (object Attribute tool "Java" name "GenerateRoseID" value TRUE) (object Attribute tool "Java" name "GenerateDefaultJ2EEJavadoc" value TRUE) (object Attribute tool "Java" name "GenerateDefaultReturnLine" value TRUE) (object Attribute tool "Java" name "UserDefineJavaDocTags" value "") (object Attribute tool "Java" name "ReferenceClasspath" value "") (object Attribute tool "Java" name "VAJavaWorkingFolder" value "") (object Attribute tool "Java" name "BeanPrefix" value "") (object Attribute tool "Java" name "BeanSuffix" value "") (object Attribute tool "Java" name "RemotePrefix" value "") (object Attribute tool "Java" name "RemoteSuffix" value "") (object Attribute tool "Java" name "HomePrefix" value "") (object Attribute tool "Java" name "HomeSuffix" value "") (object Attribute tool "Java" name "LocalPrefix" value "") (object Attribute tool "Java" name "LocalSuffix" value "") (object Attribute tool "Java" name "LocalHomePrefix" value "") (object Attribute tool "Java" name "LocalHomeSuffix" value "") (object Attribute tool "Java" name "PrimaryKeyPrefix" value "") (object Attribute tool "Java" name "PrimaryKeySuffix" value "") (object Attribute tool "Java" name "EJBDTDLocation" value "") (object Attribute tool "Java" name "ServletDTDLocation" value "") (object Attribute tool "Java" name "DefaultEJBVersion" value "") (object Attribute tool "Java" name "DefaultServletVersion" value "") (object Attribute tool "Java" name "SourceControl" value FALSE) (object Attribute tool "Java" name "SCCSelected" value FALSE) (object Attribute tool "Java" name "SCCProjectSourceRoot" value "") (object Attribute tool "Java" name "SCCProjectName" value "") (object Attribute tool "Java" name "SCCComment" value FALSE))) (object Attribute tool "Java" name "default__Class" value (list Attribute_Set (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Static" value FALSE) (object Attribute tool "Java" name "GenerateDefaultConstructor" value TRUE) (object Attribute tool "Java" name "ConstructorIs" value ("Ctor_Set" 62)) (object Attribute tool "Java" name "Ctor_Set" value (list Attribute_Set (object Attribute tool "Java" name "public" value 62) (object Attribute tool "Java" name "protected" value 63) (object Attribute tool "Java" name "private" value 64) (object Attribute tool "Java" name "package" value 65))) (object Attribute tool "Java" name "GenerateFinalizer" value FALSE) (object Attribute tool "Java" name "GenerateStaticInitializer" value FALSE) (object Attribute tool "Java" name "GenerateInstanceInitializer" value FALSE) (object Attribute tool "Java" name "GenerateCode" value TRUE) (object Attribute tool "Java" name "DisableAutoSync" value FALSE) (object Attribute tool "Java" name "ReadOnly" value FALSE) (object Attribute tool "Java" name "Strictfp" value FALSE) (object Attribute tool "Java" name "ServletName" value "") (object Attribute tool "Java" name "ServletContextRef" value FALSE) (object Attribute tool "Java" name "IsSingleThread" value FALSE) (object Attribute tool "Java" name "ServletInitParameter" value "") (object Attribute tool "Java" name "ServletInitParameterNames" value FALSE) (object Attribute tool "Java" name "ServletIsSecure" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcher" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcherPath" value "") (object Attribute tool "Java" name "DispatcherInclude" value FALSE) (object Attribute tool "Java" name "DispatcherForward" value FALSE) (object Attribute tool "Java" name "ServletSecurityRoles" value "") (object Attribute tool "Java" name "ServletgetInfo" value "") (object Attribute tool "Java" name "ServletXMLFilePath" value "") (object Attribute tool "Java" name "Generate_XML_DD" value TRUE) (object Attribute tool "Java" name "EJBCmpField" value "") (object Attribute tool "Java" name "EJBEnvironmentProperties" value "") (object Attribute tool "Java" name "EJBCnxFactory" value "") (object Attribute tool "Java" name "EJBReferences" value "") (object Attribute tool "Java" name "EJBSecurityRoles" value "") (object Attribute tool "Java" name "EJBNameInJAR" value "") (object Attribute tool "Java" name "EJBSessionType" value ("EJBSessionType_Set" 200)) (object Attribute tool "Java" name "EJBSessionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 200) (object Attribute tool "Java" name "Stateless" value 201) (object Attribute tool "Java" name "Stateful" value 202))) (object Attribute tool "Java" name "EJBTransactionType" value ("EJBTransactionType_Set" 211)) (object Attribute tool "Java" name "EJBTransactionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "Container" value 211) (object Attribute tool "Java" name "Bean" value 212))) (object Attribute tool "Java" name "EJBPersistenceType" value ("EJBPersistenceType_Set" 220)) (object Attribute tool "Java" name "EJBPersistenceType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 220) (object Attribute tool "Java" name "Bean" value 221) (object Attribute tool "Java" name "Container" value 222))) (object Attribute tool "Java" name "EJBReentrant" value FALSE) (object Attribute tool "Java" name "EJBSessionSync" value FALSE) (object Attribute tool "Java" name "EJBVersion" value ("EJBVersion_Set" 230)) (object Attribute tool "Java" name "EJBVersion_Set" value (list Attribute_Set (object Attribute tool "Java" name "2.0" value 230) (object Attribute tool "Java" name "1.x" value 231))) (object Attribute tool "Java" name "EJBXMLFilePath" value ""))) (object Attribute tool "Java" name "Default_Servlet__Class" value (list Attribute_Set (object Attribute tool "Java" name "ServletName" value "") (object Attribute tool "Java" name "ServletContextRef" value FALSE) (object Attribute tool "Java" name "IsSingleThread" value FALSE) (object Attribute tool "Java" name "ServletInitParameter" value "") (object Attribute tool "Java" name "ServletInitParameterNames" value FALSE) (object Attribute tool "Java" name "ServletIsSecure" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcher" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcherPath" value "") (object Attribute tool "Java" name "DispatcherInclude" value FALSE) (object Attribute tool "Java" name "DispatcherForward" value FALSE) (object Attribute tool "Java" name "ServletSecurityRoles" value "") (object Attribute tool "Java" name "ServletgetInfo" value "") (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Static" value FALSE) (object Attribute tool "Java" name "GenerateDefaultConstructor" value TRUE) (object Attribute tool "Java" name "ConstructorIs" value ("Ctor_Set" 62)) (object Attribute tool "Java" name "Ctor_Set" value (list Attribute_Set (object Attribute tool "Java" name "public" value 62) (object Attribute tool "Java" name "protected" value 63) (object Attribute tool "Java" name "private" value 64) (object Attribute tool "Java" name "package" value 65))) (object Attribute tool "Java" name "GenerateFinalizer" value FALSE) (object Attribute tool "Java" name "GenerateStaticInitializer" value FALSE) (object Attribute tool "Java" name "GenerateInstanceInitializer" value FALSE) (object Attribute tool "Java" name "GenerateCode" value TRUE) (object Attribute tool "Java" name "DisableAutoSync" value FALSE) (object Attribute tool "Java" name "ReadOnly" value FALSE) (object Attribute tool "Java" name "Strictfp" value FALSE) (object Attribute tool "Java" name "ServletXMLFilePath" value "") (object Attribute tool "Java" name "Generate_XML_DD" value TRUE) (object Attribute tool "Java" name "EJBCmpField" value "") (object Attribute tool "Java" name "EJBEnvironmentProperties" value "") (object Attribute tool "Java" name "EJBCnxFactory" value "") (object Attribute tool "Java" name "EJBReferences" value "") (object Attribute tool "Java" name "EJBSecurityRoles" value "") (object Attribute tool "Java" name "EJBNameInJAR" value "") (object Attribute tool "Java" name "EJBSessionType" value ("EJBSessionType_Set" 200)) (object Attribute tool "Java" name "EJBSessionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 200) (object Attribute tool "Java" name "Stateless" value 201) (object Attribute tool "Java" name "Stateful" value 202))) (object Attribute tool "Java" name "EJBTransactionType" value ("EJBTransactionType_Set" 211)) (object Attribute tool "Java" name "EJBTransactionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "Container" value 211) (object Attribute tool "Java" name "Bean" value 212))) (object Attribute tool "Java" name "EJBPersistenceType" value ("EJBPersistenceType_Set" 220)) (object Attribute tool "Java" name "EJBPersistenceType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 220) (object Attribute tool "Java" name "Bean" value 221) (object Attribute tool "Java" name "Container" value 222))) (object Attribute tool "Java" name "EJBReentrant" value FALSE) (object Attribute tool "Java" name "EJBSessionSync" value FALSE) (object Attribute tool "Java" name "EJBVersion" value ("EJBVersion_Set" 230)) (object Attribute tool "Java" name "EJBVersion_Set" value (list Attribute_Set (object Attribute tool "Java" name "2.0" value 230) (object Attribute tool "Java" name "1.x" value 231))) (object Attribute tool "Java" name "EJBXMLFilePath" value ""))) (object Attribute tool "Java" name "Http_Servlet__Class" value (list Attribute_Set (object Attribute tool "Java" name "ServletRequestAttribute" value "") (object Attribute tool "Java" name "ServletRequestAttributesNames" value FALSE) (object Attribute tool "Java" name "MethodForRequestAttributes" value "") (object Attribute tool "Java" name "ServletRequestParameter" value "") (object Attribute tool "Java" name "ServletRequestParameterNames" value FALSE) (object Attribute tool "Java" name "MethodForRequestParameters" value "") (object Attribute tool "Java" name "ServletHeader" value "") (object Attribute tool "Java" name "ServletHeaderNames" value FALSE) (object Attribute tool "Java" name "MethodForHeaders" value "") (object Attribute tool "Java" name "ServletIntHeader" value FALSE) (object Attribute tool "Java" name "ServletDateHeader" value FALSE) (object Attribute tool "Java" name "ServletCookie" value FALSE) (object Attribute tool "Java" name "MethodForCookie" value "") (object Attribute tool "Java" name "ServletContentType" value "") (object Attribute tool "Java" name "GenerateHTML" value FALSE) (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Static" value FALSE) (object Attribute tool "Java" name "GenerateDefaultConstructor" value TRUE) (object Attribute tool "Java" name "ConstructorIs" value ("Ctor_Set" 62)) (object Attribute tool "Java" name "Ctor_Set" value (list Attribute_Set (object Attribute tool "Java" name "public" value 62) (object Attribute tool "Java" name "protected" value 63) (object Attribute tool "Java" name "private" value 64) (object Attribute tool "Java" name "package" value 65))) (object Attribute tool "Java" name "GenerateFinalizer" value FALSE) (object Attribute tool "Java" name "GenerateStaticInitializer" value FALSE) (object Attribute tool "Java" name "GenerateInstanceInitializer" value FALSE) (object Attribute tool "Java" name "GenerateCode" value TRUE) (object Attribute tool "Java" name "DisableAutoSync" value FALSE) (object Attribute tool "Java" name "ReadOnly" value FALSE) (object Attribute tool "Java" name "Strictfp" value FALSE) (object Attribute tool "Java" name "ServletName" value "") (object Attribute tool "Java" name "ServletContextRef" value FALSE) (object Attribute tool "Java" name "IsSingleThread" value FALSE) (object Attribute tool "Java" name "ServletInitParameter" value "") (object Attribute tool "Java" name "ServletInitParameterNames" value FALSE) (object Attribute tool "Java" name "ServletIsSecure" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcher" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcherPath" value "") (object Attribute tool "Java" name "DispatcherInclude" value FALSE) (object Attribute tool "Java" name "DispatcherForward" value FALSE) (object Attribute tool "Java" name "ServletSecurityRoles" value "") (object Attribute tool "Java" name "ServletgetInfo" value "") (object Attribute tool "Java" name "ServletXMLFilePath" value "") (object Attribute tool "Java" name "Generate_XML_DD" value TRUE) (object Attribute tool "Java" name "EJBCmpField" value "") (object Attribute tool "Java" name "EJBEnvironmentProperties" value "") (object Attribute tool "Java" name "EJBCnxFactory" value "") (object Attribute tool "Java" name "EJBReferences" value "") (object Attribute tool "Java" name "EJBSecurityRoles" value "") (object Attribute tool "Java" name "EJBNameInJAR" value "") (object Attribute tool "Java" name "EJBSessionType" value ("EJBSessionType_Set" 200)) (object Attribute tool "Java" name "EJBSessionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 200) (object Attribute tool "Java" name "Stateless" value 201) (object Attribute tool "Java" name "Stateful" value 202))) (object Attribute tool "Java" name "EJBTransactionType" value ("EJBTransactionType_Set" 211)) (object Attribute tool "Java" name "EJBTransactionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "Container" value 211) (object Attribute tool "Java" name "Bean" value 212))) (object Attribute tool "Java" name "EJBPersistenceType" value ("EJBPersistenceType_Set" 220)) (object Attribute tool "Java" name "EJBPersistenceType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 220) (object Attribute tool "Java" name "Bean" value 221) (object Attribute tool "Java" name "Container" value 222))) (object Attribute tool "Java" name "EJBReentrant" value FALSE) (object Attribute tool "Java" name "EJBSessionSync" value FALSE) (object Attribute tool "Java" name "EJBVersion" value ("EJBVersion_Set" 230)) (object Attribute tool "Java" name "EJBVersion_Set" value (list Attribute_Set (object Attribute tool "Java" name "2.0" value 230) (object Attribute tool "Java" name "1.x" value 231))) (object Attribute tool "Java" name "EJBXMLFilePath" value ""))) (object Attribute tool "Java" name "Default_EJB__Class" value (list Attribute_Set (object Attribute tool "Java" name "Generate_XML_DD" value TRUE) (object Attribute tool "Java" name "EJBCmpField" value "") (object Attribute tool "Java" name "EJBEnvironmentProperties" value "") (object Attribute tool "Java" name "EJBCnxFactory" value "") (object Attribute tool "Java" name "EJBReferences" value "") (object Attribute tool "Java" name "EJBSecurityRoles" value "") (object Attribute tool "Java" name "EJBNameInJAR" value "") (object Attribute tool "Java" name "EJBSessionType" value ("EJBSessionType_Set" 200)) (object Attribute tool "Java" name "EJBSessionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 200) (object Attribute tool "Java" name "Stateless" value 201) (object Attribute tool "Java" name "Stateful" value 202))) (object Attribute tool "Java" name "EJBTransactionType" value ("EJBTransactionType_Set" 211)) (object Attribute tool "Java" name "EJBTransactionType_Set" value (list Attribute_Set (object Attribute tool "Java" name "Container" value 211) (object Attribute tool "Java" name "Bean" value 212))) (object Attribute tool "Java" name "EJBPersistenceType" value ("EJBPersistenceType_Set" 220)) (object Attribute tool "Java" name "EJBPersistenceType_Set" value (list Attribute_Set (object Attribute tool "Java" name "" value 220) (object Attribute tool "Java" name "Bean" value 221) (object Attribute tool "Java" name "Container" value 222))) (object Attribute tool "Java" name "EJBReentrant" value FALSE) (object Attribute tool "Java" name "BMP_Extend_CMP" value FALSE) (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Static" value FALSE) (object Attribute tool "Java" name "GenerateDefaultConstructor" value TRUE) (object Attribute tool "Java" name "ConstructorIs" value ("Ctor_Set" 62)) (object Attribute tool "Java" name "Ctor_Set" value (list Attribute_Set (object Attribute tool "Java" name "public" value 62) (object Attribute tool "Java" name "protected" value 63) (object Attribute tool "Java" name "private" value 64) (object Attribute tool "Java" name "package" value 65))) (object Attribute tool "Java" name "GenerateFinalizer" value FALSE) (object Attribute tool "Java" name "GenerateStaticInitializer" value FALSE) (object Attribute tool "Java" name "GenerateInstanceInitializer" value FALSE) (object Attribute tool "Java" name "GenerateCode" value TRUE) (object Attribute tool "Java" name "DisableAutoSync" value FALSE) (object Attribute tool "Java" name "ReadOnly" value FALSE) (object Attribute tool "Java" name "Strictfp" value FALSE) (object Attribute tool "Java" name "ServletName" value "") (object Attribute tool "Java" name "ServletContextRef" value FALSE) (object Attribute tool "Java" name "IsSingleThread" value FALSE) (object Attribute tool "Java" name "ServletInitParameter" value "") (object Attribute tool "Java" name "ServletInitParameterNames" value FALSE) (object Attribute tool "Java" name "ServletIsSecure" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcher" value FALSE) (object Attribute tool "Java" name "ServletRequestDispatcherPath" value "") (object Attribute tool "Java" name "DispatcherInclude" value FALSE) (object Attribute tool "Java" name "DispatcherForward" value FALSE) (object Attribute tool "Java" name "ServletSecurityRoles" value "") (object Attribute tool "Java" name "ServletgetInfo" value "") (object Attribute tool "Java" name "ServletXMLFilePath" value "") (object Attribute tool "Java" name "EJBSessionSync" value FALSE) (object Attribute tool "Java" name "EJBVersion" value ("EJBVersion_Set" 230)) (object Attribute tool "Java" name "EJBVersion_Set" value (list Attribute_Set (object Attribute tool "Java" name "2.0" value 230) (object Attribute tool "Java" name "1.x" value 231))) (object Attribute tool "Java" name "EJBXMLFilePath" value ""))) (object Attribute tool "Java" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Java" name "CmIdentification" value (value Text "")) (object Attribute tool "Java" name "CopyrightNotice" value (value Text "")))) (object Attribute tool "Java" name "default__Module-Body" value (list Attribute_Set (object Attribute tool "Java" name "CmIdentification" value (value Text "")) (object Attribute tool "Java" name "CopyrightNotice" value (value Text "")))) (object Attribute tool "Java" name "default__Operation" value (list Attribute_Set (object Attribute tool "Java" name "Abstract" value FALSE) (object Attribute tool "Java" name "Static" value FALSE) (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Native" value FALSE) (object Attribute tool "Java" name "Synchronized" value FALSE) (object Attribute tool "Java" name "GenerateFullyQualifiedReturn" value FALSE) (object Attribute tool "Java" name "ReplaceExistingCode" value TRUE) (object Attribute tool "Java" name "Strictfp" value FALSE))) (object Attribute tool "Java" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Transient" value FALSE) (object Attribute tool "Java" name "Volatile" value FALSE) (object Attribute tool "Java" name "PropertyType" value ("BeanProperty_Set" 71)) (object Attribute tool "Java" name "BeanProperty_Set" value (list Attribute_Set (object Attribute tool "Java" name "Not A Property" value 71) (object Attribute tool "Java" name "Simple" value 72) (object Attribute tool "Java" name "Bound" value 73) (object Attribute tool "Java" name "Constrained" value 74))) (object Attribute tool "Java" name "IndividualChangeMgt" value FALSE) (object Attribute tool "Java" name "Read/Write" value ("Read/Write_Set" 81)) (object Attribute tool "Java" name "Read/Write_Set" value (list Attribute_Set (object Attribute tool "Java" name "Read & Write" value 81) (object Attribute tool "Java" name "Read Only" value 82) (object Attribute tool "Java" name "Write Only" value 83))) (object Attribute tool "Java" name "GenerateFullyQualifiedTypes" value FALSE))) (object Attribute tool "Java" name "default__Role" value (list Attribute_Set (object Attribute tool "Java" name "ContainerClass" value "") (object Attribute tool "Java" name "InitialValue" value "") (object Attribute tool "Java" name "Final" value FALSE) (object Attribute tool "Java" name "Transient" value FALSE) (object Attribute tool "Java" name "Volatile" value FALSE) (object Attribute tool "Java" name "PropertyType" value ("BeanProperty_Set" 71)) (object Attribute tool "Java" name "BeanProperty_Set" value (list Attribute_Set (object Attribute tool "Java" name "Not A Property" value 71) (object Attribute tool "Java" name "Simple" value 72) (object Attribute tool "Java" name "Bound" value 73) (object Attribute tool "Java" name "Constrained" value 74))) (object Attribute tool "Java" name "IndividualChangeMgt" value FALSE) (object Attribute tool "Java" name "Read/Write" value ("Read/Write_Set" 81)) (object Attribute tool "Java" name "Read/Write_Set" value (list Attribute_Set (object Attribute tool "Java" name "Read & Write" value 81) (object Attribute tool "Java" name "Read Only" value 82) (object Attribute tool "Java" name "Write Only" value 83))) (object Attribute tool "Java" name "GenerateFullyQualifiedTypes" value FALSE) (object Attribute tool "Java" name "IsNavigable" value TRUE))) (object Attribute tool "Java" name "HiddenTool" value FALSE) (object Attribute tool "R2Editor" name "HiddenTool" value FALSE) (object Attribute tool "Rose Web Publisher" name "HiddenTool" value FALSE) (object Attribute tool "COM" name "propertyId" value "783606378") (object Attribute tool "COM" name "default__Class" value (list Attribute_Set (object Attribute tool "COM" name "TypeKinds" value (list Attribute_Set (object Attribute tool "COM" name "enum" value 100) (object Attribute tool "COM" name "record" value 101) (object Attribute tool "COM" name "module" value 102) (object Attribute tool "COM" name "interface" value 103) (object Attribute tool "COM" name "dispinterface" value 104) (object Attribute tool "COM" name "coclass" value 105) (object Attribute tool "COM" name "alias" value 106) (object Attribute tool "COM" name "union" value 107) (object Attribute tool "COM" name "max" value 108) (object Attribute tool "COM" name "(none)" value 109))) (object Attribute tool "COM" name "Generate" value TRUE) (object Attribute tool "COM" name "kind" value ("TypeKinds" 109)) (object Attribute tool "COM" name "uuid" value "") (object Attribute tool "COM" name "version" value "") (object Attribute tool "COM" name "helpstring" value "") (object Attribute tool "COM" name "helpcontext" value "") (object Attribute tool "COM" name "attributes" value "") (object Attribute tool "COM" name "dllname" value "") (object Attribute tool "COM" name "alias" value ""))) (object Attribute tool "COM" name "default__Operation" value (list Attribute_Set (object Attribute tool "COM" name "Generate" value TRUE) (object Attribute tool "COM" name "id" value "") (object Attribute tool "COM" name "helpstring" value "") (object Attribute tool "COM" name "attributes" value ""))) (object Attribute tool "COM" name "default__Attribute" value (list Attribute_Set (object Attribute tool "COM" name "Generate" value TRUE) (object Attribute tool "COM" name "id" value "") (object Attribute tool "COM" name "helpstring" value "") (object Attribute tool "COM" name "attributes" value ""))) (object Attribute tool "COM" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "COM" name "Generate" value TRUE) (object Attribute tool "COM" name "filename" value "") (object Attribute tool "COM" name "library" value "") (object Attribute tool "COM" name "uuid" value "") (object Attribute tool "COM" name "version" value "") (object Attribute tool "COM" name "helpstring" value "") (object Attribute tool "COM" name "helpfile" value "") (object Attribute tool "COM" name "helpcontext" value "") (object Attribute tool "COM" name "lcid" value "") (object Attribute tool "COM" name "attributes" value ""))) (object Attribute tool "COM" name "default__Param" value (list Attribute_Set (object Attribute tool "COM" name "attributes" value ""))) (object Attribute tool "COM" name "HiddenTool" value FALSE) (object Attribute tool "VC++" name "propertyId" value "809135966") (object Attribute tool "VC++" name "default__Project" value (list Attribute_Set (object Attribute tool "VC++" name "UpdateATL" value TRUE) (object Attribute tool "VC++" name "SmartPointersOnAssoc" value TRUE) (object Attribute tool "VC++" name "GenerateImports" value TRUE) (object Attribute tool "VC++" name "PutImportsIn" value "stdafx.h") (object Attribute tool "VC++" name "FullPathInImports" value TRUE) (object Attribute tool "VC++" name "UseImportAttributes" value TRUE) (object Attribute tool "VC++" name "ImportAttributes" value "no_namespace named_guids") (object Attribute tool "VC++" name "ImportProjTypeLib" value TRUE) (object Attribute tool "VC++" name "DefaultTypeLib" value TRUE) (object Attribute tool "VC++" name "TypeLibLocation" value "") (object Attribute tool "VC++" name "CompileProjTypeLib" value TRUE) (object Attribute tool "VC++" name "IdlInterfaceAttributes" value (value Text |endpoint("") |local |object |pointer_default() |uuid("") |version("") |encode |decode |auto_handle |implicit_handle("") |code |nocode )) (object Attribute tool "VC++" name "IdlCoClassAttributes" value (value Text |uuid("") |helpstring("") |helpcontext("") |licensed |version("") |control |hidden |appobject )) (object Attribute tool "VC++" name "IdlCoClassInterfaceAttributes" value (value Text |default |source )) (object Attribute tool "VC++" name "IdlParameterAttributes" value (value Text |in |out |retval )) (object Attribute tool "VC++" name "IdlMethodAttributes" value (value Text |id(1) |helpstring("") |call_as("") |callback |helpcontext("") |hidden |local |restricted |source |vararg )) (object Attribute tool "VC++" name "IdlPropertyAttributes" value (value Text |id() |helpstring("") |call_as("") |helpcontext("") |hidden |local |restricted |source |vararg |bindable |defaultbind |defaultcallelem |displaybind |immediatebind |nonbrowseable |requestedit )) (object Attribute tool "VC++" name "RvcPtyVersion" value "1.3") (object Attribute tool "VC++" name "ModelIDStyle" value 2) (object Attribute tool "VC++" name "DocStyle" value 1) (object Attribute tool "VC++" name "GenerateIncludes" value TRUE) (object Attribute tool "VC++" name "ApplyPattern" value FALSE) (object Attribute tool "VC++" name "CreateBackupFiles" value TRUE) (object Attribute tool "VC++" name "SupportCodeName" value FALSE) (object Attribute tool "VC++" name "DocRevEngineer" value TRUE) (object Attribute tool "VC++" name "CreateOverviewDiagrams" value TRUE) (object Attribute tool "VC++" name "UpdateModelIDsInCode" value TRUE) (object Attribute tool "VC++" name "AttributeTypes" value (value Text |attr1=bool |attr2=short |attr3=int |attr4=long |attr5=char |attr6=float |attr7=double |attr8=void |attr9=clock_t |attr10=_complex |attr11=_dev_t |attr12=div_t |attr13=_exception |attr14=FILE |attr15=_finddata_t |attr16=_FPIEEE_RECORD |attr17=fpos_t |attr18=_HEAPINFO |attr19=jmp_buf |attr20=lconv |attr21=ldiv_t |attr22=_off_t |attr23=_onexit_t |attr24=_PNH |attr25=ptrdiff_t |attr26=sig_atomic_t |attr27=size_t |attr28=_stat |attr29=time_t |attr30=_timeb |attr31=tm |attr32=_utimbuf |attr33=va_list |attr34=wchar_t |attr35=wctrans_t |attr36=wctype_t |attr37=_wfinddata_t |attr38=_wfinddatai64_t |attr39=wint_t |attr40=ABORTPROC |attr41=ACMDRIVERENUMCB |attr42=ACMDRIVERPROC |attr43=ACMFILTERCHOOSEHOOKPROC |attr44=ACMFILTERENUMCB |attr45=ACMFILTERTAGENUMCB |attr46=ACMFORMATCHOOSEHOOKPROC |attr47=ACMFORMATENUMCB |attr48=ACMFORMATTAGENUMCB |attr49=APPLET_PROC |attr50=ATOM |attr51=BOOL |attr52=BOOLEAN |attr53=BYTE |attr54=CALINFO_ENUMPROC |attr55=CALLBACK |attr56=CHAR |attr57=COLORREF |attr58=CONST |attr59=CRITICAL_SECTION |attr60=CTRYID |attr61=DATEFMT_ENUMPROC |attr62=DESKTOPENUMPROC |attr63=DLGPROC |attr64=DRAWSTATEPROC |attr65=DWORD |attr66=EDITWORDBREAKPROC |attr67=ENHMFENUMPROC |attr68=ENUMRESLANGPROC |attr69=ENUMRESNAMEPROC |attr70=ENUMRESTYPEPROC |attr71=FARPROC |attr72=FILE_SEGMENT_ELEMENT |attr73=FLOAT |attr74=FONTENUMPROC |attr75=GOBJENUMPROC |attr76=GRAYSTRINGPROC |attr77=HACCEL |attr78=HANDLE |attr79=HBITMAP |attr80=HBRUSH |attr81=HCOLORSPACE |attr82=HCONV |attr83=HCONVLIST |attr84=HCURSOR |attr85=HDC |attr86=HDDEDATA |attr87=HDESK |attr88=HDROP |attr89=HDWP |attr90=HENHMETAFILE |attr91=HFILE |attr92=HFONT |attr93=HGDIOBJ |attr94=HGLOBAL |attr95=HHOOK |attr96=HICON |attr97=HIMAGELIST |attr98=HIMC |attr99=HINSTANCE |attr100=HKEY |attr101=HKL |attr102=HLOCAL |attr103=HMENU |attr104=HMETAFILE |attr105=HMODULE |attr106=HMONITOR |attr107=HOOKPROC |attr108=HPALETTE |attr109=HPEN |attr110=HRGN |attr111=HRSRC |attr112=HSZ |attr113=HTREEITEM |attr114=HWINSTA |attr115=HWND |attr116=INT |attr117=IPADDR |attr118=LANGID |attr119=LCID |attr120=LCSCSTYPE |attr121=LCSGAMUTMATCH |attr122=LCTYPE |attr123=LINEDDAPROC |attr124=LOCALE_ENUMPROC |attr125=LONG |attr126=LONGLONG |attr127=LPARAM |attr128=LPBOOL |attr129=LPBYTE |attr130=LPCCHOOKPROC |attr131=LPCFHOOKPROC |attr132=LPCOLORREF |attr133=LPCRITICAL_SECTION |attr134=LPCSTR |attr135=LPCTSTR |attr136=LPCVOID |attr137=LPCWSTR |attr138=LPDWORD |attr139=LPFIBER_START_ROUTINE |attr140=LPFRHOOKPROC |attr141=LPHANDLE |attr142=LPHANDLER_FUNCTION |attr143=LPINT |attr144=LPLONG |attr145=LPOFNHOOKPROC |attr146=LPPAGEPAINTHOOK |attr147=LPPAGESETUPHOOK |attr148=LPPRINTHOOKPROC |attr149=LPPROGRESS_ROUTINE |attr150=LPSETUPHOOKPROC |attr151=LPSTR |attr152=LPSTREAM |attr153=LPTHREAD_START_ROUTINE |attr154=LPTSTR |attr155=LPVOID |attr156=LPWORD |attr157=LPWSTR |attr158=LRESULT |attr159=LUID |attr160=PBOOL |attr161=PBOOLEAN |attr162=PBYTE |attr163=PCHAR |attr164=PCRITICAL_SECTION |attr165=PCSTR |attr166=PCTSTR |attr167=PCWCH |attr168=PCWSTR |attr169=PDWORD |attr170=PFLOAT |attr171=PFNCALLBACK |attr172=PHANDLE |attr173=PHANDLER_ROUTINE |attr174=PHKEY |attr175=PINT |attr176=PLCID |attr177=PLONG |attr178=PLUID |attr179=PROPENUMPROC |attr180=PROPENUMPROCEX |attr181=PSHORT |attr182=PSTR |attr183=PTBYTE |attr184=PTCHAR |attr185=PTIMERAPCROUTINE |attr186=PTSTR |attr187=PUCHAR |attr188=PUINT |attr189=PULONG |attr190=PUSHORT |attr191=PVOID |attr192=PWCHAR |attr193=PWORD |attr194=PWSTR |attr195=REGISTERWORDENUMPROC |attr196=REGSAM |attr197=SC_HANDLE |attr198=SC_LOCK |attr199=SENDASYNCPROC |attr200=SERVICE_STATUS_HANDLE |attr201=SHORT |attr202=TBYTE |attr203=TCHAR |attr204=TIMEFMT_ENUMPROC |attr205=TIMERPROC |attr206=UCHAR |attr207=UINT |attr208=ULONG |attr209=ULONGLONG |attr210=UNSIGNED |attr211=USHORT |attr212=VOID |attr213=WCHAR |attr214=WINAPI |attr215=WINSTAENUMPROC |attr216=WNDENUMPROC |attr217=WNDPROC |attr218=WORD |attr219=WPARAM |attr220=YIELDPROC |attr221=CPoint |attr222=CRect |attr223=CSize |attr224=CString |attr225=CTime |attr226=CTimeSpan |attr227=CCreateContext |attr228=CMemoryState |attr229=COleSafeArray |attr230=CPrintInfo |attr231=HRESULT )) (object Attribute tool "VC++" name "Containers" value (value Text |cont1=CArray<$TYPE, $TYPE&> |cont2=CByteArray |cont3=CDWordArray |cont4=CObArray |cont5=CPtrArray |cont6=CStringArray |cont7=CUIntArray |cont8=CWordArray |cont9=CList<$TYPE, $TYPE&> |cont10=CPtrList |cont11=CObList |cont12=CStringList |cont13=CMapWordToPtr |cont14=CMapPtrToWord |cont15=CMapPtrToPtr |cont16=CMapWordToOb |cont17=CMapStringToPtr |cont18=CMapStringToOb |cont19=CMapStringToString |cont20=CTypedPtrArray |cont21=CTypedPtrArray |cont22=CTypedPtrList |cont23=CTypedPtrList |cont24=CComObject<$TYPE> |cont25=CComPtr<$TYPE> |cont26=CComQIPtr<$TYPE> |cont27=CComQIPtr<$TYPE, IID*> )) (object Attribute tool "VC++" name "ClassMethods" value (value Text |*_body=// ToDo: Add your specialized code here and/or call the base class |cm1=$NAME() |cm2=$NAME(orig:const $NAME&) |cm3=<> ~$NAME() |cm4=operator=(rhs:$NAME&):$NAME& |cm4_body=// ToDo: Add your specialized code here and/or call the base class||return rhs; |cm5=<> operator==(rhs:const $NAME&):bool |cm5_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm6=<> operator!=(rhs:$NAME&):bool |cm6_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm7=<> operator<(rhs:$NAME&):bool |cm7_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm8=<> operator>(rhs:$NAME&):bool |cm8_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm9=<> operator<=(rhs:$NAME&):bool |cm9_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm10=<> operator>=(rhs:$NAME&):bool |cm10_body=// ToDo: Add your specialized code here and/or call the base class||return false; |cm11=<> operator>>(i:istream&, rhs:$NAME&):istream& |cm11_body=// ToDo: Add your specialized code here and/or call the base class||return i; |cm12=<> operator<<(o:ostream&, rhs:const $NAME&):ostream& |cm12_body=// ToDo: Add your specialized code here and/or call the base class||return o; )) (object Attribute tool "VC++" name "Accessors" value (value Text |agf=<> get_$BASICNAME():const $TYPE |agf_body=return $NAME; |asf=set_$BASICNAME(value:$TYPE):void |asf_body=$NAME = value;|return; |agv=<> get_$BASICNAME():const $TYPE& |agv_body=return $NAME; |asv=set_$BASICNAME(value:$TYPE&):void |asv_body=$NAME = value;|return; |agp=<> get_$BASICNAME():const $TYPE |agp_body=return $NAME; |asp=set_$BASICNAME(value:$TYPE):void |asp_body=$NAME = value;|return; |agr=<> get_$BASICNAME():const $TYPE |agr_body=return $NAME; |asr=set_$BASICNAME(value:$TYPE):void |asr_body=$NAME = value;|return; |aga=<> get_$BASICNAME(index:int):const $TYPE |aga_body=return $NAME[index]; |asa=set_$BASICNAME(index:int, value:$TYPE):void |asa_body=$NAME[index] = value;|return; )) (object Attribute tool "VC++" name "Conditionals" value (value Text |*_decl=#ifdef _DEBUG |*_base=CObject |cond1=<> AssertValid():void |cond1_body=$SUPERNAME::AssertValid(); |cond2=<> Dump(dc:CDumpContext&):void |cond2_body=$SUPERNAME::Dump(dc); )) (object Attribute tool "VC++" name "Patterns" value (value Text |patrn1=cm1,cm3,cond1,cond2 |Patrn1_name=Default )) (object Attribute tool "VC++" name "AtlClassPrefix" value "C") (object Attribute tool "VC++" name "AtlInterfacePrefix" value "I") (object Attribute tool "VC++" name "AtlTypeDescription" value "Class"))) (object Attribute tool "VC++" name "default__Class" value (list Attribute_Set (object Attribute tool "VC++" name "Generate" value TRUE) (object Attribute tool "VC++" name "HeaderFileName" value "") (object Attribute tool "VC++" name "CodeFileName" value ""))) (object Attribute tool "VC++" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "VC++" name "InternalMap" value (value Text |*:AUTO:AUTO | )) (object Attribute tool "VC++" name "ExportMap" value (value Text |*:AUTO:AUTO | )) (object Attribute tool "VC++" name "InitialSourceIncludes" value (value Text |"stdafx.h" )) (object Attribute tool "VC++" name "InitialHeaderIncludes" value (value Text "")) (object Attribute tool "VC++" name "Copyright" value (value Text "Copyright (C) 1991 - 1999 Rational Software Corporation")) (object Attribute tool "VC++" name "KindSet" value (list Attribute_Set (object Attribute tool "VC++" name "(none)" value 300) (object Attribute tool "VC++" name "DLL" value 301) (object Attribute tool "VC++" name "EXE" value 302) (object Attribute tool "VC++" name "MIDL" value 303))) (object Attribute tool "VC++" name "Kind" value ("KindSet" 300)))) (object Attribute tool "VC++" name "default__Role" value (list Attribute_Set (object Attribute tool "VC++" name "Const" value FALSE) (object Attribute tool "VC++" name "Generate" value TRUE) (object Attribute tool "VC++" name "InitialValue" value ""))) (object Attribute tool "VC++" name "default__Uses" value (list Attribute_Set (object Attribute tool "VC++" name "Generate" value TRUE))) (object Attribute tool "VC++" name "default__Category" value (list Attribute_Set (object Attribute tool "VC++" name "IsDirectory" value FALSE) (object Attribute tool "VC++" name "Directory" value ""))) (object Attribute tool "VC++" name "default__Attribute" value (list Attribute_Set (object Attribute tool "VC++" name "Generate" value TRUE))) (object Attribute tool "VC++" name "default__Operation" value (list Attribute_Set (object Attribute tool "VC++" name "Generate" value TRUE) (object Attribute tool "VC++" name "Inline" value FALSE) (object Attribute tool "VC++" name "DefaultBody" value (value Text "")))) (object Attribute tool "VC++" name "HiddenTool" value FALSE) (object Attribute tool "VisualStudio" name "HiddenTool" value FALSE) (object Attribute tool "Web Modeler" name "HiddenTool" value FALSE) (object Attribute tool "XML_DTD" name "propertyId" value "809135966") (object Attribute tool "XML_DTD" name "default__Project" value (list Attribute_Set (object Attribute tool "XML_DTD" name "CreateMissingDirectories" value TRUE) (object Attribute tool "XML_DTD" name "Editor" value ("EditorType" 100)) (object Attribute tool "XML_DTD" name "StopOnError" value TRUE) (object Attribute tool "XML_DTD" name "EditorType" value (list Attribute_Set (object Attribute tool "XML_DTD" name "BuiltIn" value 100) (object Attribute tool "XML_DTD" name "WindowsShell" value 101))))) (object Attribute tool "XML_DTD" name "default__Class" value (list Attribute_Set (object Attribute tool "XML_DTD" name "Entity_SystemID" value "") (object Attribute tool "XML_DTD" name "Entity_PublicID" value "") (object Attribute tool "XML_DTD" name "NotationValue" value "") (object Attribute tool "XML_DTD" name "InternalValue" value "") (object Attribute tool "XML_DTD" name "ParameterEntity" value FALSE) (object Attribute tool "XML_DTD" name "ExternalEntity" value FALSE) (object Attribute tool "XML_DTD" name "Notation_SystemID" value "") (object Attribute tool "XML_DTD" name "Notation_PublicID" value ""))) (object Attribute tool "XML_DTD" name "default__Attribute" value (list Attribute_Set (object Attribute tool "XML_DTD" name "DefaultDeclType" value ""))) (object Attribute tool "XML_DTD" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "XML_DTD" name "Assign All" value FALSE) (object Attribute tool "XML_DTD" name "ComponentPath" value ""))) (object Attribute tool "XML_DTD" name "HiddenTool" value FALSE) (object Attribute tool "Cplusplus" name "propertyId" value "809135966") (object Attribute tool "Cplusplus" name "default__Role" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "CodeName" value "") (object Attribute tool "Cplusplus" name "InitialValue" value ""))) (object Attribute tool "Cplusplus" name "default__Inherit" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE))) (object Attribute tool "Cplusplus" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "RevEngRootDirectory" value "") (object Attribute tool "Cplusplus" name "RootPackage" value "C++ Reverse Engineered") (object Attribute tool "Cplusplus" name "RevEngDirectoriesAsPackages" value FALSE) (object Attribute tool "Cplusplus" name "HeaderFileExtension" value ".h") (object Attribute tool "Cplusplus" name "ImplementationFileExtension" value ".cpp") (object Attribute tool "Cplusplus" name "NewHeaderFileDirectory" value "") (object Attribute tool "Cplusplus" name "NewImplementationFileDirectory" value "") (object Attribute tool "Cplusplus" name "FileCapitalization" value ("FileCapitalizationSet" 0)) (object Attribute tool "Cplusplus" name "CodeGenExtraDirectories" value ("CodeGenExtraDirectoriesSet" 0)) (object Attribute tool "Cplusplus" name "StripClassPrefix" value "") (object Attribute tool "Cplusplus" name "UseTabs" value FALSE) (object Attribute tool "Cplusplus" name "TabWidth" value 8) (object Attribute tool "Cplusplus" name "IndentWidth" value 4) (object Attribute tool "Cplusplus" name "AccessIndentation" value -2) (object Attribute tool "Cplusplus" name "CreateBackupFiles" value FALSE) (object Attribute tool "Cplusplus" name "ModelIdCommentRules" value ("ModelIdCommentRulesSet" 1)) (object Attribute tool "Cplusplus" name "CommentRules" value ("CommentRulesSet" 1)) (object Attribute tool "Cplusplus" name "PageWidth" value 80) (object Attribute tool "Cplusplus" name "ClassMemberOrder" value ("MemberOrderSet" 1)) (object Attribute tool "Cplusplus" name "OneParameterPerLine" value FALSE) (object Attribute tool "Cplusplus" name "NamespaceBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "ClassBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "FunctionBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "Copyright" value (value Text "")) (object Attribute tool "Cplusplus" name "InitialHeaderIncludes" value (value Text "")) (object Attribute tool "Cplusplus" name "InitialBodyIncludes" value (value Text "")) (object Attribute tool "Cplusplus" name "CodeGenExtraDirectoriesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "None" value 0) (object Attribute tool "Cplusplus" name "Namespaces" value 1) (object Attribute tool "Cplusplus" name "Packages" value 2))) (object Attribute tool "Cplusplus" name "FileCapitalizationSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Same as model" value 0) (object Attribute tool "Cplusplus" name "Lower case" value 1) (object Attribute tool "Cplusplus" name "Upper case" value 2) (object Attribute tool "Cplusplus" name "Lower case with underscores" value 3))) (object Attribute tool "Cplusplus" name "BraceStyleSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "B1" value 1) (object Attribute tool "Cplusplus" name "B2" value 2) (object Attribute tool "Cplusplus" name "B3" value 3) (object Attribute tool "Cplusplus" name "B4" value 4) (object Attribute tool "Cplusplus" name "B5" value 5))) (object Attribute tool "Cplusplus" name "MemberOrderSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Public First" value 1) (object Attribute tool "Cplusplus" name "Private First" value 2) (object Attribute tool "Cplusplus" name "Order by kind" value 3) (object Attribute tool "Cplusplus" name "Unordered" value 4))) (object Attribute tool "Cplusplus" name "ModelIdCommentRulesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Code generation only" value 1) (object Attribute tool "Cplusplus" name "Code generation and reverse engineering" value 2) (object Attribute tool "Cplusplus" name "Never generate model IDs" value 3))) (object Attribute tool "Cplusplus" name "CommentRulesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Always synchronize" value 1) (object Attribute tool "Cplusplus" name "Code generation only" value 2) (object Attribute tool "Cplusplus" name "Reverse engineering only" value 3) (object Attribute tool "Cplusplus" name "Never synchronize" value 4))))) (object Attribute tool "Cplusplus" name "default__Module-Body" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "RevEngRootDirectory" value "") (object Attribute tool "Cplusplus" name "RootPackage" value "C++ Reverse Engineered") (object Attribute tool "Cplusplus" name "RevEngDirectoriesAsPackages" value FALSE) (object Attribute tool "Cplusplus" name "HeaderFileExtension" value ".h") (object Attribute tool "Cplusplus" name "ImplementationFileExtension" value ".cpp") (object Attribute tool "Cplusplus" name "NewHeaderFileDirectory" value "") (object Attribute tool "Cplusplus" name "NewImplementationFileDirectory" value "") (object Attribute tool "Cplusplus" name "FileCapitalization" value ("FileCapitalizationSet" 0)) (object Attribute tool "Cplusplus" name "CodeGenExtraDirectories" value ("CodeGenExtraDirectoriesSet" 0)) (object Attribute tool "Cplusplus" name "StripClassPrefix" value "") (object Attribute tool "Cplusplus" name "UseTabs" value FALSE) (object Attribute tool "Cplusplus" name "TabWidth" value 8) (object Attribute tool "Cplusplus" name "IndentWidth" value 4) (object Attribute tool "Cplusplus" name "AccessIndentation" value -2) (object Attribute tool "Cplusplus" name "CreateBackupFiles" value FALSE) (object Attribute tool "Cplusplus" name "ModelIdCommentRules" value ("ModelIdCommentRulesSet" 1)) (object Attribute tool "Cplusplus" name "CommentRules" value ("CommentRulesSet" 1)) (object Attribute tool "Cplusplus" name "PageWidth" value 80) (object Attribute tool "Cplusplus" name "ClassMemberOrder" value ("MemberOrderSet" 1)) (object Attribute tool "Cplusplus" name "OneParameterPerLine" value FALSE) (object Attribute tool "Cplusplus" name "NamespaceBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "ClassBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "FunctionBraceStyle" value ("BraceStyleSet" 2)) (object Attribute tool "Cplusplus" name "Copyright" value (value Text "")) (object Attribute tool "Cplusplus" name "InitialHeaderIncludes" value (value Text "")) (object Attribute tool "Cplusplus" name "InitialBodyIncludes" value (value Text "")) (object Attribute tool "Cplusplus" name "CodeGenExtraDirectoriesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "None" value 0) (object Attribute tool "Cplusplus" name "Namespaces" value 1) (object Attribute tool "Cplusplus" name "Packages" value 2))) (object Attribute tool "Cplusplus" name "FileCapitalizationSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Same as model" value 0) (object Attribute tool "Cplusplus" name "Lower case" value 1) (object Attribute tool "Cplusplus" name "Upper case" value 2) (object Attribute tool "Cplusplus" name "Lower case with underscores" value 3))) (object Attribute tool "Cplusplus" name "BraceStyleSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "B1" value 1) (object Attribute tool "Cplusplus" name "B2" value 2) (object Attribute tool "Cplusplus" name "B3" value 3) (object Attribute tool "Cplusplus" name "B4" value 4) (object Attribute tool "Cplusplus" name "B5" value 5))) (object Attribute tool "Cplusplus" name "MemberOrderSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Public First" value 1) (object Attribute tool "Cplusplus" name "Private First" value 2) (object Attribute tool "Cplusplus" name "Order by kind" value 3) (object Attribute tool "Cplusplus" name "Unordered" value 4))) (object Attribute tool "Cplusplus" name "ModelIdCommentRulesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Code generation only" value 1) (object Attribute tool "Cplusplus" name "Code generation and reverse engineering" value 2) (object Attribute tool "Cplusplus" name "Never generate model IDs" value 3))) (object Attribute tool "Cplusplus" name "CommentRulesSet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Always synchronize" value 1) (object Attribute tool "Cplusplus" name "Code generation only" value 2) (object Attribute tool "Cplusplus" name "Reverse engineering only" value 3) (object Attribute tool "Cplusplus" name "Never synchronize" value 4))))) (object Attribute tool "Cplusplus" name "default__Param" value (list Attribute_Set (object Attribute tool "Cplusplus" name "CodeName" value ""))) (object Attribute tool "Cplusplus" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "CodeName" value ""))) (object Attribute tool "Cplusplus" name "default__Operation" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "CodeName" value "") (object Attribute tool "Cplusplus" name "InitialCodeBody" value "") (object Attribute tool "Cplusplus" name "Inline" value FALSE) (object Attribute tool "Cplusplus" name "GenerateFunctionBody" value ("GenerateFunctionBodySet" 2)) (object Attribute tool "Cplusplus" name "GenerateFunctionBodySet" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Default" value 2) (object Attribute tool "Cplusplus" name "True" value 1) (object Attribute tool "Cplusplus" name "False" value 0))))) (object Attribute tool "Cplusplus" name "default__Class" value (list Attribute_Set (object Attribute tool "Cplusplus" name "Synchronize" value TRUE) (object Attribute tool "Cplusplus" name "CodeName" value "") (object Attribute tool "Cplusplus" name "ImplementationType" value "") (object Attribute tool "Cplusplus" name "HeaderSourceFile" value "") (object Attribute tool "Cplusplus" name "BodySourceFile" value ""))) (object Attribute tool "Cplusplus" name "default__Category" value (list Attribute_Set (object Attribute tool "Cplusplus" name "CodeName" value "") (object Attribute tool "Cplusplus" name "IsNamespace" value FALSE))) (object Attribute tool "Cplusplus" name "default__Uses" value (list Attribute_Set (object Attribute tool "Cplusplus" name "BodyReferenceOnly" value FALSE))) (object Attribute tool "Cplusplus" name "HiddenTool" value FALSE) (object Attribute tool "ANSIConvert" name "HiddenTool" value FALSE) (object Attribute tool "Ada83" name "propertyId" value "838326200") (object Attribute tool "Ada83" name "default__Project" value (list Attribute_Set (object Attribute tool "Ada83" name "SpecFileExtension" value "1.ada") (object Attribute tool "Ada83" name "SpecFileBackupExtension" value "1.ad~") (object Attribute tool "Ada83" name "SpecFileTemporaryExtension" value "1.ad#") (object Attribute tool "Ada83" name "BodyFileExtension" value "2.ada") (object Attribute tool "Ada83" name "BodyFileBackupExtension" value "2.ad~") (object Attribute tool "Ada83" name "BodyFileTemporaryExtension" value "2.ad#") (object Attribute tool "Ada83" name "CreateMissingDirectories" value TRUE) (object Attribute tool "Ada83" name "GenerateBodies" value TRUE) (object Attribute tool "Ada83" name "GenerateAccessorOperations" value TRUE) (object Attribute tool "Ada83" name "GenerateStandardOperations" value TRUE) (object Attribute tool "Ada83" name "DefaultCodeBody" value "[statement]") (object Attribute tool "Ada83" name "ImplicitParameter" value TRUE) (object Attribute tool "Ada83" name "CommentWidth" value 60) (object Attribute tool "Ada83" name "StopOnError" value FALSE) (object Attribute tool "Ada83" name "ErrorLimit" value 30) (object Attribute tool "Ada83" name "UseFileName" value FALSE) (object Attribute tool "Ada83" name "Directory" value "$ROSEADA83_SOURCE"))) (object Attribute tool "Ada83" name "default__Class" value (list Attribute_Set (object Attribute tool "Ada83" name "CodeName" value "") (object Attribute tool "Ada83" name "ClassName" value "Object") (object Attribute tool "Ada83" name "ClassAccess" value ("ImplementationSet" 43)) (object Attribute tool "Ada83" name "ImplementationType" value (value Text "")) (object Attribute tool "Ada83" name "IsSubtype" value FALSE) (object Attribute tool "Ada83" name "PolymorphicUnit" value FALSE) (object Attribute tool "Ada83" name "HandleName" value "Handle") (object Attribute tool "Ada83" name "HandleAccess" value ("ImplementationSet" 45)) (object Attribute tool "Ada83" name "Discriminant" value "") (object Attribute tool "Ada83" name "Variant" value "") (object Attribute tool "Ada83" name "EnumerationLiteralPrefix" value "A_") (object Attribute tool "Ada83" name "RecordFieldPrefix" value "The_") (object Attribute tool "Ada83" name "GenerateAccessorOperations" value TRUE) (object Attribute tool "Ada83" name "GenerateStandardOperations" value TRUE) (object Attribute tool "Ada83" name "ImplicitParameter" value TRUE) (object Attribute tool "Ada83" name "ClassParameterName" value "This") (object Attribute tool "Ada83" name "DefaultConstructorKind" value ("ConstructorKindSet" 199)) (object Attribute tool "Ada83" name "DefaultConstructorName" value "Create") (object Attribute tool "Ada83" name "InlineDefaultConstructor" value FALSE) (object Attribute tool "Ada83" name "CopyConstructorKind" value ("ConstructorKindSet" 199)) (object Attribute tool "Ada83" name "CopyConstructorName" value "Copy") (object Attribute tool "Ada83" name "InlineCopyConstructor" value FALSE) (object Attribute tool "Ada83" name "DestructorName" value "Free") (object Attribute tool "Ada83" name "InlineDestructor" value FALSE) (object Attribute tool "Ada83" name "ClassEqualityOperation" value "") (object Attribute tool "Ada83" name "HandleEqualityOperation" value "") (object Attribute tool "Ada83" name "InlineEquality" value FALSE) (object Attribute tool "Ada83" name "IsTask" value FALSE) (object Attribute tool "Ada83" name "Representation" value (value Text "")) (object Attribute tool "Ada83" name "ImplementationSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Public" value 45) (object Attribute tool "Ada83" name "Private" value 43) (object Attribute tool "Ada83" name "LimitedPrivate" value 200) (object Attribute tool "Ada83" name "DoNotCreate" value 201))) (object Attribute tool "Ada83" name "ConstructorKindSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Procedure" value 202) (object Attribute tool "Ada83" name "Function" value 199) (object Attribute tool "Ada83" name "DoNotCreate" value 201))))) (object Attribute tool "Ada83" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Ada83" name "Generate" value TRUE) (object Attribute tool "Ada83" name "CopyrightNotice" value (value Text "")) (object Attribute tool "Ada83" name "FileName" value "") (object Attribute tool "Ada83" name "ReturnType" value "") (object Attribute tool "Ada83" name "GenericFormalParameters" value (value Text "")) (object Attribute tool "Ada83" name "AdditionalWiths" value (value Text "")))) (object Attribute tool "Ada83" name "default__Module-Body" value (list Attribute_Set (object Attribute tool "Ada83" name "Generate" value TRUE) (object Attribute tool "Ada83" name "CopyrightNotice" value (value Text "")) (object Attribute tool "Ada83" name "FileName" value "") (object Attribute tool "Ada83" name "ReturnType" value "") (object Attribute tool "Ada83" name "AdditionalWiths" value (value Text "")) (object Attribute tool "Ada83" name "IsSubunit" value FALSE))) (object Attribute tool "Ada83" name "default__Operation" value (list Attribute_Set (object Attribute tool "Ada83" name "CodeName" value "") (object Attribute tool "Ada83" name "SubprogramImplementation" value ("SubprogramImplementationSet" 2)) (object Attribute tool "Ada83" name "Renames" value "") (object Attribute tool "Ada83" name "ClassParameterMode" value ("ParameterModeSet" 203)) (object Attribute tool "Ada83" name "Inline" value FALSE) (object Attribute tool "Ada83" name "EntryCode" value (value Text "")) (object Attribute tool "Ada83" name "ExitCode" value (value Text "")) (object Attribute tool "Ada83" name "InitialCodeBody" value "${default}") (object Attribute tool "Ada83" name "Representation" value (value Text "")) (object Attribute tool "Ada83" name "SubprogramImplementationSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Spec" value 224) (object Attribute tool "Ada83" name "Body" value 2) (object Attribute tool "Ada83" name "Renaming" value 222) (object Attribute tool "Ada83" name "Separate" value 223))) (object Attribute tool "Ada83" name "ParameterModeSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Default" value 232) (object Attribute tool "Ada83" name "In" value 204) (object Attribute tool "Ada83" name "Out" value 205) (object Attribute tool "Ada83" name "InOut" value 203) (object Attribute tool "Ada83" name "FunctionReturn" value 206) (object Attribute tool "Ada83" name "DoNotCreate" value 201))))) (object Attribute tool "Ada83" name "default__Param" value (list Attribute_Set (object Attribute tool "Ada83" name "Mode" value ("ParameterModeSet" 232)) (object Attribute tool "Ada83" name "GenericFormal" value ("GenericFormalSet" 1)) (object Attribute tool "Ada83" name "AssociationMapping" value ("AssociationMappingSet" 1)) (object Attribute tool "Ada83" name "ParameterModeSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Default" value 232) (object Attribute tool "Ada83" name "In" value 204) (object Attribute tool "Ada83" name "Out" value 205) (object Attribute tool "Ada83" name "InOut" value 203))) (object Attribute tool "Ada83" name "GenericFormalSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Default" value 1) (object Attribute tool "Ada83" name "Object" value 2) (object Attribute tool "Ada83" name "Type" value 3) (object Attribute tool "Ada83" name "Procedure" value 4) (object Attribute tool "Ada83" name "Function" value 5))) (object Attribute tool "Ada83" name "AssociationMappingSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Name" value 1) (object Attribute tool "Ada83" name "Type" value 2))))) (object Attribute tool "Ada83" name "default__Has" value (list Attribute_Set (object Attribute tool "Ada83" name "CodeName" value "") (object Attribute tool "Ada83" name "NameIfUnlabeled" value "The_${supplier}") (object Attribute tool "Ada83" name "DataMemberName" value "${relationship}") (object Attribute tool "Ada83" name "GetName" value "Get_${relationship}") (object Attribute tool "Ada83" name "InlineGet" value TRUE) (object Attribute tool "Ada83" name "SetName" value "Set_${relationship}") (object Attribute tool "Ada83" name "InlineSet" value TRUE) (object Attribute tool "Ada83" name "IsConstant" value FALSE) (object Attribute tool "Ada83" name "InitialValue" value "") (object Attribute tool "Ada83" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada83" name "Variant" value "") (object Attribute tool "Ada83" name "ContainerGeneric" value "List") (object Attribute tool "Ada83" name "ContainerType" value "") (object Attribute tool "Ada83" name "ContainerDeclarations" value (value Text "")) (object Attribute tool "Ada83" name "SelectorName" value "") (object Attribute tool "Ada83" name "SelectorType" value "") (object Attribute tool "Ada83" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Before" value 233) (object Attribute tool "Ada83" name "After" value 234))))) (object Attribute tool "Ada83" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Ada83" name "CodeName" value "") (object Attribute tool "Ada83" name "DataMemberName" value "${attribute}") (object Attribute tool "Ada83" name "GetName" value "Get_${attribute}") (object Attribute tool "Ada83" name "InlineGet" value TRUE) (object Attribute tool "Ada83" name "SetName" value "Set_${attribute}") (object Attribute tool "Ada83" name "InlineSet" value TRUE) (object Attribute tool "Ada83" name "IsConstant" value FALSE) (object Attribute tool "Ada83" name "InitialValue" value "") (object Attribute tool "Ada83" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada83" name "Variant" value "") (object Attribute tool "Ada83" name "Representation" value (value Text "")) (object Attribute tool "Ada83" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Before" value 233) (object Attribute tool "Ada83" name "After" value 234))))) (object Attribute tool "Ada83" name "default__Association" value (list Attribute_Set (object Attribute tool "Ada83" name "NameIfUnlabeled" value "The_${targetClass}") (object Attribute tool "Ada83" name "GetName" value "Get_${association}") (object Attribute tool "Ada83" name "InlineGet" value FALSE) (object Attribute tool "Ada83" name "SetName" value "Set_${association}") (object Attribute tool "Ada83" name "InlineSet" value FALSE) (object Attribute tool "Ada83" name "GenerateAssociate" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada83" name "AssociateName" value "Associate") (object Attribute tool "Ada83" name "InlineAssociate" value FALSE) (object Attribute tool "Ada83" name "GenerateDissociate" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada83" name "DissociateName" value "Dissociate") (object Attribute tool "Ada83" name "InlineDissociate" value FALSE) (object Attribute tool "Ada83" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Procedure" value 202) (object Attribute tool "Ada83" name "DoNotCreate" value 201))) (object Attribute tool "Ada83" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Function" value 199) (object Attribute tool "Ada83" name "DoNotCreate" value 201))))) (object Attribute tool "Ada83" name "default__Role" value (list Attribute_Set (object Attribute tool "Ada83" name "CodeName" value "") (object Attribute tool "Ada83" name "NameIfUnlabeled" value "The_${targetClass}") (object Attribute tool "Ada83" name "DataMemberName" value "${target}") (object Attribute tool "Ada83" name "GetName" value "Get_${target}") (object Attribute tool "Ada83" name "InlineGet" value TRUE) (object Attribute tool "Ada83" name "SetName" value "Set_${target}") (object Attribute tool "Ada83" name "InlineSet" value TRUE) (object Attribute tool "Ada83" name "IsConstant" value FALSE) (object Attribute tool "Ada83" name "InitialValue" value "") (object Attribute tool "Ada83" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada83" name "Representation" value (value Text "")) (object Attribute tool "Ada83" name "ContainerGeneric" value "List") (object Attribute tool "Ada83" name "ContainerType" value "") (object Attribute tool "Ada83" name "ContainerDeclarations" value (value Text "")) (object Attribute tool "Ada83" name "SelectorName" value "") (object Attribute tool "Ada83" name "SelectorType" value "") (object Attribute tool "Ada83" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Procedure" value 202) (object Attribute tool "Ada83" name "DoNotCreate" value 201))) (object Attribute tool "Ada83" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada83" name "Before" value 233) (object Attribute tool "Ada83" name "After" value 234))))) (object Attribute tool "Ada83" name "default__Subsystem" value (list Attribute_Set (object Attribute tool "Ada83" name "Directory" value "AUTO GENERATE"))) (object Attribute tool "Ada83" name "HiddenTool" value FALSE) (object Attribute tool "Ada95" name "propertyId" value "838326200") (object Attribute tool "Ada95" name "default__Project" value (list Attribute_Set (object Attribute tool "Ada95" name "SpecFileExtension" value "1.ada") (object Attribute tool "Ada95" name "SpecFileBackupExtension" value "1.ad~") (object Attribute tool "Ada95" name "SpecFileTemporaryExtension" value "1.ad#") (object Attribute tool "Ada95" name "BodyFileExtension" value "2.ada") (object Attribute tool "Ada95" name "BodyFileBackupExtension" value "2.ad~") (object Attribute tool "Ada95" name "BodyFileTemporaryExtension" value "2.ad#") (object Attribute tool "Ada95" name "CreateMissingDirectories" value TRUE) (object Attribute tool "Ada95" name "UseColonNotation" value TRUE) (object Attribute tool "Ada95" name "GenerateBodies" value TRUE) (object Attribute tool "Ada95" name "GenerateAccessorOperations" value TRUE) (object Attribute tool "Ada95" name "GenerateStandardOperations" value TRUE) (object Attribute tool "Ada95" name "DefaultCodeBody" value "[statement]") (object Attribute tool "Ada95" name "ImplicitParameter" value TRUE) (object Attribute tool "Ada95" name "CommentWidth" value 60) (object Attribute tool "Ada95" name "StopOnError" value FALSE) (object Attribute tool "Ada95" name "ErrorLimit" value 30) (object Attribute tool "Ada95" name "UseFileName" value FALSE) (object Attribute tool "Ada95" name "Directory" value "$ROSEADA95_SOURCE"))) (object Attribute tool "Ada95" name "default__Class" value (list Attribute_Set (object Attribute tool "Ada95" name "CodeName" value "") (object Attribute tool "Ada95" name "TypeName" value "Object") (object Attribute tool "Ada95" name "TypeVisibility" value ("TypeVisibilitySet" 43)) (object Attribute tool "Ada95" name "TypeImplementation" value ("TypeImplementationSet" 208)) (object Attribute tool "Ada95" name "IncompleteType" value ("IncompleteTypeSet" 1)) (object Attribute tool "Ada95" name "TypeControl" value ("TypeControlSet" 225)) (object Attribute tool "Ada95" name "TypeControlName" value "Controlled_${type}") (object Attribute tool "Ada95" name "TypeControlVisibility" value ("TypeVisibilitySet" 43)) (object Attribute tool "Ada95" name "TypeDefinition" value (value Text "")) (object Attribute tool "Ada95" name "RecordImplementation" value ("RecordImplementationSet" 209)) (object Attribute tool "Ada95" name "RecordKindPackageName" value "${class}_Record_Kinds") (object Attribute tool "Ada95" name "IsLimited" value FALSE) (object Attribute tool "Ada95" name "IsSubtype" value FALSE) (object Attribute tool "Ada95" name "GenerateAccessType" value ("GenerateAccessTypeSet" 230)) (object Attribute tool "Ada95" name "AccessTypeName" value "Handle") (object Attribute tool "Ada95" name "AccessTypeVisibility" value ("TypeVisibilitySet" 45)) (object Attribute tool "Ada95" name "AccessTypeDefinition" value (value Text "")) (object Attribute tool "Ada95" name "AccessClassWide" value TRUE) (object Attribute tool "Ada95" name "MaybeAliased" value FALSE) (object Attribute tool "Ada95" name "ParameterizedImplementation" value ("ParameterizedImplementationSet" 11)) (object Attribute tool "Ada95" name "ParentClassName" value "Superclass") (object Attribute tool "Ada95" name "EnumerationLiteralPrefix" value "A_") (object Attribute tool "Ada95" name "RecordFieldPrefix" value "The_") (object Attribute tool "Ada95" name "ArrayOfTypeName" value "Array_Of_${type}") (object Attribute tool "Ada95" name "AccessArrayOfTypeName" value "Access_Array_Of_${type}") (object Attribute tool "Ada95" name "ArrayOfAccessTypeName" value "Array_Of_${access_type}") (object Attribute tool "Ada95" name "AccessArrayOfAccessTypeName" value "Access_Array_Of_${access_type}") (object Attribute tool "Ada95" name "ArrayIndexDefinition" value "Positive range <>") (object Attribute tool "Ada95" name "GenerateAccessorOperations" value TRUE) (object Attribute tool "Ada95" name "GenerateStandardOperations" value TRUE) (object Attribute tool "Ada95" name "ImplicitParameter" value TRUE) (object Attribute tool "Ada95" name "ImplicitParameterName" value "This") (object Attribute tool "Ada95" name "GenerateDefaultConstructor" value ("SubprogramKindSet" 199)) (object Attribute tool "Ada95" name "DefaultConstructorName" value "Create") (object Attribute tool "Ada95" name "InlineDefaultConstructor" value FALSE) (object Attribute tool "Ada95" name "GenerateCopyConstructor" value ("SubprogramKindSet" 199)) (object Attribute tool "Ada95" name "CopyConstructorName" value "Copy") (object Attribute tool "Ada95" name "InlineCopyConstructor" value FALSE) (object Attribute tool "Ada95" name "GenerateDestructor" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "DestructorName" value "Free") (object Attribute tool "Ada95" name "InlineDestructor" value FALSE) (object Attribute tool "Ada95" name "GenerateTypeEquality" value ("FunctionKindSet" 201)) (object Attribute tool "Ada95" name "TypeEqualityName" value (value Text |"=" )) (object Attribute tool "Ada95" name "InlineEquality" value FALSE) (object Attribute tool "Ada95" name "Representation" value (value Text "")) (object Attribute tool "Ada95" name "TypeImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Tagged" value 208) (object Attribute tool "Ada95" name "Record" value 210) (object Attribute tool "Ada95" name "Mixin" value 211) (object Attribute tool "Ada95" name "Protected" value 44) (object Attribute tool "Ada95" name "Task" value 212))) (object Attribute tool "Ada95" name "IncompleteTypeSet" value (list Attribute_Set (object Attribute tool "Ada95" name "DoNotDeclare" value 1) (object Attribute tool "Ada95" name "NoDiscriminantPart" value 2) (object Attribute tool "Ada95" name "UnknownDiscriminantPart" value 3) (object Attribute tool "Ada95" name "KnownDiscriminantPart" value 4))) (object Attribute tool "Ada95" name "RecordImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "SingleType" value 209) (object Attribute tool "Ada95" name "MultipleTypes" value 213))) (object Attribute tool "Ada95" name "ParameterizedImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Generic" value 11) (object Attribute tool "Ada95" name "Unconstrained" value 214))) (object Attribute tool "Ada95" name "TypeVisibilitySet" value (list Attribute_Set (object Attribute tool "Ada95" name "Public" value 45) (object Attribute tool "Ada95" name "Private" value 43))) (object Attribute tool "Ada95" name "SubprogramKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "TypeControlSet" value (list Attribute_Set (object Attribute tool "Ada95" name "None" value 225) (object Attribute tool "Ada95" name "InitializationOnly" value 226) (object Attribute tool "Ada95" name "AssignmentFinalizationOnly" value 227) (object Attribute tool "Ada95" name "All" value 228))) (object Attribute tool "Ada95" name "GenerateAccessTypeSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Always" value 229) (object Attribute tool "Ada95" name "Auto" value 230))))) (object Attribute tool "Ada95" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Ada95" name "Generate" value TRUE) (object Attribute tool "Ada95" name "CopyrightNotice" value (value Text "")) (object Attribute tool "Ada95" name "FileName" value "") (object Attribute tool "Ada95" name "ReturnType" value "") (object Attribute tool "Ada95" name "GenericFormalParameters" value (value Text "")) (object Attribute tool "Ada95" name "AdditionalWiths" value (value Text "")) (object Attribute tool "Ada95" name "IsPrivate" value FALSE))) (object Attribute tool "Ada95" name "default__Module-Body" value (list Attribute_Set (object Attribute tool "Ada95" name "Generate" value TRUE) (object Attribute tool "Ada95" name "CopyrightNotice" value (value Text "")) (object Attribute tool "Ada95" name "FileName" value "") (object Attribute tool "Ada95" name "ReturnType" value "") (object Attribute tool "Ada95" name "AdditionalWiths" value (value Text "")) (object Attribute tool "Ada95" name "IsSubunit" value FALSE))) (object Attribute tool "Ada95" name "default__Operation" value (list Attribute_Set (object Attribute tool "Ada95" name "CodeName" value "") (object Attribute tool "Ada95" name "SubprogramImplementation" value ("SubprogramImplementationSet" 2)) (object Attribute tool "Ada95" name "Renames" value "") (object Attribute tool "Ada95" name "GenerateOverriding" value TRUE) (object Attribute tool "Ada95" name "ImplicitParameterMode" value ("ParameterModeSet" 203)) (object Attribute tool "Ada95" name "ImplicitParameterClassWide" value FALSE) (object Attribute tool "Ada95" name "GenerateAccessOperation" value FALSE) (object Attribute tool "Ada95" name "Inline" value FALSE) (object Attribute tool "Ada95" name "EntryCode" value (value Text "")) (object Attribute tool "Ada95" name "ExitCode" value (value Text "")) (object Attribute tool "Ada95" name "InitialCodeBody" value "${default}") (object Attribute tool "Ada95" name "EntryBarrierCondition" value "True") (object Attribute tool "Ada95" name "Representation" value (value Text "")) (object Attribute tool "Ada95" name "SubprogramImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Spec" value 224) (object Attribute tool "Ada95" name "Body" value 2) (object Attribute tool "Ada95" name "Abstract" value 221) (object Attribute tool "Ada95" name "Renaming" value 222) (object Attribute tool "Ada95" name "RenamingAsBody" value 231) (object Attribute tool "Ada95" name "Separate" value 223))) (object Attribute tool "Ada95" name "ParameterModeSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Default" value 232) (object Attribute tool "Ada95" name "In" value 204) (object Attribute tool "Ada95" name "Out" value 205) (object Attribute tool "Ada95" name "InOut" value 203) (object Attribute tool "Ada95" name "Access" value 220) (object Attribute tool "Ada95" name "DoNotCreate" value 201))))) (object Attribute tool "Ada95" name "default__Param" value (list Attribute_Set (object Attribute tool "Ada95" name "Mode" value ("ParameterModeSet" 232)) (object Attribute tool "Ada95" name "GenericFormal" value ("GenericFormalSet" 1)) (object Attribute tool "Ada95" name "AssociationMapping" value ("AssociationMappingSet" 1)) (object Attribute tool "Ada95" name "ParameterModeSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Default" value 232) (object Attribute tool "Ada95" name "In" value 204) (object Attribute tool "Ada95" name "Out" value 205) (object Attribute tool "Ada95" name "InOut" value 203) (object Attribute tool "Ada95" name "Access" value 220))) (object Attribute tool "Ada95" name "GenericFormalSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Default" value 1) (object Attribute tool "Ada95" name "Object" value 2) (object Attribute tool "Ada95" name "Type" value 3) (object Attribute tool "Ada95" name "Procedure" value 4) (object Attribute tool "Ada95" name "Function" value 5) (object Attribute tool "Ada95" name "Package" value 6))) (object Attribute tool "Ada95" name "AssociationMappingSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Name" value 1) (object Attribute tool "Ada95" name "Type" value 2))))) (object Attribute tool "Ada95" name "default__Has" value (list Attribute_Set (object Attribute tool "Ada95" name "CodeName" value "") (object Attribute tool "Ada95" name "NameIfUnlabeled" value "The_${supplier}") (object Attribute tool "Ada95" name "RecordFieldImplementation" value ("RecordFieldImplementationSet" 216)) (object Attribute tool "Ada95" name "AccessDiscriminantClassWide" value FALSE) (object Attribute tool "Ada95" name "RecordFieldName" value "${relationship}") (object Attribute tool "Ada95" name "GenerateGet" value ("FunctionKindSet" 199)) (object Attribute tool "Ada95" name "GenerateAccessGet" value ("FunctionKindSet" 201)) (object Attribute tool "Ada95" name "GetName" value "Get_${relationship}") (object Attribute tool "Ada95" name "InlineGet" value TRUE) (object Attribute tool "Ada95" name "GenerateSet" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "GenerateAccessSet" value ("ProcedureKindSet" 201)) (object Attribute tool "Ada95" name "SetName" value "Set_${relationship}") (object Attribute tool "Ada95" name "InlineSet" value TRUE) (object Attribute tool "Ada95" name "IsAliased" value FALSE) (object Attribute tool "Ada95" name "IsConstant" value FALSE) (object Attribute tool "Ada95" name "InitialValue" value "") (object Attribute tool "Ada95" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada95" name "ContainerImplementation" value ("ContainerImplementationSet" 217)) (object Attribute tool "Ada95" name "ContainerGeneric" value "List") (object Attribute tool "Ada95" name "ContainerType" value "") (object Attribute tool "Ada95" name "ContainerDeclarations" value (value Text "")) (object Attribute tool "Ada95" name "SelectorName" value "") (object Attribute tool "Ada95" name "SelectorType" value "") (object Attribute tool "Ada95" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Before" value 233) (object Attribute tool "Ada95" name "After" value 234))) (object Attribute tool "Ada95" name "RecordFieldImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Component" value 216) (object Attribute tool "Ada95" name "Discriminant" value 218) (object Attribute tool "Ada95" name "AccessDiscriminant" value 219))) (object Attribute tool "Ada95" name "ContainerImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Array" value 217) (object Attribute tool "Ada95" name "Generic" value 11))) (object Attribute tool "Ada95" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))))) (object Attribute tool "Ada95" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Ada95" name "CodeName" value "") (object Attribute tool "Ada95" name "RecordFieldImplementation" value ("RecordFieldImplementationSet" 216)) (object Attribute tool "Ada95" name "AccessDiscriminantClassWide" value FALSE) (object Attribute tool "Ada95" name "RecordFieldName" value "${attribute}") (object Attribute tool "Ada95" name "GenerateGet" value ("FunctionKindSet" 199)) (object Attribute tool "Ada95" name "GenerateAccessGet" value ("FunctionKindSet" 201)) (object Attribute tool "Ada95" name "GetName" value "Get_${attribute}") (object Attribute tool "Ada95" name "InlineGet" value TRUE) (object Attribute tool "Ada95" name "GenerateSet" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "GenerateAccessSet" value ("ProcedureKindSet" 201)) (object Attribute tool "Ada95" name "SetName" value "Set_${attribute}") (object Attribute tool "Ada95" name "InlineSet" value TRUE) (object Attribute tool "Ada95" name "IsAliased" value FALSE) (object Attribute tool "Ada95" name "IsConstant" value FALSE) (object Attribute tool "Ada95" name "InitialValue" value "") (object Attribute tool "Ada95" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada95" name "Representation" value (value Text "")) (object Attribute tool "Ada95" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Before" value 233) (object Attribute tool "Ada95" name "After" value 234))) (object Attribute tool "Ada95" name "RecordFieldImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Component" value 216) (object Attribute tool "Ada95" name "Discriminant" value 218) (object Attribute tool "Ada95" name "AccessDiscriminant" value 219))) (object Attribute tool "Ada95" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))))) (object Attribute tool "Ada95" name "default__Association" value (list Attribute_Set (object Attribute tool "Ada95" name "NameIfUnlabeled" value "The_${targetClass}") (object Attribute tool "Ada95" name "GenerateGet" value ("FunctionKindSet" 199)) (object Attribute tool "Ada95" name "GetName" value "Get_${association}") (object Attribute tool "Ada95" name "InlineGet" value FALSE) (object Attribute tool "Ada95" name "GenerateSet" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "SetName" value "Set_${association}") (object Attribute tool "Ada95" name "InlineSet" value FALSE) (object Attribute tool "Ada95" name "GenerateAssociate" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "AssociateName" value "Associate") (object Attribute tool "Ada95" name "InlineAssociate" value FALSE) (object Attribute tool "Ada95" name "GenerateDissociate" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "DissociateName" value "Dissociate") (object Attribute tool "Ada95" name "InlineDissociate" value FALSE) (object Attribute tool "Ada95" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))))) (object Attribute tool "Ada95" name "default__Role" value (list Attribute_Set (object Attribute tool "Ada95" name "CodeName" value "") (object Attribute tool "Ada95" name "NameIfUnlabeled" value "The_${targetClass}") (object Attribute tool "Ada95" name "RecordFieldImplementation" value ("RecordFieldImplementationSet" 216)) (object Attribute tool "Ada95" name "AccessDiscriminantClassWide" value FALSE) (object Attribute tool "Ada95" name "RecordFieldName" value "${target}") (object Attribute tool "Ada95" name "GenerateGet" value ("FunctionKindSet" 199)) (object Attribute tool "Ada95" name "GenerateAccessGet" value ("FunctionKindSet" 201)) (object Attribute tool "Ada95" name "GetName" value "Get_${target}") (object Attribute tool "Ada95" name "InlineGet" value TRUE) (object Attribute tool "Ada95" name "GenerateSet" value ("ProcedureKindSet" 202)) (object Attribute tool "Ada95" name "GenerateAccessSet" value ("ProcedureKindSet" 201)) (object Attribute tool "Ada95" name "SetName" value "Set_${target}") (object Attribute tool "Ada95" name "InlineSet" value TRUE) (object Attribute tool "Ada95" name "IsAliased" value FALSE) (object Attribute tool "Ada95" name "IsConstant" value FALSE) (object Attribute tool "Ada95" name "InitialValue" value "") (object Attribute tool "Ada95" name "Declare" value ("DeclareSet" 234)) (object Attribute tool "Ada95" name "Representation" value (value Text "")) (object Attribute tool "Ada95" name "ContainerImplementation" value ("ContainerImplementationSet" 217)) (object Attribute tool "Ada95" name "ContainerGeneric" value "List") (object Attribute tool "Ada95" name "ContainerType" value "") (object Attribute tool "Ada95" name "ContainerDeclarations" value (value Text "")) (object Attribute tool "Ada95" name "SelectorName" value "") (object Attribute tool "Ada95" name "SelectorType" value "") (object Attribute tool "Ada95" name "ProcedureKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Procedure" value 202) (object Attribute tool "Ada95" name "DoNotCreate" value 201))) (object Attribute tool "Ada95" name "DeclareSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Before" value 233) (object Attribute tool "Ada95" name "After" value 234))) (object Attribute tool "Ada95" name "RecordFieldImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Component" value 216) (object Attribute tool "Ada95" name "Discriminant" value 218) (object Attribute tool "Ada95" name "AccessDiscriminant" value 219))) (object Attribute tool "Ada95" name "ContainerImplementationSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Array" value 217) (object Attribute tool "Ada95" name "Generic" value 11))) (object Attribute tool "Ada95" name "FunctionKindSet" value (list Attribute_Set (object Attribute tool "Ada95" name "Function" value 199) (object Attribute tool "Ada95" name "DoNotCreate" value 201))))) (object Attribute tool "Ada95" name "default__Subsystem" value (list Attribute_Set (object Attribute tool "Ada95" name "Directory" value "AUTO GENERATE"))) (object Attribute tool "Ada95" name "HiddenTool" value FALSE) (object Attribute tool "CORBA" name "default__Param" value (list Attribute_Set (object Attribute tool "CORBA" name "Direction" value ("ParamDirectionTypeSet" 102)) (object Attribute tool "CORBA" name "ParamDirectionTypeSet" value (list Attribute_Set (object Attribute tool "CORBA" name "in" value 102) (object Attribute tool "CORBA" name "inout" value 103) (object Attribute tool "CORBA" name "out" value 104))))) (object Attribute tool "Deploy" name "HiddenTool" value FALSE) (object Attribute tool "Oracle8" name "propertyId" value "360000002") (object Attribute tool "Oracle8" name "default__Project" value (list Attribute_Set (object Attribute tool "Oracle8" name "DDLScriptFilename" value "DDL1.SQL") (object Attribute tool "Oracle8" name "DropClause" value FALSE) (object Attribute tool "Oracle8" name "PrimaryKeyColumnName" value "_ID") (object Attribute tool "Oracle8" name "PrimaryKeyColumnType" value "NUMBER(5,0)") (object Attribute tool "Oracle8" name "SchemaNamePrefix" value "") (object Attribute tool "Oracle8" name "SchemaNameSuffix" value "") (object Attribute tool "Oracle8" name "TableNamePrefix" value "") (object Attribute tool "Oracle8" name "TableNameSuffix" value "") (object Attribute tool "Oracle8" name "TypeNamePrefix" value "") (object Attribute tool "Oracle8" name "TypeNameSuffix" value "") (object Attribute tool "Oracle8" name "ViewNamePrefix" value "") (object Attribute tool "Oracle8" name "ViewNameSuffix" value "") (object Attribute tool "Oracle8" name "VarrayNamePrefix" value "") (object Attribute tool "Oracle8" name "VarrayNameSuffix" value "") (object Attribute tool "Oracle8" name "NestedTableNamePrefix" value "") (object Attribute tool "Oracle8" name "NestedTableNameSuffix" value "") (object Attribute tool "Oracle8" name "ObjectTableNamePrefix" value "") (object Attribute tool "Oracle8" name "ObjectTableNameSuffix" value ""))) (object Attribute tool "Oracle8" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Oracle8" name "IsSchema" value FALSE))) (object Attribute tool "Oracle8" name "default__Class" value (list Attribute_Set (object Attribute tool "Oracle8" name "OID" value "") (object Attribute tool "Oracle8" name "WhereClause" value "") (object Attribute tool "Oracle8" name "CheckConstraint" value "") (object Attribute tool "Oracle8" name "CollectionTypeLength" value "") (object Attribute tool "Oracle8" name "CollectionTypePrecision" value "") (object Attribute tool "Oracle8" name "CollectionTypeScale" value "") (object Attribute tool "Oracle8" name "CollectionOfREFS" value FALSE))) (object Attribute tool "Oracle8" name "default__Operation" value (list Attribute_Set (object Attribute tool "Oracle8" name "MethodKind" value ("MethodKindSet" 1903)) (object Attribute tool "Oracle8" name "OverloadID" value "") (object Attribute tool "Oracle8" name "OrderNumber" value "") (object Attribute tool "Oracle8" name "IsReadNoDataState" value FALSE) (object Attribute tool "Oracle8" name "IsReadNoProcessState" value FALSE) (object Attribute tool "Oracle8" name "IsWriteNoDataState" value FALSE) (object Attribute tool "Oracle8" name "IsWriteNoProcessState" value FALSE) (object Attribute tool "Oracle8" name "IsSelfish" value FALSE) (object Attribute tool "Oracle8" name "TriggerType" value ("TriggerTypeSet" 1801)) (object Attribute tool "Oracle8" name "TriggerEvent" value ("TriggerEventSet" 1601)) (object Attribute tool "Oracle8" name "TriggerText" value "") (object Attribute tool "Oracle8" name "TriggerReferencingNames" value "") (object Attribute tool "Oracle8" name "TriggerForEach" value ("TriggerForEachSet" 1701)) (object Attribute tool "Oracle8" name "TriggerWhenClause" value "") (object Attribute tool "Oracle8" name "MethodKindSet" value (list Attribute_Set (object Attribute tool "Oracle8" name "MapMethod" value 1901) (object Attribute tool "Oracle8" name "OrderMethod" value 1902) (object Attribute tool "Oracle8" name "Function" value 1903) (object Attribute tool "Oracle8" name "Procedure" value 1904) (object Attribute tool "Oracle8" name "Operator" value 1905) (object Attribute tool "Oracle8" name "Constructor" value 1906) (object Attribute tool "Oracle8" name "Destructor" value 1907) (object Attribute tool "Oracle8" name "Trigger" value 1908) (object Attribute tool "Oracle8" name "Calculated" value 1909))) (object Attribute tool "Oracle8" name "TriggerTypeSet" value (list Attribute_Set (object Attribute tool "Oracle8" name "AFTER" value 1801) (object Attribute tool "Oracle8" name "BEFORE" value 1802) (object Attribute tool "Oracle8" name "INSTEAD OF" value 1803))) (object Attribute tool "Oracle8" name "TriggerForEachSet" value (list Attribute_Set (object Attribute tool "Oracle8" name "ROW" value 1701) (object Attribute tool "Oracle8" name "STATEMENT" value 1702))) (object Attribute tool "Oracle8" name "TriggerEventSet" value (list Attribute_Set (object Attribute tool "Oracle8" name "INSERT" value 1601) (object Attribute tool "Oracle8" name "UPDATE" value 1602) (object Attribute tool "Oracle8" name "DELETE" value 1603) (object Attribute tool "Oracle8" name "INSERT OR UPDATE" value 1604) (object Attribute tool "Oracle8" name "INSERT OR DELETE" value 1605) (object Attribute tool "Oracle8" name "UPDATE OR DELETE" value 1606) (object Attribute tool "Oracle8" name "INSERT OR UPDATE OR DELETE" value 1607))))) (object Attribute tool "Oracle8" name "default__Role" value (list Attribute_Set (object Attribute tool "Oracle8" name "OrderNumber" value ""))) (object Attribute tool "Oracle8" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Oracle8" name "OrderNumber" value "") (object Attribute tool "Oracle8" name "IsUnique" value FALSE) (object Attribute tool "Oracle8" name "NullsAllowed" value TRUE) (object Attribute tool "Oracle8" name "Length" value "") (object Attribute tool "Oracle8" name "Precision" value "2") (object Attribute tool "Oracle8" name "Scale" value "6") (object Attribute tool "Oracle8" name "IsIndex" value FALSE) (object Attribute tool "Oracle8" name "IsPrimaryKey" value FALSE) (object Attribute tool "Oracle8" name "CompositeUnique" value FALSE) (object Attribute tool "Oracle8" name "CheckConstraint" value ""))) (object Attribute tool "Oracle8" name "HiddenTool" value FALSE) (object Attribute tool "ComponentTest" name "HiddenTool" value FALSE) (object Attribute tool "Rose Model Integrator" name "HiddenTool" value FALSE) (object Attribute tool "TopLink" name "HiddenTool" value FALSE) (object Attribute tool "Version Control" name "HiddenTool" value FALSE) (object Attribute tool "Visual Basic" name "propertyId" value "783606378") (object Attribute tool "Visual Basic" name "default__Class" value (list Attribute_Set (object Attribute tool "Visual Basic" name "UpdateCode" value TRUE) (object Attribute tool "Visual Basic" name "UpdateModel" value TRUE) (object Attribute tool "Visual Basic" name "InstancingSet" value (list Attribute_Set (object Attribute tool "Visual Basic" name "Private" value 221) (object Attribute tool "Visual Basic" name "PublicNotCreatable" value 213) (object Attribute tool "Visual Basic" name "SingleUse" value 214) (object Attribute tool "Visual Basic" name "GlobalSingleUse" value 215) (object Attribute tool "Visual Basic" name "MultiUse" value 219) (object Attribute tool "Visual Basic" name "GlobalMultiUse" value 220))) (object Attribute tool "Visual Basic" name "BaseSet" value (list Attribute_Set (object Attribute tool "Visual Basic" name "(none)" value 222) (object Attribute tool "Visual Basic" name "0" value 223) (object Attribute tool "Visual Basic" name "1" value 224))) (object Attribute tool "Visual Basic" name "OptionBase" value ("BaseSet" 222)) (object Attribute tool "Visual Basic" name "OptionExplicit" value TRUE) (object Attribute tool "Visual Basic" name "OptionCompare" value ("CompareSet" 202)) (object Attribute tool "Visual Basic" name "Instancing" value ("InstancingSet" 219)) (object Attribute tool "Visual Basic" name "CompareSet" value (list Attribute_Set (object Attribute tool "Visual Basic" name "(none)" value 202) (object Attribute tool "Visual Basic" name "Binary" value 203) (object Attribute tool "Visual Basic" name "Text" value 204))))) (object Attribute tool "Visual Basic" name "default__Operation" value (list Attribute_Set (object Attribute tool "Visual Basic" name "LibraryName" value "") (object Attribute tool "Visual Basic" name "AliasName" value "") (object Attribute tool "Visual Basic" name "IsStatic" value FALSE) (object Attribute tool "Visual Basic" name "ProcedureID" value "") (object Attribute tool "Visual Basic" name "ReplaceExistingBody" value FALSE) (object Attribute tool "Visual Basic" name "DefaultBody" value (value Text "")))) (object Attribute tool "Visual Basic" name "default__Attribute" value (list Attribute_Set (object Attribute tool "Visual Basic" name "New" value FALSE) (object Attribute tool "Visual Basic" name "WithEvents" value FALSE) (object Attribute tool "Visual Basic" name "ProcedureID" value "") (object Attribute tool "Visual Basic" name "PropertyName" value "") (object Attribute tool "Visual Basic" name "Subscript" value ""))) (object Attribute tool "Visual Basic" name "default__Role" value (list Attribute_Set (object Attribute tool "Visual Basic" name "UpdateCode" value TRUE) (object Attribute tool "Visual Basic" name "New" value FALSE) (object Attribute tool "Visual Basic" name "WithEvents" value FALSE) (object Attribute tool "Visual Basic" name "FullName" value FALSE) (object Attribute tool "Visual Basic" name "ProcedureID" value "") (object Attribute tool "Visual Basic" name "PropertyName" value "") (object Attribute tool "Visual Basic" name "Subscript" value ""))) (object Attribute tool "Visual Basic" name "default__Inherit" value (list Attribute_Set (object Attribute tool "Visual Basic" name "ImplementsDelegation" value TRUE) (object Attribute tool "Visual Basic" name "FullName" value FALSE))) (object Attribute tool "Visual Basic" name "default__Param" value (list Attribute_Set (object Attribute tool "Visual Basic" name "ByVal" value FALSE) (object Attribute tool "Visual Basic" name "ByRef" value FALSE) (object Attribute tool "Visual Basic" name "Optional" value FALSE) (object Attribute tool "Visual Basic" name "ParamArray" value FALSE))) (object Attribute tool "Visual Basic" name "default__Module-Spec" value (list Attribute_Set (object Attribute tool "Visual Basic" name "ProjectFile" value "") (object Attribute tool "Visual Basic" name "UpdateCode" value TRUE) (object Attribute tool "Visual Basic" name "UpdateModel" value TRUE) (object Attribute tool "Visual Basic" name "ImportReferences" value TRUE) (object Attribute tool "Visual Basic" name "QuickImport" value TRUE) (object Attribute tool "Visual Basic" name "ImportBinary" value FALSE))) (object Attribute tool "Visual Basic" name "HiddenTool" value FALSE)) quid "39C9260C00D9")) ================================================ FILE: src/ReadMe.md ================================================ ### 电子商务项目taoshop @version版本1.0.0 本开源项目拟采用B2C的商业模式,采用SpringBoot+SpringCloud或者Dubbo技术栈实现微服务,实现一款分布式集群的高性能电商系统。(开发中...) ================================================ FILE: src/pom.xml ================================================ 4.0.0 com.muses.taoshop taoshop 1.0-SNAPSHOT pom taoshop org.springframework.boot spring-boot-starter-parent 1.5.7.RELEASE UTF-8 1.0 1.2.17 5.1.27 3.4.0 1.3.0 1.3.1 5.1.39 1.5.7.RELEASE 1.1.2 4.2.1 1.2.7 1.16.10 taoshop-quartz taoshop-search taoshop-common taoshop-provider-api taoshop-provider taoshop-manager taoshop-portal taoshop-cms taoshop-order taoshop-sso src/main/java **/*.xml true org.apache.maven.plugins maven-compiler-plugin 3.6.1 1.8 1.8 1.8 UTF-8 org.projectlombok lombok ${lombok.version} org.apache.maven.plugins maven-resources-plugin 3.0.2 UTF-8 org.springframework.boot spring-boot-starter-web ${spring-boot.version} org.springframework.boot spring-boot-starter-data-redis ${spring-boot.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.springboot.version} org.springframework.boot spring-boot-devtools true com.alibaba druid ${druid.version} com.alibaba druid-spring-boot-starter ${druid.version} org.springframework.boot spring-boot-starter-thymeleaf com.github.pagehelper pagehelper ${github.pagehelper.version} mysql mysql-connector-java ${mysql-connector.version} com.alibaba fastjson 1.2.35 org.projectlombok lombok ${lombok.version} commons-fileupload commons-fileupload 1.2.2 commons-io commons-io 2.4 commons-codec commons-codec 1.9 org.apache.commons commons-lang3 3.5 repos Repository http://maven.aliyun.com/nexus/content/groups/public pluginsRepos PluginsRepository http://maven.aliyun.com/nexus/content/groups/public ================================================ FILE: src/taoshop-cms/ReadMe.md ================================================ ### CMS系统 ================================================ FILE: src/taoshop-cms/pom.xml ================================================ taoshop com.muses.taoshop 1.0-SNAPSHOT 4.0.0 taoshop-cms 1.0-SNAPSHOT war taoshop-cms Maven Webapp http://www.example.com UTF-8 1.7 1.7 junit junit 4.11 test taoshop-cms maven-clean-plugin 3.0.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.7.0 maven-surefire-plugin 2.20.1 maven-war-plugin 3.2.0 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2 ================================================ FILE: src/taoshop-cms/src/main/webapp/WEB-INF/web.xml ================================================ Archetype Created Web Application ================================================ FILE: src/taoshop-cms/src/main/webapp/index.jsp ================================================

Hello World!

================================================ FILE: src/taoshop-common/ReadMe.md ================================================ ### 电商平台通用工程 ================================================ FILE: src/taoshop-common/pom.xml ================================================ taoshop com.muses.taoshop 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.common taoshop-common pom taoshop-common-rpc taoshop-common-cache taoshop-common-core taoshop-security-core taoshop-common http://www.example.com UTF-8 1.7 1.7 junit junit 4.11 test ================================================ FILE: src/taoshop-common/taoshop-common-cache/ReadMe.md ================================================ ###缓存框架 ================================================ FILE: src/taoshop-common/taoshop-common-cache/pom.xml ================================================ taoshop-common com.muses.taoshop.common 1.0-SNAPSHOT 4.0.0 taoshop-common-cache UTF-8 org.springframework.boot spring-boot-starter-cache org.springframework.boot spring-boot-starter-data-redis com.github.ben-manes.caffeine caffeine ================================================ FILE: src/taoshop-common/taoshop-common-core/ReadMe.md ================================================ ###电商平台通用工程 包括统一异常处理类,Mybatis数据库相关的通用类 ================================================ FILE: src/taoshop-common/taoshop-common-core/pom.xml ================================================ taoshop-common com.muses.taoshop.common 1.0-SNAPSHOT 4.0.0 taoshop-common-core taoshop-common-core http://www.example.com UTF-8 junit junit 4.11 test ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/base/Constants.java ================================================ package com.muses.taoshop.common.core.base; import java.util.Locale; /** * @description Constants类,项目的基本信息配置 * @author Nicky * @date 2017年3月6日 */ public class Constants { //定义统一Locale.CHINA,程序中所有和Locale相关操作均默认使用此Locale public static final Locale LOCALE_CHINA = Locale.CHINA; //验证码Session public static final String SESSION_SECURITY_CODE = "sessionSecCode"; //用户信息Session public static final String SESSION_USER = "sessionUser"; //角色权限Session public static final String SESSION_ROLE_RIGHTS = "sessionRoleRights"; //所有菜单Session public static final String SESSION_ALLMENU = "sessionAllMenu"; //权限Session public static final String SESSION_RIGHTS = "sessionRights"; //页面分页数量 public static final Integer PAGE_SIZE = 6; //页面排序数量 public static final Integer SORT_SIZE = 3; //登录URL public static final String URL_LOGIN = "/login.do"; //登录过滤的正则表达式 public static final String REGEXP_PATH = ".*/((login)|(logout)|(toblog)|(search)|(getArchiveArticles)|(code)|(plugins)|(upload)|(static)).*"; //不对匹配该值的访问路径拦截(正则) //Lucene索引的路径 public static final String LUCENE_INDEX_PATH = "D:\\lucene"; } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/base/ResultStatus.java ================================================ package com.muses.taoshop.common.core.base; /** *
 *  返回结果枚举类 TODO 代补充完善
 * 
* * @author nicky.ma * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ public enum ResultStatus { //TODO add result status OK("200","OK","成功"), VALIDATION_ERROR("400","Validation Error","参数校验异常"), AUTHENTICATION_ERROR("300","Authentication Error","身份认证异常"); private final String statusCode; private final String resonPhrase; private final String message; private ResultStatus(String statusCode, String resonPhrase, String message) { this.statusCode = statusCode; this.resonPhrase = resonPhrase; this.message = message; } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/database/annotation/AnnotationConstants.java ================================================ package com.muses.taoshop.common.core.database.annotation; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.util.ClassUtils; import static com.muses.taoshop.common.core.database.config.BaseConfig.ENTITY_PACKAGES; /** *
 *  配置类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.12.01 18:30    修改内容:
 * 
*/ public class AnnotationConstants { public static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; public final static String PACKAGE_PATTERN = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(ENTITY_PACKAGES) + DEFAULT_RESOURCE_PATTERN; } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/database/annotation/MybatisRepository.java ================================================ package com.muses.taoshop.common.core.database.annotation; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; import java.lang.annotation.*; /** *
 *  定义一个元注解类扫描repository接口类
 *  @see @link org.mybatis.spring.mapper.MapperScannerConfigurer}
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Component @Mapper public @interface MybatisRepository { String value() default ""; } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/database/annotation/TypeAliasesPackageScanner.java ================================================ package com.muses.taoshop.common.core.database.annotation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import java.io.IOException; import java.util.*; import org.springframework.core.io.Resource; import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.thymeleaf.util.StringUtils; import static com.muses.taoshop.common.core.database.annotation.AnnotationConstants.PACKAGE_PATTERN; /** *
 *  TypeAlicsesPackage的扫描类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.12.01 18:23    修改内容:
 * 
*/ @Component public class TypeAliasesPackageScanner { protected final static Logger LOGGER = LoggerFactory.getLogger(TypeAliasesPackageScanner.class); private static ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); /* private TypeFilter[] entityTypeFilters = new TypeFilter[]{new AnnotationTypeFilter(Entity.class, false), new AnnotationTypeFilter(Embeddable.class, false), new AnnotationTypeFilter(MappedSuperclass.class, false), new AnnotationTypeFilter(org.hibernate.annotations.Entity.class, false)};*/ public static String getTypeAliasesPackages() { Set packageNames = new TreeSet(); //TreeSet packageNames = new TreeSet(); String typeAliasesPackage =""; try { //加载所有的资源 Resource[] resources = resourcePatternResolver.getResources(PACKAGE_PATTERN); MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(resourcePatternResolver); //遍历资源 for (Resource resource : resources) { if (resource.isReadable()) { MetadataReader reader = readerFactory.getMetadataReader(resource); String className = reader.getClassMetadata().getClassName(); //eg:com.muses.taoshop.item.entity.ItemBrand LOGGER.info("className : {} "+className); try{ //eg:com.muses.taoshop.item.entity LOGGER.info("packageName : {} "+Class.forName(className).getPackage().getName()); packageNames.add(Class.forName(className).getPackage().getName()); }catch (ClassNotFoundException e){ LOGGER.error("classNotFoundException : {} "+e); } } } } catch (IOException e) { LOGGER.error("ioException =>: {} " + e); } //集合不为空的情况,拼装一下数据 if (!CollectionUtils.isEmpty(packageNames)) { typeAliasesPackage = StringUtils.join(packageNames.toArray() , ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); }else{ LOGGER.info("set empty,size:{} "+packageNames.size()); } return typeAliasesPackage; } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/database/config/BaseConfig.java ================================================ package com.muses.taoshop.common.core.database.config; /** *
 *  基本配置类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ public class BaseConfig { /** * 设置主数据源名称 */ public static final String DATA_SOURCE_NAME = "shop"; /** * 加载配置文件信息 */ public static final String DATA_SOURCE_PROPERTIES = "spring.datasource.shop"; /** * repository 所在包 */ public static final String REPOSITORY_PACKAGES = "com.muses.taoshop.**.repository"; /** * mapper 所在包 */ public static final String MAPPER_PACKAGES = "com.muses.taoshop.**.mapper"; /** * 实体类 所在包 */ public static final String ENTITY_PACKAGES = "com.muses.taoshop.*.entity"; /** * 自定义TypeHandler */ public static final String TYPE_HANDLERS_PACKAGES = "com.muses.taoshop.common.core.database.typehandlers"; /** * Mybatis session 工厂 */ public static final String SQL_SESSION_FACTORY = "sqlSessionFactory"; /** * Mybatis 事务管理器 */ public static final String MYBATIS_TRANSACTION_MANAGER = "mybatisTransactionManager"; /** * Jedis连接池 */ public static final String JEDIS_POOL = "jedisPool"; /** * Jedis连接池配置 */ public static final String JEDIS_POOL_CONFIG = "jedisPoolConfig"; } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/database/config/DataSourceConfig.java ================================================ package com.muses.taoshop.common.core.database.config; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; import static com.muses.taoshop.common.core.database.config.BaseConfig.DATA_SOURCE_NAME; import static com.muses.taoshop.common.core.database.config.BaseConfig.DATA_SOURCE_PROPERTIES; /** *
 *  DataSource配置类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ @Configuration public class DataSourceConfig { @Bean(name = DATA_SOURCE_NAME) @ConfigurationProperties(prefix = DATA_SOURCE_PROPERTIES) public DataSource dataSource() { return DruidDataSourceBuilder.create().build(); } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/database/config/MybatisConfig.java ================================================ package com.muses.taoshop.common.core.database.config; import com.muses.taoshop.common.core.database.annotation.MybatisRepository; import com.muses.taoshop.common.core.database.annotation.TypeAliasesPackageScanner; import org.apache.ibatis.io.VFS; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.*; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; import static com.muses.taoshop.common.core.database.config.BaseConfig.*; /** *
 *  Mybatis配置类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ @MapperScan( basePackages = MAPPER_PACKAGES, annotationClass = MybatisRepository.class, sqlSessionFactoryRef = SQL_SESSION_FACTORY ) @ComponentScan @EnableTransactionManagement @Configuration public class MybatisConfig { @Autowired MybatisSqlInterceptor mybatisSqlInterceptor; TypeAliasesPackageScanner packageScanner = new TypeAliasesPackageScanner(); @Bean(name = DATA_SOURCE_NAME) @ConfigurationProperties(prefix = DATA_SOURCE_PROPERTIES) @Primary public DataSource dataSource(){ return DataSourceBuilder.create().build(); } @Primary @Bean(name = SQL_SESSION_FACTORY) public SqlSessionFactory sqlSessionFactory(@Qualifier(DATA_SOURCE_NAME)DataSource dataSource)throws Exception{ //SpringBoot默认使用DefaultVFS进行扫描,但是没有扫描到jar里的实体类 VFS.addImplClass(SpringBootVFS.class); SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setPlugins(new Interceptor[]{mybatisSqlInterceptor}); factoryBean.setDataSource(dataSource); //factoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try{ factoryBean.setMapperLocations(resolver.getResources("classpath*:/mybatis/*Mapper.xml")); String typeAliasesPackage = packageScanner.getTypeAliasesPackages(); factoryBean.setTypeAliasesPackage(typeAliasesPackage); SqlSessionFactory sqlSessionFactory = factoryBean.getObject(); return sqlSessionFactory; }catch (Exception e){ e.printStackTrace(); throw new RuntimeException(); } } @Bean(name = MYBATIS_TRANSACTION_MANAGER) public DataSourceTransactionManager transactionManager(@Qualifier(DATA_SOURCE_NAME)DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/database/config/MybatisSqlInterceptor.java ================================================ package com.muses.taoshop.common.core.database.config; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.plugin.*; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.Properties; /** *
 *  Mybatis SQL拦截器
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ @Component @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})) public class MybatisSqlInterceptor implements Interceptor { Logger LOGGER = LoggerFactory.getLogger(MybatisSqlInterceptor.class); @Override public Object intercept(Invocation invocation) throws Throwable { // 拦截sql Object[] args = invocation.getArgs(); MappedStatement statement = (MappedStatement) args[0]; Object parameterObject = args[1]; BoundSql boundSql = statement.getBoundSql(parameterObject); String sql = boundSql.getSql(); LOGGER.info("获取到的SQL:{}"+sql); if (StringUtils.isBlank(sql)) { return invocation.proceed(); } // 返回 return invocation.proceed(); } @Override public Object plugin(Object obj) { return Plugin.wrap(obj, this); } @Override public void setProperties(Properties arg0) {} } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/database/typehandlers/Spring2BooleanTypeHandler.java ================================================ package com.muses.taoshop.common.core.database.typehandlers; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** *
 *  将数据库中的"Y"和"N"类型转为boolean类型
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:2018.05.26     修改内容:
 * 
*/ public class Spring2BooleanTypeHandler implements TypeHandler{ /** * *(non-Javadoc) * @see org.apache.ibatis.type.TypeHandler#getResult(java.sql.ResultSet, int) */ @Override public void setParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException { } /** * (non-Javadoc) * @see org.apache.ibatis.type.TypeHandler#getResult(java.sql.ResultSet, int) */ @Override public Object getResult(ResultSet resultSet, String s) throws SQLException { boolean flag ; if(resultSet.getString(s).equals("Y")){ flag = true; }else{ flag = false; } return flag; } /** * *(non-Javadoc) * @see org.apache.ibatis.type.TypeHandler#getResult(java.sql.ResultSet, int) */ @Override public Object getResult(ResultSet resultSet, int i) throws SQLException { boolean flag; if(resultSet.getString(i).equals("Y")){ flag = true; }else{ flag = false; } return flag; } /** * (non-Javadoc) * @see org.apache.ibatis.type.TypeHandler#getResult(java.sql.ResultSet, int) */ @Override public Object getResult(CallableStatement callableStatement, int i) throws SQLException { return callableStatement.getString(i); } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/database/typehandlers/UnixLong2DateTypeHandler.java ================================================ package com.muses.taoshop.common.core.database.typehandlers; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** *
 *  类型转换 Long => Date
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.06.18 14:04    修改内容:
 * 
*/ public class UnixLong2DateTypeHandler implements TypeHandler { @Override public void setParameter(PreparedStatement preparedStatement, int i, Date o, JdbcType jdbcType) throws SQLException { } @Override public Date getResult(ResultSet resultSet, String s) throws SQLException { long unixlongTime = resultSet.getLong(s); Date date = new Date(unixlongTime*1000); return date; } @Override public Date getResult(ResultSet resultSet, int i) throws SQLException { long unixlongTime = resultSet.getLong(i); Date date = new Date(unixlongTime*1000); return date; } @Override public Date getResult(CallableStatement callableStatement, int i) throws SQLException { return callableStatement.getDate(i); } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/exception/CommonException.java ================================================ package com.muses.taoshop.common.core.exception; /** *
 *  TODO 实现统一异常处理类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ public class CommonException { } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/util/DateUtils.java ================================================ package com.muses.taoshop.common.core.util; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** *
 *  日期处理工具类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.06.18 14:28    修改内容:
 * 
*/ public class DateUtils { public static Date doParse(String date){ DateFormat dateFormat = new SimpleDateFormat(); try { return dateFormat.parse(date); } catch (ParseException e) { e.printStackTrace(); throw new RuntimeException(e); } } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/util/JsonDateSerializer.java ================================================ package com.muses.taoshop.common.core.util; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class JsonDateSerializer extends JsonSerializer { private SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException { String value = dateFormat.format(date); gen.writeString(value); } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/util/SerializeUtils.java ================================================ package com.muses.taoshop.common.core.util; import java.io.*; /** *
 *  序列化工具类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:2018.05.26     修改内容:
 * 
*/ public class SerializeUtils { /** * 序列化对象 * @param obj * 创建一个对象 * @return * 字节流byte */ public static byte[] doSerialize(Object obj){ ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; baos = new ByteArrayOutputStream(); try { oos = new ObjectOutputStream(baos); oos.writeObject(obj); byte[] byteArray = baos.toByteArray(); return byteArray; } catch (IOException e) { e.printStackTrace(); } return null; } /** * 反序列化对象 * @param byteArray * 字节流byte * @return * 返回一个对象 */ public static Object unSerialize(byte[] byteArray){ ByteArrayInputStream bais = null; bais = new ByteArrayInputStream(byteArray); try { ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/main/java/com/muses/taoshop/common/core/util/UUIDGenerator.java ================================================ package com.muses.taoshop.common.core.util; /** *
 *  UUID生成器
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.06.18 14:15    修改内容:
 * 
*/ public class UUIDGenerator { } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/test/java/org/muses/commo/AppTest.java ================================================ package org.muses.commo; import static org.junit.Assert.assertTrue; import org.junit.Test; /** * Unit test for simple App. */ public class AppTest { /** * Rigorous Test :-) */ @Test public void shouldAnswerWithTrue() { assertTrue( true ); } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/test/java/org/muses/commo/MybatisSqlInterceptor.java ================================================ package org.muses.commo; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlCommandType; import org.apache.ibatis.mapping.SqlSource; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.DefaultReflectorFactory; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.factory.DefaultObjectFactory; import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.sql.SQLException; import java.util.Properties; @Component @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})) public class MybatisSqlInterceptor implements Interceptor { Logger logger = LoggerFactory.getLogger(MybatisSqlInterceptor.class); @Override public Object intercept(Invocation invocation) throws Throwable { // 获取sql String sql = getSqlByInvocation(invocation); logger.info("获取到的SQL:{}"+sql); if (StringUtils.isBlank(sql)) { return invocation.proceed(); } // sql交由处理类处理 对sql语句进行处理 此处是范例 不做任何处理 String sql2Reset = sql; // 包装sql后,重置到invocation中 resetSql2Invocation(invocation, sql2Reset); // 返回,继续执行 return invocation.proceed(); } @Override public Object plugin(Object obj) { return Plugin.wrap(obj, this); } @Override public void setProperties(Properties arg0) { // doSomething } /** * 获取sql语句 * @param invocation * @return */ private String getSqlByInvocation(Invocation invocation) { final Object[] args = invocation.getArgs(); MappedStatement ms = (MappedStatement) args[0]; Object parameterObject = args[1]; BoundSql boundSql = ms.getBoundSql(parameterObject); return boundSql.getSql(); } /** * 包装sql后,重置到invocation中 * @param invocation * @param sql * @throws SQLException */ private void resetSql2Invocation(Invocation invocation, String sql) throws SQLException { final Object[] args = invocation.getArgs(); MappedStatement statement = (MappedStatement) args[0]; Object parameterObject = args[1]; BoundSql boundSql = statement.getBoundSql(parameterObject); MappedStatement newStatement = newMappedStatement(statement, new BoundSqlSqlSource(boundSql)); MetaObject msObject = MetaObject.forObject(newStatement, new DefaultObjectFactory(), new DefaultObjectWrapperFactory(),new DefaultReflectorFactory()); msObject.setValue("sqlSource.boundSql.sql", sql); args[0] = newStatement; } private MappedStatement newMappedStatement(MappedStatement ms, SqlSource newSqlSource) { MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType()); builder.resource(ms.getResource()); builder.fetchSize(ms.getFetchSize()); builder.statementType(ms.getStatementType()); builder.keyGenerator(ms.getKeyGenerator()); if (ms.getKeyProperties() != null && ms.getKeyProperties().length != 0) { StringBuilder keyProperties = new StringBuilder(); for (String keyProperty : ms.getKeyProperties()) { keyProperties.append(keyProperty).append(","); } keyProperties.delete(keyProperties.length() - 1, keyProperties.length()); builder.keyProperty(keyProperties.toString()); } builder.timeout(ms.getTimeout()); builder.parameterMap(ms.getParameterMap()); builder.resultMaps(ms.getResultMaps()); builder.resultSetType(ms.getResultSetType()); builder.cache(ms.getCache()); builder.flushCacheRequired(ms.isFlushCacheRequired()); builder.useCache(ms.isUseCache()); return builder.build(); } private String getOperateType(Invocation invocation) { final Object[] args = invocation.getArgs(); MappedStatement ms = (MappedStatement) args[0]; SqlCommandType commondType = ms.getSqlCommandType(); if (commondType.compareTo(SqlCommandType.SELECT) == 0) { return "select"; } if (commondType.compareTo(SqlCommandType.INSERT) == 0) { return "insert"; } if (commondType.compareTo(SqlCommandType.UPDATE) == 0) { return "update"; } if (commondType.compareTo(SqlCommandType.DELETE) == 0) { return "delete"; } return null; } // 定义一个内部辅助类,作用是包装sq class BoundSqlSqlSource implements SqlSource { private BoundSql boundSql; public BoundSqlSqlSource(BoundSql boundSql) { this.boundSql = boundSql; } @Override public BoundSql getBoundSql(Object parameterObject) { return boundSql; } } } ================================================ FILE: src/taoshop-common/taoshop-common-core/src/test/java/org/muses/commo/RedisWithReentrantLock.java ================================================ package org.muses.commo; import redis.clients.jedis.Jedis; import java.util.HashMap; import java.util.Map; public class RedisWithReentrantLock { private ThreadLocal> lockers = new ThreadLocal<>(); private Jedis jedis; public RedisWithReentrantLock(Jedis jedis) { this.jedis = jedis; } private boolean _lock(String key) { return jedis.set(key, "", "nx", "ex", 5L) != null; } private void _unlock(String key) { jedis.del(key); } private Map currentLockers() { Map refs = lockers.get(); if (refs != null) { return refs; } lockers.set(new HashMap<>()); return lockers.get(); } public boolean lock(String key) { Map refs = currentLockers(); Integer refCnt = refs.get(key); if (refCnt != null) { refs.put(key, refCnt + 1); return true; } boolean ok = this._lock(key); if (!ok) { return false; } refs.put(key, 1); return true; } public boolean unlock(String key) { Map refs = currentLockers(); Integer refCnt = refs.get(key); if (refCnt == null) { return false; } refCnt -= 1; if (refCnt > 0) { refs.put(key, refCnt); } else { refs.remove(key); this._unlock(key); } return true; } public static void main(String[] args) { Jedis jedis = new Jedis(); RedisWithReentrantLock redis = new RedisWithReentrantLock(jedis); System.out.println(redis.lock("codehole")); System.out.println(redis.lock("codehole")); System.out.println(redis.unlock("codehole")); System.out.println(redis.unlock("codehole")); } } ================================================ FILE: src/taoshop-common/taoshop-common-rpc/ReadMe.md ================================================ ### 项目RPC工程 ================================================ FILE: src/taoshop-common/taoshop-common-rpc/pom.xml ================================================ taoshop-common com.muses.taoshop.common 1.0-SNAPSHOT 4.0.0 taoshop-common-rpc UTF-8 1.7 1.7 2.5.6 junit junit 4.11 test com.alibaba dubbo ${dubbo.version} maven-clean-plugin 3.0.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.7.0 maven-surefire-plugin 2.20.1 maven-jar-plugin 3.0.2 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2 ================================================ FILE: src/taoshop-common/taoshop-common-rpc/src/main/java/org/muses/common/App.java ================================================ package org.muses.common; /** * Hello world! * */ public class App { public static void main( String[] args ) { System.out.println( "Hello World!" ); } } ================================================ FILE: src/taoshop-common/taoshop-common-rpc/src/test/java/org/muses/common/AppTest.java ================================================ package org.muses.common; import static org.junit.Assert.assertTrue; import org.junit.Test; /** * Unit test for simple App. */ public class AppTest { /** * Rigorous Test :-) */ @Test public void shouldAnswerWithTrue() { assertTrue( true ); } } ================================================ FILE: src/taoshop-common/taoshop-security-core/ReadMe.md ================================================ ### 电商平台安全核心服务 ================================================ FILE: src/taoshop-common/taoshop-security-core/pom.xml ================================================ taoshop-common com.muses.taoshop.common 1.0-SNAPSHOT 4.0.0 taoshop-security-core 3.7 1.2.4 UTF-8 1.7 1.7 org.apache.shiro shiro-all ${shiro.version} org.apache.shiro shiro-spring ${shiro.version} org.apache.shiro shiro-ehcache ${shiro.version} org.apache.shiro shiro-cas ${shiro.version} src/main/java **/*.xml true org.apache.maven.plugins maven-compiler-plugin 3.6.1 1.8 1.8 1.8 UTF-8 org.projectlombok lombok ${lombok.version} org.apache.maven.plugins maven-resources-plugin 3.0.2 UTF-8 ================================================ FILE: src/taoshop-common/taoshop-security-core/src/main/java/com/muses/taoshop/common/cas/casRealm/ShiroCasRealm.java ================================================ package com.muses.taoshop.common.cas.casRealm; import org.apache.shiro.cas.CasRealm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; /** *
 *  CASRealm类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.11.03 16:59    修改内容:
 * 
*/ public class ShiroCasRealm extends CasRealm{ private static final Logger log = LoggerFactory.getLogger(ShiroCasRealm.class); @PostConstruct public void initProperty() { } } ================================================ FILE: src/taoshop-common/taoshop-security-core/src/main/java/com/muses/taoshop/common/cas/config/CasConfiguration.java ================================================ package com.muses.taoshop.common.cas.config; import com.muses.taoshop.common.security.core.shiro.realm.CommonShiroRealm; import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** *
 *  单点登录配置类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.10.28 22:33    修改内容:
 * 
*/ @Configuration public class CasConfiguration { private static final Logger log = LoggerFactory.getLogger(CasConfiguration.class); @Bean public CommonShiroRealm getShiroRealm() { CommonShiroRealm commonShiroRealm = new CommonShiroRealm(); return commonShiroRealm; } /** * 单点登出监听器 * @return */ @Bean public ServletListenerRegistrationBean servletListenerRegistrationBean() { ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(); registrationBean.setListener(new SingleSignOutHttpSessionListener()); registrationBean.setEnabled(true); return registrationBean; } } ================================================ FILE: src/taoshop-common/taoshop-security-core/src/main/java/com/muses/taoshop/common/cas/constant/CasConsts.java ================================================ package com.muses.taoshop.common.cas.constant; /** *
 *  单点登录配置类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.10.28 22:40    修改内容:
 * 
*/ public class CasConsts { //CAS server地址 public static final String CAS_SERVER_URL_PREFIX = "http://127.0.0.1:8080/cas"; //单点登录地址 public static final String CAS_SERVER_LOGIN_URL = CAS_SERVER_URL_PREFIX + "/login"; //单点登出地址 public static final String CAS_SERVER_LOGOUT_URL = CAS_SERVER_LOGIN_URL + "/logout"; //对外提供的服务地址 public static final String SERVER_URL_PREFIX = "http://127.0.0.1:8080/"; //casFilter utlPattern public static final String CAS_FILTER_URL_PATTERN = "/cas"; //登录地址 public static final String LOGIN_URL = CAS_SERVER_LOGIN_URL + "?server=" +SERVER_URL_PREFIX + CAS_FILTER_URL_PATTERN; //登出地址 public static final String LOGOUT_URL = CAS_SERVER_LOGOUT_URL + "?server=" + SERVER_URL_PREFIX; //登录成功地址 public static final String LOGIN_SUCCESS_URL = "/toIndex"; //权限认证失败跳转地址 public static final String UNUATHORIZED_URL = "/error/403.html"; } ================================================ FILE: src/taoshop-common/taoshop-security-core/src/main/java/com/muses/taoshop/common/security/core/filter/SysAccessControllerFilter.java ================================================ package com.muses.taoshop.common.security.core.filter; import com.alibaba.fastjson.JSON; import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.CacheManager; import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.DefaultSessionKey; import org.apache.shiro.session.mgt.SessionManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.web.filter.AccessControlFilter; import org.apache.shiro.web.util.WebUtils; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.PrintWriter; import java.io.Serializable; import java.util.Deque; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; public class SysAccessControllerFilter extends AccessControlFilter{ private String url;//被提出后,重定向的url private boolean isKickoutAfter = false;// private int maxSession = 1; private SessionManager sessionManager; private Cache> cache; public void setUrl(String url){ this.url = url; } public void setKickoutAfter(boolean isKickoutAfter){ this.isKickoutAfter = isKickoutAfter; } public void setMaxSession(int maxSession){ this.maxSession = maxSession; } public void setSessionManager(SessionManager sessionManager){ this.sessionManager = sessionManager; } public void setCacheManager(CacheManager cacheManager){ this.cache = cacheManager.getCache(""); } @Override protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception { return false; } @Override protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { Subject subject = getSubject(servletRequest,servletResponse); if(!subject.isAuthenticated() && ! subject.isRemembered()){ return true; } Session session = subject.getSession(); // User user = (User)subject.getPrincipal(); // String username = user.getUsername(); String username = ""; Serializable sessionId = session.getId(); //读取缓存 Deque deque = cache.get(username); //new一个空队列 if(deque == null){ deque = new LinkedList(); } //如果队列里没有此sessionId,且用户没有被踢出;放入队列 if(!deque.contains(sessionId) && session.getAttribute("kickout") == null) { //将sessionId存入队列 deque.push(sessionId); //将用户的sessionId队列缓存 cache.put(username, deque); } //如果队列里的sessionId数超出最大会话数,开始踢人 while(deque.size() > maxSession) { Serializable kickoutSessionId = null; if(isKickoutAfter) { //如果踢出后者 kickoutSessionId = deque.removeFirst(); //踢出后再更新下缓存队列 cache.put(username, deque); } else { //否则踢出前者 kickoutSessionId = deque.removeLast(); //踢出后再更新下缓存队列 cache.put(username, deque); } try { //获取被踢出的sessionId的session对象 Session kickoutSession = sessionManager.getSession(new DefaultSessionKey(kickoutSessionId)); if(kickoutSession != null) { //设置会话的kickout属性表示踢出了 kickoutSession.setAttribute("kickout", true); } } catch (Exception e) {//ignore exception } } //如果被踢出了,直接退出,重定向到踢出后的地址 if ((Boolean)session.getAttribute("kickout")!=null&&(Boolean)session.getAttribute("kickout") == true) { //会话被踢出了 try { //退出登录 subject.logout(); } catch (Exception e) { //ignore } saveRequest(servletRequest); Map resultMap = new HashMap(); //判断是不是Ajax请求 if ("XMLHttpRequest".equalsIgnoreCase(((HttpServletRequest) servletRequest).getHeader("X-Requested-With"))) { resultMap.put("user_status", "300"); resultMap.put("message", "您已经在其他地方登录,请重新登录!"); //输出json串 out(servletResponse, resultMap); }else{ //重定向 WebUtils.issueRedirect(servletRequest, servletResponse, url); } return false; } return true; } private void out(ServletResponse hresponse, Map resultMap) throws IOException { try { hresponse.setContentType("UTF-8"); PrintWriter out = hresponse.getWriter(); out.println(JSON.toJSON(resultMap)); out.flush(); out.close(); } catch (Exception e) { System.err.println("KickoutSessionFilter.class 输出JSON异常,可以忽略。"); } } } ================================================ FILE: src/taoshop-common/taoshop-security-core/src/main/java/com/muses/taoshop/common/security/core/shiro/realm/CommonShiroRealm.java ================================================ package com.muses.taoshop.common.security.core.shiro.realm; import javax.annotation.Resource; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.LockedAccountException; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; /** * @description 基于Shiro框架的权限安全认证和授权 * @author Nicky * @date 2017年3月12日 */ public class CommonShiroRealm extends AuthorizingRealm { /**注解引入业务类**/ // @Resource // UserService userService; /** * 登录信息和用户验证信息验证(non-Javadoc) * @see org.apache.shiro.realm.AuthenticatingRealm#doGetAuthenticationInfo(AuthenticationToken) */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String)token.getPrincipal(); //得到用户名 String password = new String((char[])token.getCredentials()); //得到密码 // User user = userService.findByUsername(username); /**检测是否有此用户 **/ // if(user == null){ // throw new UnknownAccountException();//没有找到账号异常 // } /**检验账号是否被锁定 **/ // if(Boolean.TRUE.equals(user.getLocked())){ // throw new LockedAccountException();//抛出账号锁定异常 // } /**AuthenticatingRealm使用CredentialsMatcher进行密码匹配**/ if(null != username && null != password){ return new SimpleAuthenticationInfo(username, password, getName()); }else{ return null; } } /** * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用,负责在应用程序中决定用户的访问控制的方法(non-Javadoc) * @see AuthorizingRealm#doGetAuthorizationInfo(PrincipalCollection) */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) { String username = (String)pc.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // authorizationInfo.setRoles(userService.getRoles(username)); // authorizationInfo.setStringPermissions(userService.getPermissions(username)); System.out.println("Shiro授权"); return authorizationInfo; } @Override public void clearCachedAuthorizationInfo(PrincipalCollection principals) { super.clearCachedAuthorizationInfo(principals); } @Override public void clearCachedAuthenticationInfo(PrincipalCollection principals) { super.clearCachedAuthenticationInfo(principals); } @Override public void clearCache(PrincipalCollection principals) { super.clearCache(principals); } } ================================================ FILE: src/taoshop-common/taoshop-security-core/src/main/java/com/muses/taoshop/common/security/core/utils/AESUtil.java ================================================ package com.muses.taoshop.common.security.core.utils; import sun.misc.BASE64Encoder; import java.security.SecureRandom; import java.text.SimpleDateFormat; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** *
 *  AES加密工具类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.05.20    修改内容:
 * 
*/ public class AESUtil { /** * 加密 * @param content * @param encryptKey * @return * @throws Exception */ public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); //防止linux下 随机生成key SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" ); secureRandom.setSeed(encryptKey.getBytes()); kgen.init(128, secureRandom); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 创建密码器 byte[] byteContent = content.getBytes("utf-8"); cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 return cipher.doFinal(byteContent); } public static String aesEncrypt(String content, String encryptKey) throws Exception { return base64Encode(aesEncryptToBytes(content, encryptKey)); } /** * 解密 * @param encryptBytes * @param decryptKey * @return * @throws Exception */ public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); //防止linux下 随机生成key SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" ); secureRandom.setSeed(decryptKey.getBytes()); kgen.init(128, secureRandom); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 创建密码器 cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 byte[] result = cipher.doFinal(encryptBytes); return new String(result); } public static String base64Encode(byte[] bytes) { return new BASE64Encoder().encode(bytes); } } ================================================ FILE: src/taoshop-manager/ReadMe.md ================================================ ### 电商平台后台维护系统 ================================================ FILE: src/taoshop-manager/pom.xml ================================================ taoshop com.muses.taoshop 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.manager taoshop-manager 1.0-SNAPSHOT taoshop-manager-web taoshop-manager-api taoshop-manager-service pom http://www.example.com website scp://webhost.company.com/www/website UTF-8 src/main/java **/*.xml true org.apache.maven.plugins maven-compiler-plugin 3.6.1 1.8 1.8 1.8 UTF-8 org.projectlombok lombok ${lombok.version} org.apache.maven.plugins maven-resources-plugin 3.0.2 UTF-8 ================================================ FILE: src/taoshop-manager/taoshop-manager-api/pom.xml ================================================ taoshop-manager com.muses.taoshop.manager 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.manager taoshop-manager-api 1.0-SNAPSHOT taoshop-manager-api http://www.example.com UTF-8 1.7 1.7 junit junit 4.11 test ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/entity/ItemOrders.java ================================================ package com.muses.taoshop.manager.entity; import lombok.Data; /** *
 *  订单实体类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 11:09    修改内容:
 * 
*/ @Data public class ItemOrders { } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/entity/Menu.java ================================================ package com.muses.taoshop.manager.entity; import lombok.Data; import java.util.List; /** *
 *  菜单信息实体类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 12:32    修改内容:
 * 
*/ @Data public class Menu { /** * 菜单Id ** */ private int menuId; /** * 上级Id * */ private int parentId; /** * 菜单名称 * */ private String menuName; /** * 菜单图标 */ private String menuIcon; /** * 菜单uri */ private String menuUrl; /** * 菜单类型 */ private String menuType; /** 菜单排序**/ private String menuOrder; /** * 菜单排序 */ private String menuStatus; /** * 子级菜单 */ private List subMenu; private String target; /** * 是否有子级菜单 */ private boolean hasSubMenu = false; } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/entity/Operation.java ================================================ package com.muses.taoshop.manager.entity; import lombok.Data; /** *
 *  Operation类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 15:25    修改内容:
 * 
*/ @Data public class Operation { private int id; private String desc; private String name; private String operation; private static final long serialVersionUID = 1L; } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/entity/Permission.java ================================================ package com.muses.taoshop.manager.entity; import lombok.Data; import java.util.HashSet; import java.util.Set; /** *
 *  权限信息实体类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 14:28    修改内容:
 * 
*/ @Data public class Permission { private int id; private String pdesc; private String name; private Menu menu; private Set operations = new HashSet(); } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/entity/SysRole.java ================================================ package com.muses.taoshop.manager.entity; import lombok.Data; import java.util.HashSet; import java.util.Set; /** *
 *  角色信息实体类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 13:31    修改内容:
 * 
*/ @Data public class SysRole { /** 角色Id**/ private int roleId; /** 角色描述**/ private String roleDesc; /** 角色名称**/ private String roleName; /** 角色标志**/ private String role; private Set permissions = new HashSet(); } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/entity/SysUser.java ================================================ package com.muses.taoshop.manager.entity; import lombok.Data; import java.util.Date; import java.util.Set; /** *
 *  系统用户
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.07.01 18:51    修改内容:
 * 
*/ @Data public class SysUser { /** * 用户id */ private int id; /** * 用户名 */ private String username; /** * 密码 */ private String password; /** * 手机号 */ private String phone; /** * 性别 */ private String sex; /** * 电子邮箱 */ private String email; /** * 备注 */ private String mark; /** * 用户级别 */ private String rank; /** * 上次登录时间 */ private Date lastLogin; /** * 登录的IP地址 */ private String loginIp; /** * 头像图片地址 */ private String imageUrl; /** * 注册时间 */ private Date regTime; /** * 账号是否被锁定 */ private Boolean locked = Boolean.FALSE; /** * 权限 */ private String rights; private Set roles; } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/service/IItemOrdersService.java ================================================ package com.muses.taoshop.manager.service; /** *
 *  订单管理
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 11:10    修改内容:
 * 
*/ public interface IItemOrdersService { } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/service/IMenuService.java ================================================ package com.muses.taoshop.manager.service; import com.muses.taoshop.manager.entity.Menu; import java.util.List; public interface IMenuService { /** * 根据权限id获取菜单 * @param permissionId * @return */ Menu listMenu(int permissionId); /** * 权限菜单获取,即根据用户角色获取用户可以查看的菜单 * @return */ List listPermissionMenu(int userId); } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/service/ISysPermissionService.java ================================================ package com.muses.taoshop.manager.service; import com.muses.taoshop.manager.entity.Permission; import java.util.List; import java.util.Set; public interface ISysPermissionService { /** * 获取角色所有权限 * @return */ Set getRolePermissions(int roleId); } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/service/ISysRoleService.java ================================================ package com.muses.taoshop.manager.service; import com.muses.taoshop.manager.entity.SysRole; import java.util.List; import java.util.Set; /** *
 *  角色业务接口
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.10.21 21:57    修改内容:
 * 
*/ public interface ISysRoleService { /** * 获取所有用户角色 * @return */ Set getUserRoles(int userId); } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/main/java/com/muses/taoshop/manager/service/ISysUserService.java ================================================ package com.muses.taoshop.manager.service; import com.muses.taoshop.manager.entity.SysRole; import com.muses.taoshop.manager.entity.SysUser; import java.util.Set; /** *
 *  系统用户信息处理接口类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.07.01 19:09    修改内容:
 * 
*/ public interface ISysUserService { /** * 通过用户名和密码获取用户信息 * @param username * @param password * @return */ SysUser getSysUser(String username , String password); /** * 获取用户角色 * @param username * @return */ Set getRoles(String username) ; /** * 获取用户权限 * @param username * @return */ Set getPermissions(String username); /** * 通过用户名获取用户信息 * @param username * @return */ SysUser getUserInfoByUsername(String username); /** * 通过用户id获取用户角色集合 * @param userId * @return */ @Deprecated Set getUserRoles(int userId); } ================================================ FILE: src/taoshop-manager/taoshop-manager-api/src/test/java/com/muses/taoshop/AppTest.java ================================================ package com.muses.taoshop; import static org.junit.Assert.assertTrue; import org.junit.Test; /** * Unit test for simple App. */ public class AppTest { /** * Rigorous Test :-) */ @Test public void shouldAnswerWithTrue() { assertTrue( true ); } } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/pom.xml ================================================ taoshop-manager com.muses.taoshop.manager 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.manager taoshop-manager-service 1.0-SNAPSHOT taoshop-manager-service http://www.example.com UTF-8 1.7 1.7 com.muses.taoshop.manager taoshop-manager-api 1.0-SNAPSHOT com.muses.taoshop.common taoshop-common-core 1.0-SNAPSHOT junit junit 4.11 test ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/java/com/muses/taoshop/manager/mapper/ItemOrdersMapper.java ================================================ package com.muses.taoshop.manager.mapper; /** *
 *  订单管理
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 11:10    修改内容:
 * 
*/ public interface ItemOrdersMapper { } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/java/com/muses/taoshop/manager/mapper/SysMenuMapper.java ================================================ package com.muses.taoshop.manager.mapper; import com.muses.taoshop.common.core.database.annotation.MybatisRepository; import com.muses.taoshop.manager.entity.Menu; import org.apache.ibatis.annotations.Param; import java.util.List; /** *
 *  菜单管理
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 12:33    修改内容:
 * 
*/ @MybatisRepository public interface SysMenuMapper { Menu listMenu(@Param("permissionId") int permissionId); List listPermissionMenu(@Param("userId")int userId); } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/java/com/muses/taoshop/manager/mapper/SysPermissionMapper.java ================================================ package com.muses.taoshop.manager.mapper; import com.muses.taoshop.common.core.database.annotation.MybatisRepository; import com.muses.taoshop.manager.entity.Permission; import java.util.List; @MybatisRepository public interface SysPermissionMapper { List listRolePermission(int roleId); } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/java/com/muses/taoshop/manager/mapper/SysRoleMapper.java ================================================ package com.muses.taoshop.manager.mapper; import com.muses.taoshop.common.core.database.annotation.MybatisRepository; import com.muses.taoshop.manager.entity.SysRole; import org.apache.ibatis.annotations.Param; import java.util.List; /** *
 *  角色操作Mapper接口
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.10.21 21:55    修改内容:
 * 
*/ @MybatisRepository public interface SysRoleMapper { List listUserRole(@Param("userId")int userId); } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/java/com/muses/taoshop/manager/mapper/SysUserMapper.java ================================================ package com.muses.taoshop.manager.mapper; import com.muses.taoshop.common.core.database.annotation.MybatisRepository; import com.muses.taoshop.manager.entity.SysUser; import org.apache.ibatis.annotations.Param; /** * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.07.08 11:17    修改内容:
 * 
*/ @MybatisRepository public interface SysUserMapper { SysUser getSysUserInfo(@Param("username")String username, @Param("password")String password); SysUser getUserInfoByUsername(@Param("username") String username); } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/java/com/muses/taoshop/manager/service/ItemOrdersServiceImpl.java ================================================ package com.muses.taoshop.manager.service; import org.springframework.stereotype.Service; /** *
 *  订单管理业务接口
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 11:11    修改内容:
 * 
*/ @Service public class ItemOrdersServiceImpl { } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/java/com/muses/taoshop/manager/service/MenuServiceImpl.java ================================================ package com.muses.taoshop.manager.service; import com.muses.taoshop.manager.entity.Menu; import com.muses.taoshop.manager.mapper.SysMenuMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** *
 *  菜单管理业务接口
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 12:34    修改内容:
 * 
*/ @Service public class MenuServiceImpl implements IMenuService{ @Autowired SysMenuMapper sysMenuMapper; /** * 根据权限id获取菜单 * @param permissionId * @return */ @Override public Menu listMenu(int permissionId) { return sysMenuMapper.listMenu(permissionId); } /** * 权限菜单获取,即根据用户角色获取用户可以查看的菜单 * * @return */ @Override public List listPermissionMenu(int userId) { return sysMenuMapper.listPermissionMenu(userId); } } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/java/com/muses/taoshop/manager/service/SysPermissionServiceImpl.java ================================================ package com.muses.taoshop.manager.service; import com.muses.taoshop.manager.entity.Permission; import com.muses.taoshop.manager.mapper.SysPermissionMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashSet; import java.util.List; import java.util.Set; /** *
 *  权限业务接口
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.10.21 23:34    修改内容:
 * 
*/ @Service public class SysPermissionServiceImpl implements ISysPermissionService{ @Autowired SysPermissionMapper sysPermissionMapper; @Override public Set getRolePermissions(int roleId) { List permissionList = sysPermissionMapper.listRolePermission(roleId); Set permissions = new HashSet(permissionList); return permissions; } } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/java/com/muses/taoshop/manager/service/SysRoleServiceImpl.java ================================================ package com.muses.taoshop.manager.service; import com.muses.taoshop.manager.entity.SysRole; import com.muses.taoshop.manager.mapper.SysRoleMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashSet; import java.util.List; import java.util.Set; /** *
 *  角色业务类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.10.21 21:59    修改内容:
 * 
*/ @Service public class SysRoleServiceImpl implements ISysRoleService { @Autowired SysRoleMapper sysRoleMapper; /** * 通过用户id获取用户角色 * * @param userId * @return */ @Override public Set getUserRoles(int userId) { List roleList = sysRoleMapper.listUserRole(userId); Set roles = new HashSet<>(roleList); return roles; } } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/java/com/muses/taoshop/manager/service/SysUserServiceImpl.java ================================================ package com.muses.taoshop.manager.service; import com.muses.taoshop.manager.entity.Operation; import com.muses.taoshop.manager.entity.Permission; import com.muses.taoshop.manager.entity.SysRole; import com.muses.taoshop.manager.mapper.SysRoleMapper; import com.muses.taoshop.manager.mapper.SysUserMapper; import com.muses.taoshop.manager.entity.SysUser; import com.muses.taoshop.manager.service.ISysUserService; import org.apache.catalina.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.management.relation.Role; import java.util.HashSet; import java.util.List; import java.util.Set; /** *
 *  用户信息管理业务类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.07.08 11:15    修改内容:
 * 
*/ @Service public class SysUserServiceImpl implements ISysUserService{ @Autowired SysUserMapper sysUserMapper; @Autowired SysRoleMapper sysRoleMapper; @Override public SysUser getSysUser(String username , String password) { return sysUserMapper.getSysUserInfo(username , password); } /** * 获取用户角色 * @param username * @return */ @Override public Set getRoles(String username) { SysUser user = this.getUserInfoByUsername(username); Set roles = user.getRoles(); Set roleStrs = new HashSet(); for(SysRole r : roles){ roleStrs.add(r.getRole()); } return roleStrs; } /** * 通过用户id获取用户角色集合 * @param userId * @return */ @Override public Set getUserRoles(int userId) { List roleList = sysRoleMapper.listUserRole(userId); Set roles = new HashSet<>(roleList); return roles; } /** * 获取用户权限 * @param username * @return */ public Set getPermissions(String username) { SysUser user = this.getUserInfoByUsername(username); Set roles = user.getRoles(); /* 创建一个HashSet来存放角色权限信息 */ Set permissions = new HashSet(); for(SysRole r : roles) { for (Permission p : r.getPermissions()){ for(Operation o : p.getOperations()){ permissions.add(o.getOperation()); } } } return permissions; } /** * 通过用户名获取用户信息 * * @param username * @return */ @Override @Deprecated public SysUser getUserInfoByUsername(String username) { return sysUserMapper.getUserInfoByUsername(username); } } ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/resources/mybatis/SysMenuMapper.xml ================================================ ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/resources/mybatis/SysPermissionMapper.xml ================================================ ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/resources/mybatis/SysRoleMapper.xml ================================================ roleId, roleName, roleDesc, role ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/main/resources/mybatis/SysUserMapper.xml ================================================ id, username, password, phone, sex, email, mark, rank, lastLogin, loginIp, imageUrl, regTime, locked, rights ================================================ FILE: src/taoshop-manager/taoshop-manager-service/src/test/java/com/muses/taoshop/AppTest.java ================================================ package com.muses.taoshop; import static org.junit.Assert.assertTrue; import org.junit.Test; /** * Unit test for simple App. */ public class AppTest { /** * Rigorous Test :-) */ @Test public void shouldAnswerWithTrue() { assertTrue( true ); } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/ReadMe.md ================================================ ### 电商维护系统Web ================================================ FILE: src/taoshop-manager/taoshop-manager-web/pom.xml ================================================ taoshop-manager com.muses.taoshop.manager 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.manager taoshop-manager-web 1.0-SNAPSHOT war taoshop-manager-web Maven Webapp http://www.example.com 3.7 1.2.3 UTF-8 org.springframework.boot spring-boot-devtools true org.springframework.boot spring-boot-starter-thymeleaf com.muses.taoshop.manager taoshop-manager-service 1.0-SNAPSHOT org.apache.shiro shiro-all ${shiro.version} org.apache.poi poi ${poi.version} com.sun.mail javax.mail 1.5.6 src/main/java **/*.xml true org.apache.maven.plugins maven-compiler-plugin 3.6.1 1.8 1.8 1.8 UTF-8 org.projectlombok lombok ${lombok.version} org.apache.maven.plugins maven-resources-plugin 3.0.2 UTF-8 ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/WebApplication.java ================================================ package com.muses.taoshop.manager; import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.cache.annotation.EnableCaching; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * *
 *  SpringBoot启动配置类
 * 
* @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ @Controller @EnableScheduling//开启对计划任务的支持 @EnableTransactionManagement//开启对事务管理配置的支持 @EnableCaching @EnableAsync//开启对异步方法的支持 @EnableAutoConfiguration @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class}) public class WebApplication { @RequestMapping("/doTest1") @ResponseBody String doTest(){ System.out.println(Thread.currentThread().getName()); String threadName = Thread.currentThread().getName(); return threadName; } public static void main(String[] args) throws Exception { SpringApplication.run(WebApplication.class, args); } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/config/MybatisConfig.java ================================================ package com.muses.taoshop.manager.config; import com.muses.taoshop.common.core.database.annotation.MybatisRepository; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.util.ClassUtils; import javax.sql.DataSource; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import static com.muses.taoshop.common.core.database.config.BaseConfig.*; /** *
 *  Mybatis配置类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ @MapperScan( basePackages = MAPPER_PACKAGES, annotationClass = MybatisRepository.class, sqlSessionFactoryRef = SQL_SESSION_FACTORY ) @EnableTransactionManagement @Configuration //@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class }) //@ConditionalOnBean(DataSource.class) //@EnableConfigurationProperties(MybatisProperties.class) //@AutoConfigureAfter(DataSourceAutoConfiguration.class) public class MybatisConfig { @Bean(name = DATA_SOURCE_NAME) @ConfigurationProperties(prefix = DATA_SOURCE_PROPERTIES) @Primary public DataSource dataSource(){ return DataSourceBuilder.create().build(); } @Primary @Bean(name = SQL_SESSION_FACTORY) public SqlSessionFactory sqlSessionFactory(@Qualifier(DATA_SOURCE_NAME)DataSource dataSource)throws Exception{ //SpringBoot默认使用DefaultVFS进行扫描,但是没有扫描到jar里的实体类 //VFS.addImplClass(SpringBootVFS.class); SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); //factoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try{ factoryBean.setMapperLocations(resolver.getResources("classpath*:/mybatis/*Mapper.xml")); String typeAliasesPackage=setTypeAliasesPackage(ENTITY_PACKAGES); factoryBean.setTypeAliasesPackage(typeAliasesPackage); SqlSessionFactory sqlSessionFactory = factoryBean.getObject(); return sqlSessionFactory; }catch (Exception e){ e.printStackTrace(); throw new RuntimeException(); } } @Bean(name = MYBATIS_TRANSACTION_MANAGER) public DataSourceTransactionManager transactionManager(@Qualifier(DATA_SOURCE_NAME)DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; public static String setTypeAliasesPackage(String typeAliasesPackage) { ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory( resolver); typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN; try { List result = new ArrayList(); Resource[] resources = resolver.getResources(typeAliasesPackage); if (resources != null && resources.length > 0) { MetadataReader metadataReader = null; for (Resource resource : resources) { if (resource.isReadable()) { metadataReader = metadataReaderFactory .getMetadataReader(resource); try { // System.out.println(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); result.add(Class .forName( metadataReader.getClassMetadata() .getClassName()) .getPackage().getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } } if (result.size() > 0) { HashSet h = new HashSet(result); result.clear(); result.addAll(h); typeAliasesPackage=String.join(",",(String[]) result.toArray(new String[0])); // System.out.println(typeAliasesPackage); } else { throw new RuntimeException( "mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包"); } } catch (IOException e) { e.printStackTrace(); } return typeAliasesPackage; } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/config/ShiroConfig.java ================================================ package com.muses.taoshop.manager.config; import com.muses.taoshop.manager.core.shiro.ShiroRealm; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap; import java.util.Map; /** *
 *  Shiro配置类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ @Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); //拦截器. Map filterChainDefinitionMap = new LinkedHashMap<>(); // 配置不会被拦截的链接 顺序判断 filterChainDefinitionMap.put("/static/**", "anon"); filterChainDefinitionMap.put("/upload/**", "anon"); filterChainDefinitionMap.put("/plugins/**", "anon"); filterChainDefinitionMap.put("/templates/**", "anon"); filterChainDefinitionMap.put("/admin/code/api/generate", "anon"); filterChainDefinitionMap.put("/admin/login/api/toLogin", "anon"); filterChainDefinitionMap.put("/admin/login/api/loginCheck", "anon"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setLoginUrl("/admin/login/api/toLogin"); shiroFilterFactoryBean.setSuccessUrl("/admin/login/api/toIndex"); shiroFilterFactoryBean.setUnauthorizedUrl("/admin/login/api/toIndex"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } @Bean public ShiroRealm myShiroRealm(){ ShiroRealm myShiroRealm = new ShiroRealm(); return myShiroRealm; } @Bean public SecurityManager securityManager(){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myShiroRealm()); return securityManager; } /** * 限制同一账号登录同时登录人数控制 * @return */ // public SysAccessControllerFilter kickoutSessionControlFilter(){ // SysAccessControllerFilter filter = new SysAccessControllerFilter(); // //使用cacheManager获取相应的cache来缓存用户登录的会话;用于保存用户—会话之间的关系的; // //这里我们还是用之前shiro使用的redisManager()实现的cacheManager()缓存管理 // //也可以重新另写一个,重新配置缓存时间之类的自定义缓存属性 //// filter.setCacheManager(cacheManager()); //// //用于根据会话ID,获取会话进行踢出操作的; //// filter.setSessionManager(sessionManager()); // //是否踢出后来登录的,默认是false;即后者登录的用户踢出前者登录的用户;踢出顺序。 // filter.setKickoutAfter(false); // //同一个用户最大的会话数,默认1;比如2的意思是同一个用户允许最多同时两个人登录; // filter.setMaxSession(1); // //被踢出后重定向到的地址; // filter.setUrl("/admin/login/api/toLogin"); // return filter; // } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/config/ThymeleafConfig.java ================================================ package com.muses.taoshop.manager.config; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistrar; import org.springframework.format.FormatterRegistry; import org.springframework.format.datetime.DateFormatter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; /** *
 * Thymeleaf模板引擎配置
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 10:50    修改内容:
 * 
*/ @Configuration public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware{ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { } @Override public void addFormatters(final FormatterRegistry registry){ super.addFormatters(registry); registry.addFormatter(dateFormatter()); } @Bean public DateFormatter dateFormatter(){ return new MyDateFormatter(); } class MyDateFormatter extends DateFormatter { @Override public String print(Date date, Locale locale) { //return super.print(date, locale); return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); } } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/config/WebConfig.java ================================================ package com.muses.taoshop.manager.config; import org.springframework.context.annotation.Configuration; import org.springframework.util.ResourceUtils; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/templates/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/templates/"); registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/"); registry.addResourceHandler("/plugins/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/"); super.addResourceHandlers(registry); } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/core/Constants.java ================================================ package com.muses.taoshop.manager.core; import java.util.Locale; /** *
 *  Constants类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.07.08 11:00    修改内容:
 * 
*/ public class Constants { //定义统一Locale.CHINA,程序中所有和Locale相关操作均默认使用此Locale public static final Locale LOCALE_CHINA = Locale.CHINA; //验证码Session public static final String SESSION_SECURITY_CODE = "sessionSecCode"; //用户信息Session public static final String SESSION_USER = "sessionUser"; //角色权限Session public static final String SESSION_ROLE_RIGHTS = "sessionRoleRights"; //所有菜单Session public static final String SESSION_ALLMENU = "sessionAllMenu"; //权限Session public static final String SESSION_RIGHTS = "sessionRights"; //页面分页数量 public static final Integer PAGE_SIZE = 6; //页面排序数量 public static final Integer SORT_SIZE = 3; //登录URL public static final String URL_LOGIN = "/login.do"; //登录过滤的正则表达式 public static final String REGEXP_PATH = ".*/((login)|(logout)|(toblog)|(search)|(getArchiveArticles)|(code)|(plugins)|(upload)|(static)).*"; //不对匹配该值的访问路径拦截(正则) //Lucene索引的路径 public static final String LUCENE_INDEX_PATH = "D:\\lucene"; } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/core/shiro/ShiroRealm.java ================================================ package com.muses.taoshop.manager.core.shiro; import com.muses.taoshop.manager.entity.SysUser; import com.muses.taoshop.manager.service.ISysUserService; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import javax.annotation.Resource; /** *
 *  权限认证和授权
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 12:34    修改内容:
 * 
*/ public class ShiroRealm extends AuthorizingRealm { /**注解引入业务类**/ @Resource ISysUserService userService; /** * 登录信息和用户验证信息验证(non-Javadoc) * @see org.apache.shiro.realm.AuthenticatingRealm#doGetAuthenticationInfo(AuthenticationToken) */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String)token.getPrincipal(); //得到用户名 String password = new String((char[])token.getCredentials()); //得到密码 SysUser user = userService.getUserInfoByUsername(username); /* 检测是否有此用户 */ if(user == null){ throw new UnknownAccountException();//没有找到账号异常 } /* 检验账号是否被锁定 */ if(Boolean.TRUE.equals(user.getLocked())){ throw new LockedAccountException();//抛出账号锁定异常 } /* AuthenticatingRealm使用CredentialsMatcher进行密码匹配 */ if(null != username && null != password){ return new SimpleAuthenticationInfo(username, password, getName()); }else{ return null; } } /** * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用,负责在应用程序中决定用户的访问控制的方法(non-Javadoc) * @see AuthorizingRealm#doGetAuthorizationInfo(PrincipalCollection) */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) { String username = (String)pc.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.setRoles(userService.getRoles(username)); authorizationInfo.setStringPermissions(userService.getPermissions(username)); return authorizationInfo; } @Override public void clearCachedAuthorizationInfo(PrincipalCollection principals) { super.clearCachedAuthorizationInfo(principals); } @Override public void clearCachedAuthenticationInfo(PrincipalCollection principals) { super.clearCachedAuthenticationInfo(principals); } @Override public void clearCache(PrincipalCollection principals) { super.clearCache(principals); } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/util/MenuTreeUtil.java ================================================ package com.muses.taoshop.manager.util; import com.muses.taoshop.manager.entity.Menu; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class MenuTreeUtil { public List menuCommon; public List list = new ArrayList(); public List menuList(List menus){ this.menuCommon = menus; for (Menu x : menus) { Menu m = new Menu(); if(x.getParentId()==0){ m.setParentId(x.getParentId()); m.setMenuId(x.getMenuId()); m.setMenuName(x.getMenuName()); m.setMenuIcon(x.getMenuIcon()); m.setMenuUrl(x.getMenuUrl()); m.setSubMenu(menuChild(x.getMenuId())); list.add(m); } } return list; } public List menuChild(int id){ List lists = new ArrayList(); for(Menu a:menuCommon){ Menu m = new Menu(); if(a.getParentId() == id){ m.setParentId(a.getParentId()); m.setMenuId(a.getMenuId()); m.setMenuName(a.getMenuName()); m.setMenuIcon(a.getMenuIcon()); m.setMenuUrl(a.getMenuUrl()); lists.add(m); } } return lists; } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/web/controller/BaseController.java ================================================ package com.muses.taoshop.manager.web.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; /** *
 *  基础控制类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.06.18 00:12    修改内容:
 * 
*/ public class BaseController { public Logger log = LoggerFactory.getLogger(BaseController.class); public void debug(String message , Exception e){ log.debug(message , e); } public void info(String message,Exception e){ log.info(message , e); } public void error(String message,Exception e){ log.error(message , e); } /*** * 获取request值 * @return */ public HttpServletRequest getRequest() { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } /** * 得到ModelAndView */ public ModelAndView getModelAndView(){ return new ModelAndView(); } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/web/controller/CodeController.java ================================================ package com.muses.taoshop.manager.web.controller; import com.muses.taoshop.manager.core.Constants; import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Random; @Controller @RequestMapping("/admin/code/api") public class CodeController { @RequestMapping("/generate") public void generate(HttpServletResponse response){ ByteArrayOutputStream output = new ByteArrayOutputStream(); String code = drawImg(output); Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); session.setAttribute(Constants.SESSION_SECURITY_CODE, code); try { ServletOutputStream out = response.getOutputStream(); output.writeTo(out); } catch (IOException e) { e.printStackTrace(); } } /** * 绘画验证码 * @param output * @return */ private String drawImg(ByteArrayOutputStream output){ String code = ""; //随机产生4个字符 for(int i=0; i<4; i++){ code += randomChar(); } int width = 70; int height = 25; BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR); Font font = new Font("Times New Roman",Font.PLAIN,20); //调用Graphics2D绘画验证码 Graphics2D g = bi.createGraphics(); g.setFont(font); Color color = new Color(66,2,82); g.setColor(color); g.setBackground(new Color(226,226,240)); g.clearRect(0, 0, width, height); FontRenderContext context = g.getFontRenderContext(); Rectangle2D bounds = font.getStringBounds(code, context); double x = (width - bounds.getWidth()) / 2; double y = (height - bounds.getHeight()) / 2; double ascent = bounds.getY(); double baseY = y - ascent; g.drawString(code, (int)x, (int)baseY); g.dispose(); try { ImageIO.write(bi, "jpg", output); } catch (IOException e) { e.printStackTrace(); } return code; } /** * 随机参数一个字符 * @return */ private char randomChar(){ Random r = new Random(); String s = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789"; return s.charAt(r.nextInt(s.length())); } /** * 获取随机颜色值 * @param fc * @param bc * @return */ Color getRandColor(int fc,int bc){ Random random=new Random(); if(fc>255) fc=255; if(bc>255) bc=255; int r=fc+random.nextInt(bc-fc); int g=fc+random.nextInt(bc-fc); int b=fc+random.nextInt(bc-fc); return new Color(r,g,b); } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/web/controller/LoginController.java ================================================ package com.muses.taoshop.manager.web.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.muses.taoshop.manager.core.Constants; import com.muses.taoshop.manager.entity.Menu; import com.muses.taoshop.manager.entity.Permission; import com.muses.taoshop.manager.entity.SysRole; import com.muses.taoshop.manager.entity.SysUser; import com.muses.taoshop.manager.service.IMenuService; import com.muses.taoshop.manager.service.ISysPermissionService; import com.muses.taoshop.manager.service.ISysRoleService; import com.muses.taoshop.manager.service.ISysUserService; import com.muses.taoshop.manager.util.MenuTreeUtil; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import javax.imageio.ImageIO; import javax.naming.AuthenticationException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.*; import java.util.List; /** *
 *  登录控制类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.07.01 21:01    修改内容:
 * 
*/ @Controller @RequestMapping("/admin/login/api") public class LoginController extends BaseController { @Autowired ISysUserService iSysUserService; @Autowired ISysRoleService iSysRoleService; @Autowired ISysPermissionService iSysPermissionService; @Autowired IMenuService iMenuService; @RequestMapping(value = "/toLogin") @GetMapping public ModelAndView toLogin(){ ModelAndView mv = this.getModelAndView(); mv.setViewName("login"); return mv; } /** * 基于Shiro框架的登录验证,页面发送JSON请求数据, * 服务端进行登录验证之后,返回Json响应数据,"success"表示验证成功 * @param request * @return * @throws Exception */ @RequestMapping(value="/loginCheck", produces="application/json;charset=UTF-8") @ResponseBody public String loginCheck(HttpServletRequest request)throws AuthenticationException { JSONObject obj = new JSONObject(); String errInfo = "";//错误信息 String logindata[] = request.getParameter("LOGINDATA").split(","); if(logindata != null && logindata.length == 3){ //获取Shiro管理的Session Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); String codeSession = (String)session.getAttribute(Constants.SESSION_SECURITY_CODE); String code = logindata[2]; /**检测页面验证码是否为空,调用工具类检测**/ if(StringUtils.isEmpty(code)){ errInfo = "nullcode"; }else{ String username = logindata[0]; String password = logindata[1]; if(StringUtils.isNotEmpty(codeSession)/*&&code.equalsIgnoreCase(codeSession)*/){ //Shiro框架SHA加密 String passwordsha = new SimpleHash("SHA-1",username,password).toString(); System.out.println(passwordsha); //检测用户名和密码是否正确 SysUser user = iSysUserService.getSysUser(username,passwordsha); if(user != null){ if(Boolean.TRUE.equals(user.getLocked())){ errInfo = "locked"; }else{ //Shiro添加会话 session.setAttribute("username", username); session.setAttribute(Constants.SESSION_USER, user); //删除验证码Session session.removeAttribute(Constants.SESSION_SECURITY_CODE); //保存登录IP //getRemortIP(username); /**Shiro加入身份验证**/ Subject sub = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username,password); sub.login(token); log.info("登录成功!"); } }else{ //账号或者密码错误 errInfo = "uerror"; } if(StringUtils.isEmpty(errInfo)){ errInfo = "success"; } }else{ //缺少参数 errInfo="codeerror"; } } } obj.put("result", errInfo); return obj.toString(); } /** * 后台管理系统主页 * @return * @throws Exception */ @RequestMapping(value="/toIndex") public ModelAndView toMain() throws AuthenticationException{ log.info("跳转到系统主页=>"); ModelAndView mv = this.getModelAndView(); /* E1:获取Shiro管理的用户Session */ Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); SysUser user = (SysUser)session.getAttribute(Constants.SESSION_USER); /* E2:获取用户具有的角色权限 */ if(user != null){ Set roles = iSysRoleService.getUserRoles(user.getId()); Set permissions = new HashSet(); if(!CollectionUtils.isEmpty(roles)) { for (SysRole r : roles) { Set permissionSet = iSysPermissionService.getRolePermissions(r.getRoleId()); permissions.addAll(permissionSet); } } log.info("权限集合:{}"+permissions.toString()); List menuList = new ArrayList(); for(Permission p : permissions){ Menu menu = iMenuService.listMenu(p.getId()); menuList.add(menu); } /* E3:获取权限对应的菜单信息*/ //方法二: 直接通过SQL获取权限菜单 //menuList = iMenuService.listPermissionMenu(user.getId()); log.info("用户可以查看的菜单个数:{}"+menuList.size()); MenuTreeUtil treeUtil = new MenuTreeUtil(); if(!CollectionUtils.isEmpty(menuList)) { List treemenus= treeUtil.menuList(menuList); mv.addObject("menus",treemenus); mv.setViewName("admin/frame/index"); } }else{ //会话失效,返回登录界面 mv.setViewName("login"); } return mv; } /** * 注销登录 * @return */ @RequestMapping(value="/logout") public ModelAndView logout(){ ModelAndView mv = this.getModelAndView(); /* Shiro管理Session */ Subject sub = SecurityUtils.getSubject(); Session session = sub.getSession(); session.removeAttribute(Constants.SESSION_USER); session.removeAttribute(Constants.SESSION_SECURITY_CODE); /* Shiro销毁登录 */ Subject subject = SecurityUtils.getSubject(); subject.logout(); /* 返回后台系统登录界面 */ mv.setViewName("login"); return mv; } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/web/controller/item/OrderController.java ================================================ package com.muses.taoshop.manager.web.controller.item; import com.muses.taoshop.manager.web.controller.BaseController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** *
 *  订单管理控制类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 11:08    修改内容:
 * 
*/ @Controller @RequestMapping("/admin/order/api") public class OrderController extends BaseController{ /** * 跳转订单管理页面 * @return */ @GetMapping(value = "/toOrder") public ModelAndView toOrder() { ModelAndView mv = this.getModelAndView(); mv.setViewName("admin/order/order_list"); return mv; } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/web/controller/menu/MenuController.java ================================================ package com.muses.taoshop.manager.web.controller.menu; import org.springframework.stereotype.Controller; /** *
 *  菜单管理
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.09.22 12:34    修改内容:
 * 
*/ @Controller public class MenuController { } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/java/com/muses/taoshop/manager/web/controller/userCenter/UserController.java ================================================ package com.muses.taoshop.manager.web.controller.userCenter; import com.muses.taoshop.manager.web.controller.BaseController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** *
 *  用户中心控制类
 * 
* * @author nicky * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.08.11 11:06    修改内容:
 * 
*/ @Controller @RequestMapping("/admin/user/api") public class UserController extends BaseController { /** * 跳转到用户中心 * @return */ @GetMapping(value = "/toUserCenter") public ModelAndView toUserCenter() { ModelAndView mv = this.getModelAndView(); mv.setViewName("admin/user/user_center"); return mv; } } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/application.yml ================================================ server: port: 8082 #logging: # config: classpath:logback.xml # level: # com.muses.taoshop.*.mapper: trace spring: datasource: # 主数据源 shop: url: jdbc:mysql://127.0.0.1:3306/taoshop?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 连接池设置 druid: initial-size: 5 min-idle: 5 max-active: 20 # 配置获取连接等待超时的时间 max-wait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 time-between-eviction-runs-millis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 min-evictable-idle-time-millis: 300000 # Oracle请使用select 1 from dual validation-query: SELECT 'x' test-while-idle: true test-on-borrow: false test-on-return: false # 打开PSCache,并且指定每个连接上PSCache的大小 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多个DruidDataSource的监控数据 use-global-data-source-stat: true # jpa: # database: mysql # hibernate: # show_sql: true # format_sql: true # ddl-auto: none # naming: # physical-strategy: org.hibernate.boot.entity.naming.PhysicalNamingStrategyStandardImpl # mvc: # view: # prefix: /WEB-INF/jsp/ # suffix: .jsp #添加Thymeleaf配置 thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html mode: HTML5 encoding: UTF-8 content-type: text/html #Jedis配置 # jedis : # pool : # host : 127.0.0.1 # port : 6379 # password : redispassword # timeout : 0 # config : # maxTotal : 100 # maxIdle : 10 # maxWaitMillis : 100000 ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/datepicker/css/bootstrap-datepicker.css ================================================ /*! * Datepicker for Bootstrap v1.5.1 (https://github.com/eternicode/bootstrap-datepicker) * * Copyright 2012 Stefan Petre * Improvements by Andrew Rowls * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) */ .datepicker { padding: 4px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; direction: ltr; } .datepicker-inline { width: 220px; } .datepicker.datepicker-rtl { direction: rtl; } .datepicker.datepicker-rtl table tr td span { float: right; } .datepicker-dropdown { top: 0; left: 0; } .datepicker-dropdown:before { content: ''; display: inline-block; border-left: 7px solid transparent; border-right: 7px solid transparent; border-bottom: 7px solid #999999; border-top: 0; border-bottom-color: rgba(0, 0, 0, 0.2); position: absolute; } .datepicker-dropdown:after { content: ''; display: inline-block; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid #ffffff; border-top: 0; position: absolute; } .datepicker-dropdown.datepicker-orient-left:before { left: 6px; } .datepicker-dropdown.datepicker-orient-left:after { left: 7px; } .datepicker-dropdown.datepicker-orient-right:before { right: 6px; } .datepicker-dropdown.datepicker-orient-right:after { right: 7px; } .datepicker-dropdown.datepicker-orient-bottom:before { top: -7px; } .datepicker-dropdown.datepicker-orient-bottom:after { top: -6px; } .datepicker-dropdown.datepicker-orient-top:before { bottom: -7px; border-bottom: 0; border-top: 7px solid #999999; } .datepicker-dropdown.datepicker-orient-top:after { bottom: -6px; border-bottom: 0; border-top: 6px solid #ffffff; } .datepicker > div { display: none; } .datepicker table { margin: 0; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .datepicker td, .datepicker th { text-align: center; width: 20px; height: 20px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; border: none; } .table-striped .datepicker table tr td, .table-striped .datepicker table tr th { background-color: transparent; } .datepicker table tr td.day:hover, .datepicker table tr td.day.focused { background: #eeeeee; cursor: pointer; } .datepicker table tr td.old, .datepicker table tr td.new { color: #999999; } .datepicker table tr td.disabled, .datepicker table tr td.disabled:hover { background: none; color: #999999; cursor: default; } .datepicker table tr td.highlighted { background: #d9edf7; border-radius: 0; } .datepicker table tr td.today, .datepicker table tr td.today:hover, .datepicker table tr td.today.disabled, .datepicker table tr td.today.disabled:hover { background-color: #fde19a; background-image: -moz-linear-gradient(to bottom, #fdd49a, #fdf59a); background-image: -ms-linear-gradient(to bottom, #fdd49a, #fdf59a); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); background-image: -webkit-linear-gradient(to bottom, #fdd49a, #fdf59a); background-image: -o-linear-gradient(to bottom, #fdd49a, #fdf59a); background-image: linear-gradient(to bottom, #fdd49a, #fdf59a); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); border-color: #fdf59a #fdf59a #fbed50; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); color: #000; } .datepicker table tr td.today:hover, .datepicker table tr td.today:hover:hover, .datepicker table tr td.today.disabled:hover, .datepicker table tr td.today.disabled:hover:hover, .datepicker table tr td.today:active, .datepicker table tr td.today:hover:active, .datepicker table tr td.today.disabled:active, .datepicker table tr td.today.disabled:hover:active, .datepicker table tr td.today.active, .datepicker table tr td.today:hover.active, .datepicker table tr td.today.disabled.active, .datepicker table tr td.today.disabled:hover.active, .datepicker table tr td.today.disabled, .datepicker table tr td.today:hover.disabled, .datepicker table tr td.today.disabled.disabled, .datepicker table tr td.today.disabled:hover.disabled, .datepicker table tr td.today[disabled], .datepicker table tr td.today:hover[disabled], .datepicker table tr td.today.disabled[disabled], .datepicker table tr td.today.disabled:hover[disabled] { background-color: #fdf59a; } .datepicker table tr td.today:active, .datepicker table tr td.today:hover:active, .datepicker table tr td.today.disabled:active, .datepicker table tr td.today.disabled:hover:active, .datepicker table tr td.today.active, .datepicker table tr td.today:hover.active, .datepicker table tr td.today.disabled.active, .datepicker table tr td.today.disabled:hover.active { background-color: #fbf069 \9; } .datepicker table tr td.today:hover:hover { color: #000; } .datepicker table tr td.today.active:hover { color: #fff; } .datepicker table tr td.range, .datepicker table tr td.range:hover, .datepicker table tr td.range.disabled, .datepicker table tr td.range.disabled:hover { background: #eeeeee; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .datepicker table tr td.range.today, .datepicker table tr td.range.today:hover, .datepicker table tr td.range.today.disabled, .datepicker table tr td.range.today.disabled:hover { background-color: #f3d17a; background-image: -moz-linear-gradient(to bottom, #f3c17a, #f3e97a); background-image: -ms-linear-gradient(to bottom, #f3c17a, #f3e97a); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); background-image: -webkit-linear-gradient(to bottom, #f3c17a, #f3e97a); background-image: -o-linear-gradient(to bottom, #f3c17a, #f3e97a); background-image: linear-gradient(to bottom, #f3c17a, #f3e97a); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0); border-color: #f3e97a #f3e97a #edde34; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .datepicker table tr td.range.today:hover, .datepicker table tr td.range.today:hover:hover, .datepicker table tr td.range.today.disabled:hover, .datepicker table tr td.range.today.disabled:hover:hover, .datepicker table tr td.range.today:active, .datepicker table tr td.range.today:hover:active, .datepicker table tr td.range.today.disabled:active, .datepicker table tr td.range.today.disabled:hover:active, .datepicker table tr td.range.today.active, .datepicker table tr td.range.today:hover.active, .datepicker table tr td.range.today.disabled.active, .datepicker table tr td.range.today.disabled:hover.active, .datepicker table tr td.range.today.disabled, .datepicker table tr td.range.today:hover.disabled, .datepicker table tr td.range.today.disabled.disabled, .datepicker table tr td.range.today.disabled:hover.disabled, .datepicker table tr td.range.today[disabled], .datepicker table tr td.range.today:hover[disabled], .datepicker table tr td.range.today.disabled[disabled], .datepicker table tr td.range.today.disabled:hover[disabled] { background-color: #f3e97a; } .datepicker table tr td.range.today:active, .datepicker table tr td.range.today:hover:active, .datepicker table tr td.range.today.disabled:active, .datepicker table tr td.range.today.disabled:hover:active, .datepicker table tr td.range.today.active, .datepicker table tr td.range.today:hover.active, .datepicker table tr td.range.today.disabled.active, .datepicker table tr td.range.today.disabled:hover.active { background-color: #efe24b \9; } .datepicker table tr td.selected, .datepicker table tr td.selected:hover, .datepicker table tr td.selected.disabled, .datepicker table tr td.selected.disabled:hover { background-color: #9e9e9e; background-image: -moz-linear-gradient(to bottom, #b3b3b3, #808080); background-image: -ms-linear-gradient(to bottom, #b3b3b3, #808080); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); background-image: -webkit-linear-gradient(to bottom, #b3b3b3, #808080); background-image: -o-linear-gradient(to bottom, #b3b3b3, #808080); background-image: linear-gradient(to bottom, #b3b3b3, #808080); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); border-color: #808080 #808080 #595959; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker table tr td.selected:hover, .datepicker table tr td.selected:hover:hover, .datepicker table tr td.selected.disabled:hover, .datepicker table tr td.selected.disabled:hover:hover, .datepicker table tr td.selected:active, .datepicker table tr td.selected:hover:active, .datepicker table tr td.selected.disabled:active, .datepicker table tr td.selected.disabled:hover:active, .datepicker table tr td.selected.active, .datepicker table tr td.selected:hover.active, .datepicker table tr td.selected.disabled.active, .datepicker table tr td.selected.disabled:hover.active, .datepicker table tr td.selected.disabled, .datepicker table tr td.selected:hover.disabled, .datepicker table tr td.selected.disabled.disabled, .datepicker table tr td.selected.disabled:hover.disabled, .datepicker table tr td.selected[disabled], .datepicker table tr td.selected:hover[disabled], .datepicker table tr td.selected.disabled[disabled], .datepicker table tr td.selected.disabled:hover[disabled] { background-color: #808080; } .datepicker table tr td.selected:active, .datepicker table tr td.selected:hover:active, .datepicker table tr td.selected.disabled:active, .datepicker table tr td.selected.disabled:hover:active, .datepicker table tr td.selected.active, .datepicker table tr td.selected:hover.active, .datepicker table tr td.selected.disabled.active, .datepicker table tr td.selected.disabled:hover.active { background-color: #666666 \9; } .datepicker table tr td.active, .datepicker table tr td.active:hover, .datepicker table tr td.active.disabled, .datepicker table tr td.active.disabled:hover { background-color: #006dcc; background-image: -moz-linear-gradient(to bottom, #0088cc, #0044cc); background-image: -ms-linear-gradient(to bottom, #0088cc, #0044cc); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); background-image: -webkit-linear-gradient(to bottom, #0088cc, #0044cc); background-image: -o-linear-gradient(to bottom, #0088cc, #0044cc); background-image: linear-gradient(to bottom, #0088cc, #0044cc); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker table tr td.active:hover, .datepicker table tr td.active:hover:hover, .datepicker table tr td.active.disabled:hover, .datepicker table tr td.active.disabled:hover:hover, .datepicker table tr td.active:active, .datepicker table tr td.active:hover:active, .datepicker table tr td.active.disabled:active, .datepicker table tr td.active.disabled:hover:active, .datepicker table tr td.active.active, .datepicker table tr td.active:hover.active, .datepicker table tr td.active.disabled.active, .datepicker table tr td.active.disabled:hover.active, .datepicker table tr td.active.disabled, .datepicker table tr td.active:hover.disabled, .datepicker table tr td.active.disabled.disabled, .datepicker table tr td.active.disabled:hover.disabled, .datepicker table tr td.active[disabled], .datepicker table tr td.active:hover[disabled], .datepicker table tr td.active.disabled[disabled], .datepicker table tr td.active.disabled:hover[disabled] { background-color: #0044cc; } .datepicker table tr td.active:active, .datepicker table tr td.active:hover:active, .datepicker table tr td.active.disabled:active, .datepicker table tr td.active.disabled:hover:active, .datepicker table tr td.active.active, .datepicker table tr td.active:hover.active, .datepicker table tr td.active.disabled.active, .datepicker table tr td.active.disabled:hover.active { background-color: #003399 \9; } .datepicker table tr td span { display: block; width: 23%; height: 54px; line-height: 54px; float: left; margin: 1%; cursor: pointer; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .datepicker table tr td span:hover { background: #eeeeee; } .datepicker table tr td span.disabled, .datepicker table tr td span.disabled:hover { background: none; color: #999999; cursor: default; } .datepicker table tr td span.active, .datepicker table tr td span.active:hover, .datepicker table tr td span.active.disabled, .datepicker table tr td span.active.disabled:hover { background-color: #006dcc; background-image: -moz-linear-gradient(to bottom, #0088cc, #0044cc); background-image: -ms-linear-gradient(to bottom, #0088cc, #0044cc); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); background-image: -webkit-linear-gradient(to bottom, #0088cc, #0044cc); background-image: -o-linear-gradient(to bottom, #0088cc, #0044cc); background-image: linear-gradient(to bottom, #0088cc, #0044cc); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker table tr td span.active:hover, .datepicker table tr td span.active:hover:hover, .datepicker table tr td span.active.disabled:hover, .datepicker table tr td span.active.disabled:hover:hover, .datepicker table tr td span.active:active, .datepicker table tr td span.active:hover:active, .datepicker table tr td span.active.disabled:active, .datepicker table tr td span.active.disabled:hover:active, .datepicker table tr td span.active.active, .datepicker table tr td span.active:hover.active, .datepicker table tr td span.active.disabled.active, .datepicker table tr td span.active.disabled:hover.active, .datepicker table tr td span.active.disabled, .datepicker table tr td span.active:hover.disabled, .datepicker table tr td span.active.disabled.disabled, .datepicker table tr td span.active.disabled:hover.disabled, .datepicker table tr td span.active[disabled], .datepicker table tr td span.active:hover[disabled], .datepicker table tr td span.active.disabled[disabled], .datepicker table tr td span.active.disabled:hover[disabled] { background-color: #0044cc; } .datepicker table tr td span.active:active, .datepicker table tr td span.active:hover:active, .datepicker table tr td span.active.disabled:active, .datepicker table tr td span.active.disabled:hover:active, .datepicker table tr td span.active.active, .datepicker table tr td span.active:hover.active, .datepicker table tr td span.active.disabled.active, .datepicker table tr td span.active.disabled:hover.active { background-color: #003399 \9; } .datepicker table tr td span.old, .datepicker table tr td span.new { color: #999999; } .datepicker .datepicker-switch { width: 145px; } .datepicker .datepicker-switch, .datepicker .prev, .datepicker .next, .datepicker tfoot tr th { cursor: pointer; } .datepicker .datepicker-switch:hover, .datepicker .prev:hover, .datepicker .next:hover, .datepicker tfoot tr th:hover { background: #eeeeee; } .datepicker .cw { font-size: 10px; width: 12px; padding: 0 2px 0 5px; vertical-align: middle; } .input-append.date .add-on, .input-prepend.date .add-on { cursor: pointer; } .input-append.date .add-on i, .input-prepend.date .add-on i { margin-top: 3px; } .input-daterange input { text-align: center; } .input-daterange input:first-child { -webkit-border-radius: 3px 0 0 3px; -moz-border-radius: 3px 0 0 3px; border-radius: 3px 0 0 3px; } .input-daterange input:last-child { -webkit-border-radius: 0 3px 3px 0; -moz-border-radius: 0 3px 3px 0; border-radius: 0 3px 3px 0; } .input-daterange .add-on { display: inline-block; width: auto; min-width: 16px; height: 18px; padding: 4px 5px; font-weight: normal; line-height: 18px; text-align: center; text-shadow: 0 1px 0 #ffffff; vertical-align: middle; background-color: #eeeeee; border: 1px solid #ccc; margin-left: -5px; margin-right: -5px; } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/datepicker/css/bootstrap.css ================================================ /*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before, .glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity .15s linear; -o-transition: opacity .15s linear; transition: opacity .15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; -webkit-transition-duration: .35s; -o-transition-duration: .35s; transition-duration: .35s; -webkit-transition-property: height, visibility; -o-transition-property: height, visibility; transition-property: height, visibility; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; text-align: left; list-style: none; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); box-shadow: 0 6px 12px rgba(0, 0, 0, .175); } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #262626; text-decoration: none; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #fff; text-decoration: none; background-color: #337ab7; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { right: 0; left: auto; } .dropdown-menu-left { right: auto; left: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.42857143; color: #777; white-space: nowrap; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { content: ""; border-top: 0; border-bottom: 4px dashed; border-bottom: 4px solid \9; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } .navbar-right .dropdown-menu-left { right: auto; left: 0; } } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 46px; line-height: 46px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; color: #555; text-align: center; background-color: #eee; border: 1px solid #ccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #fff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); box-shadow: 0 1px 1px rgba(0, 0, 0, .05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-right: 15px; padding-left: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { margin-bottom: 0; border: 0; } .panel-group { margin-bottom: 20px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ddd; } .panel-default { border-color: #ddd; } .panel-default > .panel-heading { color: #333; background-color: #f5f5f5; border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { color: #fff; background-color: #337ab7; border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; } .embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } /*# sourceMappingURL=bootstrap.css.map */ ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/datepicker/js/bootstrap-datepicker.js ================================================ /*! * Datepicker for Bootstrap v1.5.1 (https://github.com/eternicode/bootstrap-datepicker) * * Copyright 2012 Stefan Petre * Improvements by Andrew Rowls * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) */(function(factory){ if (typeof define === "function" && define.amd) { define(["jquery"], factory); } else if (typeof exports === 'object') { factory(require('jquery')); } else { factory(jQuery); } }(function($, undefined){ function UTCDate(){ return new Date(Date.UTC.apply(Date, arguments)); } function UTCToday(){ var today = new Date(); return UTCDate(today.getFullYear(), today.getMonth(), today.getDate()); } function isUTCEquals(date1, date2) { return ( date1.getUTCFullYear() === date2.getUTCFullYear() && date1.getUTCMonth() === date2.getUTCMonth() && date1.getUTCDate() === date2.getUTCDate() ); } function alias(method){ return function(){ return this[method].apply(this, arguments); }; } function isValidDate(d) { return d && !isNaN(d.getTime()); } var DateArray = (function(){ var extras = { get: function(i){ return this.slice(i)[0]; }, contains: function(d){ // Array.indexOf is not cross-browser; // $.inArray doesn't work with Dates var val = d && d.valueOf(); for (var i=0, l=this.length; i < l; i++) if (this[i].valueOf() === val) return i; return -1; }, remove: function(i){ this.splice(i,1); }, replace: function(new_array){ if (!new_array) return; if (!$.isArray(new_array)) new_array = [new_array]; this.clear(); this.push.apply(this, new_array); }, clear: function(){ this.length = 0; }, copy: function(){ var a = new DateArray(); a.replace(this); return a; } }; return function(){ var a = []; a.push.apply(a, arguments); $.extend(a, extras); return a; }; })(); // Picker object var Datepicker = function(element, options){ $(element).data('datepicker', this); this._process_options(options); this.dates = new DateArray(); this.viewDate = this.o.defaultViewDate; this.focusDate = null; this.element = $(element); this.isInline = false; this.isInput = this.element.is('input'); this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .btn') : false; this.hasInput = this.component && this.element.find('input').length; if (this.component && this.component.length === 0) this.component = false; this.picker = $(DPGlobal.template); this._buildEvents(); this._attachEvents(); if (this.isInline){ this.picker.addClass('datepicker-inline').appendTo(this.element); } else { this.picker.addClass('datepicker-dropdown dropdown-menu'); } if (this.o.rtl){ this.picker.addClass('datepicker-rtl'); } this.viewMode = this.o.startView; if (this.o.calendarWeeks) this.picker.find('thead .datepicker-title, tfoot .today, tfoot .clear') .attr('colspan', function(i, val){ return parseInt(val) + 1; }); this._allow_update = false; this.setStartDate(this._o.startDate); this.setEndDate(this._o.endDate); this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled); this.setDaysOfWeekHighlighted(this.o.daysOfWeekHighlighted); this.setDatesDisabled(this.o.datesDisabled); this.fillDow(); this.fillMonths(); this._allow_update = true; this.update(); this.showMode(); if (this.isInline){ this.show(); } }; Datepicker.prototype = { constructor: Datepicker, _process_options: function(opts){ // Store raw options for reference this._o = $.extend({}, this._o, opts); // Processed options var o = this.o = $.extend({}, this._o); // Check if "de-DE" style date is available, if not language should // fallback to 2 letter code eg "de" var lang = o.language; if (!dates[lang]){ lang = lang.split('-')[0]; if (!dates[lang]) lang = defaults.language; } o.language = lang; switch (o.startView){ case 2: case 'decade': o.startView = 2; break; case 1: case 'year': o.startView = 1; break; default: o.startView = 0; } switch (o.minViewMode){ case 1: case 'months': o.minViewMode = 1; break; case 2: case 'years': o.minViewMode = 2; break; default: o.minViewMode = 0; } switch (o.maxViewMode) { case 0: case 'days': o.maxViewMode = 0; break; case 1: case 'months': o.maxViewMode = 1; break; default: o.maxViewMode = 2; } o.startView = Math.min(o.startView, o.maxViewMode); o.startView = Math.max(o.startView, o.minViewMode); // true, false, or Number > 0 if (o.multidate !== true){ o.multidate = Number(o.multidate) || false; if (o.multidate !== false) o.multidate = Math.max(0, o.multidate); } o.multidateSeparator = String(o.multidateSeparator); o.weekStart %= 7; o.weekEnd = (o.weekStart + 6) % 7; var format = DPGlobal.parseFormat(o.format); if (o.startDate !== -Infinity){ if (!!o.startDate){ if (o.startDate instanceof Date) o.startDate = this._local_to_utc(this._zero_time(o.startDate)); else o.startDate = DPGlobal.parseDate(o.startDate, format, o.language); } else { o.startDate = -Infinity; } } if (o.endDate !== Infinity){ if (!!o.endDate){ if (o.endDate instanceof Date) o.endDate = this._local_to_utc(this._zero_time(o.endDate)); else o.endDate = DPGlobal.parseDate(o.endDate, format, o.language); } else { o.endDate = Infinity; } } o.daysOfWeekDisabled = o.daysOfWeekDisabled||[]; if (!$.isArray(o.daysOfWeekDisabled)) o.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\s]*/); o.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){ return parseInt(d, 10); }); o.daysOfWeekHighlighted = o.daysOfWeekHighlighted||[]; if (!$.isArray(o.daysOfWeekHighlighted)) o.daysOfWeekHighlighted = o.daysOfWeekHighlighted.split(/[,\s]*/); o.daysOfWeekHighlighted = $.map(o.daysOfWeekHighlighted, function(d){ return parseInt(d, 10); }); o.datesDisabled = o.datesDisabled||[]; if (!$.isArray(o.datesDisabled)) { var datesDisabled = []; datesDisabled.push(DPGlobal.parseDate(o.datesDisabled, format, o.language)); o.datesDisabled = datesDisabled; } o.datesDisabled = $.map(o.datesDisabled,function(d){ return DPGlobal.parseDate(d, format, o.language); }); var plc = String(o.orientation).toLowerCase().split(/\s+/g), _plc = o.orientation.toLowerCase(); plc = $.grep(plc, function(word){ return /^auto|left|right|top|bottom$/.test(word); }); o.orientation = {x: 'auto', y: 'auto'}; if (!_plc || _plc === 'auto') ; // no action else if (plc.length === 1){ switch (plc[0]){ case 'top': case 'bottom': o.orientation.y = plc[0]; break; case 'left': case 'right': o.orientation.x = plc[0]; break; } } else { _plc = $.grep(plc, function(word){ return /^left|right$/.test(word); }); o.orientation.x = _plc[0] || 'auto'; _plc = $.grep(plc, function(word){ return /^top|bottom$/.test(word); }); o.orientation.y = _plc[0] || 'auto'; } if (o.defaultViewDate) { var year = o.defaultViewDate.year || new Date().getFullYear(); var month = o.defaultViewDate.month || 0; var day = o.defaultViewDate.day || 1; o.defaultViewDate = UTCDate(year, month, day); } else { o.defaultViewDate = UTCToday(); } }, _events: [], _secondaryEvents: [], _applyEvents: function(evs){ for (var i=0, el, ch, ev; i < evs.length; i++){ el = evs[i][0]; if (evs[i].length === 2){ ch = undefined; ev = evs[i][1]; } else if (evs[i].length === 3){ ch = evs[i][1]; ev = evs[i][2]; } el.on(ev, ch); } }, _unapplyEvents: function(evs){ for (var i=0, el, ev, ch; i < evs.length; i++){ el = evs[i][0]; if (evs[i].length === 2){ ch = undefined; ev = evs[i][1]; } else if (evs[i].length === 3){ ch = evs[i][1]; ev = evs[i][2]; } el.off(ev, ch); } }, _buildEvents: function(){ var events = { keyup: $.proxy(function(e){ if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1) this.update(); }, this), keydown: $.proxy(this.keydown, this), paste: $.proxy(this.paste, this) }; if (this.o.showOnFocus === true) { events.focus = $.proxy(this.show, this); } if (this.isInput) { // single input this._events = [ [this.element, events] ]; } else if (this.component && this.hasInput) { // component: input + button this._events = [ // For components that are not readonly, allow keyboard nav [this.element.find('input'), events], [this.component, { click: $.proxy(this.show, this) }] ]; } else if (this.element.is('div')){ // inline datepicker this.isInline = true; } else { this._events = [ [this.element, { click: $.proxy(this.show, this) }] ]; } this._events.push( // Component: listen for blur on element descendants [this.element, '*', { blur: $.proxy(function(e){ this._focused_from = e.target; }, this) }], // Input: listen for blur on element [this.element, { blur: $.proxy(function(e){ this._focused_from = e.target; }, this) }] ); if (this.o.immediateUpdates) { // Trigger input updates immediately on changed year/month this._events.push([this.element, { 'changeYear changeMonth': $.proxy(function(e){ this.update(e.date); }, this) }]); } this._secondaryEvents = [ [this.picker, { click: $.proxy(this.click, this) }], [$(window), { resize: $.proxy(this.place, this) }], [$(document), { mousedown: $.proxy(function(e){ // Clicked outside the datepicker, hide it if (!( this.element.is(e.target) || this.element.find(e.target).length || this.picker.is(e.target) || this.picker.find(e.target).length || this.picker.hasClass('datepicker-inline') )){ this.hide(); } }, this) }] ]; }, _attachEvents: function(){ this._detachEvents(); this._applyEvents(this._events); }, _detachEvents: function(){ this._unapplyEvents(this._events); }, _attachSecondaryEvents: function(){ this._detachSecondaryEvents(); this._applyEvents(this._secondaryEvents); }, _detachSecondaryEvents: function(){ this._unapplyEvents(this._secondaryEvents); }, _trigger: function(event, altdate){ var date = altdate || this.dates.get(-1), local_date = this._utc_to_local(date); this.element.trigger({ type: event, date: local_date, dates: $.map(this.dates, this._utc_to_local), format: $.proxy(function(ix, format){ if (arguments.length === 0){ ix = this.dates.length - 1; format = this.o.format; } else if (typeof ix === 'string'){ format = ix; ix = this.dates.length - 1; } format = format || this.o.format; var date = this.dates.get(ix); return DPGlobal.formatDate(date, format, this.o.language); }, this) }); }, show: function(){ var element = this.component ? this.element.find('input') : this.element; if (element.attr('readonly') && this.o.enableOnReadonly === false) return; if (!this.isInline) this.picker.appendTo(this.o.container); this.place(); this.picker.show(); this._attachSecondaryEvents(); this._trigger('show'); if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) { $(this.element).blur(); } return this; }, hide: function(){ if (this.isInline) return this; if (!this.picker.is(':visible')) return this; this.focusDate = null; this.picker.hide().detach(); this._detachSecondaryEvents(); this.viewMode = this.o.startView; this.showMode(); if ( this.o.forceParse && ( this.isInput && this.element.val() || this.hasInput && this.element.find('input').val() ) ) this.setValue(); this._trigger('hide'); return this; }, remove: function(){ this.hide(); this._detachEvents(); this._detachSecondaryEvents(); this.picker.remove(); delete this.element.data().datepicker; if (!this.isInput){ delete this.element.data().date; } return this; }, paste: function(evt){ var dateString; if (evt.originalEvent.clipboardData && evt.originalEvent.clipboardData.types && $.inArray('text/plain', evt.originalEvent.clipboardData.types) !== -1) { dateString = evt.originalEvent.clipboardData.getData('text/plain'); } else if (window.clipboardData) { dateString = window.clipboardData.getData('Text'); } else { return; } this.setDate(dateString); this.update(); evt.preventDefault(); }, _utc_to_local: function(utc){ return utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000)); }, _local_to_utc: function(local){ return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000)); }, _zero_time: function(local){ return local && new Date(local.getFullYear(), local.getMonth(), local.getDate()); }, _zero_utc_time: function(utc){ return utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate())); }, getDates: function(){ return $.map(this.dates, this._utc_to_local); }, getUTCDates: function(){ return $.map(this.dates, function(d){ return new Date(d); }); }, getDate: function(){ return this._utc_to_local(this.getUTCDate()); }, getUTCDate: function(){ var selected_date = this.dates.get(-1); if (typeof selected_date !== 'undefined') { return new Date(selected_date); } else { return null; } }, clearDates: function(){ var element; if (this.isInput) { element = this.element; } else if (this.component) { element = this.element.find('input'); } if (element) { element.val(''); } this.update(); this._trigger('changeDate'); if (this.o.autoclose) { this.hide(); } }, setDates: function(){ var args = $.isArray(arguments[0]) ? arguments[0] : arguments; this.update.apply(this, args); this._trigger('changeDate'); this.setValue(); return this; }, setUTCDates: function(){ var args = $.isArray(arguments[0]) ? arguments[0] : arguments; this.update.apply(this, $.map(args, this._utc_to_local)); this._trigger('changeDate'); this.setValue(); return this; }, setDate: alias('setDates'), setUTCDate: alias('setUTCDates'), setValue: function(){ var formatted = this.getFormattedDate(); if (!this.isInput){ if (this.component){ this.element.find('input').val(formatted); } } else { this.element.val(formatted); } return this; }, getFormattedDate: function(format){ if (format === undefined) format = this.o.format; var lang = this.o.language; return $.map(this.dates, function(d){ return DPGlobal.formatDate(d, format, lang); }).join(this.o.multidateSeparator); }, setStartDate: function(startDate){ this._process_options({startDate: startDate}); this.update(); this.updateNavArrows(); return this; }, setEndDate: function(endDate){ this._process_options({endDate: endDate}); this.update(); this.updateNavArrows(); return this; }, setDaysOfWeekDisabled: function(daysOfWeekDisabled){ this._process_options({daysOfWeekDisabled: daysOfWeekDisabled}); this.update(); this.updateNavArrows(); return this; }, setDaysOfWeekHighlighted: function(daysOfWeekHighlighted){ this._process_options({daysOfWeekHighlighted: daysOfWeekHighlighted}); this.update(); return this; }, setDatesDisabled: function(datesDisabled){ this._process_options({datesDisabled: datesDisabled}); this.update(); this.updateNavArrows(); }, place: function(){ if (this.isInline) return this; var calendarWidth = this.picker.outerWidth(), calendarHeight = this.picker.outerHeight(), visualPadding = 10, container = $(this.o.container), windowWidth = container.width(), scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(), appendOffset = container.offset(); var parentsZindex = []; this.element.parents().each(function(){ var itemZIndex = $(this).css('z-index'); if (itemZIndex !== 'auto' && itemZIndex !== 0) parentsZindex.push(parseInt(itemZIndex)); }); var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset; var offset = this.component ? this.component.parent().offset() : this.element.offset(); var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false); var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false); var left = offset.left - appendOffset.left, top = offset.top - appendOffset.top; if (this.o.container !== 'body') { top += scrollTop; } this.picker.removeClass( 'datepicker-orient-top datepicker-orient-bottom '+ 'datepicker-orient-right datepicker-orient-left' ); if (this.o.orientation.x !== 'auto'){ this.picker.addClass('datepicker-orient-' + this.o.orientation.x); if (this.o.orientation.x === 'right') left -= calendarWidth - width; } // auto x orientation is best-placement: if it crosses a window // edge, fudge it sideways else { if (offset.left < 0) { // component is outside the window on the left side. Move it into visible range this.picker.addClass('datepicker-orient-left'); left -= offset.left - visualPadding; } else if (left + calendarWidth > windowWidth) { // the calendar passes the widow right edge. Align it to component right side this.picker.addClass('datepicker-orient-right'); left += width - calendarWidth; } else { // Default to left this.picker.addClass('datepicker-orient-left'); } } // auto y orientation is best-situation: top or bottom, no fudging, // decision based on which shows more of the calendar var yorient = this.o.orientation.y, top_overflow; if (yorient === 'auto'){ top_overflow = -scrollTop + top - calendarHeight; yorient = top_overflow < 0 ? 'bottom' : 'top'; } this.picker.addClass('datepicker-orient-' + yorient); if (yorient === 'top') top -= calendarHeight + parseInt(this.picker.css('padding-top')); else top += height; if (this.o.rtl) { var right = windowWidth - (left + width); this.picker.css({ top: top, right: right, zIndex: zIndex }); } else { this.picker.css({ top: top, left: left, zIndex: zIndex }); } return this; }, _allow_update: true, update: function(){ if (!this._allow_update) return this; var oldDates = this.dates.copy(), dates = [], fromArgs = false; if (arguments.length){ $.each(arguments, $.proxy(function(i, date){ if (date instanceof Date) date = this._local_to_utc(date); dates.push(date); }, this)); fromArgs = true; } else { dates = this.isInput ? this.element.val() : this.element.data('date') || this.element.find('input').val(); if (dates && this.o.multidate) dates = dates.split(this.o.multidateSeparator); else dates = [dates]; delete this.element.data().date; } dates = $.map(dates, $.proxy(function(date){ return DPGlobal.parseDate(date, this.o.format, this.o.language); }, this)); dates = $.grep(dates, $.proxy(function(date){ return ( !this.dateWithinRange(date) || !date ); }, this), true); this.dates.replace(dates); if (this.dates.length) this.viewDate = new Date(this.dates.get(-1)); else if (this.viewDate < this.o.startDate) this.viewDate = new Date(this.o.startDate); else if (this.viewDate > this.o.endDate) this.viewDate = new Date(this.o.endDate); else this.viewDate = this.o.defaultViewDate; if (fromArgs){ // setting date by clicking this.setValue(); } else if (dates.length){ // setting date by typing if (String(oldDates) !== String(this.dates)) this._trigger('changeDate'); } if (!this.dates.length && oldDates.length) this._trigger('clearDate'); this.fill(); this.element.change(); return this; }, fillDow: function(){ var dowCnt = this.o.weekStart, html = ''; if (this.o.calendarWeeks){ this.picker.find('.datepicker-days .datepicker-switch') .attr('colspan', function(i, val){ return parseInt(val) + 1; }); html += ' '; } while (dowCnt < this.o.weekStart + 7){ html += ''+dates[this.o.language].daysMin[(dowCnt++)%7]+''; } html += ''; this.picker.find('.datepicker-days thead').append(html); }, fillMonths: function(){ var html = '', i = 0; while (i < 12){ html += ''+dates[this.o.language].monthsShort[i++]+''; } this.picker.find('.datepicker-months td').html(html); }, setRange: function(range){ if (!range || !range.length) delete this.range; else this.range = $.map(range, function(d){ return d.valueOf(); }); this.fill(); }, getClassNames: function(date){ var cls = [], year = this.viewDate.getUTCFullYear(), month = this.viewDate.getUTCMonth(), today = new Date(); if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){ cls.push('old'); } else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){ cls.push('new'); } if (this.focusDate && date.valueOf() === this.focusDate.valueOf()) cls.push('focused'); // Compare internal UTC date with local today, not UTC today if (this.o.todayHighlight && date.getUTCFullYear() === today.getFullYear() && date.getUTCMonth() === today.getMonth() && date.getUTCDate() === today.getDate()){ cls.push('today'); } if (this.dates.contains(date) !== -1) cls.push('active'); if (!this.dateWithinRange(date) || this.dateIsDisabled(date)){ cls.push('disabled'); } if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){ cls.push('highlighted'); } if (this.range){ if (date > this.range[0] && date < this.range[this.range.length-1]){ cls.push('range'); } if ($.inArray(date.valueOf(), this.range) !== -1){ cls.push('selected'); } if (date.valueOf() === this.range[0]){ cls.push('range-start'); } if (date.valueOf() === this.range[this.range.length-1]){ cls.push('range-end'); } } return cls; }, fill: function(){ var d = new Date(this.viewDate), year = d.getUTCFullYear(), month = d.getUTCMonth(), startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, todaytxt = dates[this.o.language].today || dates['en'].today || '', cleartxt = dates[this.o.language].clear || dates['en'].clear || '', titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat, tooltip; if (isNaN(year) || isNaN(month)) return; this.picker.find('.datepicker-days thead .datepicker-switch') .text(DPGlobal.formatDate(new UTCDate(year, month), titleFormat, this.o.language)); this.picker.find('tfoot .today') .text(todaytxt) .toggle(this.o.todayBtn !== false); this.picker.find('tfoot .clear') .text(cleartxt) .toggle(this.o.clearBtn !== false); this.picker.find('thead .datepicker-title') .text(this.o.title) .toggle(this.o.title !== ''); this.updateNavArrows(); this.fillMonths(); var prevMonth = UTCDate(year, month-1, 28), day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); prevMonth.setUTCDate(day); prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7); var nextMonth = new Date(prevMonth); if (prevMonth.getUTCFullYear() < 100){ nextMonth.setUTCFullYear(prevMonth.getUTCFullYear()); } nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); nextMonth = nextMonth.valueOf(); var html = []; var clsName; while (prevMonth.valueOf() < nextMonth){ if (prevMonth.getUTCDay() === this.o.weekStart){ html.push(''); if (this.o.calendarWeeks){ // ISO 8601: First week contains first thursday. // ISO also states week starts on Monday, but we can be more abstract here. var // Start of current week: based on weekstart/current date ws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5), // Thursday of this week th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5), // First Thursday of year, year from thursday yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5), // Calendar week: ms between thursdays, div ms per day, div 7 days calWeek = (th - yth) / 864e5 / 7 + 1; html.push(''+ calWeek +''); } } clsName = this.getClassNames(prevMonth); clsName.push('day'); if (this.o.beforeShowDay !== $.noop){ var before = this.o.beforeShowDay(this._utc_to_local(prevMonth)); if (before === undefined) before = {}; else if (typeof(before) === 'boolean') before = {enabled: before}; else if (typeof(before) === 'string') before = {classes: before}; if (before.enabled === false) clsName.push('disabled'); if (before.classes) clsName = clsName.concat(before.classes.split(/\s+/)); if (before.tooltip) tooltip = before.tooltip; } clsName = $.unique(clsName); html.push(''+prevMonth.getUTCDate() + ''); tooltip = null; if (prevMonth.getUTCDay() === this.o.weekEnd){ html.push(''); } prevMonth.setUTCDate(prevMonth.getUTCDate()+1); } this.picker.find('.datepicker-days tbody').empty().append(html.join('')); var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months'; var months = this.picker.find('.datepicker-months') .find('.datepicker-switch') .text(this.o.maxViewMode < 2 ? monthsTitle : year) .end() .find('span').removeClass('active'); $.each(this.dates, function(i, d){ if (d.getUTCFullYear() === year) months.eq(d.getUTCMonth()).addClass('active'); }); if (year < startYear || year > endYear){ months.addClass('disabled'); } if (year === startYear){ months.slice(0, startMonth).addClass('disabled'); } if (year === endYear){ months.slice(endMonth+1).addClass('disabled'); } if (this.o.beforeShowMonth !== $.noop){ var that = this; $.each(months, function(i, month){ if (!$(month).hasClass('disabled')) { var moDate = new Date(year, i, 1); var before = that.o.beforeShowMonth(moDate); if (before === false) $(month).addClass('disabled'); } }); } html = ''; year = parseInt(year/10, 10) * 10; var yearCont = this.picker.find('.datepicker-years') .find('.datepicker-switch') .text(year + '-' + (year + 9)) .end() .find('td'); year -= 1; var years = $.map(this.dates, function(d){ return d.getUTCFullYear(); }), classes; for (var i = -1; i < 11; i++){ classes = ['year']; tooltip = null; if (i === -1) classes.push('old'); else if (i === 10) classes.push('new'); if ($.inArray(year, years) !== -1) classes.push('active'); if (year < startYear || year > endYear) classes.push('disabled'); if (this.o.beforeShowYear !== $.noop) { var yrBefore = this.o.beforeShowYear(new Date(year, 0, 1)); if (yrBefore === undefined) yrBefore = {}; else if (typeof(yrBefore) === 'boolean') yrBefore = {enabled: yrBefore}; else if (typeof(yrBefore) === 'string') yrBefore = {classes: yrBefore}; if (yrBefore.enabled === false) classes.push('disabled'); if (yrBefore.classes) classes = classes.concat(yrBefore.classes.split(/\s+/)); if (yrBefore.tooltip) tooltip = yrBefore.tooltip; } html += '' + year + ''; year += 1; } yearCont.html(html); }, updateNavArrows: function(){ if (!this._allow_update) return; var d = new Date(this.viewDate), year = d.getUTCFullYear(), month = d.getUTCMonth(); switch (this.viewMode){ case 0: if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){ this.picker.find('.prev').css({visibility: 'hidden'}); } else { this.picker.find('.prev').css({visibility: 'visible'}); } if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){ this.picker.find('.next').css({visibility: 'hidden'}); } else { this.picker.find('.next').css({visibility: 'visible'}); } break; case 1: case 2: if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() || this.o.maxViewMode < 2){ this.picker.find('.prev').css({visibility: 'hidden'}); } else { this.picker.find('.prev').css({visibility: 'visible'}); } if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() || this.o.maxViewMode < 2){ this.picker.find('.next').css({visibility: 'hidden'}); } else { this.picker.find('.next').css({visibility: 'visible'}); } break; } }, click: function(e){ e.preventDefault(); e.stopPropagation(); var target = $(e.target).closest('span, td, th'), year, month, day; if (target.length === 1){ switch (target[0].nodeName.toLowerCase()){ case 'th': switch (target[0].className){ case 'datepicker-switch': this.showMode(1); break; case 'prev': case 'next': var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1); switch (this.viewMode){ case 0: this.viewDate = this.moveMonth(this.viewDate, dir); this._trigger('changeMonth', this.viewDate); break; case 1: case 2: this.viewDate = this.moveYear(this.viewDate, dir); if (this.viewMode === 1) this._trigger('changeYear', this.viewDate); break; } this.fill(); break; case 'today': this.showMode(-2); var which = this.o.todayBtn === 'linked' ? null : 'view'; this._setDate(UTCToday(), which); break; case 'clear': this.clearDates(); break; } break; case 'span': if (!target.hasClass('disabled')){ this.viewDate.setUTCDate(1); if (target.hasClass('month')){ day = 1; month = target.parent().find('span').index(target); year = this.viewDate.getUTCFullYear(); this.viewDate.setUTCMonth(month); this._trigger('changeMonth', this.viewDate); if (this.o.minViewMode === 1){ this._setDate(UTCDate(year, month, day)); this.showMode(); } else { this.showMode(-1); } } else { day = 1; month = 0; year = parseInt(target.text(), 10)||0; this.viewDate.setUTCFullYear(year); this._trigger('changeYear', this.viewDate); if (this.o.minViewMode === 2){ this._setDate(UTCDate(year, month, day)); } this.showMode(-1); } this.fill(); } break; case 'td': if (target.hasClass('day') && !target.hasClass('disabled')){ day = parseInt(target.text(), 10)||1; year = this.viewDate.getUTCFullYear(); month = this.viewDate.getUTCMonth(); if (target.hasClass('old')){ if (month === 0){ month = 11; year -= 1; } else { month -= 1; } } else if (target.hasClass('new')){ if (month === 11){ month = 0; year += 1; } else { month += 1; } } this._setDate(UTCDate(year, month, day)); } break; } } if (this.picker.is(':visible') && this._focused_from){ $(this._focused_from).focus(); } delete this._focused_from; }, _toggle_multidate: function(date){ var ix = this.dates.contains(date); if (!date){ this.dates.clear(); } if (ix !== -1){ if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){ this.dates.remove(ix); } } else if (this.o.multidate === false) { this.dates.clear(); this.dates.push(date); } else { this.dates.push(date); } if (typeof this.o.multidate === 'number') while (this.dates.length > this.o.multidate) this.dates.remove(0); }, _setDate: function(date, which){ if (!which || which === 'date') this._toggle_multidate(date && new Date(date)); if (!which || which === 'view') this.viewDate = date && new Date(date); this.fill(); this.setValue(); if (!which || which !== 'view') { this._trigger('changeDate'); } var element; if (this.isInput){ element = this.element; } else if (this.component){ element = this.element.find('input'); } if (element){ element.change(); } if (this.o.autoclose && (!which || which === 'date')){ this.hide(); } }, moveDay: function(date, dir){ var newDate = new Date(date); newDate.setUTCDate(date.getUTCDate() + dir); return newDate; }, moveWeek: function(date, dir){ return this.moveDay(date, dir * 7); }, moveMonth: function(date, dir){ if (!isValidDate(date)) return this.o.defaultViewDate; if (!dir) return date; var new_date = new Date(date.valueOf()), day = new_date.getUTCDate(), month = new_date.getUTCMonth(), mag = Math.abs(dir), new_month, test; dir = dir > 0 ? 1 : -1; if (mag === 1){ test = dir === -1 // If going back one month, make sure month is not current month // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02) ? function(){ return new_date.getUTCMonth() === month; } // If going forward one month, make sure month is as expected // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02) : function(){ return new_date.getUTCMonth() !== new_month; }; new_month = month + dir; new_date.setUTCMonth(new_month); // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 if (new_month < 0 || new_month > 11) new_month = (new_month + 12) % 12; } else { // For magnitudes >1, move one month at a time... for (var i=0; i < mag; i++) // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... new_date = this.moveMonth(new_date, dir); // ...then reset the day, keeping it in the new month new_month = new_date.getUTCMonth(); new_date.setUTCDate(day); test = function(){ return new_month !== new_date.getUTCMonth(); }; } // Common date-resetting loop -- if date is beyond end of month, make it // end of month while (test()){ new_date.setUTCDate(--day); new_date.setUTCMonth(new_month); } return new_date; }, moveYear: function(date, dir){ return this.moveMonth(date, dir*12); }, moveAvailableDate: function(date, dir, fn){ do { date = this[fn](date, dir); if (!this.dateWithinRange(date)) return false; fn = 'moveDay'; } while (this.dateIsDisabled(date)); return date; }, weekOfDateIsDisabled: function(date){ return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1; }, dateIsDisabled: function(date){ return ( this.weekOfDateIsDisabled(date) || $.grep(this.o.datesDisabled, function(d){ return isUTCEquals(date, d); }).length > 0 ); }, dateWithinRange: function(date){ return date >= this.o.startDate && date <= this.o.endDate; }, keydown: function(e){ if (!this.picker.is(':visible')){ if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker this.show(); e.stopPropagation(); } return; } var dateChanged = false, dir, newViewDate, focusDate = this.focusDate || this.viewDate; switch (e.keyCode){ case 27: // escape if (this.focusDate){ this.focusDate = null; this.viewDate = this.dates.get(-1) || this.viewDate; this.fill(); } else this.hide(); e.preventDefault(); e.stopPropagation(); break; case 37: // left case 38: // up case 39: // right case 40: // down if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7) break; dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1; if (e.ctrlKey){ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear'); if (newViewDate) this._trigger('changeYear', this.viewDate); } else if (e.shiftKey){ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth'); if (newViewDate) this._trigger('changeMonth', this.viewDate); } else if (e.keyCode === 37 || e.keyCode === 39){ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay'); } else if (!this.weekOfDateIsDisabled(focusDate)){ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek'); } if (newViewDate){ this.focusDate = this.viewDate = newViewDate; this.setValue(); this.fill(); e.preventDefault(); } break; case 13: // enter if (!this.o.forceParse) break; focusDate = this.focusDate || this.dates.get(-1) || this.viewDate; if (this.o.keyboardNavigation) { this._toggle_multidate(focusDate); dateChanged = true; } this.focusDate = null; this.viewDate = this.dates.get(-1) || this.viewDate; this.setValue(); this.fill(); if (this.picker.is(':visible')){ e.preventDefault(); e.stopPropagation(); if (this.o.autoclose) this.hide(); } break; case 9: // tab this.focusDate = null; this.viewDate = this.dates.get(-1) || this.viewDate; this.fill(); this.hide(); break; } if (dateChanged){ if (this.dates.length) this._trigger('changeDate'); else this._trigger('clearDate'); var element; if (this.isInput){ element = this.element; } else if (this.component){ element = this.element.find('input'); } if (element){ element.change(); } } }, showMode: function(dir){ if (dir){ this.viewMode = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, this.viewMode + dir)); } this.picker .children('div') .hide() .filter('.datepicker-' + DPGlobal.modes[this.viewMode].clsName) .show(); this.updateNavArrows(); } }; var DateRangePicker = function(element, options){ $(element).data('datepicker', this); this.element = $(element); this.inputs = $.map(options.inputs, function(i){ return i.jquery ? i[0] : i; }); delete options.inputs; datepickerPlugin.call($(this.inputs), options) .on('changeDate', $.proxy(this.dateUpdated, this)); this.pickers = $.map(this.inputs, function(i){ return $(i).data('datepicker'); }); this.updateDates(); }; DateRangePicker.prototype = { updateDates: function(){ this.dates = $.map(this.pickers, function(i){ return i.getUTCDate(); }); this.updateRanges(); }, updateRanges: function(){ var range = $.map(this.dates, function(d){ return d.valueOf(); }); $.each(this.pickers, function(i, p){ p.setRange(range); }); }, dateUpdated: function(e){ // `this.updating` is a workaround for preventing infinite recursion // between `changeDate` triggering and `setUTCDate` calling. Until // there is a better mechanism. if (this.updating) return; this.updating = true; var dp = $(e.target).data('datepicker'); if (typeof(dp) === "undefined") { return; } var new_date = dp.getUTCDate(), i = $.inArray(e.target, this.inputs), j = i - 1, k = i + 1, l = this.inputs.length; if (i === -1) return; $.each(this.pickers, function(i, p){ if (!p.getUTCDate()) p.setUTCDate(new_date); }); if (new_date < this.dates[j]){ // Date being moved earlier/left while (j >= 0 && new_date < this.dates[j]){ this.pickers[j--].setUTCDate(new_date); } } else if (new_date > this.dates[k]){ // Date being moved later/right while (k < l && new_date > this.dates[k]){ this.pickers[k++].setUTCDate(new_date); } } this.updateDates(); delete this.updating; }, remove: function(){ $.map(this.pickers, function(p){ p.remove(); }); delete this.element.data().datepicker; } }; function opts_from_el(el, prefix){ // Derive options from element data-attrs var data = $(el).data(), out = {}, inkey, replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])'); prefix = new RegExp('^' + prefix.toLowerCase()); function re_lower(_,a){ return a.toLowerCase(); } for (var key in data) if (prefix.test(key)){ inkey = key.replace(replace, re_lower); out[inkey] = data[key]; } return out; } function opts_from_locale(lang){ // Derive options from locale plugins var out = {}; // Check if "de-DE" style date is available, if not language should // fallback to 2 letter code eg "de" if (!dates[lang]){ lang = lang.split('-')[0]; if (!dates[lang]) return; } var d = dates[lang]; $.each(locale_opts, function(i,k){ if (k in d) out[k] = d[k]; }); return out; } var old = $.fn.datepicker; var datepickerPlugin = function(option){ var args = Array.apply(null, arguments); args.shift(); var internal_return; this.each(function(){ var $this = $(this), data = $this.data('datepicker'), options = typeof option === 'object' && option; if (!data){ var elopts = opts_from_el(this, 'date'), // Preliminary otions xopts = $.extend({}, defaults, elopts, options), locopts = opts_from_locale(xopts.language), // Options priority: js args, data-attrs, locales, defaults opts = $.extend({}, defaults, locopts, elopts, options); if ($this.hasClass('input-daterange') || opts.inputs){ $.extend(opts, { inputs: opts.inputs || $this.find('input').toArray() }); data = new DateRangePicker(this, opts); } else { data = new Datepicker(this, opts); } $this.data('datepicker', data); } if (typeof option === 'string' && typeof data[option] === 'function'){ internal_return = data[option].apply(data, args); } }); if ( internal_return === undefined || internal_return instanceof Datepicker || internal_return instanceof DateRangePicker ) return this; if (this.length > 1) throw new Error('Using only allowed for the collection of a single element (' + option + ' function)'); else return internal_return; }; $.fn.datepicker = datepickerPlugin; var defaults = $.fn.datepicker.defaults = { autoclose: false, beforeShowDay: $.noop, beforeShowMonth: $.noop, beforeShowYear: $.noop, calendarWeeks: false, clearBtn: false, toggleActive: false, daysOfWeekDisabled: [], daysOfWeekHighlighted: [], datesDisabled: [], endDate: Infinity, forceParse: true, format: 'mm/dd/yyyy', keyboardNavigation: true, language: 'en', minViewMode: 0, maxViewMode: 2, multidate: false, multidateSeparator: ',', orientation: "auto", rtl: false, startDate: -Infinity, startView: 0, todayBtn: false, todayHighlight: false, weekStart: 0, disableTouchKeyboard: false, enableOnReadonly: true, showOnFocus: true, zIndexOffset: 10, container: 'body', immediateUpdates: false, title: '' }; var locale_opts = $.fn.datepicker.locale_opts = [ 'format', 'rtl', 'weekStart' ]; $.fn.datepicker.Constructor = Datepicker; var dates = $.fn.datepicker.dates = { en: { days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], today: "Today", clear: "Clear", titleFormat: "MM yyyy" } }; var DPGlobal = { modes: [ { clsName: 'days', navFnc: 'Month', navStep: 1 }, { clsName: 'months', navFnc: 'FullYear', navStep: 1 }, { clsName: 'years', navFnc: 'FullYear', navStep: 10 }], isLeapYear: function(year){ return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); }, getDaysInMonth: function(year, month){ return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; }, validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g, nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g, parseFormat: function(format){ if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function') return format; // IE treats \0 as a string end in inputs (truncating the value), // so it's a bad format delimiter, anyway var separators = format.replace(this.validParts, '\0').split('\0'), parts = format.match(this.validParts); if (!separators || !separators.length || !parts || parts.length === 0){ throw new Error("Invalid date format."); } return {separators: separators, parts: parts}; }, parseDate: function(date, format, language){ if (!date) return undefined; if (date instanceof Date) return date; if (typeof format === 'string') format = DPGlobal.parseFormat(format); if (format.toValue) return format.toValue(date, format, language); var part_re = /([\-+]\d+)([dmwy])/, parts = date.match(/([\-+]\d+)([dmwy])/g), fn_map = { d: 'moveDay', m: 'moveMonth', w: 'moveWeek', y: 'moveYear' }, part, dir, i, fn; if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){ date = new Date(); for (i=0; i < parts.length; i++){ part = part_re.exec(parts[i]); dir = parseInt(part[1]); fn = fn_map[part[2]]; date = Datepicker.prototype[fn](date, dir); } return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); } parts = date && date.match(this.nonpunctuation) || []; date = new Date(); var parsed = {}, setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'], setters_map = { yyyy: function(d,v){ return d.setUTCFullYear(v); }, yy: function(d,v){ return d.setUTCFullYear(2000+v); }, m: function(d,v){ if (isNaN(d)) return d; v -= 1; while (v < 0) v += 12; v %= 12; d.setUTCMonth(v); while (d.getUTCMonth() !== v) d.setUTCDate(d.getUTCDate()-1); return d; }, d: function(d,v){ return d.setUTCDate(v); } }, val, filtered; setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; setters_map['dd'] = setters_map['d']; date = UTCToday(); var fparts = format.parts.slice(); // Remove noop parts if (parts.length !== fparts.length){ fparts = $(fparts).filter(function(i,p){ return $.inArray(p, setters_order) !== -1; }).toArray(); } // Process remainder function match_part(){ var m = this.slice(0, parts[i].length), p = parts[i].slice(0, m.length); return m.toLowerCase() === p.toLowerCase(); } if (parts.length === fparts.length){ var cnt; for (i=0, cnt = fparts.length; i < cnt; i++){ val = parseInt(parts[i], 10); part = fparts[i]; if (isNaN(val)){ switch (part){ case 'MM': filtered = $(dates[language].months).filter(match_part); val = $.inArray(filtered[0], dates[language].months) + 1; break; case 'M': filtered = $(dates[language].monthsShort).filter(match_part); val = $.inArray(filtered[0], dates[language].monthsShort) + 1; break; } } parsed[part] = val; } var _date, s; for (i=0; i < setters_order.length; i++){ s = setters_order[i]; if (s in parsed && !isNaN(parsed[s])){ _date = new Date(date); setters_map[s](_date, parsed[s]); if (!isNaN(_date)) date = _date; } } } return date; }, formatDate: function(date, format, language){ if (!date) return ''; if (typeof format === 'string') format = DPGlobal.parseFormat(format); if (format.toDisplay) return format.toDisplay(date, format, language); var val = { d: date.getUTCDate(), D: dates[language].daysShort[date.getUTCDay()], DD: dates[language].days[date.getUTCDay()], m: date.getUTCMonth() + 1, M: dates[language].monthsShort[date.getUTCMonth()], MM: dates[language].months[date.getUTCMonth()], yy: date.getUTCFullYear().toString().substring(2), yyyy: date.getUTCFullYear() }; val.dd = (val.d < 10 ? '0' : '') + val.d; val.mm = (val.m < 10 ? '0' : '') + val.m; date = []; var seps = $.extend([], format.separators); for (var i=0, cnt = format.parts.length; i <= cnt; i++){ if (seps.length) date.push(seps.shift()); date.push(val[format.parts[i]]); } return date.join(''); }, headTemplate: ''+ ''+ ''+ ''+ ''+ '«'+ ''+ '»'+ ''+ '', contTemplate: '', footTemplate: ''+ ''+ ''+ ''+ ''+ ''+ ''+ '' }; DPGlobal.template = '
'+ '
'+ ''+ DPGlobal.headTemplate+ ''+ DPGlobal.footTemplate+ '
'+ '
'+ '
'+ ''+ DPGlobal.headTemplate+ DPGlobal.contTemplate+ DPGlobal.footTemplate+ '
'+ '
'+ '
'+ ''+ DPGlobal.headTemplate+ DPGlobal.contTemplate+ DPGlobal.footTemplate+ '
'+ '
'+ '
'; $.fn.datepicker.DPGlobal = DPGlobal; /* DATEPICKER NO CONFLICT * =================== */ $.fn.datepicker.noConflict = function(){ $.fn.datepicker = old; return this; }; /* DATEPICKER VERSION * =================== */ $.fn.datepicker.version = '1.5.1'; /* DATEPICKER DATA-API * ================== */ $(document).on( 'focus.datepicker.data-api click.datepicker.data-api', '[data-provide="datepicker"]', function(e){ var $this = $(this); if ($this.data('datepicker')) return; e.preventDefault(); // component click requires us to explicitly show it datepickerPlugin.call($this, 'show'); } ); $(function(){ datepickerPlugin.call($('[data-provide="datepicker-inline"]')); }); })); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/css/select2.css ================================================ .select2-container { box-sizing: border-box; display: inline-block; margin: 0; position: relative; vertical-align: middle; } .select2-container .select2-selection--single { box-sizing: border-box; cursor: pointer; display: block; height: 28px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--single .select2-selection__rendered { display: block; padding-left: 8px; padding-right: 20px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .select2-container .select2-selection--single .select2-selection__clear { position: relative; } .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { padding-right: 8px; padding-left: 20px; } .select2-container .select2-selection--multiple { box-sizing: border-box; cursor: pointer; display: block; min-height: 32px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--multiple .select2-selection__rendered { display: inline-block; overflow: hidden; padding-left: 8px; text-overflow: ellipsis; white-space: nowrap; } .select2-container .select2-search--inline { float: left; } .select2-container .select2-search--inline .select2-search__field { box-sizing: border-box; border: none; font-size: 100%; margin-top: 5px; padding: 0; } .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none; } .select2-dropdown { background-color: white; border: 1px solid #aaa; border-radius: 4px; box-sizing: border-box; display: block; position: absolute; left: -100000px; width: 100%; z-index: 1051; } .select2-results { display: block; } .select2-results__options { list-style: none; margin: 0; padding: 0; } .select2-results__option { padding: 6px; user-select: none; -webkit-user-select: none; } .select2-results__option[aria-selected] { cursor: pointer; } .select2-container--open .select2-dropdown { left: 0; } .select2-container--open .select2-dropdown--above { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--open .select2-dropdown--below { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; } .select2-search--dropdown { display: block; padding: 4px; } .select2-search--dropdown .select2-search__field { padding: 4px; width: 100%; box-sizing: border-box; } .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none; } .select2-search--dropdown.select2-search--hide { display: none; } .select2-close-mask { border: 0; margin: 0; padding: 0; display: block; position: fixed; left: 0; top: 0; min-height: 100%; min-width: 100%; height: auto; width: auto; opacity: 0; z-index: 99; background-color: #fff; filter: alpha(opacity=0); } .select2-hidden-accessible { border: 0 !important; clip: rect(0 0 0 0) !important; height: 1px !important; margin: -1px !important; overflow: hidden !important; padding: 0 !important; position: absolute !important; width: 1px !important; } .select2-container--default .select2-selection--single { background-color: #fff; border: 1px solid #aaa; border-radius: 4px; } .select2-container--default .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px; } .select2-container--default .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; } .select2-container--default .select2-selection--single .select2-selection__placeholder { color: #999; } .select2-container--default .select2-selection--single .select2-selection__arrow { height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; } .select2-container--default .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0; } .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { left: 1px; right: auto; } .select2-container--default.select2-container--disabled .select2-selection--single { background-color: #eee; cursor: default; } .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { display: none; } .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .select2-container--default .select2-selection--multiple { background-color: white; border: 1px solid #aaa; border-radius: 4px; cursor: text; } .select2-container--default .select2-selection--multiple .select2-selection__rendered { box-sizing: border-box; list-style: none; margin: 0; padding: 0 5px; width: 100%; } .select2-container--default .select2-selection--multiple .select2-selection__placeholder { color: #999; margin-top: 5px; float: left; } .select2-container--default .select2-selection--multiple .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; margin-top: 5px; margin-right: 10px; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; cursor: default; float: left; margin-right: 5px; margin-top: 5px; padding: 0 5px; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { color: #999; cursor: pointer; display: inline-block; font-weight: bold; margin-right: 2px; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { color: #333; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { float: right; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { margin-left: 5px; margin-right: auto; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto; } .select2-container--default.select2-container--focus .select2-selection--multiple { border: solid black 1px; outline: 0; } .select2-container--default.select2-container--disabled .select2-selection--multiple { background-color: #eee; cursor: default; } .select2-container--default.select2-container--disabled .select2-selection__choice__remove { display: none; } .select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { border-top-left-radius: 0; border-top-right-radius: 0; } .select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--default .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; } .select2-container--default .select2-search--inline .select2-search__field { background: transparent; border: none; outline: 0; box-shadow: none; -webkit-appearance: textfield; } .select2-container--default .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } .select2-container--default .select2-results__option[role=group] { padding: 0; } .select2-container--default .select2-results__option[aria-disabled=true] { color: #999; } .select2-container--default .select2-results__option[aria-selected=true] { background-color: #ddd; } .select2-container--default .select2-results__option .select2-results__option { padding-left: 1em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__group { padding-left: 0; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option { margin-left: -1em; padding-left: 2em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -2em; padding-left: 3em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -3em; padding-left: 4em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -4em; padding-left: 5em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -5em; padding-left: 6em; } .select2-container--default .select2-results__option--highlighted[aria-selected] { background-color: #5897fb; color: white; } .select2-container--default .select2-results__group { cursor: default; display: block; padding: 6px; } .select2-container--classic .select2-selection--single { background-color: #f7f7f7; border: 1px solid #aaa; border-radius: 4px; outline: 0; background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } .select2-container--classic .select2-selection--single:focus { border: 1px solid #5897fb; } .select2-container--classic .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px; } .select2-container--classic .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; margin-right: 10px; } .select2-container--classic .select2-selection--single .select2-selection__placeholder { color: #999; } .select2-container--classic .select2-selection--single .select2-selection__arrow { background-color: #ddd; border: none; border-left: 1px solid #aaa; border-top-right-radius: 4px; border-bottom-right-radius: 4px; height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } .select2-container--classic .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { border: none; border-right: 1px solid #aaa; border-radius: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; left: 1px; right: auto; } .select2-container--classic.select2-container--open .select2-selection--single { border: 1px solid #5897fb; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { background: transparent; border: none; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } .select2-container--classic .select2-selection--multiple { background-color: white; border: 1px solid #aaa; border-radius: 4px; cursor: text; outline: 0; } .select2-container--classic .select2-selection--multiple:focus { border: 1px solid #5897fb; } .select2-container--classic .select2-selection--multiple .select2-selection__rendered { list-style: none; margin: 0; padding: 0 5px; } .select2-container--classic .select2-selection--multiple .select2-selection__clear { display: none; } .select2-container--classic .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; cursor: default; float: left; margin-right: 5px; margin-top: 5px; padding: 0 5px; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { color: #888; cursor: pointer; display: inline-block; font-weight: bold; margin-right: 2px; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { color: #555; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { float: right; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { margin-left: 5px; margin-right: auto; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto; } .select2-container--classic.select2-container--open .select2-selection--multiple { border: 1px solid #5897fb; } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--classic .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; outline: 0; } .select2-container--classic .select2-search--inline .select2-search__field { outline: 0; box-shadow: none; } .select2-container--classic .select2-dropdown { background-color: white; border: 1px solid transparent; } .select2-container--classic .select2-dropdown--above { border-bottom: none; } .select2-container--classic .select2-dropdown--below { border-top: none; } .select2-container--classic .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } .select2-container--classic .select2-results__option[role=group] { padding: 0; } .select2-container--classic .select2-results__option[aria-disabled=true] { color: grey; } .select2-container--classic .select2-results__option--highlighted[aria-selected] { background-color: #3875d7; color: white; } .select2-container--classic .select2-results__group { cursor: default; display: block; padding: 6px; } .select2-container--classic.select2-container--open .select2-dropdown { border-color: #5897fb; } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/ar.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="الرجاء حذف "+t+" عناصر";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="الرجاء إضافة "+t+" عناصر";return n},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(e){var t="تستطيع إختيار "+e.maximum+" بنود فقط";return t},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/az.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/bg.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/ca.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/cs.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím zadejte o jeden znak méně":n<=4?"Prosím zadejte o "+e(n,!0)+" znaky méně":"Prosím zadejte o "+n+" znaků méně"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím zadejte ještě jeden znak":n<=4?"Prosím zadejte ještě další "+e(n,!0)+" znaky":"Prosím zadejte ještě dalších "+n+" znaků"},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky":"Můžete zvolit maximálně "+n+" položek"},noResults:function(){return"Nenalezeny žádné položky"},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/da.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/de.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/en.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/es.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/et.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/eu.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/fa.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/fi.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/fr.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/gl.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Elimine ";return t===1?n+="un carácter":n+=t+" caracteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Engada ";return t===1?n+="un carácter":n+=t+" caracteres",n},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){var t="Só pode ";return e.maximum===1?t+="un elemento":t+=e.maximum+" elementos",t},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/he.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/hi.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/hr.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/hu.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/id.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/is.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/it.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/ja.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/ko.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/lt.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%100>9&&e%100<21||e%10===0?e%10>1?n:r:t}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"ių","ius","į"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"ių","ius","į"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ų","us","ą"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/lv.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/mk.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/ms.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/nb.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/nl.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/pl.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/pt-BR.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/pt.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"carácter",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/ro.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+"sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/ru.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/sk.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/sr-Cyrl.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/sr.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/sv.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/th.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/tr.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/uk.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/vi.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+' ký tự"';return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/zh-CN.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/i18n/zh-TW.js ================================================ /*! Select2 4.0.2 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})(); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/plugins/select2/js/select2.full.js ================================================ /*! * Select2 4.0.2 * https://select2.github.io * * Released under the MIT license * https://github.com/select2/select2/blob/master/LICENSE.md */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof exports === 'object') { // Node/CommonJS factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function (jQuery) { // This is needed so we can catch the AMD loader configuration and use it // The inner file should be wrapped (by `banner.start.js`) in a function that // returns the AMD loader references. var S2 = (function () { // Restore the Select2 AMD loader so it can be used // Needed mostly in the language files, where the loader is not inserted if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { var S2 = jQuery.fn.select2.amd; } var S2;(function () { if (!S2 || !S2.requirejs) { if (!S2) { S2 = {}; } else { require = S2; } /** * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. * Available via the MIT or new BSD license. * see: http://github.com/jrburke/almond for details */ //Going sloppy to avoid 'use strict' string cost, but strict practices should //be followed. /*jslint sloppy: true */ /*global setTimeout: false */ var requirejs, require, define; (function (undef) { var main, req, makeMap, handlers, defined = {}, waiting = {}, config = {}, defining = {}, hasOwn = Object.prototype.hasOwnProperty, aps = [].slice, jsSuffixRegExp = /\.js$/; function hasProp(obj, prop) { return hasOwn.call(obj, prop); } /** * Given a relative module name, like ./something, normalize it to * a real name that can be mapped to a path. * @param {String} name the relative name * @param {String} baseName a real name that the name arg is relative * to. * @returns {String} normalized name */ function normalize(name, baseName) { var nameParts, nameSegment, mapValue, foundMap, lastIndex, foundI, foundStarMap, starI, i, j, part, baseParts = baseName && baseName.split("/"), map = config.map, starMap = (map && map['*']) || {}; //Adjust any relative paths. if (name && name.charAt(0) === ".") { //If have a base name, try to normalize against it, //otherwise, assume it is a top-level require that will //be relative to baseUrl in the end. if (baseName) { name = name.split('/'); lastIndex = name.length - 1; // Node .js allowance: if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); } //Lop off the last part of baseParts, so that . matches the //"directory" and not name of the baseName's module. For instance, //baseName of "one/two/three", maps to "one/two/three.js", but we //want the directory, "one/two" for this normalization. name = baseParts.slice(0, baseParts.length - 1).concat(name); //start trimDots for (i = 0; i < name.length; i += 1) { part = name[i]; if (part === ".") { name.splice(i, 1); i -= 1; } else if (part === "..") { if (i === 1 && (name[2] === '..' || name[0] === '..')) { //End of the line. Keep at least one non-dot //path segment at the front so it can be mapped //correctly to disk. Otherwise, there is likely //no path mapping for a path starting with '..'. //This can still fail, but catches the most reasonable //uses of .. break; } else if (i > 0) { name.splice(i - 1, 2); i -= 2; } } } //end trimDots name = name.join("/"); } else if (name.indexOf('./') === 0) { // No baseName, so this is ID is resolved relative // to baseUrl, pull off the leading dot. name = name.substring(2); } } //Apply map config if available. if ((baseParts || starMap) && map) { nameParts = name.split('/'); for (i = nameParts.length; i > 0; i -= 1) { nameSegment = nameParts.slice(0, i).join("/"); if (baseParts) { //Find the longest baseName segment match in the config. //So, do joins on the biggest to smallest lengths of baseParts. for (j = baseParts.length; j > 0; j -= 1) { mapValue = map[baseParts.slice(0, j).join('/')]; //baseName segment has config, find if it has one for //this name. if (mapValue) { mapValue = mapValue[nameSegment]; if (mapValue) { //Match, update name to the new value. foundMap = mapValue; foundI = i; break; } } } } if (foundMap) { break; } //Check for a star map match, but just hold on to it, //if there is a shorter segment match later in a matching //config, then favor over this star map. if (!foundStarMap && starMap && starMap[nameSegment]) { foundStarMap = starMap[nameSegment]; starI = i; } } if (!foundMap && foundStarMap) { foundMap = foundStarMap; foundI = starI; } if (foundMap) { nameParts.splice(0, foundI, foundMap); name = nameParts.join('/'); } } return name; } function makeRequire(relName, forceSync) { return function () { //A version of a require function that passes a moduleName //value for items that may need to //look up paths relative to the moduleName var args = aps.call(arguments, 0); //If first arg is not require('string'), and there is only //one arg, it is the array form without a callback. Insert //a null so that the following concat is correct. if (typeof args[0] !== 'string' && args.length === 1) { args.push(null); } return req.apply(undef, args.concat([relName, forceSync])); }; } function makeNormalize(relName) { return function (name) { return normalize(name, relName); }; } function makeLoad(depName) { return function (value) { defined[depName] = value; }; } function callDep(name) { if (hasProp(waiting, name)) { var args = waiting[name]; delete waiting[name]; defining[name] = true; main.apply(undef, args); } if (!hasProp(defined, name) && !hasProp(defining, name)) { throw new Error('No ' + name); } return defined[name]; } //Turns a plugin!resource to [plugin, resource] //with the plugin being undefined if the name //did not have a plugin prefix. function splitPrefix(name) { var prefix, index = name ? name.indexOf('!') : -1; if (index > -1) { prefix = name.substring(0, index); name = name.substring(index + 1, name.length); } return [prefix, name]; } /** * Makes a name map, normalizing the name, and using a plugin * for normalization if necessary. Grabs a ref to plugin * too, as an optimization. */ makeMap = function (name, relName) { var plugin, parts = splitPrefix(name), prefix = parts[0]; name = parts[1]; if (prefix) { prefix = normalize(prefix, relName); plugin = callDep(prefix); } //Normalize according if (prefix) { if (plugin && plugin.normalize) { name = plugin.normalize(name, makeNormalize(relName)); } else { name = normalize(name, relName); } } else { name = normalize(name, relName); parts = splitPrefix(name); prefix = parts[0]; name = parts[1]; if (prefix) { plugin = callDep(prefix); } } //Using ridiculous property names for space reasons return { f: prefix ? prefix + '!' + name : name, //fullName n: name, pr: prefix, p: plugin }; }; function makeConfig(name) { return function () { return (config && config.config && config.config[name]) || {}; }; } handlers = { require: function (name) { return makeRequire(name); }, exports: function (name) { var e = defined[name]; if (typeof e !== 'undefined') { return e; } else { return (defined[name] = {}); } }, module: function (name) { return { id: name, uri: '', exports: defined[name], config: makeConfig(name) }; } }; main = function (name, deps, callback, relName) { var cjsModule, depName, ret, map, i, args = [], callbackType = typeof callback, usingExports; //Use name if no relName relName = relName || name; //Call the callback to define the module, if necessary. if (callbackType === 'undefined' || callbackType === 'function') { //Pull out the defined dependencies and pass the ordered //values to the callback. //Default to [require, exports, module] if no deps deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; for (i = 0; i < deps.length; i += 1) { map = makeMap(deps[i], relName); depName = map.f; //Fast path CommonJS standard dependencies. if (depName === "require") { args[i] = handlers.require(name); } else if (depName === "exports") { //CommonJS module spec 1.1 args[i] = handlers.exports(name); usingExports = true; } else if (depName === "module") { //CommonJS module spec 1.1 cjsModule = args[i] = handlers.module(name); } else if (hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) { args[i] = callDep(depName); } else if (map.p) { map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); args[i] = defined[depName]; } else { throw new Error(name + ' missing ' + depName); } } ret = callback ? callback.apply(defined[name], args) : undefined; if (name) { //If setting exports via "module" is in play, //favor that over return value and exports. After that, //favor a non-undefined return value over exports use. if (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name]) { defined[name] = cjsModule.exports; } else if (ret !== undef || !usingExports) { //Use the return value from the function. defined[name] = ret; } } } else if (name) { //May just be an object definition for the module. Only //worry about defining if have a module name. defined[name] = callback; } }; requirejs = require = req = function (deps, callback, relName, forceSync, alt) { if (typeof deps === "string") { if (handlers[deps]) { //callback in this case is really relName return handlers[deps](callback); } //Just return the module wanted. In this scenario, the //deps arg is the module name, and second arg (if passed) //is just the relName. //Normalize module name, if it contains . or .. return callDep(makeMap(deps, callback).f); } else if (!deps.splice) { //deps is a config object, not an array. config = deps; if (config.deps) { req(config.deps, config.callback); } if (!callback) { return; } if (callback.splice) { //callback is an array, which means it is a dependency list. //Adjust args if there are dependencies deps = callback; callback = relName; relName = null; } else { deps = undef; } } //Support require(['a']) callback = callback || function () {}; //If relName is a function, it is an errback handler, //so remove it. if (typeof relName === 'function') { relName = forceSync; forceSync = alt; } //Simulate async callback; if (forceSync) { main(undef, deps, callback, relName); } else { //Using a non-zero value because of concern for what old browsers //do, and latest browsers "upgrade" to 4 if lower value is used: //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: //If want a value immediately, use require('id') instead -- something //that works in almond on the global level, but not guaranteed and //unlikely to work in other AMD implementations. setTimeout(function () { main(undef, deps, callback, relName); }, 4); } return req; }; /** * Just drops the config on the floor, but returns req in case * the config return value is used. */ req.config = function (cfg) { return req(cfg); }; /** * Expose module registry for debugging and tooling */ requirejs._defined = defined; define = function (name, deps, callback) { if (typeof name !== 'string') { throw new Error('See almond README: incorrect module build, no module name'); } //This module may not have dependencies if (!deps.splice) { //deps is not an array, so probably means //an object literal or factory function for //the value. Adjust args. callback = deps; deps = []; } if (!hasProp(defined, name) && !hasProp(waiting, name)) { waiting[name] = [name, deps, callback]; } }; define.amd = { jQuery: true }; }()); S2.requirejs = requirejs;S2.require = require;S2.define = define; } }()); S2.define("almond", function(){}); /* global jQuery:false, $:false */ S2.define('jquery',[],function () { var _$ = jQuery || $; if (_$ == null && console && console.error) { console.error( 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + 'found. Make sure that you are including jQuery before Select2 on your ' + 'web page.' ); } return _$; }); S2.define('select2/utils',[ 'jquery' ], function ($) { var Utils = {}; Utils.Extend = function (ChildClass, SuperClass) { var __hasProp = {}.hasOwnProperty; function BaseConstructor () { this.constructor = ChildClass; } for (var key in SuperClass) { if (__hasProp.call(SuperClass, key)) { ChildClass[key] = SuperClass[key]; } } BaseConstructor.prototype = SuperClass.prototype; ChildClass.prototype = new BaseConstructor(); ChildClass.__super__ = SuperClass.prototype; return ChildClass; }; function getMethods (theClass) { var proto = theClass.prototype; var methods = []; for (var methodName in proto) { var m = proto[methodName]; if (typeof m !== 'function') { continue; } if (methodName === 'constructor') { continue; } methods.push(methodName); } return methods; } Utils.Decorate = function (SuperClass, DecoratorClass) { var decoratedMethods = getMethods(DecoratorClass); var superMethods = getMethods(SuperClass); function DecoratedClass () { var unshift = Array.prototype.unshift; var argCount = DecoratorClass.prototype.constructor.length; var calledConstructor = SuperClass.prototype.constructor; if (argCount > 0) { unshift.call(arguments, SuperClass.prototype.constructor); calledConstructor = DecoratorClass.prototype.constructor; } calledConstructor.apply(this, arguments); } DecoratorClass.displayName = SuperClass.displayName; function ctr () { this.constructor = DecoratedClass; } DecoratedClass.prototype = new ctr(); for (var m = 0; m < superMethods.length; m++) { var superMethod = superMethods[m]; DecoratedClass.prototype[superMethod] = SuperClass.prototype[superMethod]; } var calledMethod = function (methodName) { // Stub out the original method if it's not decorating an actual method var originalMethod = function () {}; if (methodName in DecoratedClass.prototype) { originalMethod = DecoratedClass.prototype[methodName]; } var decoratedMethod = DecoratorClass.prototype[methodName]; return function () { var unshift = Array.prototype.unshift; unshift.call(arguments, originalMethod); return decoratedMethod.apply(this, arguments); }; }; for (var d = 0; d < decoratedMethods.length; d++) { var decoratedMethod = decoratedMethods[d]; DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); } return DecoratedClass; }; var Observable = function () { this.listeners = {}; }; Observable.prototype.on = function (event, callback) { this.listeners = this.listeners || {}; if (event in this.listeners) { this.listeners[event].push(callback); } else { this.listeners[event] = [callback]; } }; Observable.prototype.trigger = function (event) { var slice = Array.prototype.slice; this.listeners = this.listeners || {}; if (event in this.listeners) { this.invoke(this.listeners[event], slice.call(arguments, 1)); } if ('*' in this.listeners) { this.invoke(this.listeners['*'], arguments); } }; Observable.prototype.invoke = function (listeners, params) { for (var i = 0, len = listeners.length; i < len; i++) { listeners[i].apply(this, params); } }; Utils.Observable = Observable; Utils.generateChars = function (length) { var chars = ''; for (var i = 0; i < length; i++) { var randomChar = Math.floor(Math.random() * 36); chars += randomChar.toString(36); } return chars; }; Utils.bind = function (func, context) { return function () { func.apply(context, arguments); }; }; Utils._convertData = function (data) { for (var originalKey in data) { var keys = originalKey.split('-'); var dataLevel = data; if (keys.length === 1) { continue; } for (var k = 0; k < keys.length; k++) { var key = keys[k]; // Lowercase the first letter // By default, dash-separated becomes camelCase key = key.substring(0, 1).toLowerCase() + key.substring(1); if (!(key in dataLevel)) { dataLevel[key] = {}; } if (k == keys.length - 1) { dataLevel[key] = data[originalKey]; } dataLevel = dataLevel[key]; } delete data[originalKey]; } return data; }; Utils.hasScroll = function (index, el) { // Adapted from the function created by @ShadowScripter // and adapted by @BillBarry on the Stack Exchange Code Review website. // The original code can be found at // http://codereview.stackexchange.com/q/13338 // and was designed to be used with the Sizzle selector engine. var $el = $(el); var overflowX = el.style.overflowX; var overflowY = el.style.overflowY; //Check both x and y declarations if (overflowX === overflowY && (overflowY === 'hidden' || overflowY === 'visible')) { return false; } if (overflowX === 'scroll' || overflowY === 'scroll') { return true; } return ($el.innerHeight() < el.scrollHeight || $el.innerWidth() < el.scrollWidth); }; Utils.escapeMarkup = function (markup) { var replaceMap = { '\\': '\', '&': '&', '<': '<', '>': '>', '"': '"', '\'': ''', '/': '/' }; // Do not try to escape the markup if it's not a string if (typeof markup !== 'string') { return markup; } return String(markup).replace(/[&<>"'\/\\]/g, function (match) { return replaceMap[match]; }); }; // Append an array of jQuery nodes to a given element. Utils.appendMany = function ($element, $nodes) { // jQuery 1.7.x does not support $.fn.append() with an array // Fall back to a jQuery object collection using $.fn.add() if ($.fn.jquery.substr(0, 3) === '1.7') { var $jqNodes = $(); $.map($nodes, function (node) { $jqNodes = $jqNodes.add(node); }); $nodes = $jqNodes; } $element.append($nodes); }; return Utils; }); S2.define('select2/results',[ 'jquery', './utils' ], function ($, Utils) { function Results ($element, options, dataAdapter) { this.$element = $element; this.data = dataAdapter; this.options = options; Results.__super__.constructor.call(this); } Utils.Extend(Results, Utils.Observable); Results.prototype.render = function () { var $results = $( '
    ' ); if (this.options.get('multiple')) { $results.attr('aria-multiselectable', 'true'); } this.$results = $results; return $results; }; Results.prototype.clear = function () { this.$results.empty(); }; Results.prototype.displayMessage = function (params) { var escapeMarkup = this.options.get('escapeMarkup'); this.clear(); this.hideLoading(); var $message = $( '
  • ' ); var message = this.options.get('translations').get(params.message); $message.append( escapeMarkup( message(params.args) ) ); $message[0].className += ' select2-results__message'; this.$results.append($message); }; Results.prototype.hideMessages = function () { this.$results.find('.select2-results__message').remove(); }; Results.prototype.append = function (data) { this.hideLoading(); var $options = []; if (data.results == null || data.results.length === 0) { if (this.$results.children().length === 0) { this.trigger('results:message', { message: 'noResults' }); } return; } data.results = this.sort(data.results); for (var d = 0; d < data.results.length; d++) { var item = data.results[d]; var $option = this.option(item); $options.push($option); } this.$results.append($options); }; Results.prototype.position = function ($results, $dropdown) { var $resultsContainer = $dropdown.find('.select2-results'); $resultsContainer.append($results); }; Results.prototype.sort = function (data) { var sorter = this.options.get('sorter'); return sorter(data); }; Results.prototype.setClasses = function () { var self = this; this.data.current(function (selected) { var selectedIds = $.map(selected, function (s) { return s.id.toString(); }); var $options = self.$results .find('.select2-results__option[aria-selected]'); $options.each(function () { var $option = $(this); var item = $.data(this, 'data'); // id needs to be converted to a string when comparing var id = '' + item.id; if ((item.element != null && item.element.selected) || (item.element == null && $.inArray(id, selectedIds) > -1)) { $option.attr('aria-selected', 'true'); } else { $option.attr('aria-selected', 'false'); } }); var $selected = $options.filter('[aria-selected=true]'); // Check if there are any selected options if ($selected.length > 0) { // If there are selected options, highlight the first $selected.first().trigger('mouseenter'); } else { // If there are no selected options, highlight the first option // in the dropdown $options.first().trigger('mouseenter'); } }); }; Results.prototype.showLoading = function (params) { this.hideLoading(); var loadingMore = this.options.get('translations').get('searching'); var loading = { disabled: true, loading: true, text: loadingMore(params) }; var $loading = this.option(loading); $loading.className += ' loading-results'; this.$results.prepend($loading); }; Results.prototype.hideLoading = function () { this.$results.find('.loading-results').remove(); }; Results.prototype.option = function (data) { var option = document.createElement('li'); option.className = 'select2-results__option'; var attrs = { 'role': 'treeitem', 'aria-selected': 'false' }; if (data.disabled) { delete attrs['aria-selected']; attrs['aria-disabled'] = 'true'; } if (data.id == null) { delete attrs['aria-selected']; } if (data._resultId != null) { option.id = data._resultId; } if (data.title) { option.title = data.title; } if (data.children) { attrs.role = 'group'; attrs['aria-label'] = data.text; delete attrs['aria-selected']; } for (var attr in attrs) { var val = attrs[attr]; option.setAttribute(attr, val); } if (data.children) { var $option = $(option); var label = document.createElement('strong'); label.className = 'select2-results__group'; var $label = $(label); this.template(data, label); var $children = []; for (var c = 0; c < data.children.length; c++) { var child = data.children[c]; var $child = this.option(child); $children.push($child); } var $childrenContainer = $('
      ', { 'class': 'select2-results__options select2-results__options--nested' }); $childrenContainer.append($children); $option.append(label); $option.append($childrenContainer); } else { this.template(data, option); } $.data(option, 'data', data); return option; }; Results.prototype.bind = function (container, $container) { var self = this; var id = container.id + '-results'; this.$results.attr('id', id); container.on('results:all', function (params) { self.clear(); self.append(params.data); if (container.isOpen()) { self.setClasses(); } }); container.on('results:append', function (params) { self.append(params.data); if (container.isOpen()) { self.setClasses(); } }); container.on('query', function (params) { self.hideMessages(); self.showLoading(params); }); container.on('select', function () { if (!container.isOpen()) { return; } self.setClasses(); }); container.on('unselect', function () { if (!container.isOpen()) { return; } self.setClasses(); }); container.on('open', function () { // When the dropdown is open, aria-expended="true" self.$results.attr('aria-expanded', 'true'); self.$results.attr('aria-hidden', 'false'); self.setClasses(); self.ensureHighlightVisible(); }); container.on('close', function () { // When the dropdown is closed, aria-expended="false" self.$results.attr('aria-expanded', 'false'); self.$results.attr('aria-hidden', 'true'); self.$results.removeAttr('aria-activedescendant'); }); container.on('results:toggle', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } $highlighted.trigger('mouseup'); }); container.on('results:select', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } var data = $highlighted.data('data'); if ($highlighted.attr('aria-selected') == 'true') { self.trigger('close', {}); } else { self.trigger('select', { data: data }); } }); container.on('results:previous', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); // If we are already at te top, don't move further if (currentIndex === 0) { return; } var nextIndex = currentIndex - 1; // If none are highlighted, highlight the first if ($highlighted.length === 0) { nextIndex = 0; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top; var nextTop = $next.offset().top; var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextTop - currentOffset < 0) { self.$results.scrollTop(nextOffset); } }); container.on('results:next', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); var nextIndex = currentIndex + 1; // If we are at the last option, stay there if (nextIndex >= $options.length) { return; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var nextBottom = $next.offset().top + $next.outerHeight(false); var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextBottom > currentOffset) { self.$results.scrollTop(nextOffset); } }); container.on('results:focus', function (params) { params.element.addClass('select2-results__option--highlighted'); }); container.on('results:message', function (params) { self.displayMessage(params); }); if ($.fn.mousewheel) { this.$results.on('mousewheel', function (e) { var top = self.$results.scrollTop(); var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); if (isAtTop) { self.$results.scrollTop(0); e.preventDefault(); e.stopPropagation(); } else if (isAtBottom) { self.$results.scrollTop( self.$results.get(0).scrollHeight - self.$results.height() ); e.preventDefault(); e.stopPropagation(); } }); } this.$results.on('mouseup', '.select2-results__option[aria-selected]', function (evt) { var $this = $(this); var data = $this.data('data'); if ($this.attr('aria-selected') === 'true') { if (self.options.get('multiple')) { self.trigger('unselect', { originalEvent: evt, data: data }); } else { self.trigger('close', {}); } return; } self.trigger('select', { originalEvent: evt, data: data }); }); this.$results.on('mouseenter', '.select2-results__option[aria-selected]', function (evt) { var data = $(this).data('data'); self.getHighlightedResults() .removeClass('select2-results__option--highlighted'); self.trigger('results:focus', { data: data, element: $(this) }); }); }; Results.prototype.getHighlightedResults = function () { var $highlighted = this.$results .find('.select2-results__option--highlighted'); return $highlighted; }; Results.prototype.destroy = function () { this.$results.remove(); }; Results.prototype.ensureHighlightVisible = function () { var $highlighted = this.getHighlightedResults(); if ($highlighted.length === 0) { return; } var $options = this.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); var currentOffset = this.$results.offset().top; var nextTop = $highlighted.offset().top; var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); var offsetDelta = nextTop - currentOffset; nextOffset -= $highlighted.outerHeight(false) * 2; if (currentIndex <= 2) { this.$results.scrollTop(0); } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { this.$results.scrollTop(nextOffset); } }; Results.prototype.template = function (result, container) { var template = this.options.get('templateResult'); var escapeMarkup = this.options.get('escapeMarkup'); var content = template(result, container); if (content == null) { container.style.display = 'none'; } else if (typeof content === 'string') { container.innerHTML = escapeMarkup(content); } else { $(container).append(content); } }; return Results; }); S2.define('select2/keys',[ ], function () { var KEYS = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, PAGE_UP: 33, PAGE_DOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 }; return KEYS; }); S2.define('select2/selection/base',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function BaseSelection ($element, options) { this.$element = $element; this.options = options; BaseSelection.__super__.constructor.call(this); } Utils.Extend(BaseSelection, Utils.Observable); BaseSelection.prototype.render = function () { var $selection = $( '' ); this._tabindex = 0; if (this.$element.data('old-tabindex') != null) { this._tabindex = this.$element.data('old-tabindex'); } else if (this.$element.attr('tabindex') != null) { this._tabindex = this.$element.attr('tabindex'); } $selection.attr('title', this.$element.attr('title')); $selection.attr('tabindex', this._tabindex); this.$selection = $selection; return $selection; }; BaseSelection.prototype.bind = function (container, $container) { var self = this; var id = container.id + '-container'; var resultsId = container.id + '-results'; this.container = container; this.$selection.on('focus', function (evt) { self.trigger('focus', evt); }); this.$selection.on('blur', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', function (evt) { self.trigger('keypress', evt); if (evt.which === KEYS.SPACE) { evt.preventDefault(); } }); container.on('results:focus', function (params) { self.$selection.attr('aria-activedescendant', params.data._resultId); }); container.on('selection:update', function (params) { self.update(params.data); }); container.on('open', function () { // When the dropdown is open, aria-expanded="true" self.$selection.attr('aria-expanded', 'true'); self.$selection.attr('aria-owns', resultsId); self._attachCloseHandler(container); }); container.on('close', function () { // When the dropdown is closed, aria-expanded="false" self.$selection.attr('aria-expanded', 'false'); self.$selection.removeAttr('aria-activedescendant'); self.$selection.removeAttr('aria-owns'); self.$selection.focus(); self._detachCloseHandler(container); }); container.on('enable', function () { self.$selection.attr('tabindex', self._tabindex); }); container.on('disable', function () { self.$selection.attr('tabindex', '-1'); }); }; BaseSelection.prototype._handleBlur = function (evt) { var self = this; // This needs to be delayed as the active element is the body when the tab // key is pressed, possibly along with others. window.setTimeout(function () { // Don't trigger `blur` if the focus is still in the selection if ( (document.activeElement == self.$selection[0]) || ($.contains(self.$selection[0], document.activeElement)) ) { return; } self.trigger('blur', evt); }, 1); }; BaseSelection.prototype._attachCloseHandler = function (container) { var self = this; $(document.body).on('mousedown.select2.' + container.id, function (e) { var $target = $(e.target); var $select = $target.closest('.select2'); var $all = $('.select2.select2-container--open'); $all.each(function () { var $this = $(this); if (this == $select[0]) { return; } var $element = $this.data('element'); $element.select2('close'); }); }); }; BaseSelection.prototype._detachCloseHandler = function (container) { $(document.body).off('mousedown.select2.' + container.id); }; BaseSelection.prototype.position = function ($selection, $container) { var $selectionContainer = $container.find('.selection'); $selectionContainer.append($selection); }; BaseSelection.prototype.destroy = function () { this._detachCloseHandler(this.container); }; BaseSelection.prototype.update = function (data) { throw new Error('The `update` method must be defined in child classes.'); }; return BaseSelection; }); S2.define('select2/selection/single',[ 'jquery', './base', '../utils', '../keys' ], function ($, BaseSelection, Utils, KEYS) { function SingleSelection () { SingleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(SingleSelection, BaseSelection); SingleSelection.prototype.render = function () { var $selection = SingleSelection.__super__.render.call(this); $selection.addClass('select2-selection--single'); $selection.html( '' + '' + '' + '' ); return $selection; }; SingleSelection.prototype.bind = function (container, $container) { var self = this; SingleSelection.__super__.bind.apply(this, arguments); var id = container.id + '-container'; this.$selection.find('.select2-selection__rendered').attr('id', id); this.$selection.attr('aria-labelledby', id); this.$selection.on('mousedown', function (evt) { // Only respond to left clicks if (evt.which !== 1) { return; } self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on('focus', function (evt) { // User focuses on the container }); this.$selection.on('blur', function (evt) { // User exits the container }); container.on('selection:update', function (params) { self.update(params.data); }); }; SingleSelection.prototype.clear = function () { this.$selection.find('.select2-selection__rendered').empty(); }; SingleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; SingleSelection.prototype.selectionContainer = function () { return $(''); }; SingleSelection.prototype.update = function (data) { if (data.length === 0) { this.clear(); return; } var selection = data[0]; var $rendered = this.$selection.find('.select2-selection__rendered'); var formatted = this.display(selection, $rendered); $rendered.empty().append(formatted); $rendered.prop('title', selection.title || selection.text); }; return SingleSelection; }); S2.define('select2/selection/multiple',[ 'jquery', './base', '../utils' ], function ($, BaseSelection, Utils) { function MultipleSelection ($element, options) { MultipleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(MultipleSelection, BaseSelection); MultipleSelection.prototype.render = function () { var $selection = MultipleSelection.__super__.render.call(this); $selection.addClass('select2-selection--multiple'); $selection.html( '
        ' ); return $selection; }; MultipleSelection.prototype.bind = function (container, $container) { var self = this; MultipleSelection.__super__.bind.apply(this, arguments); this.$selection.on('click', function (evt) { self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on( 'click', '.select2-selection__choice__remove', function (evt) { // Ignore the event if it is disabled if (self.options.get('disabled')) { return; } var $remove = $(this); var $selection = $remove.parent(); var data = $selection.data('data'); self.trigger('unselect', { originalEvent: evt, data: data }); } ); }; MultipleSelection.prototype.clear = function () { this.$selection.find('.select2-selection__rendered').empty(); }; MultipleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; MultipleSelection.prototype.selectionContainer = function () { var $container = $( '
      • ' + '' + '×' + '' + '
      • ' ); return $container; }; MultipleSelection.prototype.update = function (data) { this.clear(); if (data.length === 0) { return; } var $selections = []; for (var d = 0; d < data.length; d++) { var selection = data[d]; var $selection = this.selectionContainer(); var formatted = this.display(selection, $selection); $selection.append(formatted); $selection.prop('title', selection.title || selection.text); $selection.data('data', selection); $selections.push($selection); } var $rendered = this.$selection.find('.select2-selection__rendered'); Utils.appendMany($rendered, $selections); }; return MultipleSelection; }); S2.define('select2/selection/placeholder',[ '../utils' ], function (Utils) { function Placeholder (decorated, $element, options) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options); } Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { var $placeholder = this.selectionContainer(); $placeholder.html(this.display(placeholder)); $placeholder.addClass('select2-selection__placeholder') .removeClass('select2-selection__choice'); return $placeholder; }; Placeholder.prototype.update = function (decorated, data) { var singlePlaceholder = ( data.length == 1 && data[0].id != this.placeholder.id ); var multipleSelections = data.length > 1; if (multipleSelections || singlePlaceholder) { return decorated.call(this, data); } this.clear(); var $placeholder = this.createPlaceholder(this.placeholder); this.$selection.find('.select2-selection__rendered').append($placeholder); }; return Placeholder; }); S2.define('select2/selection/allowClear',[ 'jquery', '../keys' ], function ($, KEYS) { function AllowClear () { } AllowClear.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); if (this.placeholder == null) { if (this.options.get('debug') && window.console && console.error) { console.error( 'Select2: The `allowClear` option should be used in combination ' + 'with the `placeholder` option.' ); } } this.$selection.on('mousedown', '.select2-selection__clear', function (evt) { self._handleClear(evt); }); container.on('keypress', function (evt) { self._handleKeyboardClear(evt, container); }); }; AllowClear.prototype._handleClear = function (_, evt) { // Ignore the event if it is disabled if (this.options.get('disabled')) { return; } var $clear = this.$selection.find('.select2-selection__clear'); // Ignore the event if nothing has been selected if ($clear.length === 0) { return; } evt.stopPropagation(); var data = $clear.data('data'); for (var d = 0; d < data.length; d++) { var unselectData = { data: data[d] }; // Trigger the `unselect` event, so people can prevent it from being // cleared. this.trigger('unselect', unselectData); // If the event was prevented, don't clear it out. if (unselectData.prevented) { return; } } this.$element.val(this.placeholder.id).trigger('change'); this.trigger('toggle', {}); }; AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { if (container.isOpen()) { return; } if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { this._handleClear(evt); } }; AllowClear.prototype.update = function (decorated, data) { decorated.call(this, data); if (this.$selection.find('.select2-selection__placeholder').length > 0 || data.length === 0) { return; } var $remove = $( '' + '×' + '' ); $remove.data('data', data); this.$selection.find('.select2-selection__rendered').prepend($remove); }; return AllowClear; }); S2.define('select2/selection/search',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function Search (decorated, $element, options) { decorated.call(this, $element, options); } Search.prototype.render = function (decorated) { var $search = $( '' ); this.$searchContainer = $search; this.$search = $search.find('input'); var $rendered = decorated.call(this); this._transferTabIndex(); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('open', function () { self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); container.on('enable', function () { self.$search.prop('disabled', false); self._transferTabIndex(); }); container.on('disable', function () { self.$search.prop('disabled', true); }); container.on('focus', function (evt) { self.$search.trigger('focus'); }); container.on('results:focus', function (params) { self.$search.attr('aria-activedescendant', params.id); }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { self.trigger('focus', evt); }); this.$selection.on('focusout', '.select2-search--inline', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', '.select2-search--inline', function (evt) { evt.stopPropagation(); self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); var key = evt.which; if (key === KEYS.BACKSPACE && self.$search.val() === '') { var $previousChoice = self.$searchContainer .prev('.select2-selection__choice'); if ($previousChoice.length > 0) { var item = $previousChoice.data('data'); self.searchRemoveChoice(item); evt.preventDefault(); } } }); // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. // This property is not available in Edge, but Edge also doesn't have // this bug. var msie = document.documentMode; var disableInputEvents = msie && msie <= 11; // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$selection.on( 'input.searchcheck', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents) { self.$selection.off('input.search input.searchcheck'); return; } // Unbind the duplicated `keyup` event self.$selection.off('keyup.search'); } ); this.$selection.on( 'keyup.search input.search', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents && evt.type === 'input') { self.$selection.off('input.search input.searchcheck'); return; } var key = evt.which; // We can freely ignore events from modifier keys if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { return; } // Tabbing will be handled during the `keydown` phase if (key == KEYS.TAB) { return; } self.handleSearch(evt); } ); }; /** * This method will transfer the tabindex attribute from the rendered * selection to the search box. This allows for the search box to be used as * the primary focus instead of the selection container. * * @private */ Search.prototype._transferTabIndex = function (decorated) { this.$search.attr('tabindex', this.$selection.attr('tabindex')); this.$selection.attr('tabindex', '-1'); }; Search.prototype.createPlaceholder = function (decorated, placeholder) { this.$search.attr('placeholder', placeholder.text); }; Search.prototype.update = function (decorated, data) { var searchHadFocus = this.$search[0] == document.activeElement; this.$search.attr('placeholder', ''); decorated.call(this, data); this.$selection.find('.select2-selection__rendered') .append(this.$searchContainer); this.resizeSearch(); if (searchHadFocus) { this.$search.focus(); } }; Search.prototype.handleSearch = function () { this.resizeSearch(); if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(item.text); this.handleSearch(); }; Search.prototype.resizeSearch = function () { this.$search.css('width', '25px'); var width = ''; if (this.$search.attr('placeholder') !== '') { width = this.$selection.find('.select2-selection__rendered').innerWidth(); } else { var minimumWidth = this.$search.val().length + 1; width = (minimumWidth * 0.75) + 'em'; } this.$search.css('width', width); }; return Search; }); S2.define('select2/selection/eventRelay',[ 'jquery' ], function ($) { function EventRelay () { } EventRelay.prototype.bind = function (decorated, container, $container) { var self = this; var relayEvents = [ 'open', 'opening', 'close', 'closing', 'select', 'selecting', 'unselect', 'unselecting' ]; var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; decorated.call(this, container, $container); container.on('*', function (name, params) { // Ignore events that should not be relayed if ($.inArray(name, relayEvents) === -1) { return; } // The parameters should always be an object params = params || {}; // Generate the jQuery event for the Select2 event var evt = $.Event('select2:' + name, { params: params }); self.$element.trigger(evt); // Only handle preventable events if it was one if ($.inArray(name, preventableEvents) === -1) { return; } params.prevented = evt.isDefaultPrevented(); }); }; return EventRelay; }); S2.define('select2/translation',[ 'jquery', 'require' ], function ($, require) { function Translation (dict) { this.dict = dict || {}; } Translation.prototype.all = function () { return this.dict; }; Translation.prototype.get = function (key) { return this.dict[key]; }; Translation.prototype.extend = function (translation) { this.dict = $.extend({}, translation.all(), this.dict); }; // Static functions Translation._cache = {}; Translation.loadPath = function (path) { if (!(path in Translation._cache)) { var translations = require(path); Translation._cache[path] = translations; } return new Translation(Translation._cache[path]); }; return Translation; }); S2.define('select2/diacritics',[ ], function () { var diacritics = { '\u24B6': 'A', '\uFF21': 'A', '\u00C0': 'A', '\u00C1': 'A', '\u00C2': 'A', '\u1EA6': 'A', '\u1EA4': 'A', '\u1EAA': 'A', '\u1EA8': 'A', '\u00C3': 'A', '\u0100': 'A', '\u0102': 'A', '\u1EB0': 'A', '\u1EAE': 'A', '\u1EB4': 'A', '\u1EB2': 'A', '\u0226': 'A', '\u01E0': 'A', '\u00C4': 'A', '\u01DE': 'A', '\u1EA2': 'A', '\u00C5': 'A', '\u01FA': 'A', '\u01CD': 'A', '\u0200': 'A', '\u0202': 'A', '\u1EA0': 'A', '\u1EAC': 'A', '\u1EB6': 'A', '\u1E00': 'A', '\u0104': 'A', '\u023A': 'A', '\u2C6F': 'A', '\uA732': 'AA', '\u00C6': 'AE', '\u01FC': 'AE', '\u01E2': 'AE', '\uA734': 'AO', '\uA736': 'AU', '\uA738': 'AV', '\uA73A': 'AV', '\uA73C': 'AY', '\u24B7': 'B', '\uFF22': 'B', '\u1E02': 'B', '\u1E04': 'B', '\u1E06': 'B', '\u0243': 'B', '\u0182': 'B', '\u0181': 'B', '\u24B8': 'C', '\uFF23': 'C', '\u0106': 'C', '\u0108': 'C', '\u010A': 'C', '\u010C': 'C', '\u00C7': 'C', '\u1E08': 'C', '\u0187': 'C', '\u023B': 'C', '\uA73E': 'C', '\u24B9': 'D', '\uFF24': 'D', '\u1E0A': 'D', '\u010E': 'D', '\u1E0C': 'D', '\u1E10': 'D', '\u1E12': 'D', '\u1E0E': 'D', '\u0110': 'D', '\u018B': 'D', '\u018A': 'D', '\u0189': 'D', '\uA779': 'D', '\u01F1': 'DZ', '\u01C4': 'DZ', '\u01F2': 'Dz', '\u01C5': 'Dz', '\u24BA': 'E', '\uFF25': 'E', '\u00C8': 'E', '\u00C9': 'E', '\u00CA': 'E', '\u1EC0': 'E', '\u1EBE': 'E', '\u1EC4': 'E', '\u1EC2': 'E', '\u1EBC': 'E', '\u0112': 'E', '\u1E14': 'E', '\u1E16': 'E', '\u0114': 'E', '\u0116': 'E', '\u00CB': 'E', '\u1EBA': 'E', '\u011A': 'E', '\u0204': 'E', '\u0206': 'E', '\u1EB8': 'E', '\u1EC6': 'E', '\u0228': 'E', '\u1E1C': 'E', '\u0118': 'E', '\u1E18': 'E', '\u1E1A': 'E', '\u0190': 'E', '\u018E': 'E', '\u24BB': 'F', '\uFF26': 'F', '\u1E1E': 'F', '\u0191': 'F', '\uA77B': 'F', '\u24BC': 'G', '\uFF27': 'G', '\u01F4': 'G', '\u011C': 'G', '\u1E20': 'G', '\u011E': 'G', '\u0120': 'G', '\u01E6': 'G', '\u0122': 'G', '\u01E4': 'G', '\u0193': 'G', '\uA7A0': 'G', '\uA77D': 'G', '\uA77E': 'G', '\u24BD': 'H', '\uFF28': 'H', '\u0124': 'H', '\u1E22': 'H', '\u1E26': 'H', '\u021E': 'H', '\u1E24': 'H', '\u1E28': 'H', '\u1E2A': 'H', '\u0126': 'H', '\u2C67': 'H', '\u2C75': 'H', '\uA78D': 'H', '\u24BE': 'I', '\uFF29': 'I', '\u00CC': 'I', '\u00CD': 'I', '\u00CE': 'I', '\u0128': 'I', '\u012A': 'I', '\u012C': 'I', '\u0130': 'I', '\u00CF': 'I', '\u1E2E': 'I', '\u1EC8': 'I', '\u01CF': 'I', '\u0208': 'I', '\u020A': 'I', '\u1ECA': 'I', '\u012E': 'I', '\u1E2C': 'I', '\u0197': 'I', '\u24BF': 'J', '\uFF2A': 'J', '\u0134': 'J', '\u0248': 'J', '\u24C0': 'K', '\uFF2B': 'K', '\u1E30': 'K', '\u01E8': 'K', '\u1E32': 'K', '\u0136': 'K', '\u1E34': 'K', '\u0198': 'K', '\u2C69': 'K', '\uA740': 'K', '\uA742': 'K', '\uA744': 'K', '\uA7A2': 'K', '\u24C1': 'L', '\uFF2C': 'L', '\u013F': 'L', '\u0139': 'L', '\u013D': 'L', '\u1E36': 'L', '\u1E38': 'L', '\u013B': 'L', '\u1E3C': 'L', '\u1E3A': 'L', '\u0141': 'L', '\u023D': 'L', '\u2C62': 'L', '\u2C60': 'L', '\uA748': 'L', '\uA746': 'L', '\uA780': 'L', '\u01C7': 'LJ', '\u01C8': 'Lj', '\u24C2': 'M', '\uFF2D': 'M', '\u1E3E': 'M', '\u1E40': 'M', '\u1E42': 'M', '\u2C6E': 'M', '\u019C': 'M', '\u24C3': 'N', '\uFF2E': 'N', '\u01F8': 'N', '\u0143': 'N', '\u00D1': 'N', '\u1E44': 'N', '\u0147': 'N', '\u1E46': 'N', '\u0145': 'N', '\u1E4A': 'N', '\u1E48': 'N', '\u0220': 'N', '\u019D': 'N', '\uA790': 'N', '\uA7A4': 'N', '\u01CA': 'NJ', '\u01CB': 'Nj', '\u24C4': 'O', '\uFF2F': 'O', '\u00D2': 'O', '\u00D3': 'O', '\u00D4': 'O', '\u1ED2': 'O', '\u1ED0': 'O', '\u1ED6': 'O', '\u1ED4': 'O', '\u00D5': 'O', '\u1E4C': 'O', '\u022C': 'O', '\u1E4E': 'O', '\u014C': 'O', '\u1E50': 'O', '\u1E52': 'O', '\u014E': 'O', '\u022E': 'O', '\u0230': 'O', '\u00D6': 'O', '\u022A': 'O', '\u1ECE': 'O', '\u0150': 'O', '\u01D1': 'O', '\u020C': 'O', '\u020E': 'O', '\u01A0': 'O', '\u1EDC': 'O', '\u1EDA': 'O', '\u1EE0': 'O', '\u1EDE': 'O', '\u1EE2': 'O', '\u1ECC': 'O', '\u1ED8': 'O', '\u01EA': 'O', '\u01EC': 'O', '\u00D8': 'O', '\u01FE': 'O', '\u0186': 'O', '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', '\u24C5': 'P', '\uFF30': 'P', '\u1E54': 'P', '\u1E56': 'P', '\u01A4': 'P', '\u2C63': 'P', '\uA750': 'P', '\uA752': 'P', '\uA754': 'P', '\u24C6': 'Q', '\uFF31': 'Q', '\uA756': 'Q', '\uA758': 'Q', '\u024A': 'Q', '\u24C7': 'R', '\uFF32': 'R', '\u0154': 'R', '\u1E58': 'R', '\u0158': 'R', '\u0210': 'R', '\u0212': 'R', '\u1E5A': 'R', '\u1E5C': 'R', '\u0156': 'R', '\u1E5E': 'R', '\u024C': 'R', '\u2C64': 'R', '\uA75A': 'R', '\uA7A6': 'R', '\uA782': 'R', '\u24C8': 'S', '\uFF33': 'S', '\u1E9E': 'S', '\u015A': 'S', '\u1E64': 'S', '\u015C': 'S', '\u1E60': 'S', '\u0160': 'S', '\u1E66': 'S', '\u1E62': 'S', '\u1E68': 'S', '\u0218': 'S', '\u015E': 'S', '\u2C7E': 'S', '\uA7A8': 'S', '\uA784': 'S', '\u24C9': 'T', '\uFF34': 'T', '\u1E6A': 'T', '\u0164': 'T', '\u1E6C': 'T', '\u021A': 'T', '\u0162': 'T', '\u1E70': 'T', '\u1E6E': 'T', '\u0166': 'T', '\u01AC': 'T', '\u01AE': 'T', '\u023E': 'T', '\uA786': 'T', '\uA728': 'TZ', '\u24CA': 'U', '\uFF35': 'U', '\u00D9': 'U', '\u00DA': 'U', '\u00DB': 'U', '\u0168': 'U', '\u1E78': 'U', '\u016A': 'U', '\u1E7A': 'U', '\u016C': 'U', '\u00DC': 'U', '\u01DB': 'U', '\u01D7': 'U', '\u01D5': 'U', '\u01D9': 'U', '\u1EE6': 'U', '\u016E': 'U', '\u0170': 'U', '\u01D3': 'U', '\u0214': 'U', '\u0216': 'U', '\u01AF': 'U', '\u1EEA': 'U', '\u1EE8': 'U', '\u1EEE': 'U', '\u1EEC': 'U', '\u1EF0': 'U', '\u1EE4': 'U', '\u1E72': 'U', '\u0172': 'U', '\u1E76': 'U', '\u1E74': 'U', '\u0244': 'U', '\u24CB': 'V', '\uFF36': 'V', '\u1E7C': 'V', '\u1E7E': 'V', '\u01B2': 'V', '\uA75E': 'V', '\u0245': 'V', '\uA760': 'VY', '\u24CC': 'W', '\uFF37': 'W', '\u1E80': 'W', '\u1E82': 'W', '\u0174': 'W', '\u1E86': 'W', '\u1E84': 'W', '\u1E88': 'W', '\u2C72': 'W', '\u24CD': 'X', '\uFF38': 'X', '\u1E8A': 'X', '\u1E8C': 'X', '\u24CE': 'Y', '\uFF39': 'Y', '\u1EF2': 'Y', '\u00DD': 'Y', '\u0176': 'Y', '\u1EF8': 'Y', '\u0232': 'Y', '\u1E8E': 'Y', '\u0178': 'Y', '\u1EF6': 'Y', '\u1EF4': 'Y', '\u01B3': 'Y', '\u024E': 'Y', '\u1EFE': 'Y', '\u24CF': 'Z', '\uFF3A': 'Z', '\u0179': 'Z', '\u1E90': 'Z', '\u017B': 'Z', '\u017D': 'Z', '\u1E92': 'Z', '\u1E94': 'Z', '\u01B5': 'Z', '\u0224': 'Z', '\u2C7F': 'Z', '\u2C6B': 'Z', '\uA762': 'Z', '\u24D0': 'a', '\uFF41': 'a', '\u1E9A': 'a', '\u00E0': 'a', '\u00E1': 'a', '\u00E2': 'a', '\u1EA7': 'a', '\u1EA5': 'a', '\u1EAB': 'a', '\u1EA9': 'a', '\u00E3': 'a', '\u0101': 'a', '\u0103': 'a', '\u1EB1': 'a', '\u1EAF': 'a', '\u1EB5': 'a', '\u1EB3': 'a', '\u0227': 'a', '\u01E1': 'a', '\u00E4': 'a', '\u01DF': 'a', '\u1EA3': 'a', '\u00E5': 'a', '\u01FB': 'a', '\u01CE': 'a', '\u0201': 'a', '\u0203': 'a', '\u1EA1': 'a', '\u1EAD': 'a', '\u1EB7': 'a', '\u1E01': 'a', '\u0105': 'a', '\u2C65': 'a', '\u0250': 'a', '\uA733': 'aa', '\u00E6': 'ae', '\u01FD': 'ae', '\u01E3': 'ae', '\uA735': 'ao', '\uA737': 'au', '\uA739': 'av', '\uA73B': 'av', '\uA73D': 'ay', '\u24D1': 'b', '\uFF42': 'b', '\u1E03': 'b', '\u1E05': 'b', '\u1E07': 'b', '\u0180': 'b', '\u0183': 'b', '\u0253': 'b', '\u24D2': 'c', '\uFF43': 'c', '\u0107': 'c', '\u0109': 'c', '\u010B': 'c', '\u010D': 'c', '\u00E7': 'c', '\u1E09': 'c', '\u0188': 'c', '\u023C': 'c', '\uA73F': 'c', '\u2184': 'c', '\u24D3': 'd', '\uFF44': 'd', '\u1E0B': 'd', '\u010F': 'd', '\u1E0D': 'd', '\u1E11': 'd', '\u1E13': 'd', '\u1E0F': 'd', '\u0111': 'd', '\u018C': 'd', '\u0256': 'd', '\u0257': 'd', '\uA77A': 'd', '\u01F3': 'dz', '\u01C6': 'dz', '\u24D4': 'e', '\uFF45': 'e', '\u00E8': 'e', '\u00E9': 'e', '\u00EA': 'e', '\u1EC1': 'e', '\u1EBF': 'e', '\u1EC5': 'e', '\u1EC3': 'e', '\u1EBD': 'e', '\u0113': 'e', '\u1E15': 'e', '\u1E17': 'e', '\u0115': 'e', '\u0117': 'e', '\u00EB': 'e', '\u1EBB': 'e', '\u011B': 'e', '\u0205': 'e', '\u0207': 'e', '\u1EB9': 'e', '\u1EC7': 'e', '\u0229': 'e', '\u1E1D': 'e', '\u0119': 'e', '\u1E19': 'e', '\u1E1B': 'e', '\u0247': 'e', '\u025B': 'e', '\u01DD': 'e', '\u24D5': 'f', '\uFF46': 'f', '\u1E1F': 'f', '\u0192': 'f', '\uA77C': 'f', '\u24D6': 'g', '\uFF47': 'g', '\u01F5': 'g', '\u011D': 'g', '\u1E21': 'g', '\u011F': 'g', '\u0121': 'g', '\u01E7': 'g', '\u0123': 'g', '\u01E5': 'g', '\u0260': 'g', '\uA7A1': 'g', '\u1D79': 'g', '\uA77F': 'g', '\u24D7': 'h', '\uFF48': 'h', '\u0125': 'h', '\u1E23': 'h', '\u1E27': 'h', '\u021F': 'h', '\u1E25': 'h', '\u1E29': 'h', '\u1E2B': 'h', '\u1E96': 'h', '\u0127': 'h', '\u2C68': 'h', '\u2C76': 'h', '\u0265': 'h', '\u0195': 'hv', '\u24D8': 'i', '\uFF49': 'i', '\u00EC': 'i', '\u00ED': 'i', '\u00EE': 'i', '\u0129': 'i', '\u012B': 'i', '\u012D': 'i', '\u00EF': 'i', '\u1E2F': 'i', '\u1EC9': 'i', '\u01D0': 'i', '\u0209': 'i', '\u020B': 'i', '\u1ECB': 'i', '\u012F': 'i', '\u1E2D': 'i', '\u0268': 'i', '\u0131': 'i', '\u24D9': 'j', '\uFF4A': 'j', '\u0135': 'j', '\u01F0': 'j', '\u0249': 'j', '\u24DA': 'k', '\uFF4B': 'k', '\u1E31': 'k', '\u01E9': 'k', '\u1E33': 'k', '\u0137': 'k', '\u1E35': 'k', '\u0199': 'k', '\u2C6A': 'k', '\uA741': 'k', '\uA743': 'k', '\uA745': 'k', '\uA7A3': 'k', '\u24DB': 'l', '\uFF4C': 'l', '\u0140': 'l', '\u013A': 'l', '\u013E': 'l', '\u1E37': 'l', '\u1E39': 'l', '\u013C': 'l', '\u1E3D': 'l', '\u1E3B': 'l', '\u017F': 'l', '\u0142': 'l', '\u019A': 'l', '\u026B': 'l', '\u2C61': 'l', '\uA749': 'l', '\uA781': 'l', '\uA747': 'l', '\u01C9': 'lj', '\u24DC': 'm', '\uFF4D': 'm', '\u1E3F': 'm', '\u1E41': 'm', '\u1E43': 'm', '\u0271': 'm', '\u026F': 'm', '\u24DD': 'n', '\uFF4E': 'n', '\u01F9': 'n', '\u0144': 'n', '\u00F1': 'n', '\u1E45': 'n', '\u0148': 'n', '\u1E47': 'n', '\u0146': 'n', '\u1E4B': 'n', '\u1E49': 'n', '\u019E': 'n', '\u0272': 'n', '\u0149': 'n', '\uA791': 'n', '\uA7A5': 'n', '\u01CC': 'nj', '\u24DE': 'o', '\uFF4F': 'o', '\u00F2': 'o', '\u00F3': 'o', '\u00F4': 'o', '\u1ED3': 'o', '\u1ED1': 'o', '\u1ED7': 'o', '\u1ED5': 'o', '\u00F5': 'o', '\u1E4D': 'o', '\u022D': 'o', '\u1E4F': 'o', '\u014D': 'o', '\u1E51': 'o', '\u1E53': 'o', '\u014F': 'o', '\u022F': 'o', '\u0231': 'o', '\u00F6': 'o', '\u022B': 'o', '\u1ECF': 'o', '\u0151': 'o', '\u01D2': 'o', '\u020D': 'o', '\u020F': 'o', '\u01A1': 'o', '\u1EDD': 'o', '\u1EDB': 'o', '\u1EE1': 'o', '\u1EDF': 'o', '\u1EE3': 'o', '\u1ECD': 'o', '\u1ED9': 'o', '\u01EB': 'o', '\u01ED': 'o', '\u00F8': 'o', '\u01FF': 'o', '\u0254': 'o', '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', '\u24DF': 'p', '\uFF50': 'p', '\u1E55': 'p', '\u1E57': 'p', '\u01A5': 'p', '\u1D7D': 'p', '\uA751': 'p', '\uA753': 'p', '\uA755': 'p', '\u24E0': 'q', '\uFF51': 'q', '\u024B': 'q', '\uA757': 'q', '\uA759': 'q', '\u24E1': 'r', '\uFF52': 'r', '\u0155': 'r', '\u1E59': 'r', '\u0159': 'r', '\u0211': 'r', '\u0213': 'r', '\u1E5B': 'r', '\u1E5D': 'r', '\u0157': 'r', '\u1E5F': 'r', '\u024D': 'r', '\u027D': 'r', '\uA75B': 'r', '\uA7A7': 'r', '\uA783': 'r', '\u24E2': 's', '\uFF53': 's', '\u00DF': 's', '\u015B': 's', '\u1E65': 's', '\u015D': 's', '\u1E61': 's', '\u0161': 's', '\u1E67': 's', '\u1E63': 's', '\u1E69': 's', '\u0219': 's', '\u015F': 's', '\u023F': 's', '\uA7A9': 's', '\uA785': 's', '\u1E9B': 's', '\u24E3': 't', '\uFF54': 't', '\u1E6B': 't', '\u1E97': 't', '\u0165': 't', '\u1E6D': 't', '\u021B': 't', '\u0163': 't', '\u1E71': 't', '\u1E6F': 't', '\u0167': 't', '\u01AD': 't', '\u0288': 't', '\u2C66': 't', '\uA787': 't', '\uA729': 'tz', '\u24E4': 'u', '\uFF55': 'u', '\u00F9': 'u', '\u00FA': 'u', '\u00FB': 'u', '\u0169': 'u', '\u1E79': 'u', '\u016B': 'u', '\u1E7B': 'u', '\u016D': 'u', '\u00FC': 'u', '\u01DC': 'u', '\u01D8': 'u', '\u01D6': 'u', '\u01DA': 'u', '\u1EE7': 'u', '\u016F': 'u', '\u0171': 'u', '\u01D4': 'u', '\u0215': 'u', '\u0217': 'u', '\u01B0': 'u', '\u1EEB': 'u', '\u1EE9': 'u', '\u1EEF': 'u', '\u1EED': 'u', '\u1EF1': 'u', '\u1EE5': 'u', '\u1E73': 'u', '\u0173': 'u', '\u1E77': 'u', '\u1E75': 'u', '\u0289': 'u', '\u24E5': 'v', '\uFF56': 'v', '\u1E7D': 'v', '\u1E7F': 'v', '\u028B': 'v', '\uA75F': 'v', '\u028C': 'v', '\uA761': 'vy', '\u24E6': 'w', '\uFF57': 'w', '\u1E81': 'w', '\u1E83': 'w', '\u0175': 'w', '\u1E87': 'w', '\u1E85': 'w', '\u1E98': 'w', '\u1E89': 'w', '\u2C73': 'w', '\u24E7': 'x', '\uFF58': 'x', '\u1E8B': 'x', '\u1E8D': 'x', '\u24E8': 'y', '\uFF59': 'y', '\u1EF3': 'y', '\u00FD': 'y', '\u0177': 'y', '\u1EF9': 'y', '\u0233': 'y', '\u1E8F': 'y', '\u00FF': 'y', '\u1EF7': 'y', '\u1E99': 'y', '\u1EF5': 'y', '\u01B4': 'y', '\u024F': 'y', '\u1EFF': 'y', '\u24E9': 'z', '\uFF5A': 'z', '\u017A': 'z', '\u1E91': 'z', '\u017C': 'z', '\u017E': 'z', '\u1E93': 'z', '\u1E95': 'z', '\u01B6': 'z', '\u0225': 'z', '\u0240': 'z', '\u2C6C': 'z', '\uA763': 'z', '\u0386': '\u0391', '\u0388': '\u0395', '\u0389': '\u0397', '\u038A': '\u0399', '\u03AA': '\u0399', '\u038C': '\u039F', '\u038E': '\u03A5', '\u03AB': '\u03A5', '\u038F': '\u03A9', '\u03AC': '\u03B1', '\u03AD': '\u03B5', '\u03AE': '\u03B7', '\u03AF': '\u03B9', '\u03CA': '\u03B9', '\u0390': '\u03B9', '\u03CC': '\u03BF', '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', '\u03C9': '\u03C9', '\u03C2': '\u03C3' }; return diacritics; }); S2.define('select2/data/base',[ '../utils' ], function (Utils) { function BaseAdapter ($element, options) { BaseAdapter.__super__.constructor.call(this); } Utils.Extend(BaseAdapter, Utils.Observable); BaseAdapter.prototype.current = function (callback) { throw new Error('The `current` method must be defined in child classes.'); }; BaseAdapter.prototype.query = function (params, callback) { throw new Error('The `query` method must be defined in child classes.'); }; BaseAdapter.prototype.bind = function (container, $container) { // Can be implemented in subclasses }; BaseAdapter.prototype.destroy = function () { // Can be implemented in subclasses }; BaseAdapter.prototype.generateResultId = function (container, data) { var id = container.id + '-result-'; id += Utils.generateChars(4); if (data.id != null) { id += '-' + data.id.toString(); } else { id += '-' + Utils.generateChars(4); } return id; }; return BaseAdapter; }); S2.define('select2/data/select',[ './base', '../utils', 'jquery' ], function (BaseAdapter, Utils, $) { function SelectAdapter ($element, options) { this.$element = $element; this.options = options; SelectAdapter.__super__.constructor.call(this); } Utils.Extend(SelectAdapter, BaseAdapter); SelectAdapter.prototype.current = function (callback) { var data = []; var self = this; this.$element.find(':selected').each(function () { var $option = $(this); var option = self.item($option); data.push(option); }); callback(data); }; SelectAdapter.prototype.select = function (data) { var self = this; data.selected = true; // If data.element is a DOM node, use it instead if ($(data.element).is('option')) { data.element.selected = true; this.$element.trigger('change'); return; } if (this.$element.prop('multiple')) { this.current(function (currentData) { var val = []; data = [data]; data.push.apply(data, currentData); for (var d = 0; d < data.length; d++) { var id = data[d].id; if ($.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); } else { var val = data.id; this.$element.val(val); this.$element.trigger('change'); } }; SelectAdapter.prototype.unselect = function (data) { var self = this; if (!this.$element.prop('multiple')) { return; } data.selected = false; if ($(data.element).is('option')) { data.element.selected = false; this.$element.trigger('change'); return; } this.current(function (currentData) { var val = []; for (var d = 0; d < currentData.length; d++) { var id = currentData[d].id; if (id !== data.id && $.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); }; SelectAdapter.prototype.bind = function (container, $container) { var self = this; this.container = container; container.on('select', function (params) { self.select(params.data); }); container.on('unselect', function (params) { self.unselect(params.data); }); }; SelectAdapter.prototype.destroy = function () { // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 $.removeData(this, 'data'); }); }; SelectAdapter.prototype.query = function (params, callback) { var data = []; var self = this; var $options = this.$element.children(); $options.each(function () { var $option = $(this); if (!$option.is('option') && !$option.is('optgroup')) { return; } var option = self.item($option); var matches = self.matches(params, option); if (matches !== null) { data.push(matches); } }); callback({ results: data }); }; SelectAdapter.prototype.addOptions = function ($options) { Utils.appendMany(this.$element, $options); }; SelectAdapter.prototype.option = function (data) { var option; if (data.children) { option = document.createElement('optgroup'); option.label = data.text; } else { option = document.createElement('option'); if (option.textContent !== undefined) { option.textContent = data.text; } else { option.innerText = data.text; } } if (data.id) { option.value = data.id; } if (data.disabled) { option.disabled = true; } if (data.selected) { option.selected = true; } if (data.title) { option.title = data.title; } var $option = $(option); var normalizedData = this._normalizeItem(data); normalizedData.element = option; // Override the option's data with the combined data $.data(option, 'data', normalizedData); return $option; }; SelectAdapter.prototype.item = function ($option) { var data = {}; data = $.data($option[0], 'data'); if (data != null) { return data; } if ($option.is('option')) { data = { id: $option.val(), text: $option.text(), disabled: $option.prop('disabled'), selected: $option.prop('selected'), title: $option.prop('title') }; } else if ($option.is('optgroup')) { data = { text: $option.prop('label'), children: [], title: $option.prop('title') }; var $children = $option.children('option'); var children = []; for (var c = 0; c < $children.length; c++) { var $child = $($children[c]); var child = this.item($child); children.push(child); } data.children = children; } data = this._normalizeItem(data); data.element = $option[0]; $.data($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { if (!$.isPlainObject(item)) { item = { id: item, text: item }; } item = $.extend({}, { text: '' }, item); var defaults = { selected: false, disabled: false }; if (item.id != null) { item.id = item.id.toString(); } if (item.text != null) { item.text = item.text.toString(); } if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } return $.extend({}, defaults, item); }; SelectAdapter.prototype.matches = function (params, data) { var matcher = this.options.get('matcher'); return matcher(params, data); }; return SelectAdapter; }); S2.define('select2/data/array',[ './select', '../utils', 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { var data = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); this.addOptions(this.convertToOptions(data)); } Utils.Extend(ArrayAdapter, SelectAdapter); ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); }); if ($option.length === 0) { $option = this.option(data); this.addOptions($option); } ArrayAdapter.__super__.select.call(this, data); }; ArrayAdapter.prototype.convertToOptions = function (data) { var self = this; var $existing = this.$element.find('option'); var existingIds = $existing.map(function () { return self.item($(this)).id; }).get(); var $options = []; // Filter out all items except for the one passed in the argument function onlyItem (item) { return function () { return $(this).val() == item.id; }; } for (var d = 0; d < data.length; d++) { var item = this._normalizeItem(data[d]); // Skip items which were pre-loaded, only merge the data if ($.inArray(item.id, existingIds) >= 0) { var $existingOption = $existing.filter(onlyItem(item)); var existingData = this.item($existingOption); var newData = $.extend(true, {}, item, existingData); var $newOption = this.option(newData); $existingOption.replaceWith($newOption); continue; } var $option = this.option(item); if (item.children) { var $children = this.convertToOptions(item.children); Utils.appendMany($option, $children); } $options.push($option); } return $options; }; return ArrayAdapter; }); S2.define('select2/data/ajax',[ './array', '../utils', 'jquery' ], function (ArrayAdapter, Utils, $) { function AjaxAdapter ($element, options) { this.ajaxOptions = this._applyDefaults(options.get('ajax')); if (this.ajaxOptions.processResults != null) { this.processResults = this.ajaxOptions.processResults; } AjaxAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(AjaxAdapter, ArrayAdapter); AjaxAdapter.prototype._applyDefaults = function (options) { var defaults = { data: function (params) { return $.extend({}, params, { q: params.term }); }, transport: function (params, success, failure) { var $request = $.ajax(params); $request.then(success); $request.fail(failure); return $request; } }; return $.extend({}, defaults, options, true); }; AjaxAdapter.prototype.processResults = function (results) { return results; }; AjaxAdapter.prototype.query = function (params, callback) { var matches = []; var self = this; if (this._request != null) { // JSONP requests cannot always be aborted if ($.isFunction(this._request.abort)) { this._request.abort(); } this._request = null; } var options = $.extend({ type: 'GET' }, this.ajaxOptions); if (typeof options.url === 'function') { options.url = options.url.call(this.$element, params); } if (typeof options.data === 'function') { options.data = options.data.call(this.$element, params); } function request () { var $request = options.transport(options, function (data) { var results = self.processResults(data, params); if (self.options.get('debug') && window.console && console.error) { // Check to make sure that the response included a `results` key. if (!results || !results.results || !$.isArray(results.results)) { console.error( 'Select2: The AJAX results did not return an array in the ' + '`results` key of the response.' ); } } callback(results); }, function () { self.trigger('results:message', { message: 'errorLoading' }); }); self._request = $request; } if (this.ajaxOptions.delay && params.term !== '') { if (this._queryTimeout) { window.clearTimeout(this._queryTimeout); } this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); } else { request(); } }; return AjaxAdapter; }); S2.define('select2/data/tags',[ 'jquery' ], function ($) { function Tags (decorated, $element, options) { var tags = options.get('tags'); var createTag = options.get('createTag'); if (createTag !== undefined) { this.createTag = createTag; } var insertTag = options.get('insertTag'); if (insertTag !== undefined) { this.insertTag = insertTag; } decorated.call(this, $element, options); if ($.isArray(tags)) { for (var t = 0; t < tags.length; t++) { var tag = tags[t]; var item = this._normalizeItem(tag); var $option = this.option(item); this.$element.append($option); } } } Tags.prototype.query = function (decorated, params, callback) { var self = this; this._removeOldTags(); if (params.term == null || params.page != null) { decorated.call(this, params, callback); return; } function wrapper (obj, child) { var data = obj.results; for (var i = 0; i < data.length; i++) { var option = data[i]; var checkChildren = ( option.children != null && !wrapper({ results: option.children }, true) ); var checkText = option.text === params.term; if (checkText || checkChildren) { if (child) { return false; } obj.data = data; callback(obj); return; } } if (child) { return true; } var tag = self.createTag(params); if (tag != null) { var $option = self.option(tag); $option.attr('data-select2-tag', true); self.addOptions([$option]); self.insertTag(data, tag); } obj.results = data; callback(obj); } decorated.call(this, params, wrapper); }; Tags.prototype.createTag = function (decorated, params) { var term = $.trim(params.term); if (term === '') { return null; } return { id: term, text: term }; }; Tags.prototype.insertTag = function (_, data, tag) { data.unshift(tag); }; Tags.prototype._removeOldTags = function (_) { var tag = this._lastTag; var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { if (this.selected) { return; } $(this).remove(); }); }; return Tags; }); S2.define('select2/data/tokenizer',[ 'jquery' ], function ($) { function Tokenizer (decorated, $element, options) { var tokenizer = options.get('tokenizer'); if (tokenizer !== undefined) { this.tokenizer = tokenizer; } decorated.call(this, $element, options); } Tokenizer.prototype.bind = function (decorated, container, $container) { decorated.call(this, container, $container); this.$search = container.dropdown.$search || container.selection.$search || $container.find('.select2-search__field'); }; Tokenizer.prototype.query = function (decorated, params, callback) { var self = this; function select (data) { self.trigger('select', { data: data }); } params.term = params.term || ''; var tokenData = this.tokenizer(params, this.options, select); if (tokenData.term !== params.term) { // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); this.$search.focus(); } params.term = tokenData.term; } decorated.call(this, params, callback); }; Tokenizer.prototype.tokenizer = function (_, params, options, callback) { var separators = options.get('tokenSeparators') || []; var term = params.term; var i = 0; var createTag = this.createTag || function (params) { return { id: params.term, text: params.term }; }; while (i < term.length) { var termChar = term[i]; if ($.inArray(termChar, separators) === -1) { i++; continue; } var part = term.substr(0, i); var partParams = $.extend({}, params, { term: part }); var data = createTag(partParams); if (data == null) { i++; continue; } callback(data); // Reset the term to not include the tokenized portion term = term.substr(i + 1) || ''; i = 0; } return { term: term }; }; return Tokenizer; }); S2.define('select2/data/minimumInputLength',[ ], function () { function MinimumInputLength (decorated, $e, options) { this.minimumInputLength = options.get('minimumInputLength'); decorated.call(this, $e, options); } MinimumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (params.term.length < this.minimumInputLength) { this.trigger('results:message', { message: 'inputTooShort', args: { minimum: this.minimumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MinimumInputLength; }); S2.define('select2/data/maximumInputLength',[ ], function () { function MaximumInputLength (decorated, $e, options) { this.maximumInputLength = options.get('maximumInputLength'); decorated.call(this, $e, options); } MaximumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) { this.trigger('results:message', { message: 'inputTooLong', args: { maximum: this.maximumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MaximumInputLength; }); S2.define('select2/data/maximumSelectionLength',[ ], function (){ function MaximumSelectionLength (decorated, $e, options) { this.maximumSelectionLength = options.get('maximumSelectionLength'); decorated.call(this, $e, options); } MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) { self.trigger('results:message', { message: 'maximumSelected', args: { maximum: self.maximumSelectionLength } }); return; } decorated.call(self, params, callback); }); }; return MaximumSelectionLength; }); S2.define('select2/dropdown',[ 'jquery', './utils' ], function ($, Utils) { function Dropdown ($element, options) { this.$element = $element; this.options = options; Dropdown.__super__.constructor.call(this); } Utils.Extend(Dropdown, Utils.Observable); Dropdown.prototype.render = function () { var $dropdown = $( '' + '' + '' ); $dropdown.attr('dir', this.options.get('dir')); this.$dropdown = $dropdown; return $dropdown; }; Dropdown.prototype.bind = function () { // Should be implemented in subclasses }; Dropdown.prototype.position = function ($dropdown, $container) { // Should be implmented in subclasses }; Dropdown.prototype.destroy = function () { // Remove the dropdown from the DOM this.$dropdown.remove(); }; return Dropdown; }); S2.define('select2/dropdown/search',[ 'jquery', '../utils' ], function ($, Utils) { function Search () { } Search.prototype.render = function (decorated) { var $rendered = decorated.call(this); var $search = $( '' + '' + '' ); this.$searchContainer = $search; this.$search = $search.find('input'); $rendered.prepend($search); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); }); // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$search.on('input', function (evt) { // Unbind the duplicated `keyup` event $(this).off('keyup'); }); this.$search.on('keyup input', function (evt) { self.handleSearch(evt); }); container.on('open', function () { self.$search.attr('tabindex', 0); self.$search.focus(); window.setTimeout(function () { self.$search.focus(); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); self.$search.val(''); }); container.on('results:all', function (params) { if (params.query.term == null || params.query.term === '') { var showSearch = self.showSearch(params); if (showSearch) { self.$searchContainer.removeClass('select2-search--hide'); } else { self.$searchContainer.addClass('select2-search--hide'); } } }); }; Search.prototype.handleSearch = function (evt) { if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.showSearch = function (_, params) { return true; }; return Search; }); S2.define('select2/dropdown/hidePlaceholder',[ ], function () { function HidePlaceholder (decorated, $element, options, dataAdapter) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options, dataAdapter); } HidePlaceholder.prototype.append = function (decorated, data) { data.results = this.removePlaceholder(data.results); decorated.call(this, data); }; HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; HidePlaceholder.prototype.removePlaceholder = function (_, data) { var modifiedData = data.slice(0); for (var d = data.length - 1; d >= 0; d--) { var item = data[d]; if (this.placeholder.id === item.id) { modifiedData.splice(d, 1); } } return modifiedData; }; return HidePlaceholder; }); S2.define('select2/dropdown/infiniteScroll',[ 'jquery' ], function ($) { function InfiniteScroll (decorated, $element, options, dataAdapter) { this.lastParams = {}; decorated.call(this, $element, options, dataAdapter); this.$loadingMore = this.createLoadingMore(); this.loading = false; } InfiniteScroll.prototype.append = function (decorated, data) { this.$loadingMore.remove(); this.loading = false; decorated.call(this, data); if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); } }; InfiniteScroll.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('query', function (params) { self.lastParams = params; self.loading = true; }); container.on('query:append', function (params) { self.lastParams = params; self.loading = true; }); this.$results.on('scroll', function () { var isLoadMoreVisible = $.contains( document.documentElement, self.$loadingMore[0] ); if (self.loading || !isLoadMoreVisible) { return; } var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var loadingMoreOffset = self.$loadingMore.offset().top + self.$loadingMore.outerHeight(false); if (currentOffset + 50 >= loadingMoreOffset) { self.loadMore(); } }); }; InfiniteScroll.prototype.loadMore = function () { this.loading = true; var params = $.extend({}, {page: 1}, this.lastParams); params.page++; this.trigger('query:append', params); }; InfiniteScroll.prototype.showLoadingMore = function (_, data) { return data.pagination && data.pagination.more; }; InfiniteScroll.prototype.createLoadingMore = function () { var $option = $( '
      • ' ); var message = this.options.get('translations').get('loadingMore'); $option.html(message(this.lastParams)); return $option; }; return InfiniteScroll; }); S2.define('select2/dropdown/attachBody',[ 'jquery', '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { this.$dropdownParent = options.get('dropdownParent') || $(document.body); decorated.call(this, $element, options); } AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; var setupResultsEvents = false; decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); if (!setupResultsEvents) { setupResultsEvents = true; container.on('results:all', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:append', function () { self._positionDropdown(); self._resizeDropdown(); }); } }); container.on('close', function () { self._hideDropdown(); self._detachPositioningHandler(container); }); this.$dropdownContainer.on('mousedown', function (evt) { evt.stopPropagation(); }); }; AttachBody.prototype.destroy = function (decorated) { decorated.call(this); this.$dropdownContainer.remove(); }; AttachBody.prototype.position = function (decorated, $dropdown, $container) { // Clone all of the container classes $dropdown.attr('class', $container.attr('class')); $dropdown.removeClass('select2'); $dropdown.addClass('select2-container--open'); $dropdown.css({ position: 'absolute', top: -999999 }); this.$container = $container; }; AttachBody.prototype.render = function (decorated) { var $container = $(''); var $dropdown = decorated.call(this); $container.append($dropdown); this.$dropdownContainer = $container; return $container; }; AttachBody.prototype._hideDropdown = function (decorated) { this.$dropdownContainer.detach(); }; AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { $(this).data('select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { var position = $(this).data('select2-scroll-position'); $(this).scrollTop(position.y); }); $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, function (e) { self._positionDropdown(); self._resizeDropdown(); }); }; AttachBody.prototype._detachPositioningHandler = function (decorated, container) { var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.off(scrollEvent); $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); }; AttachBody.prototype._positionDropdown = function () { var $window = $(window); var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); var newDirection = null; var offset = this.$container.offset(); offset.bottom = offset.top + this.$container.outerHeight(false); var container = { height: this.$container.outerHeight(false) }; container.top = offset.top; container.bottom = offset.top + container.height; var dropdown = { height: this.$dropdown.outerHeight(false) }; var viewport = { top: $window.scrollTop(), bottom: $window.scrollTop() + $window.height() }; var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); var css = { left: offset.left, top: container.bottom }; // Determine what the parent element is to use for calciulating the offset var $offsetParent = this.$dropdownParent; // For statically positoned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } var parentOffset = $offsetParent.offset(); css.top -= parentOffset.top; css.left -= parentOffset.left; if (!isCurrentlyAbove && !isCurrentlyBelow) { newDirection = 'below'; } if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { newDirection = 'above'; } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { newDirection = 'below'; } if (newDirection == 'above' || (isCurrentlyAbove && newDirection !== 'below')) { css.top = container.top - dropdown.height; } if (newDirection != null) { this.$dropdown .removeClass('select2-dropdown--below select2-dropdown--above') .addClass('select2-dropdown--' + newDirection); this.$container .removeClass('select2-container--below select2-container--above') .addClass('select2-container--' + newDirection); } this.$dropdownContainer.css(css); }; AttachBody.prototype._resizeDropdown = function () { var css = { width: this.$container.outerWidth(false) + 'px' }; if (this.options.get('dropdownAutoWidth')) { css.minWidth = css.width; css.width = 'auto'; } this.$dropdown.css(css); }; AttachBody.prototype._showDropdown = function (decorated) { this.$dropdownContainer.appendTo(this.$dropdownParent); this._positionDropdown(); this._resizeDropdown(); }; return AttachBody; }); S2.define('select2/dropdown/minimumResultsForSearch',[ ], function () { function countResults (data) { var count = 0; for (var d = 0; d < data.length; d++) { var item = data[d]; if (item.children) { count += countResults(item.children); } else { count++; } } return count; } function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { this.minimumResultsForSearch = options.get('minimumResultsForSearch'); if (this.minimumResultsForSearch < 0) { this.minimumResultsForSearch = Infinity; } decorated.call(this, $element, options, dataAdapter); } MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { if (countResults(params.data.results) < this.minimumResultsForSearch) { return false; } return decorated.call(this, params); }; return MinimumResultsForSearch; }); S2.define('select2/dropdown/selectOnClose',[ ], function () { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('close', function () { self._handleSelectOnClose(); }); }; SelectOnClose.prototype._handleSelectOnClose = function () { var $highlightedResults = this.getHighlightedResults(); // Only select highlighted results if ($highlightedResults.length < 1) { return; } var data = $highlightedResults.data('data'); // Don't re-select already selected resulte if ( (data.element != null && data.element.selected) || (data.element == null && data.selected) ) { return; } this.trigger('select', { data: data }); }; return SelectOnClose; }); S2.define('select2/dropdown/closeOnSelect',[ ], function () { function CloseOnSelect () { } CloseOnSelect.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function (evt) { self._selectTriggered(evt); }); container.on('unselect', function (evt) { self._selectTriggered(evt); }); }; CloseOnSelect.prototype._selectTriggered = function (_, evt) { var originalEvent = evt.originalEvent; // Don't close if the control key is being held if (originalEvent && originalEvent.ctrlKey) { return; } this.trigger('close', {}); }; return CloseOnSelect; }); S2.define('select2/i18n/en',[],function () { // English return { errorLoading: function () { return 'The results could not be loaded.'; }, inputTooLong: function (args) { var overChars = args.input.length - args.maximum; var message = 'Please delete ' + overChars + ' character'; if (overChars != 1) { message += 's'; } return message; }, inputTooShort: function (args) { var remainingChars = args.minimum - args.input.length; var message = 'Please enter ' + remainingChars + ' or more characters'; return message; }, loadingMore: function () { return 'Loading more results…'; }, maximumSelected: function (args) { var message = 'You can only select ' + args.maximum + ' item'; if (args.maximum != 1) { message += 's'; } return message; }, noResults: function () { return 'No results found'; }, searching: function () { return 'Searching…'; } }; }); S2.define('select2/defaults',[ 'jquery', 'require', './results', './selection/single', './selection/multiple', './selection/placeholder', './selection/allowClear', './selection/search', './selection/eventRelay', './utils', './translation', './diacritics', './data/select', './data/array', './data/ajax', './data/tags', './data/tokenizer', './data/minimumInputLength', './data/maximumInputLength', './data/maximumSelectionLength', './dropdown', './dropdown/search', './dropdown/hidePlaceholder', './dropdown/infiniteScroll', './dropdown/attachBody', './dropdown/minimumResultsForSearch', './dropdown/selectOnClose', './dropdown/closeOnSelect', './i18n/en' ], function ($, require, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, EnglishTranslation) { function Defaults () { this.reset(); } Defaults.prototype.apply = function (options) { options = $.extend(true, {}, this.defaults, options); if (options.dataAdapter == null) { if (options.ajax != null) { options.dataAdapter = AjaxData; } else if (options.data != null) { options.dataAdapter = ArrayData; } else { options.dataAdapter = SelectData; } if (options.minimumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MinimumInputLength ); } if (options.maximumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumInputLength ); } if (options.maximumSelectionLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumSelectionLength ); } if (options.tags) { options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); } if (options.tokenSeparators != null || options.tokenizer != null) { options.dataAdapter = Utils.Decorate( options.dataAdapter, Tokenizer ); } if (options.query != null) { var Query = require(options.amdBase + 'compat/query'); options.dataAdapter = Utils.Decorate( options.dataAdapter, Query ); } if (options.initSelection != null) { var InitSelection = require(options.amdBase + 'compat/initSelection'); options.dataAdapter = Utils.Decorate( options.dataAdapter, InitSelection ); } } if (options.resultsAdapter == null) { options.resultsAdapter = ResultsList; if (options.ajax != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, InfiniteScroll ); } if (options.placeholder != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, HidePlaceholder ); } if (options.selectOnClose) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, SelectOnClose ); } } if (options.dropdownAdapter == null) { if (options.multiple) { options.dropdownAdapter = Dropdown; } else { var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); options.dropdownAdapter = SearchableDropdown; } if (options.minimumResultsForSearch !== 0) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, MinimumResultsForSearch ); } if (options.closeOnSelect) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, CloseOnSelect ); } if ( options.dropdownCssClass != null || options.dropdownCss != null || options.adaptDropdownCssClass != null ) { var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, DropdownCSS ); } options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, AttachBody ); } if (options.selectionAdapter == null) { if (options.multiple) { options.selectionAdapter = MultipleSelection; } else { options.selectionAdapter = SingleSelection; } // Add the placeholder mixin if a placeholder was specified if (options.placeholder != null) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, Placeholder ); } if (options.allowClear) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, AllowClear ); } if (options.multiple) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, SelectionSearch ); } if ( options.containerCssClass != null || options.containerCss != null || options.adaptContainerCssClass != null ) { var ContainerCSS = require(options.amdBase + 'compat/containerCss'); options.selectionAdapter = Utils.Decorate( options.selectionAdapter, ContainerCSS ); } options.selectionAdapter = Utils.Decorate( options.selectionAdapter, EventRelay ); } if (typeof options.language === 'string') { // Check if the language is specified with a region if (options.language.indexOf('-') > 0) { // Extract the region information if it is included var languageParts = options.language.split('-'); var baseLanguage = languageParts[0]; options.language = [options.language, baseLanguage]; } else { options.language = [options.language]; } } if ($.isArray(options.language)) { var languages = new Translation(); options.language.push('en'); var languageNames = options.language; for (var l = 0; l < languageNames.length; l++) { var name = languageNames[l]; var language = {}; try { // Try to load it with the original name language = Translation.loadPath(name); } catch (e) { try { // If we couldn't load it, check if it wasn't the full path name = this.defaults.amdLanguageBase + name; language = Translation.loadPath(name); } catch (ex) { // The translation could not be loaded at all. Sometimes this is // because of a configuration problem, other times this can be // because of how Select2 helps load all possible translation files. if (options.debug && window.console && console.warn) { console.warn( 'Select2: The language file for "' + name + '" could not be ' + 'automatically loaded. A fallback will be used instead.' ); } continue; } } languages.extend(language); } options.translations = languages; } else { var baseTranslation = Translation.loadPath( this.defaults.amdLanguageBase + 'en' ); var customTranslation = new Translation(options.language); customTranslation.extend(baseTranslation); options.translations = customTranslation; } return options; }; Defaults.prototype.reset = function () { function stripDiacritics (text) { // Used 'uni range + named function' from http://jsperf.com/diacritics/18 function match(a) { return DIACRITICS[a] || a; } return text.replace(/[^\u0000-\u007E]/g, match); } function matcher (params, data) { // Always return the object if there is nothing to compare if ($.trim(params.term) === '') { return data; } // Do a recursive check for options with children if (data.children && data.children.length > 0) { // Clone the data object if there are children // This is required as we modify the object to remove any non-matches var match = $.extend(true, {}, data); // Check each child of the option for (var c = data.children.length - 1; c >= 0; c--) { var child = data.children[c]; var matches = matcher(params, child); // If there wasn't a match, remove the object in the array if (matches == null) { match.children.splice(c, 1); } } // If any children matched, return the new object if (match.children.length > 0) { return match; } // If there were no matching children, check just the plain object return matcher(params, match); } var original = stripDiacritics(data.text).toUpperCase(); var term = stripDiacritics(params.term).toUpperCase(); // Check if the text contains the term if (original.indexOf(term) > -1) { return data; } // If it doesn't contain the term, don't return anything return null; } this.defaults = { amdBase: './', amdLanguageBase: './i18n/', closeOnSelect: true, debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, language: EnglishTranslation, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, sorter: function (data) { return data; }, templateResult: function (result) { return result.text; }, templateSelection: function (selection) { return selection.text; }, theme: 'default', width: 'resolve' }; }; Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); var data = {}; data[camelKey] = value; var convertedData = Utils._convertData(data); $.extend(this.defaults, convertedData); }; var defaults = new Defaults(); return defaults; }); S2.define('select2/options',[ 'require', 'jquery', './defaults', './utils' ], function (require, $, Defaults, Utils) { function Options (options, $element) { this.options = options; if ($element != null) { this.fromElement($element); } this.options = Defaults.apply(this.options); if ($element && $element.is('input')) { var InputCompat = require(this.get('amdBase') + 'compat/inputData'); this.options.dataAdapter = Utils.Decorate( this.options.dataAdapter, InputCompat ); } } Options.prototype.fromElement = function ($e) { var excludedData = ['select2']; if (this.options.multiple == null) { this.options.multiple = $e.prop('multiple'); } if (this.options.disabled == null) { this.options.disabled = $e.prop('disabled'); } if (this.options.language == null) { if ($e.prop('lang')) { this.options.language = $e.prop('lang').toLowerCase(); } else if ($e.closest('[lang]').prop('lang')) { this.options.language = $e.closest('[lang]').prop('lang'); } } if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); } else if ($e.closest('[dir]').prop('dir')) { this.options.dir = $e.closest('[dir]').prop('dir'); } else { this.options.dir = 'ltr'; } } $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); if ($e.data('select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + 'use the `data-data` and `data-tags="true"` attributes and will be ' + 'removed in future versions of Select2.' ); } $e.data('data', $e.data('select2Tags')); $e.data('tags', true); } if ($e.data('ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + '`data-ajax--url` and support for the old attribute will be removed' + ' in future versions of Select2.' ); } $e.attr('ajax--url', $e.data('ajaxUrl')); $e.data('ajax--url', $e.data('ajaxUrl')); } var dataset = {}; // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { dataset = $.extend(true, {}, $e[0].dataset, $e.data()); } else { dataset = $e.data(); } var data = $.extend(true, {}, dataset); data = Utils._convertData(data); for (var key in data) { if ($.inArray(key, excludedData) > -1) { continue; } if ($.isPlainObject(this.options[key])) { $.extend(this.options[key], data[key]); } else { this.options[key] = data[key]; } } return this; }; Options.prototype.get = function (key) { return this.options[key]; }; Options.prototype.set = function (key, val) { this.options[key] = val; }; return Options; }); S2.define('select2/core',[ 'jquery', './options', './utils', './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { if ($element.data('select2') != null) { $element.data('select2').destroy(); } this.$element = $element; this.id = this._generateId($element); options = options || {}; this.options = new Options(options, $element); Select2.__super__.constructor.call(this); // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; $element.data('old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters var DataAdapter = this.options.get('dataAdapter'); this.dataAdapter = new DataAdapter($element, this.options); var $container = this.render(); this._placeContainer($container); var SelectionAdapter = this.options.get('selectionAdapter'); this.selection = new SelectionAdapter($element, this.options); this.$selection = this.selection.render(); this.selection.position(this.$selection, $container); var DropdownAdapter = this.options.get('dropdownAdapter'); this.dropdown = new DropdownAdapter($element, this.options); this.$dropdown = this.dropdown.render(); this.dropdown.position(this.$dropdown, $container); var ResultsAdapter = this.options.get('resultsAdapter'); this.results = new ResultsAdapter($element, this.options, this.dataAdapter); this.$results = this.results.render(); this.results.position(this.$results, this.$dropdown); // Bind events var self = this; // Bind the container to all of the adapters this._bindAdapters(); // Register any DOM event handlers this._registerDomEvents(); // Register any internal event handlers this._registerDataEvents(); this._registerSelectionEvents(); this._registerDropdownEvents(); this._registerResultsEvents(); this._registerEvents(); // Set the initial state this.dataAdapter.current(function (initialData) { self.trigger('selection:update', { data: initialData }); }); // Hide the original select $element.addClass('select2-hidden-accessible'); $element.attr('aria-hidden', 'true'); // Synchronize any monitored attributes this._syncAttributes(); $element.data('select2', this); }; Utils.Extend(Select2, Utils.Observable); Select2.prototype._generateId = function ($element) { var id = ''; if ($element.attr('id') != null) { id = $element.attr('id'); } else if ($element.attr('name') != null) { id = $element.attr('name') + '-' + Utils.generateChars(2); } else { id = Utils.generateChars(4); } id = id.replace(/(:|\.|\[|\]|,)/g, ''); id = 'select2-' + id; return id; }; Select2.prototype._placeContainer = function ($container) { $container.insertAfter(this.$element); var width = this._resolveWidth(this.$element, this.options.get('width')); if (width != null) { $container.css('width', width); } }; Select2.prototype._resolveWidth = function ($element, method) { var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; if (method == 'resolve') { var styleWidth = this._resolveWidth($element, 'style'); if (styleWidth != null) { return styleWidth; } return this._resolveWidth($element, 'element'); } if (method == 'element') { var elementWidth = $element.outerWidth(false); if (elementWidth <= 0) { return 'auto'; } return elementWidth + 'px'; } if (method == 'style') { var style = $element.attr('style'); if (typeof(style) !== 'string') { return null; } var attrs = style.split(';'); for (var i = 0, l = attrs.length; i < l; i = i + 1) { var attr = attrs[i].replace(/\s/g, ''); var matches = attr.match(WIDTH); if (matches !== null && matches.length >= 1) { return matches[1]; } } return null; } return method; }; Select2.prototype._bindAdapters = function () { this.dataAdapter.bind(this, this.$container); this.selection.bind(this, this.$container); this.dropdown.bind(this, this.$container); this.results.bind(this, this.$container); }; Select2.prototype._registerDomEvents = function () { var self = this; this.$element.on('change.select2', function () { self.dataAdapter.current(function (data) { self.trigger('selection:update', { data: data }); }); }); this._sync = Utils.bind(this._syncAttributes, this); if (this.$element[0].attachEvent) { this.$element[0].attachEvent('onpropertychange', this._sync); } var observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver ; if (observer != null) { this._observer = new observer(function (mutations) { $.each(mutations, self._sync); }); this._observer.observe(this.$element[0], { attributes: true, subtree: false }); } else if (this.$element[0].addEventListener) { this.$element[0].addEventListener('DOMAttrModified', self._sync, false); } }; Select2.prototype._registerDataEvents = function () { var self = this; this.dataAdapter.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerSelectionEvents = function () { var self = this; var nonRelayEvents = ['toggle', 'focus']; this.selection.on('toggle', function () { self.toggleDropdown(); }); this.selection.on('focus', function (params) { self.focus(params); }); this.selection.on('*', function (name, params) { if ($.inArray(name, nonRelayEvents) !== -1) { return; } self.trigger(name, params); }); }; Select2.prototype._registerDropdownEvents = function () { var self = this; this.dropdown.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerResultsEvents = function () { var self = this; this.results.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerEvents = function () { var self = this; this.on('open', function () { self.$container.addClass('select2-container--open'); }); this.on('close', function () { self.$container.removeClass('select2-container--open'); }); this.on('enable', function () { self.$container.removeClass('select2-container--disabled'); }); this.on('disable', function () { self.$container.addClass('select2-container--disabled'); }); this.on('blur', function () { self.$container.removeClass('select2-container--focus'); }); this.on('query', function (params) { if (!self.isOpen()) { self.trigger('open', {}); } this.dataAdapter.query(params, function (data) { self.trigger('results:all', { data: data, query: params }); }); }); this.on('query:append', function (params) { this.dataAdapter.query(params, function (data) { self.trigger('results:append', { data: data, query: params }); }); }); this.on('keypress', function (evt) { var key = evt.which; if (self.isOpen()) { if (key === KEYS.ESC || key === KEYS.TAB || (key === KEYS.UP && evt.altKey)) { self.close(); evt.preventDefault(); } else if (key === KEYS.ENTER) { self.trigger('results:select', {}); evt.preventDefault(); } else if ((key === KEYS.SPACE && evt.ctrlKey)) { self.trigger('results:toggle', {}); evt.preventDefault(); } else if (key === KEYS.UP) { self.trigger('results:previous', {}); evt.preventDefault(); } else if (key === KEYS.DOWN) { self.trigger('results:next', {}); evt.preventDefault(); } } else { if (key === KEYS.ENTER || key === KEYS.SPACE || (key === KEYS.DOWN && evt.altKey)) { self.open(); evt.preventDefault(); } } }); }; Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); if (this.options.get('disabled')) { if (this.isOpen()) { this.close(); } this.trigger('disable', {}); } else { this.trigger('enable', {}); } }; /** * Override the trigger method to automatically trigger pre-events when * there are events that can be prevented. */ Select2.prototype.trigger = function (name, args) { var actualTrigger = Select2.__super__.trigger; var preTriggerMap = { 'open': 'opening', 'close': 'closing', 'select': 'selecting', 'unselect': 'unselecting' }; if (args === undefined) { args = {}; } if (name in preTriggerMap) { var preTriggerName = preTriggerMap[name]; var preTriggerArgs = { prevented: false, name: name, args: args }; actualTrigger.call(this, preTriggerName, preTriggerArgs); if (preTriggerArgs.prevented) { args.prevented = true; return; } } actualTrigger.call(this, name, args); }; Select2.prototype.toggleDropdown = function () { if (this.options.get('disabled')) { return; } if (this.isOpen()) { this.close(); } else { this.open(); } }; Select2.prototype.open = function () { if (this.isOpen()) { return; } this.trigger('query', {}); }; Select2.prototype.close = function () { if (!this.isOpen()) { return; } this.trigger('close', {}); }; Select2.prototype.isOpen = function () { return this.$container.hasClass('select2-container--open'); }; Select2.prototype.hasFocus = function () { return this.$container.hasClass('select2-container--focus'); }; Select2.prototype.focus = function (data) { // No need to re-trigger focus events if we are already focused if (this.hasFocus()) { return; } this.$container.addClass('select2-container--focus'); this.trigger('focus', {}); }; Select2.prototype.enable = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("enable")` method has been deprecated and will' + ' be removed in later Select2 versions. Use $element.prop("disabled")' + ' instead.' ); } if (args == null || args.length === 0) { args = [true]; } var disabled = !args[0]; this.$element.prop('disabled', disabled); }; Select2.prototype.data = function () { if (this.options.get('debug') && arguments.length > 0 && window.console && console.warn) { console.warn( 'Select2: Data can no longer be set using `select2("data")`. You ' + 'should consider setting the value instead using `$element.val()`.' ); } var data = []; this.dataAdapter.current(function (currentData) { data = currentData; }); return data; }; Select2.prototype.val = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("val")` method has been deprecated and will be' + ' removed in later Select2 versions. Use $element.val() instead.' ); } if (args == null || args.length === 0) { return this.$element.val(); } var newVal = args[0]; if ($.isArray(newVal)) { newVal = $.map(newVal, function (obj) { return obj.toString(); }); } this.$element.val(newVal).trigger('change'); }; Select2.prototype.destroy = function () { this.$container.remove(); if (this.$element[0].detachEvent) { this.$element[0].detachEvent('onpropertychange', this._sync); } if (this._observer != null) { this._observer.disconnect(); this._observer = null; } else if (this.$element[0].removeEventListener) { this.$element[0] .removeEventListener('DOMAttrModified', this._sync, false); } this._sync = null; this.$element.off('.select2'); this.$element.attr('tabindex', this.$element.data('old-tabindex')); this.$element.removeClass('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); this.$element.removeData('select2'); this.dataAdapter.destroy(); this.selection.destroy(); this.dropdown.destroy(); this.results.destroy(); this.dataAdapter = null; this.selection = null; this.dropdown = null; this.results = null; }; Select2.prototype.render = function () { var $container = $( '' + '' + '' + '' ); $container.attr('dir', this.options.get('dir')); this.$container = $container; this.$container.addClass('select2-container--' + this.options.get('theme')); $container.data('element', this.$element); return $container; }; return Select2; }); S2.define('select2/compat/utils',[ 'jquery' ], function ($) { function syncCssClasses ($dest, $src, adapter) { var classes, replacements = [], adapted; classes = $.trim($dest.attr('class')); if (classes) { classes = '' + classes; // for IE which returns object $(classes.split(/\s+/)).each(function () { // Save all Select2 classes if (this.indexOf('select2-') === 0) { replacements.push(this); } }); } classes = $.trim($src.attr('class')); if (classes) { classes = '' + classes; // for IE which returns object $(classes.split(/\s+/)).each(function () { // Only adapt non-Select2 classes if (this.indexOf('select2-') !== 0) { adapted = adapter(this); if (adapted != null) { replacements.push(adapted); } } }); } $dest.attr('class', replacements.join(' ')); } return { syncCssClasses: syncCssClasses }; }); S2.define('select2/compat/containerCss',[ 'jquery', './utils' ], function ($, CompatUtils) { // No-op CSS adapter that discards all classes by default function _containerAdapter (clazz) { return null; } function ContainerCSS () { } ContainerCSS.prototype.render = function (decorated) { var $container = decorated.call(this); var containerCssClass = this.options.get('containerCssClass') || ''; if ($.isFunction(containerCssClass)) { containerCssClass = containerCssClass(this.$element); } var containerCssAdapter = this.options.get('adaptContainerCssClass'); containerCssAdapter = containerCssAdapter || _containerAdapter; if (containerCssClass.indexOf(':all:') !== -1) { containerCssClass = containerCssClass.replace(':all:', ''); var _cssAdapter = containerCssAdapter; containerCssAdapter = function (clazz) { var adapted = _cssAdapter(clazz); if (adapted != null) { // Append the old one along with the adapted one return adapted + ' ' + clazz; } return clazz; }; } var containerCss = this.options.get('containerCss') || {}; if ($.isFunction(containerCss)) { containerCss = containerCss(this.$element); } CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter); $container.css(containerCss); $container.addClass(containerCssClass); return $container; }; return ContainerCSS; }); S2.define('select2/compat/dropdownCss',[ 'jquery', './utils' ], function ($, CompatUtils) { // No-op CSS adapter that discards all classes by default function _dropdownAdapter (clazz) { return null; } function DropdownCSS () { } DropdownCSS.prototype.render = function (decorated) { var $dropdown = decorated.call(this); var dropdownCssClass = this.options.get('dropdownCssClass') || ''; if ($.isFunction(dropdownCssClass)) { dropdownCssClass = dropdownCssClass(this.$element); } var dropdownCssAdapter = this.options.get('adaptDropdownCssClass'); dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter; if (dropdownCssClass.indexOf(':all:') !== -1) { dropdownCssClass = dropdownCssClass.replace(':all:', ''); var _cssAdapter = dropdownCssAdapter; dropdownCssAdapter = function (clazz) { var adapted = _cssAdapter(clazz); if (adapted != null) { // Append the old one along with the adapted one return adapted + ' ' + clazz; } return clazz; }; } var dropdownCss = this.options.get('dropdownCss') || {}; if ($.isFunction(dropdownCss)) { dropdownCss = dropdownCss(this.$element); } CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter); $dropdown.css(dropdownCss); $dropdown.addClass(dropdownCssClass); return $dropdown; }; return DropdownCSS; }); S2.define('select2/compat/initSelection',[ 'jquery' ], function ($) { function InitSelection (decorated, $element, options) { if (options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `initSelection` option has been deprecated in favor' + ' of a custom data adapter that overrides the `current` method. ' + 'This method is now called multiple times instead of a single ' + 'time when the instance is initialized. Support will be removed ' + 'for the `initSelection` option in future versions of Select2' ); } this.initSelection = options.get('initSelection'); this._isInitialized = false; decorated.call(this, $element, options); } InitSelection.prototype.current = function (decorated, callback) { var self = this; if (this._isInitialized) { decorated.call(this, callback); return; } this.initSelection.call(null, this.$element, function (data) { self._isInitialized = true; if (!$.isArray(data)) { data = [data]; } callback(data); }); }; return InitSelection; }); S2.define('select2/compat/inputData',[ 'jquery' ], function ($) { function InputData (decorated, $element, options) { this._currentData = []; this._valueSeparator = options.get('valueSeparator') || ','; if ($element.prop('type') === 'hidden') { if (options.get('debug') && console && console.warn) { console.warn( 'Select2: Using a hidden input with Select2 is no longer ' + 'supported and may stop working in the future. It is recommended ' + 'to use a `' + '' ); this.$searchContainer = $search; this.$search = $search.find('input'); var $rendered = decorated.call(this); this._transferTabIndex(); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('open', function () { self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); container.on('enable', function () { self.$search.prop('disabled', false); self._transferTabIndex(); }); container.on('disable', function () { self.$search.prop('disabled', true); }); container.on('focus', function (evt) { self.$search.trigger('focus'); }); container.on('results:focus', function (params) { self.$search.attr('aria-activedescendant', params.id); }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { self.trigger('focus', evt); }); this.$selection.on('focusout', '.select2-search--inline', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', '.select2-search--inline', function (evt) { evt.stopPropagation(); self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); var key = evt.which; if (key === KEYS.BACKSPACE && self.$search.val() === '') { var $previousChoice = self.$searchContainer .prev('.select2-selection__choice'); if ($previousChoice.length > 0) { var item = $previousChoice.data('data'); self.searchRemoveChoice(item); evt.preventDefault(); } } }); // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. // This property is not available in Edge, but Edge also doesn't have // this bug. var msie = document.documentMode; var disableInputEvents = msie && msie <= 11; // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$selection.on( 'input.searchcheck', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents) { self.$selection.off('input.search input.searchcheck'); return; } // Unbind the duplicated `keyup` event self.$selection.off('keyup.search'); } ); this.$selection.on( 'keyup.search input.search', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents && evt.type === 'input') { self.$selection.off('input.search input.searchcheck'); return; } var key = evt.which; // We can freely ignore events from modifier keys if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { return; } // Tabbing will be handled during the `keydown` phase if (key == KEYS.TAB) { return; } self.handleSearch(evt); } ); }; /** * This method will transfer the tabindex attribute from the rendered * selection to the search box. This allows for the search box to be used as * the primary focus instead of the selection container. * * @private */ Search.prototype._transferTabIndex = function (decorated) { this.$search.attr('tabindex', this.$selection.attr('tabindex')); this.$selection.attr('tabindex', '-1'); }; Search.prototype.createPlaceholder = function (decorated, placeholder) { this.$search.attr('placeholder', placeholder.text); }; Search.prototype.update = function (decorated, data) { var searchHadFocus = this.$search[0] == document.activeElement; this.$search.attr('placeholder', ''); decorated.call(this, data); this.$selection.find('.select2-selection__rendered') .append(this.$searchContainer); this.resizeSearch(); if (searchHadFocus) { this.$search.focus(); } }; Search.prototype.handleSearch = function () { this.resizeSearch(); if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(item.text); this.handleSearch(); }; Search.prototype.resizeSearch = function () { this.$search.css('width', '25px'); var width = ''; if (this.$search.attr('placeholder') !== '') { width = this.$selection.find('.select2-selection__rendered').innerWidth(); } else { var minimumWidth = this.$search.val().length + 1; width = (minimumWidth * 0.75) + 'em'; } this.$search.css('width', width); }; return Search; }); S2.define('select2/selection/eventRelay',[ 'jquery' ], function ($) { function EventRelay () { } EventRelay.prototype.bind = function (decorated, container, $container) { var self = this; var relayEvents = [ 'open', 'opening', 'close', 'closing', 'select', 'selecting', 'unselect', 'unselecting' ]; var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; decorated.call(this, container, $container); container.on('*', function (name, params) { // Ignore events that should not be relayed if ($.inArray(name, relayEvents) === -1) { return; } // The parameters should always be an object params = params || {}; // Generate the jQuery event for the Select2 event var evt = $.Event('select2:' + name, { params: params }); self.$element.trigger(evt); // Only handle preventable events if it was one if ($.inArray(name, preventableEvents) === -1) { return; } params.prevented = evt.isDefaultPrevented(); }); }; return EventRelay; }); S2.define('select2/translation',[ 'jquery', 'require' ], function ($, require) { function Translation (dict) { this.dict = dict || {}; } Translation.prototype.all = function () { return this.dict; }; Translation.prototype.get = function (key) { return this.dict[key]; }; Translation.prototype.extend = function (translation) { this.dict = $.extend({}, translation.all(), this.dict); }; // Static functions Translation._cache = {}; Translation.loadPath = function (path) { if (!(path in Translation._cache)) { var translations = require(path); Translation._cache[path] = translations; } return new Translation(Translation._cache[path]); }; return Translation; }); S2.define('select2/diacritics',[ ], function () { var diacritics = { '\u24B6': 'A', '\uFF21': 'A', '\u00C0': 'A', '\u00C1': 'A', '\u00C2': 'A', '\u1EA6': 'A', '\u1EA4': 'A', '\u1EAA': 'A', '\u1EA8': 'A', '\u00C3': 'A', '\u0100': 'A', '\u0102': 'A', '\u1EB0': 'A', '\u1EAE': 'A', '\u1EB4': 'A', '\u1EB2': 'A', '\u0226': 'A', '\u01E0': 'A', '\u00C4': 'A', '\u01DE': 'A', '\u1EA2': 'A', '\u00C5': 'A', '\u01FA': 'A', '\u01CD': 'A', '\u0200': 'A', '\u0202': 'A', '\u1EA0': 'A', '\u1EAC': 'A', '\u1EB6': 'A', '\u1E00': 'A', '\u0104': 'A', '\u023A': 'A', '\u2C6F': 'A', '\uA732': 'AA', '\u00C6': 'AE', '\u01FC': 'AE', '\u01E2': 'AE', '\uA734': 'AO', '\uA736': 'AU', '\uA738': 'AV', '\uA73A': 'AV', '\uA73C': 'AY', '\u24B7': 'B', '\uFF22': 'B', '\u1E02': 'B', '\u1E04': 'B', '\u1E06': 'B', '\u0243': 'B', '\u0182': 'B', '\u0181': 'B', '\u24B8': 'C', '\uFF23': 'C', '\u0106': 'C', '\u0108': 'C', '\u010A': 'C', '\u010C': 'C', '\u00C7': 'C', '\u1E08': 'C', '\u0187': 'C', '\u023B': 'C', '\uA73E': 'C', '\u24B9': 'D', '\uFF24': 'D', '\u1E0A': 'D', '\u010E': 'D', '\u1E0C': 'D', '\u1E10': 'D', '\u1E12': 'D', '\u1E0E': 'D', '\u0110': 'D', '\u018B': 'D', '\u018A': 'D', '\u0189': 'D', '\uA779': 'D', '\u01F1': 'DZ', '\u01C4': 'DZ', '\u01F2': 'Dz', '\u01C5': 'Dz', '\u24BA': 'E', '\uFF25': 'E', '\u00C8': 'E', '\u00C9': 'E', '\u00CA': 'E', '\u1EC0': 'E', '\u1EBE': 'E', '\u1EC4': 'E', '\u1EC2': 'E', '\u1EBC': 'E', '\u0112': 'E', '\u1E14': 'E', '\u1E16': 'E', '\u0114': 'E', '\u0116': 'E', '\u00CB': 'E', '\u1EBA': 'E', '\u011A': 'E', '\u0204': 'E', '\u0206': 'E', '\u1EB8': 'E', '\u1EC6': 'E', '\u0228': 'E', '\u1E1C': 'E', '\u0118': 'E', '\u1E18': 'E', '\u1E1A': 'E', '\u0190': 'E', '\u018E': 'E', '\u24BB': 'F', '\uFF26': 'F', '\u1E1E': 'F', '\u0191': 'F', '\uA77B': 'F', '\u24BC': 'G', '\uFF27': 'G', '\u01F4': 'G', '\u011C': 'G', '\u1E20': 'G', '\u011E': 'G', '\u0120': 'G', '\u01E6': 'G', '\u0122': 'G', '\u01E4': 'G', '\u0193': 'G', '\uA7A0': 'G', '\uA77D': 'G', '\uA77E': 'G', '\u24BD': 'H', '\uFF28': 'H', '\u0124': 'H', '\u1E22': 'H', '\u1E26': 'H', '\u021E': 'H', '\u1E24': 'H', '\u1E28': 'H', '\u1E2A': 'H', '\u0126': 'H', '\u2C67': 'H', '\u2C75': 'H', '\uA78D': 'H', '\u24BE': 'I', '\uFF29': 'I', '\u00CC': 'I', '\u00CD': 'I', '\u00CE': 'I', '\u0128': 'I', '\u012A': 'I', '\u012C': 'I', '\u0130': 'I', '\u00CF': 'I', '\u1E2E': 'I', '\u1EC8': 'I', '\u01CF': 'I', '\u0208': 'I', '\u020A': 'I', '\u1ECA': 'I', '\u012E': 'I', '\u1E2C': 'I', '\u0197': 'I', '\u24BF': 'J', '\uFF2A': 'J', '\u0134': 'J', '\u0248': 'J', '\u24C0': 'K', '\uFF2B': 'K', '\u1E30': 'K', '\u01E8': 'K', '\u1E32': 'K', '\u0136': 'K', '\u1E34': 'K', '\u0198': 'K', '\u2C69': 'K', '\uA740': 'K', '\uA742': 'K', '\uA744': 'K', '\uA7A2': 'K', '\u24C1': 'L', '\uFF2C': 'L', '\u013F': 'L', '\u0139': 'L', '\u013D': 'L', '\u1E36': 'L', '\u1E38': 'L', '\u013B': 'L', '\u1E3C': 'L', '\u1E3A': 'L', '\u0141': 'L', '\u023D': 'L', '\u2C62': 'L', '\u2C60': 'L', '\uA748': 'L', '\uA746': 'L', '\uA780': 'L', '\u01C7': 'LJ', '\u01C8': 'Lj', '\u24C2': 'M', '\uFF2D': 'M', '\u1E3E': 'M', '\u1E40': 'M', '\u1E42': 'M', '\u2C6E': 'M', '\u019C': 'M', '\u24C3': 'N', '\uFF2E': 'N', '\u01F8': 'N', '\u0143': 'N', '\u00D1': 'N', '\u1E44': 'N', '\u0147': 'N', '\u1E46': 'N', '\u0145': 'N', '\u1E4A': 'N', '\u1E48': 'N', '\u0220': 'N', '\u019D': 'N', '\uA790': 'N', '\uA7A4': 'N', '\u01CA': 'NJ', '\u01CB': 'Nj', '\u24C4': 'O', '\uFF2F': 'O', '\u00D2': 'O', '\u00D3': 'O', '\u00D4': 'O', '\u1ED2': 'O', '\u1ED0': 'O', '\u1ED6': 'O', '\u1ED4': 'O', '\u00D5': 'O', '\u1E4C': 'O', '\u022C': 'O', '\u1E4E': 'O', '\u014C': 'O', '\u1E50': 'O', '\u1E52': 'O', '\u014E': 'O', '\u022E': 'O', '\u0230': 'O', '\u00D6': 'O', '\u022A': 'O', '\u1ECE': 'O', '\u0150': 'O', '\u01D1': 'O', '\u020C': 'O', '\u020E': 'O', '\u01A0': 'O', '\u1EDC': 'O', '\u1EDA': 'O', '\u1EE0': 'O', '\u1EDE': 'O', '\u1EE2': 'O', '\u1ECC': 'O', '\u1ED8': 'O', '\u01EA': 'O', '\u01EC': 'O', '\u00D8': 'O', '\u01FE': 'O', '\u0186': 'O', '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', '\u24C5': 'P', '\uFF30': 'P', '\u1E54': 'P', '\u1E56': 'P', '\u01A4': 'P', '\u2C63': 'P', '\uA750': 'P', '\uA752': 'P', '\uA754': 'P', '\u24C6': 'Q', '\uFF31': 'Q', '\uA756': 'Q', '\uA758': 'Q', '\u024A': 'Q', '\u24C7': 'R', '\uFF32': 'R', '\u0154': 'R', '\u1E58': 'R', '\u0158': 'R', '\u0210': 'R', '\u0212': 'R', '\u1E5A': 'R', '\u1E5C': 'R', '\u0156': 'R', '\u1E5E': 'R', '\u024C': 'R', '\u2C64': 'R', '\uA75A': 'R', '\uA7A6': 'R', '\uA782': 'R', '\u24C8': 'S', '\uFF33': 'S', '\u1E9E': 'S', '\u015A': 'S', '\u1E64': 'S', '\u015C': 'S', '\u1E60': 'S', '\u0160': 'S', '\u1E66': 'S', '\u1E62': 'S', '\u1E68': 'S', '\u0218': 'S', '\u015E': 'S', '\u2C7E': 'S', '\uA7A8': 'S', '\uA784': 'S', '\u24C9': 'T', '\uFF34': 'T', '\u1E6A': 'T', '\u0164': 'T', '\u1E6C': 'T', '\u021A': 'T', '\u0162': 'T', '\u1E70': 'T', '\u1E6E': 'T', '\u0166': 'T', '\u01AC': 'T', '\u01AE': 'T', '\u023E': 'T', '\uA786': 'T', '\uA728': 'TZ', '\u24CA': 'U', '\uFF35': 'U', '\u00D9': 'U', '\u00DA': 'U', '\u00DB': 'U', '\u0168': 'U', '\u1E78': 'U', '\u016A': 'U', '\u1E7A': 'U', '\u016C': 'U', '\u00DC': 'U', '\u01DB': 'U', '\u01D7': 'U', '\u01D5': 'U', '\u01D9': 'U', '\u1EE6': 'U', '\u016E': 'U', '\u0170': 'U', '\u01D3': 'U', '\u0214': 'U', '\u0216': 'U', '\u01AF': 'U', '\u1EEA': 'U', '\u1EE8': 'U', '\u1EEE': 'U', '\u1EEC': 'U', '\u1EF0': 'U', '\u1EE4': 'U', '\u1E72': 'U', '\u0172': 'U', '\u1E76': 'U', '\u1E74': 'U', '\u0244': 'U', '\u24CB': 'V', '\uFF36': 'V', '\u1E7C': 'V', '\u1E7E': 'V', '\u01B2': 'V', '\uA75E': 'V', '\u0245': 'V', '\uA760': 'VY', '\u24CC': 'W', '\uFF37': 'W', '\u1E80': 'W', '\u1E82': 'W', '\u0174': 'W', '\u1E86': 'W', '\u1E84': 'W', '\u1E88': 'W', '\u2C72': 'W', '\u24CD': 'X', '\uFF38': 'X', '\u1E8A': 'X', '\u1E8C': 'X', '\u24CE': 'Y', '\uFF39': 'Y', '\u1EF2': 'Y', '\u00DD': 'Y', '\u0176': 'Y', '\u1EF8': 'Y', '\u0232': 'Y', '\u1E8E': 'Y', '\u0178': 'Y', '\u1EF6': 'Y', '\u1EF4': 'Y', '\u01B3': 'Y', '\u024E': 'Y', '\u1EFE': 'Y', '\u24CF': 'Z', '\uFF3A': 'Z', '\u0179': 'Z', '\u1E90': 'Z', '\u017B': 'Z', '\u017D': 'Z', '\u1E92': 'Z', '\u1E94': 'Z', '\u01B5': 'Z', '\u0224': 'Z', '\u2C7F': 'Z', '\u2C6B': 'Z', '\uA762': 'Z', '\u24D0': 'a', '\uFF41': 'a', '\u1E9A': 'a', '\u00E0': 'a', '\u00E1': 'a', '\u00E2': 'a', '\u1EA7': 'a', '\u1EA5': 'a', '\u1EAB': 'a', '\u1EA9': 'a', '\u00E3': 'a', '\u0101': 'a', '\u0103': 'a', '\u1EB1': 'a', '\u1EAF': 'a', '\u1EB5': 'a', '\u1EB3': 'a', '\u0227': 'a', '\u01E1': 'a', '\u00E4': 'a', '\u01DF': 'a', '\u1EA3': 'a', '\u00E5': 'a', '\u01FB': 'a', '\u01CE': 'a', '\u0201': 'a', '\u0203': 'a', '\u1EA1': 'a', '\u1EAD': 'a', '\u1EB7': 'a', '\u1E01': 'a', '\u0105': 'a', '\u2C65': 'a', '\u0250': 'a', '\uA733': 'aa', '\u00E6': 'ae', '\u01FD': 'ae', '\u01E3': 'ae', '\uA735': 'ao', '\uA737': 'au', '\uA739': 'av', '\uA73B': 'av', '\uA73D': 'ay', '\u24D1': 'b', '\uFF42': 'b', '\u1E03': 'b', '\u1E05': 'b', '\u1E07': 'b', '\u0180': 'b', '\u0183': 'b', '\u0253': 'b', '\u24D2': 'c', '\uFF43': 'c', '\u0107': 'c', '\u0109': 'c', '\u010B': 'c', '\u010D': 'c', '\u00E7': 'c', '\u1E09': 'c', '\u0188': 'c', '\u023C': 'c', '\uA73F': 'c', '\u2184': 'c', '\u24D3': 'd', '\uFF44': 'd', '\u1E0B': 'd', '\u010F': 'd', '\u1E0D': 'd', '\u1E11': 'd', '\u1E13': 'd', '\u1E0F': 'd', '\u0111': 'd', '\u018C': 'd', '\u0256': 'd', '\u0257': 'd', '\uA77A': 'd', '\u01F3': 'dz', '\u01C6': 'dz', '\u24D4': 'e', '\uFF45': 'e', '\u00E8': 'e', '\u00E9': 'e', '\u00EA': 'e', '\u1EC1': 'e', '\u1EBF': 'e', '\u1EC5': 'e', '\u1EC3': 'e', '\u1EBD': 'e', '\u0113': 'e', '\u1E15': 'e', '\u1E17': 'e', '\u0115': 'e', '\u0117': 'e', '\u00EB': 'e', '\u1EBB': 'e', '\u011B': 'e', '\u0205': 'e', '\u0207': 'e', '\u1EB9': 'e', '\u1EC7': 'e', '\u0229': 'e', '\u1E1D': 'e', '\u0119': 'e', '\u1E19': 'e', '\u1E1B': 'e', '\u0247': 'e', '\u025B': 'e', '\u01DD': 'e', '\u24D5': 'f', '\uFF46': 'f', '\u1E1F': 'f', '\u0192': 'f', '\uA77C': 'f', '\u24D6': 'g', '\uFF47': 'g', '\u01F5': 'g', '\u011D': 'g', '\u1E21': 'g', '\u011F': 'g', '\u0121': 'g', '\u01E7': 'g', '\u0123': 'g', '\u01E5': 'g', '\u0260': 'g', '\uA7A1': 'g', '\u1D79': 'g', '\uA77F': 'g', '\u24D7': 'h', '\uFF48': 'h', '\u0125': 'h', '\u1E23': 'h', '\u1E27': 'h', '\u021F': 'h', '\u1E25': 'h', '\u1E29': 'h', '\u1E2B': 'h', '\u1E96': 'h', '\u0127': 'h', '\u2C68': 'h', '\u2C76': 'h', '\u0265': 'h', '\u0195': 'hv', '\u24D8': 'i', '\uFF49': 'i', '\u00EC': 'i', '\u00ED': 'i', '\u00EE': 'i', '\u0129': 'i', '\u012B': 'i', '\u012D': 'i', '\u00EF': 'i', '\u1E2F': 'i', '\u1EC9': 'i', '\u01D0': 'i', '\u0209': 'i', '\u020B': 'i', '\u1ECB': 'i', '\u012F': 'i', '\u1E2D': 'i', '\u0268': 'i', '\u0131': 'i', '\u24D9': 'j', '\uFF4A': 'j', '\u0135': 'j', '\u01F0': 'j', '\u0249': 'j', '\u24DA': 'k', '\uFF4B': 'k', '\u1E31': 'k', '\u01E9': 'k', '\u1E33': 'k', '\u0137': 'k', '\u1E35': 'k', '\u0199': 'k', '\u2C6A': 'k', '\uA741': 'k', '\uA743': 'k', '\uA745': 'k', '\uA7A3': 'k', '\u24DB': 'l', '\uFF4C': 'l', '\u0140': 'l', '\u013A': 'l', '\u013E': 'l', '\u1E37': 'l', '\u1E39': 'l', '\u013C': 'l', '\u1E3D': 'l', '\u1E3B': 'l', '\u017F': 'l', '\u0142': 'l', '\u019A': 'l', '\u026B': 'l', '\u2C61': 'l', '\uA749': 'l', '\uA781': 'l', '\uA747': 'l', '\u01C9': 'lj', '\u24DC': 'm', '\uFF4D': 'm', '\u1E3F': 'm', '\u1E41': 'm', '\u1E43': 'm', '\u0271': 'm', '\u026F': 'm', '\u24DD': 'n', '\uFF4E': 'n', '\u01F9': 'n', '\u0144': 'n', '\u00F1': 'n', '\u1E45': 'n', '\u0148': 'n', '\u1E47': 'n', '\u0146': 'n', '\u1E4B': 'n', '\u1E49': 'n', '\u019E': 'n', '\u0272': 'n', '\u0149': 'n', '\uA791': 'n', '\uA7A5': 'n', '\u01CC': 'nj', '\u24DE': 'o', '\uFF4F': 'o', '\u00F2': 'o', '\u00F3': 'o', '\u00F4': 'o', '\u1ED3': 'o', '\u1ED1': 'o', '\u1ED7': 'o', '\u1ED5': 'o', '\u00F5': 'o', '\u1E4D': 'o', '\u022D': 'o', '\u1E4F': 'o', '\u014D': 'o', '\u1E51': 'o', '\u1E53': 'o', '\u014F': 'o', '\u022F': 'o', '\u0231': 'o', '\u00F6': 'o', '\u022B': 'o', '\u1ECF': 'o', '\u0151': 'o', '\u01D2': 'o', '\u020D': 'o', '\u020F': 'o', '\u01A1': 'o', '\u1EDD': 'o', '\u1EDB': 'o', '\u1EE1': 'o', '\u1EDF': 'o', '\u1EE3': 'o', '\u1ECD': 'o', '\u1ED9': 'o', '\u01EB': 'o', '\u01ED': 'o', '\u00F8': 'o', '\u01FF': 'o', '\u0254': 'o', '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', '\u24DF': 'p', '\uFF50': 'p', '\u1E55': 'p', '\u1E57': 'p', '\u01A5': 'p', '\u1D7D': 'p', '\uA751': 'p', '\uA753': 'p', '\uA755': 'p', '\u24E0': 'q', '\uFF51': 'q', '\u024B': 'q', '\uA757': 'q', '\uA759': 'q', '\u24E1': 'r', '\uFF52': 'r', '\u0155': 'r', '\u1E59': 'r', '\u0159': 'r', '\u0211': 'r', '\u0213': 'r', '\u1E5B': 'r', '\u1E5D': 'r', '\u0157': 'r', '\u1E5F': 'r', '\u024D': 'r', '\u027D': 'r', '\uA75B': 'r', '\uA7A7': 'r', '\uA783': 'r', '\u24E2': 's', '\uFF53': 's', '\u00DF': 's', '\u015B': 's', '\u1E65': 's', '\u015D': 's', '\u1E61': 's', '\u0161': 's', '\u1E67': 's', '\u1E63': 's', '\u1E69': 's', '\u0219': 's', '\u015F': 's', '\u023F': 's', '\uA7A9': 's', '\uA785': 's', '\u1E9B': 's', '\u24E3': 't', '\uFF54': 't', '\u1E6B': 't', '\u1E97': 't', '\u0165': 't', '\u1E6D': 't', '\u021B': 't', '\u0163': 't', '\u1E71': 't', '\u1E6F': 't', '\u0167': 't', '\u01AD': 't', '\u0288': 't', '\u2C66': 't', '\uA787': 't', '\uA729': 'tz', '\u24E4': 'u', '\uFF55': 'u', '\u00F9': 'u', '\u00FA': 'u', '\u00FB': 'u', '\u0169': 'u', '\u1E79': 'u', '\u016B': 'u', '\u1E7B': 'u', '\u016D': 'u', '\u00FC': 'u', '\u01DC': 'u', '\u01D8': 'u', '\u01D6': 'u', '\u01DA': 'u', '\u1EE7': 'u', '\u016F': 'u', '\u0171': 'u', '\u01D4': 'u', '\u0215': 'u', '\u0217': 'u', '\u01B0': 'u', '\u1EEB': 'u', '\u1EE9': 'u', '\u1EEF': 'u', '\u1EED': 'u', '\u1EF1': 'u', '\u1EE5': 'u', '\u1E73': 'u', '\u0173': 'u', '\u1E77': 'u', '\u1E75': 'u', '\u0289': 'u', '\u24E5': 'v', '\uFF56': 'v', '\u1E7D': 'v', '\u1E7F': 'v', '\u028B': 'v', '\uA75F': 'v', '\u028C': 'v', '\uA761': 'vy', '\u24E6': 'w', '\uFF57': 'w', '\u1E81': 'w', '\u1E83': 'w', '\u0175': 'w', '\u1E87': 'w', '\u1E85': 'w', '\u1E98': 'w', '\u1E89': 'w', '\u2C73': 'w', '\u24E7': 'x', '\uFF58': 'x', '\u1E8B': 'x', '\u1E8D': 'x', '\u24E8': 'y', '\uFF59': 'y', '\u1EF3': 'y', '\u00FD': 'y', '\u0177': 'y', '\u1EF9': 'y', '\u0233': 'y', '\u1E8F': 'y', '\u00FF': 'y', '\u1EF7': 'y', '\u1E99': 'y', '\u1EF5': 'y', '\u01B4': 'y', '\u024F': 'y', '\u1EFF': 'y', '\u24E9': 'z', '\uFF5A': 'z', '\u017A': 'z', '\u1E91': 'z', '\u017C': 'z', '\u017E': 'z', '\u1E93': 'z', '\u1E95': 'z', '\u01B6': 'z', '\u0225': 'z', '\u0240': 'z', '\u2C6C': 'z', '\uA763': 'z', '\u0386': '\u0391', '\u0388': '\u0395', '\u0389': '\u0397', '\u038A': '\u0399', '\u03AA': '\u0399', '\u038C': '\u039F', '\u038E': '\u03A5', '\u03AB': '\u03A5', '\u038F': '\u03A9', '\u03AC': '\u03B1', '\u03AD': '\u03B5', '\u03AE': '\u03B7', '\u03AF': '\u03B9', '\u03CA': '\u03B9', '\u0390': '\u03B9', '\u03CC': '\u03BF', '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', '\u03C9': '\u03C9', '\u03C2': '\u03C3' }; return diacritics; }); S2.define('select2/data/base',[ '../utils' ], function (Utils) { function BaseAdapter ($element, options) { BaseAdapter.__super__.constructor.call(this); } Utils.Extend(BaseAdapter, Utils.Observable); BaseAdapter.prototype.current = function (callback) { throw new Error('The `current` method must be defined in child classes.'); }; BaseAdapter.prototype.query = function (params, callback) { throw new Error('The `query` method must be defined in child classes.'); }; BaseAdapter.prototype.bind = function (container, $container) { // Can be implemented in subclasses }; BaseAdapter.prototype.destroy = function () { // Can be implemented in subclasses }; BaseAdapter.prototype.generateResultId = function (container, data) { var id = container.id + '-result-'; id += Utils.generateChars(4); if (data.id != null) { id += '-' + data.id.toString(); } else { id += '-' + Utils.generateChars(4); } return id; }; return BaseAdapter; }); S2.define('select2/data/select',[ './base', '../utils', 'jquery' ], function (BaseAdapter, Utils, $) { function SelectAdapter ($element, options) { this.$element = $element; this.options = options; SelectAdapter.__super__.constructor.call(this); } Utils.Extend(SelectAdapter, BaseAdapter); SelectAdapter.prototype.current = function (callback) { var data = []; var self = this; this.$element.find(':selected').each(function () { var $option = $(this); var option = self.item($option); data.push(option); }); callback(data); }; SelectAdapter.prototype.select = function (data) { var self = this; data.selected = true; // If data.element is a DOM node, use it instead if ($(data.element).is('option')) { data.element.selected = true; this.$element.trigger('change'); return; } if (this.$element.prop('multiple')) { this.current(function (currentData) { var val = []; data = [data]; data.push.apply(data, currentData); for (var d = 0; d < data.length; d++) { var id = data[d].id; if ($.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); } else { var val = data.id; this.$element.val(val); this.$element.trigger('change'); } }; SelectAdapter.prototype.unselect = function (data) { var self = this; if (!this.$element.prop('multiple')) { return; } data.selected = false; if ($(data.element).is('option')) { data.element.selected = false; this.$element.trigger('change'); return; } this.current(function (currentData) { var val = []; for (var d = 0; d < currentData.length; d++) { var id = currentData[d].id; if (id !== data.id && $.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); }; SelectAdapter.prototype.bind = function (container, $container) { var self = this; this.container = container; container.on('select', function (params) { self.select(params.data); }); container.on('unselect', function (params) { self.unselect(params.data); }); }; SelectAdapter.prototype.destroy = function () { // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 $.removeData(this, 'data'); }); }; SelectAdapter.prototype.query = function (params, callback) { var data = []; var self = this; var $options = this.$element.children(); $options.each(function () { var $option = $(this); if (!$option.is('option') && !$option.is('optgroup')) { return; } var option = self.item($option); var matches = self.matches(params, option); if (matches !== null) { data.push(matches); } }); callback({ results: data }); }; SelectAdapter.prototype.addOptions = function ($options) { Utils.appendMany(this.$element, $options); }; SelectAdapter.prototype.option = function (data) { var option; if (data.children) { option = document.createElement('optgroup'); option.label = data.text; } else { option = document.createElement('option'); if (option.textContent !== undefined) { option.textContent = data.text; } else { option.innerText = data.text; } } if (data.id) { option.value = data.id; } if (data.disabled) { option.disabled = true; } if (data.selected) { option.selected = true; } if (data.title) { option.title = data.title; } var $option = $(option); var normalizedData = this._normalizeItem(data); normalizedData.element = option; // Override the option's data with the combined data $.data(option, 'data', normalizedData); return $option; }; SelectAdapter.prototype.item = function ($option) { var data = {}; data = $.data($option[0], 'data'); if (data != null) { return data; } if ($option.is('option')) { data = { id: $option.val(), text: $option.text(), disabled: $option.prop('disabled'), selected: $option.prop('selected'), title: $option.prop('title') }; } else if ($option.is('optgroup')) { data = { text: $option.prop('label'), children: [], title: $option.prop('title') }; var $children = $option.children('option'); var children = []; for (var c = 0; c < $children.length; c++) { var $child = $($children[c]); var child = this.item($child); children.push(child); } data.children = children; } data = this._normalizeItem(data); data.element = $option[0]; $.data($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { if (!$.isPlainObject(item)) { item = { id: item, text: item }; } item = $.extend({}, { text: '' }, item); var defaults = { selected: false, disabled: false }; if (item.id != null) { item.id = item.id.toString(); } if (item.text != null) { item.text = item.text.toString(); } if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } return $.extend({}, defaults, item); }; SelectAdapter.prototype.matches = function (params, data) { var matcher = this.options.get('matcher'); return matcher(params, data); }; return SelectAdapter; }); S2.define('select2/data/array',[ './select', '../utils', 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { var data = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); this.addOptions(this.convertToOptions(data)); } Utils.Extend(ArrayAdapter, SelectAdapter); ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); }); if ($option.length === 0) { $option = this.option(data); this.addOptions($option); } ArrayAdapter.__super__.select.call(this, data); }; ArrayAdapter.prototype.convertToOptions = function (data) { var self = this; var $existing = this.$element.find('option'); var existingIds = $existing.map(function () { return self.item($(this)).id; }).get(); var $options = []; // Filter out all items except for the one passed in the argument function onlyItem (item) { return function () { return $(this).val() == item.id; }; } for (var d = 0; d < data.length; d++) { var item = this._normalizeItem(data[d]); // Skip items which were pre-loaded, only merge the data if ($.inArray(item.id, existingIds) >= 0) { var $existingOption = $existing.filter(onlyItem(item)); var existingData = this.item($existingOption); var newData = $.extend(true, {}, item, existingData); var $newOption = this.option(newData); $existingOption.replaceWith($newOption); continue; } var $option = this.option(item); if (item.children) { var $children = this.convertToOptions(item.children); Utils.appendMany($option, $children); } $options.push($option); } return $options; }; return ArrayAdapter; }); S2.define('select2/data/ajax',[ './array', '../utils', 'jquery' ], function (ArrayAdapter, Utils, $) { function AjaxAdapter ($element, options) { this.ajaxOptions = this._applyDefaults(options.get('ajax')); if (this.ajaxOptions.processResults != null) { this.processResults = this.ajaxOptions.processResults; } AjaxAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(AjaxAdapter, ArrayAdapter); AjaxAdapter.prototype._applyDefaults = function (options) { var defaults = { data: function (params) { return $.extend({}, params, { q: params.term }); }, transport: function (params, success, failure) { var $request = $.ajax(params); $request.then(success); $request.fail(failure); return $request; } }; return $.extend({}, defaults, options, true); }; AjaxAdapter.prototype.processResults = function (results) { return results; }; AjaxAdapter.prototype.query = function (params, callback) { var matches = []; var self = this; if (this._request != null) { // JSONP requests cannot always be aborted if ($.isFunction(this._request.abort)) { this._request.abort(); } this._request = null; } var options = $.extend({ type: 'GET' }, this.ajaxOptions); if (typeof options.url === 'function') { options.url = options.url.call(this.$element, params); } if (typeof options.data === 'function') { options.data = options.data.call(this.$element, params); } function request () { var $request = options.transport(options, function (data) { var results = self.processResults(data, params); if (self.options.get('debug') && window.console && console.error) { // Check to make sure that the response included a `results` key. if (!results || !results.results || !$.isArray(results.results)) { console.error( 'Select2: The AJAX results did not return an array in the ' + '`results` key of the response.' ); } } callback(results); }, function () { self.trigger('results:message', { message: 'errorLoading' }); }); self._request = $request; } if (this.ajaxOptions.delay && params.term !== '') { if (this._queryTimeout) { window.clearTimeout(this._queryTimeout); } this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); } else { request(); } }; return AjaxAdapter; }); S2.define('select2/data/tags',[ 'jquery' ], function ($) { function Tags (decorated, $element, options) { var tags = options.get('tags'); var createTag = options.get('createTag'); if (createTag !== undefined) { this.createTag = createTag; } var insertTag = options.get('insertTag'); if (insertTag !== undefined) { this.insertTag = insertTag; } decorated.call(this, $element, options); if ($.isArray(tags)) { for (var t = 0; t < tags.length; t++) { var tag = tags[t]; var item = this._normalizeItem(tag); var $option = this.option(item); this.$element.append($option); } } } Tags.prototype.query = function (decorated, params, callback) { var self = this; this._removeOldTags(); if (params.term == null || params.page != null) { decorated.call(this, params, callback); return; } function wrapper (obj, child) { var data = obj.results; for (var i = 0; i < data.length; i++) { var option = data[i]; var checkChildren = ( option.children != null && !wrapper({ results: option.children }, true) ); var checkText = option.text === params.term; if (checkText || checkChildren) { if (child) { return false; } obj.data = data; callback(obj); return; } } if (child) { return true; } var tag = self.createTag(params); if (tag != null) { var $option = self.option(tag); $option.attr('data-select2-tag', true); self.addOptions([$option]); self.insertTag(data, tag); } obj.results = data; callback(obj); } decorated.call(this, params, wrapper); }; Tags.prototype.createTag = function (decorated, params) { var term = $.trim(params.term); if (term === '') { return null; } return { id: term, text: term }; }; Tags.prototype.insertTag = function (_, data, tag) { data.unshift(tag); }; Tags.prototype._removeOldTags = function (_) { var tag = this._lastTag; var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { if (this.selected) { return; } $(this).remove(); }); }; return Tags; }); S2.define('select2/data/tokenizer',[ 'jquery' ], function ($) { function Tokenizer (decorated, $element, options) { var tokenizer = options.get('tokenizer'); if (tokenizer !== undefined) { this.tokenizer = tokenizer; } decorated.call(this, $element, options); } Tokenizer.prototype.bind = function (decorated, container, $container) { decorated.call(this, container, $container); this.$search = container.dropdown.$search || container.selection.$search || $container.find('.select2-search__field'); }; Tokenizer.prototype.query = function (decorated, params, callback) { var self = this; function select (data) { self.trigger('select', { data: data }); } params.term = params.term || ''; var tokenData = this.tokenizer(params, this.options, select); if (tokenData.term !== params.term) { // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); this.$search.focus(); } params.term = tokenData.term; } decorated.call(this, params, callback); }; Tokenizer.prototype.tokenizer = function (_, params, options, callback) { var separators = options.get('tokenSeparators') || []; var term = params.term; var i = 0; var createTag = this.createTag || function (params) { return { id: params.term, text: params.term }; }; while (i < term.length) { var termChar = term[i]; if ($.inArray(termChar, separators) === -1) { i++; continue; } var part = term.substr(0, i); var partParams = $.extend({}, params, { term: part }); var data = createTag(partParams); if (data == null) { i++; continue; } callback(data); // Reset the term to not include the tokenized portion term = term.substr(i + 1) || ''; i = 0; } return { term: term }; }; return Tokenizer; }); S2.define('select2/data/minimumInputLength',[ ], function () { function MinimumInputLength (decorated, $e, options) { this.minimumInputLength = options.get('minimumInputLength'); decorated.call(this, $e, options); } MinimumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (params.term.length < this.minimumInputLength) { this.trigger('results:message', { message: 'inputTooShort', args: { minimum: this.minimumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MinimumInputLength; }); S2.define('select2/data/maximumInputLength',[ ], function () { function MaximumInputLength (decorated, $e, options) { this.maximumInputLength = options.get('maximumInputLength'); decorated.call(this, $e, options); } MaximumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) { this.trigger('results:message', { message: 'inputTooLong', args: { maximum: this.maximumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MaximumInputLength; }); S2.define('select2/data/maximumSelectionLength',[ ], function (){ function MaximumSelectionLength (decorated, $e, options) { this.maximumSelectionLength = options.get('maximumSelectionLength'); decorated.call(this, $e, options); } MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) { self.trigger('results:message', { message: 'maximumSelected', args: { maximum: self.maximumSelectionLength } }); return; } decorated.call(self, params, callback); }); }; return MaximumSelectionLength; }); S2.define('select2/dropdown',[ 'jquery', './utils' ], function ($, Utils) { function Dropdown ($element, options) { this.$element = $element; this.options = options; Dropdown.__super__.constructor.call(this); } Utils.Extend(Dropdown, Utils.Observable); Dropdown.prototype.render = function () { var $dropdown = $( '' + '' + '' ); $dropdown.attr('dir', this.options.get('dir')); this.$dropdown = $dropdown; return $dropdown; }; Dropdown.prototype.bind = function () { // Should be implemented in subclasses }; Dropdown.prototype.position = function ($dropdown, $container) { // Should be implmented in subclasses }; Dropdown.prototype.destroy = function () { // Remove the dropdown from the DOM this.$dropdown.remove(); }; return Dropdown; }); S2.define('select2/dropdown/search',[ 'jquery', '../utils' ], function ($, Utils) { function Search () { } Search.prototype.render = function (decorated) { var $rendered = decorated.call(this); var $search = $( '' + '' + '' ); this.$searchContainer = $search; this.$search = $search.find('input'); $rendered.prepend($search); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); }); // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$search.on('input', function (evt) { // Unbind the duplicated `keyup` event $(this).off('keyup'); }); this.$search.on('keyup input', function (evt) { self.handleSearch(evt); }); container.on('open', function () { self.$search.attr('tabindex', 0); self.$search.focus(); window.setTimeout(function () { self.$search.focus(); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); self.$search.val(''); }); container.on('results:all', function (params) { if (params.query.term == null || params.query.term === '') { var showSearch = self.showSearch(params); if (showSearch) { self.$searchContainer.removeClass('select2-search--hide'); } else { self.$searchContainer.addClass('select2-search--hide'); } } }); }; Search.prototype.handleSearch = function (evt) { if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.showSearch = function (_, params) { return true; }; return Search; }); S2.define('select2/dropdown/hidePlaceholder',[ ], function () { function HidePlaceholder (decorated, $element, options, dataAdapter) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options, dataAdapter); } HidePlaceholder.prototype.append = function (decorated, data) { data.results = this.removePlaceholder(data.results); decorated.call(this, data); }; HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; HidePlaceholder.prototype.removePlaceholder = function (_, data) { var modifiedData = data.slice(0); for (var d = data.length - 1; d >= 0; d--) { var item = data[d]; if (this.placeholder.id === item.id) { modifiedData.splice(d, 1); } } return modifiedData; }; return HidePlaceholder; }); S2.define('select2/dropdown/infiniteScroll',[ 'jquery' ], function ($) { function InfiniteScroll (decorated, $element, options, dataAdapter) { this.lastParams = {}; decorated.call(this, $element, options, dataAdapter); this.$loadingMore = this.createLoadingMore(); this.loading = false; } InfiniteScroll.prototype.append = function (decorated, data) { this.$loadingMore.remove(); this.loading = false; decorated.call(this, data); if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); } }; InfiniteScroll.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('query', function (params) { self.lastParams = params; self.loading = true; }); container.on('query:append', function (params) { self.lastParams = params; self.loading = true; }); this.$results.on('scroll', function () { var isLoadMoreVisible = $.contains( document.documentElement, self.$loadingMore[0] ); if (self.loading || !isLoadMoreVisible) { return; } var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var loadingMoreOffset = self.$loadingMore.offset().top + self.$loadingMore.outerHeight(false); if (currentOffset + 50 >= loadingMoreOffset) { self.loadMore(); } }); }; InfiniteScroll.prototype.loadMore = function () { this.loading = true; var params = $.extend({}, {page: 1}, this.lastParams); params.page++; this.trigger('query:append', params); }; InfiniteScroll.prototype.showLoadingMore = function (_, data) { return data.pagination && data.pagination.more; }; InfiniteScroll.prototype.createLoadingMore = function () { var $option = $( '
      • ' ); var message = this.options.get('translations').get('loadingMore'); $option.html(message(this.lastParams)); return $option; }; return InfiniteScroll; }); S2.define('select2/dropdown/attachBody',[ 'jquery', '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { this.$dropdownParent = options.get('dropdownParent') || $(document.body); decorated.call(this, $element, options); } AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; var setupResultsEvents = false; decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); if (!setupResultsEvents) { setupResultsEvents = true; container.on('results:all', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:append', function () { self._positionDropdown(); self._resizeDropdown(); }); } }); container.on('close', function () { self._hideDropdown(); self._detachPositioningHandler(container); }); this.$dropdownContainer.on('mousedown', function (evt) { evt.stopPropagation(); }); }; AttachBody.prototype.destroy = function (decorated) { decorated.call(this); this.$dropdownContainer.remove(); }; AttachBody.prototype.position = function (decorated, $dropdown, $container) { // Clone all of the container classes $dropdown.attr('class', $container.attr('class')); $dropdown.removeClass('select2'); $dropdown.addClass('select2-container--open'); $dropdown.css({ position: 'absolute', top: -999999 }); this.$container = $container; }; AttachBody.prototype.render = function (decorated) { var $container = $(''); var $dropdown = decorated.call(this); $container.append($dropdown); this.$dropdownContainer = $container; return $container; }; AttachBody.prototype._hideDropdown = function (decorated) { this.$dropdownContainer.detach(); }; AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { $(this).data('select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { var position = $(this).data('select2-scroll-position'); $(this).scrollTop(position.y); }); $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, function (e) { self._positionDropdown(); self._resizeDropdown(); }); }; AttachBody.prototype._detachPositioningHandler = function (decorated, container) { var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.off(scrollEvent); $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); }; AttachBody.prototype._positionDropdown = function () { var $window = $(window); var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); var newDirection = null; var offset = this.$container.offset(); offset.bottom = offset.top + this.$container.outerHeight(false); var container = { height: this.$container.outerHeight(false) }; container.top = offset.top; container.bottom = offset.top + container.height; var dropdown = { height: this.$dropdown.outerHeight(false) }; var viewport = { top: $window.scrollTop(), bottom: $window.scrollTop() + $window.height() }; var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); var css = { left: offset.left, top: container.bottom }; // Determine what the parent element is to use for calciulating the offset var $offsetParent = this.$dropdownParent; // For statically positoned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } var parentOffset = $offsetParent.offset(); css.top -= parentOffset.top; css.left -= parentOffset.left; if (!isCurrentlyAbove && !isCurrentlyBelow) { newDirection = 'below'; } if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { newDirection = 'above'; } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { newDirection = 'below'; } if (newDirection == 'above' || (isCurrentlyAbove && newDirection !== 'below')) { css.top = container.top - dropdown.height; } if (newDirection != null) { this.$dropdown .removeClass('select2-dropdown--below select2-dropdown--above') .addClass('select2-dropdown--' + newDirection); this.$container .removeClass('select2-container--below select2-container--above') .addClass('select2-container--' + newDirection); } this.$dropdownContainer.css(css); }; AttachBody.prototype._resizeDropdown = function () { var css = { width: this.$container.outerWidth(false) + 'px' }; if (this.options.get('dropdownAutoWidth')) { css.minWidth = css.width; css.width = 'auto'; } this.$dropdown.css(css); }; AttachBody.prototype._showDropdown = function (decorated) { this.$dropdownContainer.appendTo(this.$dropdownParent); this._positionDropdown(); this._resizeDropdown(); }; return AttachBody; }); S2.define('select2/dropdown/minimumResultsForSearch',[ ], function () { function countResults (data) { var count = 0; for (var d = 0; d < data.length; d++) { var item = data[d]; if (item.children) { count += countResults(item.children); } else { count++; } } return count; } function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { this.minimumResultsForSearch = options.get('minimumResultsForSearch'); if (this.minimumResultsForSearch < 0) { this.minimumResultsForSearch = Infinity; } decorated.call(this, $element, options, dataAdapter); } MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { if (countResults(params.data.results) < this.minimumResultsForSearch) { return false; } return decorated.call(this, params); }; return MinimumResultsForSearch; }); S2.define('select2/dropdown/selectOnClose',[ ], function () { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('close', function () { self._handleSelectOnClose(); }); }; SelectOnClose.prototype._handleSelectOnClose = function () { var $highlightedResults = this.getHighlightedResults(); // Only select highlighted results if ($highlightedResults.length < 1) { return; } var data = $highlightedResults.data('data'); // Don't re-select already selected resulte if ( (data.element != null && data.element.selected) || (data.element == null && data.selected) ) { return; } this.trigger('select', { data: data }); }; return SelectOnClose; }); S2.define('select2/dropdown/closeOnSelect',[ ], function () { function CloseOnSelect () { } CloseOnSelect.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function (evt) { self._selectTriggered(evt); }); container.on('unselect', function (evt) { self._selectTriggered(evt); }); }; CloseOnSelect.prototype._selectTriggered = function (_, evt) { var originalEvent = evt.originalEvent; // Don't close if the control key is being held if (originalEvent && originalEvent.ctrlKey) { return; } this.trigger('close', {}); }; return CloseOnSelect; }); S2.define('select2/i18n/en',[],function () { // English return { errorLoading: function () { return 'The results could not be loaded.'; }, inputTooLong: function (args) { var overChars = args.input.length - args.maximum; var message = 'Please delete ' + overChars + ' character'; if (overChars != 1) { message += 's'; } return message; }, inputTooShort: function (args) { var remainingChars = args.minimum - args.input.length; var message = 'Please enter ' + remainingChars + ' or more characters'; return message; }, loadingMore: function () { return 'Loading more results…'; }, maximumSelected: function (args) { var message = 'You can only select ' + args.maximum + ' item'; if (args.maximum != 1) { message += 's'; } return message; }, noResults: function () { return 'No results found'; }, searching: function () { return 'Searching…'; } }; }); S2.define('select2/defaults',[ 'jquery', 'require', './results', './selection/single', './selection/multiple', './selection/placeholder', './selection/allowClear', './selection/search', './selection/eventRelay', './utils', './translation', './diacritics', './data/select', './data/array', './data/ajax', './data/tags', './data/tokenizer', './data/minimumInputLength', './data/maximumInputLength', './data/maximumSelectionLength', './dropdown', './dropdown/search', './dropdown/hidePlaceholder', './dropdown/infiniteScroll', './dropdown/attachBody', './dropdown/minimumResultsForSearch', './dropdown/selectOnClose', './dropdown/closeOnSelect', './i18n/en' ], function ($, require, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, EnglishTranslation) { function Defaults () { this.reset(); } Defaults.prototype.apply = function (options) { options = $.extend(true, {}, this.defaults, options); if (options.dataAdapter == null) { if (options.ajax != null) { options.dataAdapter = AjaxData; } else if (options.data != null) { options.dataAdapter = ArrayData; } else { options.dataAdapter = SelectData; } if (options.minimumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MinimumInputLength ); } if (options.maximumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumInputLength ); } if (options.maximumSelectionLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumSelectionLength ); } if (options.tags) { options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); } if (options.tokenSeparators != null || options.tokenizer != null) { options.dataAdapter = Utils.Decorate( options.dataAdapter, Tokenizer ); } if (options.query != null) { var Query = require(options.amdBase + 'compat/query'); options.dataAdapter = Utils.Decorate( options.dataAdapter, Query ); } if (options.initSelection != null) { var InitSelection = require(options.amdBase + 'compat/initSelection'); options.dataAdapter = Utils.Decorate( options.dataAdapter, InitSelection ); } } if (options.resultsAdapter == null) { options.resultsAdapter = ResultsList; if (options.ajax != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, InfiniteScroll ); } if (options.placeholder != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, HidePlaceholder ); } if (options.selectOnClose) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, SelectOnClose ); } } if (options.dropdownAdapter == null) { if (options.multiple) { options.dropdownAdapter = Dropdown; } else { var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); options.dropdownAdapter = SearchableDropdown; } if (options.minimumResultsForSearch !== 0) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, MinimumResultsForSearch ); } if (options.closeOnSelect) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, CloseOnSelect ); } if ( options.dropdownCssClass != null || options.dropdownCss != null || options.adaptDropdownCssClass != null ) { var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, DropdownCSS ); } options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, AttachBody ); } if (options.selectionAdapter == null) { if (options.multiple) { options.selectionAdapter = MultipleSelection; } else { options.selectionAdapter = SingleSelection; } // Add the placeholder mixin if a placeholder was specified if (options.placeholder != null) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, Placeholder ); } if (options.allowClear) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, AllowClear ); } if (options.multiple) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, SelectionSearch ); } if ( options.containerCssClass != null || options.containerCss != null || options.adaptContainerCssClass != null ) { var ContainerCSS = require(options.amdBase + 'compat/containerCss'); options.selectionAdapter = Utils.Decorate( options.selectionAdapter, ContainerCSS ); } options.selectionAdapter = Utils.Decorate( options.selectionAdapter, EventRelay ); } if (typeof options.language === 'string') { // Check if the language is specified with a region if (options.language.indexOf('-') > 0) { // Extract the region information if it is included var languageParts = options.language.split('-'); var baseLanguage = languageParts[0]; options.language = [options.language, baseLanguage]; } else { options.language = [options.language]; } } if ($.isArray(options.language)) { var languages = new Translation(); options.language.push('en'); var languageNames = options.language; for (var l = 0; l < languageNames.length; l++) { var name = languageNames[l]; var language = {}; try { // Try to load it with the original name language = Translation.loadPath(name); } catch (e) { try { // If we couldn't load it, check if it wasn't the full path name = this.defaults.amdLanguageBase + name; language = Translation.loadPath(name); } catch (ex) { // The translation could not be loaded at all. Sometimes this is // because of a configuration problem, other times this can be // because of how Select2 helps load all possible translation files. if (options.debug && window.console && console.warn) { console.warn( 'Select2: The language file for "' + name + '" could not be ' + 'automatically loaded. A fallback will be used instead.' ); } continue; } } languages.extend(language); } options.translations = languages; } else { var baseTranslation = Translation.loadPath( this.defaults.amdLanguageBase + 'en' ); var customTranslation = new Translation(options.language); customTranslation.extend(baseTranslation); options.translations = customTranslation; } return options; }; Defaults.prototype.reset = function () { function stripDiacritics (text) { // Used 'uni range + named function' from http://jsperf.com/diacritics/18 function match(a) { return DIACRITICS[a] || a; } return text.replace(/[^\u0000-\u007E]/g, match); } function matcher (params, data) { // Always return the object if there is nothing to compare if ($.trim(params.term) === '') { return data; } // Do a recursive check for options with children if (data.children && data.children.length > 0) { // Clone the data object if there are children // This is required as we modify the object to remove any non-matches var match = $.extend(true, {}, data); // Check each child of the option for (var c = data.children.length - 1; c >= 0; c--) { var child = data.children[c]; var matches = matcher(params, child); // If there wasn't a match, remove the object in the array if (matches == null) { match.children.splice(c, 1); } } // If any children matched, return the new object if (match.children.length > 0) { return match; } // If there were no matching children, check just the plain object return matcher(params, match); } var original = stripDiacritics(data.text).toUpperCase(); var term = stripDiacritics(params.term).toUpperCase(); // Check if the text contains the term if (original.indexOf(term) > -1) { return data; } // If it doesn't contain the term, don't return anything return null; } this.defaults = { amdBase: './', amdLanguageBase: './i18n/', closeOnSelect: true, debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, language: EnglishTranslation, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, sorter: function (data) { return data; }, templateResult: function (result) { return result.text; }, templateSelection: function (selection) { return selection.text; }, theme: 'default', width: 'resolve' }; }; Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); var data = {}; data[camelKey] = value; var convertedData = Utils._convertData(data); $.extend(this.defaults, convertedData); }; var defaults = new Defaults(); return defaults; }); S2.define('select2/options',[ 'require', 'jquery', './defaults', './utils' ], function (require, $, Defaults, Utils) { function Options (options, $element) { this.options = options; if ($element != null) { this.fromElement($element); } this.options = Defaults.apply(this.options); if ($element && $element.is('input')) { var InputCompat = require(this.get('amdBase') + 'compat/inputData'); this.options.dataAdapter = Utils.Decorate( this.options.dataAdapter, InputCompat ); } } Options.prototype.fromElement = function ($e) { var excludedData = ['select2']; if (this.options.multiple == null) { this.options.multiple = $e.prop('multiple'); } if (this.options.disabled == null) { this.options.disabled = $e.prop('disabled'); } if (this.options.language == null) { if ($e.prop('lang')) { this.options.language = $e.prop('lang').toLowerCase(); } else if ($e.closest('[lang]').prop('lang')) { this.options.language = $e.closest('[lang]').prop('lang'); } } if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); } else if ($e.closest('[dir]').prop('dir')) { this.options.dir = $e.closest('[dir]').prop('dir'); } else { this.options.dir = 'ltr'; } } $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); if ($e.data('select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + 'use the `data-data` and `data-tags="true"` attributes and will be ' + 'removed in future versions of Select2.' ); } $e.data('data', $e.data('select2Tags')); $e.data('tags', true); } if ($e.data('ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + '`data-ajax--url` and support for the old attribute will be removed' + ' in future versions of Select2.' ); } $e.attr('ajax--url', $e.data('ajaxUrl')); $e.data('ajax--url', $e.data('ajaxUrl')); } var dataset = {}; // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { dataset = $.extend(true, {}, $e[0].dataset, $e.data()); } else { dataset = $e.data(); } var data = $.extend(true, {}, dataset); data = Utils._convertData(data); for (var key in data) { if ($.inArray(key, excludedData) > -1) { continue; } if ($.isPlainObject(this.options[key])) { $.extend(this.options[key], data[key]); } else { this.options[key] = data[key]; } } return this; }; Options.prototype.get = function (key) { return this.options[key]; }; Options.prototype.set = function (key, val) { this.options[key] = val; }; return Options; }); S2.define('select2/core',[ 'jquery', './options', './utils', './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { if ($element.data('select2') != null) { $element.data('select2').destroy(); } this.$element = $element; this.id = this._generateId($element); options = options || {}; this.options = new Options(options, $element); Select2.__super__.constructor.call(this); // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; $element.data('old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters var DataAdapter = this.options.get('dataAdapter'); this.dataAdapter = new DataAdapter($element, this.options); var $container = this.render(); this._placeContainer($container); var SelectionAdapter = this.options.get('selectionAdapter'); this.selection = new SelectionAdapter($element, this.options); this.$selection = this.selection.render(); this.selection.position(this.$selection, $container); var DropdownAdapter = this.options.get('dropdownAdapter'); this.dropdown = new DropdownAdapter($element, this.options); this.$dropdown = this.dropdown.render(); this.dropdown.position(this.$dropdown, $container); var ResultsAdapter = this.options.get('resultsAdapter'); this.results = new ResultsAdapter($element, this.options, this.dataAdapter); this.$results = this.results.render(); this.results.position(this.$results, this.$dropdown); // Bind events var self = this; // Bind the container to all of the adapters this._bindAdapters(); // Register any DOM event handlers this._registerDomEvents(); // Register any internal event handlers this._registerDataEvents(); this._registerSelectionEvents(); this._registerDropdownEvents(); this._registerResultsEvents(); this._registerEvents(); // Set the initial state this.dataAdapter.current(function (initialData) { self.trigger('selection:update', { data: initialData }); }); // Hide the original select $element.addClass('select2-hidden-accessible'); $element.attr('aria-hidden', 'true'); // Synchronize any monitored attributes this._syncAttributes(); $element.data('select2', this); }; Utils.Extend(Select2, Utils.Observable); Select2.prototype._generateId = function ($element) { var id = ''; if ($element.attr('id') != null) { id = $element.attr('id'); } else if ($element.attr('name') != null) { id = $element.attr('name') + '-' + Utils.generateChars(2); } else { id = Utils.generateChars(4); } id = id.replace(/(:|\.|\[|\]|,)/g, ''); id = 'select2-' + id; return id; }; Select2.prototype._placeContainer = function ($container) { $container.insertAfter(this.$element); var width = this._resolveWidth(this.$element, this.options.get('width')); if (width != null) { $container.css('width', width); } }; Select2.prototype._resolveWidth = function ($element, method) { var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; if (method == 'resolve') { var styleWidth = this._resolveWidth($element, 'style'); if (styleWidth != null) { return styleWidth; } return this._resolveWidth($element, 'element'); } if (method == 'element') { var elementWidth = $element.outerWidth(false); if (elementWidth <= 0) { return 'auto'; } return elementWidth + 'px'; } if (method == 'style') { var style = $element.attr('style'); if (typeof(style) !== 'string') { return null; } var attrs = style.split(';'); for (var i = 0, l = attrs.length; i < l; i = i + 1) { var attr = attrs[i].replace(/\s/g, ''); var matches = attr.match(WIDTH); if (matches !== null && matches.length >= 1) { return matches[1]; } } return null; } return method; }; Select2.prototype._bindAdapters = function () { this.dataAdapter.bind(this, this.$container); this.selection.bind(this, this.$container); this.dropdown.bind(this, this.$container); this.results.bind(this, this.$container); }; Select2.prototype._registerDomEvents = function () { var self = this; this.$element.on('change.select2', function () { self.dataAdapter.current(function (data) { self.trigger('selection:update', { data: data }); }); }); this._sync = Utils.bind(this._syncAttributes, this); if (this.$element[0].attachEvent) { this.$element[0].attachEvent('onpropertychange', this._sync); } var observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver ; if (observer != null) { this._observer = new observer(function (mutations) { $.each(mutations, self._sync); }); this._observer.observe(this.$element[0], { attributes: true, subtree: false }); } else if (this.$element[0].addEventListener) { this.$element[0].addEventListener('DOMAttrModified', self._sync, false); } }; Select2.prototype._registerDataEvents = function () { var self = this; this.dataAdapter.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerSelectionEvents = function () { var self = this; var nonRelayEvents = ['toggle', 'focus']; this.selection.on('toggle', function () { self.toggleDropdown(); }); this.selection.on('focus', function (params) { self.focus(params); }); this.selection.on('*', function (name, params) { if ($.inArray(name, nonRelayEvents) !== -1) { return; } self.trigger(name, params); }); }; Select2.prototype._registerDropdownEvents = function () { var self = this; this.dropdown.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerResultsEvents = function () { var self = this; this.results.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerEvents = function () { var self = this; this.on('open', function () { self.$container.addClass('select2-container--open'); }); this.on('close', function () { self.$container.removeClass('select2-container--open'); }); this.on('enable', function () { self.$container.removeClass('select2-container--disabled'); }); this.on('disable', function () { self.$container.addClass('select2-container--disabled'); }); this.on('blur', function () { self.$container.removeClass('select2-container--focus'); }); this.on('query', function (params) { if (!self.isOpen()) { self.trigger('open', {}); } this.dataAdapter.query(params, function (data) { self.trigger('results:all', { data: data, query: params }); }); }); this.on('query:append', function (params) { this.dataAdapter.query(params, function (data) { self.trigger('results:append', { data: data, query: params }); }); }); this.on('keypress', function (evt) { var key = evt.which; if (self.isOpen()) { if (key === KEYS.ESC || key === KEYS.TAB || (key === KEYS.UP && evt.altKey)) { self.close(); evt.preventDefault(); } else if (key === KEYS.ENTER) { self.trigger('results:select', {}); evt.preventDefault(); } else if ((key === KEYS.SPACE && evt.ctrlKey)) { self.trigger('results:toggle', {}); evt.preventDefault(); } else if (key === KEYS.UP) { self.trigger('results:previous', {}); evt.preventDefault(); } else if (key === KEYS.DOWN) { self.trigger('results:next', {}); evt.preventDefault(); } } else { if (key === KEYS.ENTER || key === KEYS.SPACE || (key === KEYS.DOWN && evt.altKey)) { self.open(); evt.preventDefault(); } } }); }; Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); if (this.options.get('disabled')) { if (this.isOpen()) { this.close(); } this.trigger('disable', {}); } else { this.trigger('enable', {}); } }; /** * Override the trigger method to automatically trigger pre-events when * there are events that can be prevented. */ Select2.prototype.trigger = function (name, args) { var actualTrigger = Select2.__super__.trigger; var preTriggerMap = { 'open': 'opening', 'close': 'closing', 'select': 'selecting', 'unselect': 'unselecting' }; if (args === undefined) { args = {}; } if (name in preTriggerMap) { var preTriggerName = preTriggerMap[name]; var preTriggerArgs = { prevented: false, name: name, args: args }; actualTrigger.call(this, preTriggerName, preTriggerArgs); if (preTriggerArgs.prevented) { args.prevented = true; return; } } actualTrigger.call(this, name, args); }; Select2.prototype.toggleDropdown = function () { if (this.options.get('disabled')) { return; } if (this.isOpen()) { this.close(); } else { this.open(); } }; Select2.prototype.open = function () { if (this.isOpen()) { return; } this.trigger('query', {}); }; Select2.prototype.close = function () { if (!this.isOpen()) { return; } this.trigger('close', {}); }; Select2.prototype.isOpen = function () { return this.$container.hasClass('select2-container--open'); }; Select2.prototype.hasFocus = function () { return this.$container.hasClass('select2-container--focus'); }; Select2.prototype.focus = function (data) { // No need to re-trigger focus events if we are already focused if (this.hasFocus()) { return; } this.$container.addClass('select2-container--focus'); this.trigger('focus', {}); }; Select2.prototype.enable = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("enable")` method has been deprecated and will' + ' be removed in later Select2 versions. Use $element.prop("disabled")' + ' instead.' ); } if (args == null || args.length === 0) { args = [true]; } var disabled = !args[0]; this.$element.prop('disabled', disabled); }; Select2.prototype.data = function () { if (this.options.get('debug') && arguments.length > 0 && window.console && console.warn) { console.warn( 'Select2: Data can no longer be set using `select2("data")`. You ' + 'should consider setting the value instead using `$element.val()`.' ); } var data = []; this.dataAdapter.current(function (currentData) { data = currentData; }); return data; }; Select2.prototype.val = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("val")` method has been deprecated and will be' + ' removed in later Select2 versions. Use $element.val() instead.' ); } if (args == null || args.length === 0) { return this.$element.val(); } var newVal = args[0]; if ($.isArray(newVal)) { newVal = $.map(newVal, function (obj) { return obj.toString(); }); } this.$element.val(newVal).trigger('change'); }; Select2.prototype.destroy = function () { this.$container.remove(); if (this.$element[0].detachEvent) { this.$element[0].detachEvent('onpropertychange', this._sync); } if (this._observer != null) { this._observer.disconnect(); this._observer = null; } else if (this.$element[0].removeEventListener) { this.$element[0] .removeEventListener('DOMAttrModified', this._sync, false); } this._sync = null; this.$element.off('.select2'); this.$element.attr('tabindex', this.$element.data('old-tabindex')); this.$element.removeClass('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); this.$element.removeData('select2'); this.dataAdapter.destroy(); this.selection.destroy(); this.dropdown.destroy(); this.results.destroy(); this.dataAdapter = null; this.selection = null; this.dropdown = null; this.results = null; }; Select2.prototype.render = function () { var $container = $( '' + '' + '' + '' ); $container.attr('dir', this.options.get('dir')); this.$container = $container; this.$container.addClass('select2-container--' + this.options.get('theme')); $container.data('element', this.$element); return $container; }; return Select2; }); S2.define('jquery-mousewheel',[ 'jquery' ], function ($) { // Used to shim jQuery.mousewheel for non-full builds. return $; }); S2.define('jquery.select2',[ 'jquery', 'jquery-mousewheel', './select2/core', './select2/defaults' ], function ($, _, Select2, Defaults) { if ($.fn.select2 == null) { // All methods that should return the element var thisMethods = ['open', 'close', 'destroy']; $.fn.select2 = function (options) { options = options || {}; if (typeof options === 'object') { this.each(function () { var instanceOptions = $.extend(true, {}, options); var instance = new Select2($(this), instanceOptions); }); return this; } else if (typeof options === 'string') { var ret; this.each(function () { var instance = $(this).data('select2'); if (instance == null && window.console && console.error) { console.error( 'The select2(\'' + options + '\') method was called on an ' + 'element that is not using Select2.' ); } var args = Array.prototype.slice.call(arguments, 1); ret = instance[options].apply(instance, args); }); // Check if we should be returning `this` if ($.inArray(options, thisMethods) > -1) { return this; } return ret; } else { throw new Error('Invalid arguments for Select2: ' + options); } }; } if ($.fn.select2.defaults == null) { $.fn.select2.defaults = Defaults; } return Select2; }); // Return the AMD loader configuration so it can be used outside of this file return { define: S2.define, require: S2.require }; }()); // Autoload the jQuery bindings // We know that all of the modules exist above this, so we're safe var select2 = S2.require('jquery.select2'); // Hold the AMD module references on the jQuery function that was just loaded // This allows Select2 to use the internal loader outside of this file, such // as in the language files. jQuery.fn.select2.amd = S2; // Return the Select2 instance for anyone who is importing it. return select2; })); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/static/css/backend.css ================================================ .s-page{display:none;position:fixed;top:60px;bottom:0;right:0;left:300px;background:#fff;overflow:auto;box-shadow:-2px 0 3px #ddd;padding:25px 20px}.s-page .close-spage{position:absolute;right:20px;top:20px;font-size:22px;color:#5f5e6a}.s-page .close-spage:hover{text-decoration:none}html,body,#bd{height:100%;background:#e6e8ee}#hd{position:absolute;left:0;right:0;top:0}.main-wrap-bk{padding-top:60px;height:100%}.main-wrap-bk .bd-content-wrap{height:100%;overflow:auto}.page{background:#fff}.header-nav .header-categories li.menu-item h2{line-height:63px}.login-user{position:relative;float:right;margin-right:11px;padding:0 8px;cursor:pointer;color:#fff}.login-user a{color:#fff}.login-user a:hover{text-decoration:none}.login-user .user-opt-panel{display:none;position:absolute;left:-1px;right:-1px;top:65px;background:#fff;z-index:111;border:1px solid #e1e1e1;box-shadow:1px 1px 2px #ddd;border-top:none}.login-user:hover{background:#fff;color:#000}.login-user:hover a{color:#000}.login-user:hover .user-opt-panel{display:block}.login-user:hover .user-opt-panel li{height:34px;line-height:34px}.login-user:hover .user-opt-panel li a{display:block;padding:0 20px}.login-user:hover .user-opt-panel li a .iconfont{margin-right:10px}.login-user:hover .user-opt-panel li.div-line{height:46px;line-height:46px;border-top:1px solid #e3e3e3}.login-user:hover .user-opt-panel li.div-line a{padding:0 20px}.login-user:hover .user-opt-panel li:hover{background:#00a2ca;color:#fff}.login-user:hover .user-opt-panel li:hover a{color:#fff}.user-message{float:right}.user-message .label{margin:0 15px}.header-nav{position:relative;z-index:1111}.bk-area{padding:15px 20px;background:#f0f0f0;border:1px solid #d9d9d9} ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/static/css/page/backend/account_center.css ================================================ .basic-info{height:334px;background-color:#fff;padding:0 20px;margin-bottom:20px}.basic-info .info-title{height:60px;line-height:60px;color:#000;font-size:16px;font-weight:bold}.basic-info .info-title .modify{float:right;font-size:12px}.basic-info .search-box{border-bottom:0}.basic-info .form-kv{margin-top:8px}.basic-info .form-kv .form-kv-label{width:110px;text-align:right}.basic-info .form-kv .form-content span{display:inline-block;width:192px}.basic-info .form-kv .form-content span.status{color:#5dad41}.basic-info .form-kv .form-content i{color:#5dad41;margin-right:3px}.safe-setting{height:334px;background-color:#fff;padding:0 20px}.safe-setting .info-title{height:60px;line-height:60px;color:#000;font-size:16px;font-weight:bold}.safe-setting .search-box{border-bottom:0}.safe-setting .form-kv{margin-top:8px;margin-bottom:20px;padding-bottom:20px}.safe-setting .form-kv .form-kv-label{width:110px;text-align:right;font-weight:bold;font-size:16px;color:#000}.safe-setting .form-kv .form-content{font-size:12px}.safe-setting .form-kv .form-content .content-value{float:left;width:472px;line-height:24px;margin-right:70px;margin-top:3px}.safe-setting .form-kv .form-content .content-value span{float:none;color:#008eb7}.safe-setting .form-kv .form-content span{float:left;color:#5dad41;margin-right:10px}.safe-setting .form-kv .form-content span.no{color:#e0492b}.safe-setting .form-kv .form-content i{float:left;color:#5dad41;margin-right:10px}.safe-setting .form-kv .form-content i.no{color:#e0492b}.safe-setting .form-kv .form-content a{float:left}.safe-setting .form-kv:first-child{border-bottom:1px dashed #ddd} ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/static/css/page/backend/login.css ================================================ .logo { height:74px; line-height:74px } .logo h1 { float:left } .logo h1 a { display:block; height:74px; padding-left:170px; line-height:80px; font-weight:bold; background:url('../../../images/backend/login/login_logo.png?1462242749') left center no-repeat; font-size:18px; color:#000 } .logo h1 a:hover { text-decoration:none } .logo .head-link { float:right } .logo .head-link li { float:left; margin-left:20px; font-size:12px } .logo .head-link li a { color:#808080 } .login-bd { margin-bottom:38px; height:529px; background:#00a2ca } .login-bd .main-content { position:relative; height:100%; background:url('../../../images/backend/login/loginbg.png?1462242749') no-repeat } .login-bd .input-box { position:absolute; right:80px; top:50%; margin-top:-200px; background:#fff; box-shadow:2px 2px 3px #696363, -2px 0 3px #696363 } .login-bd .input-box .input-hd { margin-top:22px; padding:0 10px; border-left:4px solid #fc880c; font-size:22px; color:#000 } .login-bd .input-box .input-hd h2 { padding-bottom:8px; border-bottom:1px solid #d9d9d9; font-size:20px } .login-bd .input-box .alert { margin-bottom:10px; height:26px; line-height:26px; font-size:12px } .login-bd .input-box .input-area { padding:0 22px; padding-top:20px } .login-bd .input-box .input-area .input-item { margin-bottom:15px } .login-bd .input-box .input-area .input-item p { margin-bottom:5px; font-size:12px; font-weight:bold } .login-bd .input-box .input-area .input-item img { cursor:pointer; width:98px; height:32px } .login-bd .input-box input { padding:0 10px; border:1px solid #cacaca; width:264px; height:32px; outline:none; background:url('../../../images/backend/login/logininputbg.png?1462242749'); border-radius:3px } .login-bd .input-box .img-code { float:left; width:160px; margin-right:5px; border-radius:3px } .login-bd .input-box .login-btn { display:block; width:100%; height:36px; text-align:center; line-height:36px; background:#00a2ca; border-radius:4px; border:none; color:#fff; cursor:pointer; font-size:16px; outline:none } .login-bd .input-box .reg { padding:22px; text-align:right } .login-bd .input-box .reg a { margin-left:10px } .login-ft { padding-top:20px; padding-bottom:35px; border-top:1px solid #e5e5e5; font-size:12px } .login-ft .footer-copyright { text-align:center } .login-ft .footer-copyright p { color:#999; margin-top:10px } .login-ft .footer-copyright p:first-child { margin-top:0 } .login-ft .footer-copyright .links a { margin-left:15px; color:#666666 } .login-ft .footer-copyright .links a:first-child { margin-left:0 } ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/static/css/page/backend/order_manage.css ================================================ .ip-manage{padding:25px}.ip-manage .search-box .form-kv{float:left;margin-bottom:5px;padding-left:120px;margin-top:0;width:28%;height:32px;line-height:32px}.ip-manage .search-box .form-kv:first-child{width:100%}.ip-manage .search-box .form-kv .form-kv-label{width:120px;margin-left:-120px}.ip-manage .search-box .form-kv select,.ip-manage .search-box .form-kv input{width:160px} ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/static/css/style.css ================================================ html{color:#333;background:#fff;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-rendering:optimizelegibility}body{position:relative;font-size:14px;min-width:1200px}html.borderbox *,html.borderbox *:before,html.borderbox *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}body,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td,hr,button,article,aside,details,figcaption,figure,footer,header,menu,nav,section{margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,menu,nav,section{display:block}audio,canvas,video{display:inline-block}body,button,input,select,textarea{font-family:Arial, Microsoft Yahei, Microsoft Sans Serif, WenQuanYi Micro Hei, sans}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}blockquote{position:relative;color:#999;font-weight:400;border-left:1px solid #1abc9c;padding-left:1em;margin:1em 3em 1em 2em}@media only screen and (max-width: 640px){blockquote{margin:1em 0}}acronym,abbr{border-bottom:1px dotted;font-variant:normal}abbr{cursor:help}del{text-decoration:line-through}address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:400}ul,ol{list-style:none}caption,th{text-align:left}q:before,q:after{content:''}sub,sup{font-size:75%;line-height:0;position:relative}:root sub,:root sup{vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}a{color:#14a9ce;cursor:pointer}a:hover{text-decoration:underline}.typo a{border-bottom:1px solid #14a9ce}.typo a:hover{border-bottom-color:#555;color:#555;text-decoration:none}ins,a{text-decoration:none}u,.typo-u{text-decoration:underline}mark{background:#fffdd1;border-bottom:1px solid #ffedce;padding:2px;margin:0 5px}pre,code,pre tt{font-family:Courier, 'Courier New', monospace}pre{background:#f8f8f8;border:1px solid #ddd;padding:1em 1.5em;display:block;-webkit-overflow-scrolling:touch}hr{border:none;border-bottom:1px solid #cfcfcf;margin-bottom:0.8em;height:10px}small,.typo-small,figcaption{font-size:0.9em;color:#888}strong,b{font-weight:bold;color:#000}[draggable]{cursor:move}.clearfix:before,.clearfix:after{content:"";display:table}.clearfix:after{clear:both}.clearfix{zoom:1}.textwrap,.textwrap td,.textwrap th{word-wrap:break-word;word-break:break-all}.textwrap-table{table-layout:fixed}.serif{font-family:Palatino, Optima, Georgia, serif}.typo p,.typo pre,.typo ul,.typo ol,.typo dl,.typo form,.typo hr,.typo table,.typo-p,.typo-pre,.typo-ul,.typo-ol,.typo-dl,.typo-form,.typo-hr,.typo-table,blockquote{margin-bottom:1.2em}h1,h2,h3,h4,h5,h6{font-family:Arial, Microsoft Yahei, Microsoft Sans Serif, WenQuanYi Micro Hei, sans;font-weight:100;color:#000;line-height:1.35}.typo h1,.typo h2,.typo h3,.typo h4,.typo h5,.typo h6,.typo-h1,.typo-h2,.typo-h3,.typo-h4,.typo-h5,.typo-h6{margin-top:1.2em;margin-bottom:0.6em;line-height:1.35}.typo h1,.typo-h1{font-size:2em}.typo h2,.typo-h2{font-size:1.8em}.typo h3,.typo-h3{font-size:1.6em}.typo h4,.typo-h4{font-size:1.4em}.typo h5,.typo h6,.typo-h5,.typo-h6{font-size:1.2em}.typo ul,.typo-ul{margin-left:1.3em;list-style:disc}.typo ol,.typo-ol{list-style:decimal;margin-left:1.9em}.typo li ul,.typo li ol,.typo-ul ul,.typo-ul ol,.typo-ol ul,.typo-ol ol{margin-bottom:0.8em;margin-left:2em}.typo li ul,.typo-ul ul,.typo-ol ul{list-style:circle}.typo table th,.typo table td,.typo-table th,.typo-table td,.typo table caption{border:1px solid #ddd;padding:0.5em 1em;color:#666}.typo table th,.typo-table th{background:#fbfbfb}.typo table thead th,.typo-table thead th{background:#f1f1f1}.typo table caption{border-bottom:none}.typo-input,.typo-textarea{-webkit-appearance:none;border-radius:0}.typo-em,.typo em,legend,caption{color:#000;font-weight:inherit}.typo-em{position:relative}.typo-em:after{position:absolute;top:0.65em;left:0;width:100%;overflow:hidden;white-space:nowrap;content:"・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・"}.typo img{max-width:100%}.impInfo{color:#fc0000}.warn{color:#ff7200}.text-tip{font-size:12px;color:#848484}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.layui-layer{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-layer .layui-layer-content{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-layer-dialog .layui-layer-content{padding:0 20px !important}@font-face{font-family:'iconfont';src:url('../fonts/iconfont.eot?1462242749');src:url('../fonts/iconfont.eot?&1462242749#iefix') format("embedded-opentype"),url('../fonts/iconfont.woff?1462242749') format("woff"),url('../fonts/iconfont.ttf?1462242749') format("truetype"),url('../fonts/iconfont.svg?1462242749#iconfont') format("svg")}.iconfont{font-family:"iconfont" !important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:0.2px;-moz-osx-font-smoothing:grayscale}.title-left-line{margin-bottom:20px;padding:0 20px;height:40px;line-height:40px;border-left:4px solid #ff7200;font-size:22px;color:#000}.title-left-line.green{border-left:4px solid #5dad41}.title-bottom-line{margin-bottom:25px;font-size:16px;color:#000;border-bottom:1px solid #dadada}.title-bottom-line span{float:left;border-bottom:2px solid #00a2ca;padding-bottom:8px}.title-left-line-g{margin-bottom:20px;padding:0 13px;height:27px;line-height:27px;border-left:3px solid #63b247;font-size:15px;color:#000}.title-left-line-b{margin-bottom:20px;padding:0 9px;height:30px;line-height:30px;border-left:3px solid #00a2ca;font-size:18px;color:#000}.title-left-line-o{margin-bottom:20px;padding:0 9px;height:30px;line-height:30px;border-left:3px solid #ff7200;font-size:18px;color:#000}.main-content{margin:0 auto;width:1200px}.site-nav{height:35px;line-height:35px;color:#fff;background:#008eb7;font-size:12px}.site-nav .site-notice{float:left;height:35px}.site-nav .site-notice .more-notice{margin-left:20px;color:#7bcee6}.site-nav .site-nav-r-opt{float:right;font-size:12px}.site-nav .site-nav-r-opt li{float:left}.site-nav .site-nav-r-opt li a{color:#fff}.site-nav .site-nav-r-opt li:first-child{margin-right:5px}.site-nav .site-nav-r-opt li:first-child a{padding-right:5px;border-right:1px solid #ddd}.site-nav .site-nav-r-opt li.site-reg{margin-right:10px}.header-nav{height:65px;line-height:65px;background:#00A2CA}.header-nav .main-content,.header-nav .navigation-inner{height:100%}.header-nav .logo h1{float:left;margin:16px 25px 0 15px;width:144px}.header-nav .logo .logo-img{display:inline-block;text-indent:-1000px;width:132px;height:34px;background:url('../images/frontend/logo.png?1462242749') center center no-repeat}.header-nav .header-categories{float:left;height:100%}.header-nav .header-categories .menu{height:100%}.header-nav .header-categories li.menu-item{position:relative;float:left;height:100%}.header-nav .header-categories li.menu-item h2{line-height:65px}.header-nav .header-categories li.menu-item a{display:block;padding:0 25px;color:#fff;font-size:18px;cursor:pointer}.header-nav .header-categories li.menu-item a:hover{text-decoration:none}.header-nav .header-categories li.menu-item.selected,.header-nav .header-categories li.menu-item :hover{background:#0196bd}.header-nav .header-categories li.menu-item.has-sub:hover{background:#f7fcfd;color:#000}.header-nav .header-categories li.menu-item.has-sub:hover h2{background:#f7fcfd}.header-nav .header-categories li.menu-item.has-sub:hover h2>a{color:#000;background:#f7fcfd}.header-nav .header-categories li.menu-item.has-sub:hover .menu-item-panel{display:block}.header-nav .header-categories li.menu-item .menu-item-panel{display:none;position:absolute;left:-1px;width:625px;padding:20px 25px;top:65px;background:#f7fcfd;box-shadow:1px 1px 2px #ddd}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col{float:left;width:195px}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col.col2{width:150px}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col.col3{width:230px}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col h3{margin-bottom:5px;font-size:12px;color:#00a2ca}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col h3 .iconfont{color:#b2bac2;font-size:16px}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col h3 span{color:#00a2ca}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col .submenu-item{margin-top:20px}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col .submenu-item:first-child{margin-top:0}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col .submenu-item a{padding:0}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col .submenu{height:26px;line-height:26px}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col .submenu a{padding-left:18px;font-size:12px;color:#000}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col .submenu a:hover{text-decoration:underline}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col:hover{background:#f7fcfd}.header-nav .header-categories li.menu-item .menu-item-panel .submenu-col *:hover{background:#f7fcfd}.header-nav .header-categories li.menu-item:hover .menu-item-panel{display:block}.main-wrap{padding-left:230px}.main-wrap .sider-bar{float:left;margin-left:-230px}.main-wrap .bd-content-wrap{float:left;width:100%}.main-wrap .bd-content-wrap .bd-content{padding:20px}.sider-bar{width:230px;border:1px solid #e2e2e2;border-top:none;background:#f3f3f3;border-bottom:none}.sider-bar .sider-nav{background:#f3f3f3}.sider-bar .sider-nav .sider-nav-item{border-top:1px solid #dadada}.sider-bar .sider-nav .sider-nav-item h3 a{display:block;padding:0 15px;font-size:16px;line-height:66px;height:66px;color:#000}.sider-bar .sider-nav .sider-nav-item h3 a .iconfont{float:left}.sider-bar .sider-nav .sider-nav-item h3 a .iconfont.arrow-down{display:none}.sider-bar .sider-nav .sider-nav-item h3 span{float:left;margin-left:10px;width:155px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sider-bar .sider-nav .sider-nav-item .sider-nav-s{display:none;padding-bottom:20px}.sider-bar .sider-nav .sider-nav-item .sider-nav-s li{height:36px;line-height:36px;font-size:14px;padding:0 40px}.sider-bar .sider-nav .sider-nav-item .sider-nav-s li a{color:#000}.sider-bar .sider-nav .sider-nav-item .sider-nav-s li a:hover{text-decoration:none}.sider-bar .sider-nav .sider-nav-item .sider-nav-s li.current{background:#00A2CA}.sider-bar .sider-nav .sider-nav-item .sider-nav-s li.current a{color:#fff}.sider-bar .sider-nav .sider-nav-item.current .iconfont.arrow-right{display:none}.sider-bar .sider-nav .sider-nav-item.current .iconfont.arrow-down{display:inline}.sider-bar .sider-nav .sider-nav-item.current .sider-nav-s{display:block}.sider-bar-bk{width:184px}.main-wrap-bk{padding-left:184px}.main-wrap-bk .sider-bar-bk{float:left;margin-left:-184px;width:184px}.main-wrap-bk .bd-content-wrap{float:left;width:100%}.main-wrap-bk .bd-content-wrap .bd-content{padding:20px}.sider-bar-bk{height:100%;background:#293038}.sider-bar-bk .sider-bar-hd{padding:0 10px;line-height:40px;font-size:16px;height:40px;color:#fff;background:#394555}.sider-bar-bk .sider-bar-hd .iconfont{font-size:16px}.sider-bar-bk .sider-nav .sider-nav-item{background:#293038;color:#fff}.sider-bar-bk .sider-nav .sider-nav-item h3 span{float:left;margin-left:10px;width:122px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sider-bar-bk .sider-nav .sider-nav-item h3 a{display:block;padding:0 10px;font-size:14px;line-height:40px;height:40px;color:#fff}.sider-bar-bk .sider-nav .sider-nav-item h3 a .iconfont{float:left}.sider-bar-bk .sider-nav .sider-nav-item h3 a .iconfont.arrow-down{display:none}.sider-bar-bk .sider-nav .sider-nav-item a{color:#fff}.sider-bar-bk .sider-nav .sider-nav-item a:hover{text-decoration:none}.sider-bar-bk .sider-nav .sider-nav-item:hover{background:#22282e}.sider-bar-bk .sider-nav .sider-nav-item .sider-nav-s{display:none;padding-bottom:20px}.sider-bar-bk .sider-nav .sider-nav-item .sider-nav-s li{height:40px;line-height:40px;font-size:14px;padding:0 10px 0 40px}.sider-bar-bk .sider-nav .sider-nav-item .sider-nav-s li a{color:#fff}.sider-bar-bk .sider-nav .sider-nav-item .sider-nav-s li a:hover{text-decoration:none}.sider-bar-bk .sider-nav .sider-nav-item .sider-nav-s li.current{background:#00A2CA;border-left:2px solid #ff7200}.sider-bar-bk .sider-nav .sider-nav-item .sider-nav-s li.current a{color:#fff}.sider-bar-bk .sider-nav .sider-nav-item.current{background:#22282e}.sider-bar-bk .sider-nav .sider-nav-item.current .sider-nav-s{display:block}.sider-bar-bk .sider-nav .sider-nav-item.current .iconfont.arrow-right{display:none}.sider-bar-bk .sider-nav .sider-nav-item.current .iconfont.arrow-down{display:inline}.login-ft{padding-top:20px;padding-bottom:35px;border-top:1px solid #e5e5e5;font-size:12px}.login-ft .footer-copyright{text-align:center}.login-ft .footer-copyright p{color:#999;margin-top:10px}.login-ft .footer-copyright p:first-child{margin-top:0}.login-ft .footer-copyright .links a{margin-left:15px;color:#666666}.login-ft .footer-copyright .links a:first-child{margin-left:0}.nav-tabs li{float:left;margin-right:4px}.nav-tabs li a{display:block;padding:0 25px;height:50px;line-height:50px;background:#546478;color:#fff;font-size:16px;border-right:1px solid #546478}.nav-tabs li.active a,.nav-tabs li:hover a{text-decoration:none;border-top:3px solid #63b247;background:#fff;color:#6b6b6b;border-right:1px solid #ddd}.nav-tabs.style2{background:#fff;border-bottom:1px solid #cecece}.nav-tabs.style2 li{padding-top:10px;margin-left:1px}.nav-tabs.style2 li:first-child{margin-left:25px}.nav-tabs.style2 li a{position:relative;top:1px;height:36px;line-height:36px;font-size:12px;border-top:1px solid #cecece;border-left:1px solid #cecece;border-right:1px solid #cecece;color:#000000;background:#f0f0f0}.nav-tabs.style2 li:hover a{border-top:1px solid #00a2ca;color:#00a2ca}.nav-tabs.style2 li.active a{border-top:2px solid #00a2ca;color:#00a2ca;background:#fff}.tabs{height:54px;line-height:54px;border-bottom:1px solid #e5e5e5;margin-bottom:40px}.tabs .tab-item{float:left;font-size:14px;margin-right:25px;color:#000;cursor:pointer}.tabs .tab-item.current{border-bottom:2px solid #00a2ca;color:#00a2ca;line-height:52px}.form-kv{padding-left:120px;margin-top:20px}.form-kv:first-child{margin-top:0}.form-kv .form-kv-label{float:left;width:120px;margin-left:-120px;line-height:32px}.form-kv .form-content{float:left;width:100%;line-height:32px}.form-kv .form-content label.form-ck{margin-right:20px}.form-kv.leter3{padding-left:55px !important}.form-kv.leter3 .form-kv-label{width:55px !important;margin-left:-55px !important}.form-kv.leter4{padding-left:65px !important}.form-kv.leter4 .form-kv-label{width:65px !important;margin-left:-65px !important}input[type=text],textarea{padding:0 10px;height:32px;border:1px solid #b3b3b3;outline:none}textarea{resize:none;height:80px;width:300px}.date-pick{float:left;position:relative}.date-pick input{width:190px;padding-right:30px}.date-pick i{position:absolute;right:6px;top:1px;font-size:18px;cursor:pointer}.date-pick i:hover{color:#0c9d72}.divsion{float:left;margin:0 8px}.ck-radio span{float:left;margin-right:8px;padding:0 14px;height:30px;line-height:30px;text-align:center;color:#000;background:#d5d5d5;cursor:pointer}.ck-radio input[type="radio"],.ck-radio input[type="checkbox"]{display:none}.ck-radio input[type="radio"]:checked ~ span,.ck-radio input[type="checkbox"]:checked ~ span{background:#00a2ca;color:#fff}.ck-radio span:hover{text-decoration:none;background:#00a2ca;color:#fff}.kv-item{padding-left:90px;margin-top:20px}.kv-item:first-child{margin-top:0}.kv-item .kv-label{float:left;width:90px;margin-left:-90px;line-height:32px;color:#717171}.kv-item .kv-content{float:left;width:100%;line-height:32px}.kv-item .kv-content label.form-ck{margin-right:20px}.a-upload{font-size:14px;padding:0 20px;height:30px;line-height:30px;position:relative;cursor:pointer;color:#000;background:#fafafa;border:1px solid #c2c2c2;border-radius:4px;overflow:hidden;display:inline-block;*display:inline;*zoom:1;text-decoration:none}.a-upload input{position:absolute;font-size:100px;right:0;top:0;opacity:0;filter:alpha(opacity=0);cursor:pointer}.a-upload:hover{color:#444;background:#eee;border-color:#ccc;text-decoration:none}.btn{padding:0 12px;height:32px;line-height:32px;background:#63b247;color:#fff;border:none;cursor:pointer;outline:none;font-weight:normal}.btn.btn-blue{background:#00a2ca;border-radius:4px}.btn .iconfont{margin-right:5px;color:#fff !important}.btn.btn-big{height:40px;line-height:40px;background:#f0f0f0;border:1px solid #cecece;color:#000;border-radius:5px;padding:0 32px}.btn.btn-green{background:#5dad41;border-color:#5dad41;color:#fff}.btn.btn-default{background:#f0f0f0;color:#000;border:1px solid #cecece;border-radius:4px}.btn.btn-default .iconfont{color:#000 !important}.btn.btn-red{border-radius:4px;background:#e0492b}.btn-group .btn{margin-right:5px}.grid{margin-bottom:10px}.grid .grid-opt{margin-bottom:10px}.grid .grid-opt .grid-opt-item{float:right}.grid .grid-opt .grid-opt-item:hover{text-decoration:none}.grid .grid-opt .btn{float:left;margin-right:5px}.grid table{width:100%;border:1px solid #d9d9d9}.grid thead th{padding-left:7px;height:37px;background:#f0f0f0;border-left:1px solid #d9d9d9;border-bottom:2px solid #d9d9d9;position:relative}.grid thead th:first-child{border-left:none}.grid thead th i{color:#626262;cursor:pointer;font-size:18px;display:inline-block;text-align:center;line-height:0px;text-indent:-6px}.grid thead th i.current{color:#00a2ca}.grid thead th i.up{position:absolute;right:10px;width:6px;height:6px;top:10px}.grid thead th i.down{position:absolute;right:10px;width:6px;height:6px;top:22px}.grid tbody td{padding-left:7px;height:35px;border-top:1px solid #d9d9d9}.grid tbody td.opt a{margin-left:10px}.grid tbody td.opt a:first-child{margin-left:0}.grid tbody td.opt a.disabled{color:#000}.grid tbody td.opt a.disabled:hover{text-decoration:none;cursor:default}.grid .tr-hover td{background:#f2f2f2}.grid .num,.grid .ck{text-align:center}table.kv-table{width:100%}table.kv-table td{height:36px;padding:10px;border:1px solid #dadada}table.kv-table .kv-label{width:114px;background:#f5f5f5}.pagination{line-height:36px}.pagination .pagin-links{float:right}.pagination a,.pagination .current{float:left;margin-left:5px;width:36px;height:36px;line-height:36px;background:#ededed;border:1px solid #dadada;text-align:center;color:#858585}.pagination a:hover,.pagination .current:hover{text-decoration:none;background:#fff;color:#858585}.pagination .current{background:#00a2ca;color:#fff;border-color:#00a2ca}.pagination span{float:left;margin-left:5px}.pagination .page-btn{border-left:none}.pagination .page-btn:first-child{border-left:1px solid #e4e4e4}.pagination .page-btn.active{cursor:default;border:none;background:none;color:#00a2ca}.pagination .page-btn.active+.page-btn{border:1px solid #e4e4e4}.pagination .extra{float:left}.pagination .extra input{float:left}.pagination .prev i,.pagination .next i{display:inline-block;font-size:12px;vertical-align:5%;width:15px}.pagination .prev.disabled,.pagination .next.disabled{cursor:default;color:#ababab}.pagination .dot{width:17px;background:none;border:none;color:#9c9c9c}.pagination .extra{padding:0 0 0 15px}.pagination .extra span{background:none;border:none;font-size:12px;color:#b1b1b1;width:auto}.pagination .extra input{margin:0 8px;width:38px;height:38px;border:1px solid #ddd;color:#171212;text-align:center;outline:none}.pagination .extra .submit{margin:0 0 0 10px;padding:0 10px;height:38px;background:#f6f6f6;border:1px solid #e4e4e4;text-align:center;color:#171212;cursor:pointer}.pagination .pxofy{float:left;color:#838383}.pagination .goto{float:right;color:#838383;margin-left:2px}.pagination .goto span.text{margin-right:5px}.pagination .goto input{float:left;width:48px;height:32px;border:1px solid #b3b3b3;margin-top:2px}.pagination .goto button{display:none}.pagination .items-per{float:left;color:#838383;margin-left:10px}.pagination .items-per select{display:inline-block;height:36px;border:1px solid #b3b3b3;width:48px;text-align:center}.label{display:inline;padding:0 8px;font-size:14px;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:4px;background:#ff7200;cursor:pointer}.uc-slider .unit i{background:url('../images/ui/u-silder/month_chinese.png?1462242749') no-repeat}.uc-slider{position:relative;display:inline-block;height:26px;background-color:#f9f9f9;padding:0 7px;border-radius:4px;vertical-align:bottom;*vertical-align:text-bottom}.uc-slider .range{position:relative;height:26px;background-color:#f9f9f9;border-radius:4px}.uc-slider .range .block{display:inline-block;height:24px}.uc-slider .block div{border-right:solid 1px #e6e6e6;height:24px;padding:1px 10px 1px 0;text-align:right}.uc-slider .block span{float:right;display:inline;line-height:2;font-size:12px;color:#999}.uc-slider .block .last{border-width:0;padding-right:11px}.uc-slider .container{position:absolute;left:-7px;top:0;width:0%;height:24px;border:solid 1px #6dc5dc;padding:0 6px;overflow:hidden;background-color:#eafbfe;border-radius:4px}.uc-slider .container .current{height:24px;overflow:hidden;width:100%;background-color:#eafbfe;border-radius:4px;white-space:nowrap}.uc-slider .current .unit{display:inline-block;margin-left:0;height:24px}.uc-slider .unit div{border-right:solid 1px #d0eaf9;height:24px;padding-right:10px;text-align:right}.uc-slider .unit span{float:right;display:inline;height:24px;line-height:2;font-size:12px;color:#c8c1a8;-webkit-transition:color .3s;-moz-transition:color .3s;-ms-transition:color .3s;-o-transition:color .3s}.uc-slider .unit i{float:right;display:none;height:8px;width:13px;overflow:hidden;margin-top:7px}.uc-slider .unit .last{border-width:0;padding-right:11px}.uc-slider .bar{position:absolute;top:0;left:-7px;background-color:#f00;height:26px;overflow:hidden;width:100%;cursor:default;opacity:0;filter:alpha(opacity=0)}.uc-slider .drag{position:absolute;left:-7px;top:-2px;display:block;width:15px;height:30px;padding:9px 0 0 3px;overflow:hidden;border:solid 1px #bbbbbb;background-color:#fff;cursor:default;-webkit-transition:border-color .3s, -webkit-transform .3s;-moz-transition:border-color .3s, -moz-transform .3s;-ms-transition:border-color .3s, -ms-transform .3s;-o-transition:border-color .3s, -o-transform .3s;outline:none;box-shadow:0 1px 5px rgba(0,0,0,0.25);-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1)}.uc-slider .drag:link,.uc-slider .drag:visited{border-color:#ccc}.uc-slider .drag:hover{border-color:#aaa}.uc-slider .drag i{float:left;display:inline;margin:0 0 0 1px;width:1px;height:10px;overflow:hidden;background:#ababab;background:-webkit-linear-gradient(top, #f2f2f2, #ababab, #f2f2f2);background:-moz-linear-gradient(top, #f2f2f2, #ababab, #f2f2f2);background:-o-linear-gradient(top, #f2f2f2, #ababab, #f2f2f2);background:-ms-linear-gradient(top, #f2f2f2, #ababab, #f2f2f2)}.uc-slider .w60{width:60%;*width:59.99%}.uc-slider .w50{width:50%;*width:49.99%}.uc-slider .w25{width:25%;*width:24.99%}.uc-slider .w20{width:20%;*width:19.99%}.duration{width:520px}.uc-slider .mm{width:37px}.uc-slider .yy{width:57px}.uc-input{border:solid 1px #d4d4d4;width:44px;height:12px;padding:6px 4px;font-size:12px;line-height:1;outline:none;border-radius:4px;box-shadow:inset 1px 1px 1px #e8e8e8;color:#000}.select-container{float:left}.iselect-wrapper{float:left;position:relative}.iselect-wrapper select{position:absolute;width:96px;min-height:33px;top:0;left:0;opacity:0;filter:alpha(opacity=0)}.iselect-wrapper .iselwrap-val{display:block;width:84px;padding:0 5px;height:33px;line-height:34px;border:1px solid #c2c2c2;font-size:12px;color:#000;background:#fff url('../images/ui/select-icon.png?1462242749') no-repeat 73px center;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.search-box{margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid #ddd}.process{padding:15px 0 30px 0;}.process .process-item{float:left;width:20%;text-align:center}.process .process-item .process-tip{font-size:12px;color:#858585}.process .process-item .qiu{height:40px;position:relative}.process .process-item .qiu .yuan{position:absolute;left:50%;margin-left:-10px;width:20px;height:20px;background:url('../images/ui/process/yuan.png?1462242749') 20px 0;z-index:2}.process .process-item .qiu .line{position:absolute;top:9px;left:50%;right:0;height:1px;background:#c1c3ca;z-index:1}.process .process-item .qiu .line.line-left{left:0;right:50%}.process .process-item.processed .yuan,.process .process-item.current .yuan{background:url('../images/ui/process/yuan.png?1462242749') 0 0} .process .process-item.processed .line{background:#63b247} .process .process-item.current .line-left{background:#63b247} .alert{margin-bottom:20px;padding:0 10px;height:36px;line-height:36px;border:1px solid #ddd;color:#888} .alert .close{float:right;font-size:12px;color:#999} .alert .close:hover{text-decoration:none} .alert.alert-warning{background:#fff5db;color:#e2ba89;border-color:#ffe195} .alert.alert-error{background:#fceee8;color:#fc0000;border-color:#fc0000} ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/static/js/common.js ================================================ window['layer'] && layer.config({ extend: ['skin/osa/style.css'], //加载新皮肤 skin: 'layer-ext-osa' //一旦设定,所有弹层风格都采用此主题。 }); $(function() { if($('.site-nav').size() > 0){ $('.sider-bar').height($('.main-wrap').height()); } $(document).on('click', '.sider-nav-item', function(){ if(!$(this).hasClass('current')){ $('.sider-nav-item').removeClass('current'); $(this).addClass('current'); } }); $(document).on('click', '.sider-nav-s li', function(){ if(!$(this).hasClass('current')){ $('.sider-nav-s li').removeClass('current'); $(this).addClass('current'); } }); $('.grid tr').hover(function(){ $(this).addClass('tr-hover'); }, function(){ $(this).removeClass('tr-hover'); }); }); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/static/js/jquery.cookie.js ================================================ /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2006, 2014 Klaus Hartl * Released under the MIT license */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports === 'object') { // CommonJS factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function ($) { var pluses = /\+/g; function encode(s) { return config.raw ? s : encodeURIComponent(s); } function decode(s) { return config.raw ? s : decodeURIComponent(s); } function stringifyCookieValue(value) { return encode(config.json ? JSON.stringify(value) : String(value)); } function parseCookieValue(s) { if (s.indexOf('"') === 0) { // This is a quoted cookie as according to RFC2068, unescape... s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); } try { // Replace server-side written pluses with spaces. // If we can't decode the cookie, ignore it, it's unusable. // If we can't parse the cookie, ignore it, it's unusable. s = decodeURIComponent(s.replace(pluses, ' ')); return config.json ? JSON.parse(s) : s; } catch(e) {} } function read(s, converter) { var value = config.raw ? s : parseCookieValue(s); return $.isFunction(converter) ? converter(value) : value; } var config = $.cookie = function (key, value, options) { // Write if (arguments.length > 1 && !$.isFunction(value)) { options = $.extend({}, config.defaults, options); if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setTime(+t + days * 864e+5); } return (document.cookie = [ encode(key), '=', stringifyCookieValue(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : '' ].join('')); } // Read var result = key ? undefined : {}; // To prevent the for loop in the first place assign an empty array // in case there are no cookies at all. Also prevents odd result when // calling $.cookie(). var cookies = document.cookie ? document.cookie.split('; ') : []; for (var i = 0, l = cookies.length; i < l; i++) { var parts = cookies[i].split('='); var name = decode(parts.shift()); var cookie = parts.join('='); if (key && key === name) { // If second argument (value) is a function it's a converter... result = read(cookie, value); break; } // Prevent storing a cookie that we couldn't decode. if (!key && (cookie = read(cookie)) !== undefined) { result[name] = cookie; } } return result; }; config.defaults = {}; $.removeCookie = function (key, options) { if ($.cookie(key) === undefined) { return false; } // Must not alter options, thus extending a fresh object... $.cookie(key, '', $.extend({}, options, { expires: -1 })); return !$.cookie(key); }; })); ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/static/js/jquery.js ================================================ /*! * jQuery JavaScript Library v1.7.2 * http://jquery.com/ * * Copyright 2011, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Wed Mar 21 12:46:34 2012 -0700 */ (function( window, undefined ) { // Use the correct document accordingly with window argument (sandbox) var document = window.document, navigator = window.navigator, location = window.location; var jQuery = (function() { // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); }, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // A central reference to the root jQuery(document) rootjQuery, // A simple way to check for HTML strings or ID strings // Prioritize #id over to avoid XSS via location.hash (#9521) quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace trimLeft = /^\s+/, trimRight = /\s+$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // JSON RegExp rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, // Useragent RegExp rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, // Matches dashed string for camelizing rdashAlpha = /-([a-z]|[0-9])/ig, rmsPrefix = /^-ms-/, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return ( letter + "" ).toUpperCase(); }, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // The deferred used on DOM ready readyList, // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, // [[Class]] -> type pairs class2type = {}; jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = quickExpr.exec( selector ); } // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; doc = ( context ? context.ownerDocument || context : document ); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.7.2", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // Add the callback readyList.add( fn ); return this; }, eq: function( i ) { i = +i; return i === -1 ? this.slice( i ) : this.slice( i, i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Either a released hold or an DOMready/load event and not yet ready if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.fireWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger( "ready" ).off( "ready" ); } } }, bindReady: function() { if ( readyList ) { return; } readyList = jQuery.Callbacks( "once memory" ); // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready return setTimeout( jQuery.ready, 1 ); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { return obj != null && obj == obj.window; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return ( new Function( "return " + data ) )(); } jQuery.error( "Invalid JSON: " + data ); }, // Cross-browser xml parsing parseXML: function( data ) { if ( typeof data !== "string" || !data ) { return null; } var xml, tmp; try { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; }, // Use native String.trim function wherever possible trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 var type = jQuery.type( array ); if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array, i ) { var len; if ( array ) { if ( indexOf ) { return indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, key, ret = [], i = 0, length = elems.length, // jquery objects are treated as arrays isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( key in elems ) { value = callback( elems[ key ], key, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { if ( typeof context === "string" ) { var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; }, // Mutifunctional method to get and set values to a collection // The value/s can optionally be executed if it's a function access: function( elems, fn, key, value, chainable, emptyGet, pass ) { var exec, bulk = key == null, i = 0, length = elems.length; // Sets many values if ( key && typeof key === "object" ) { for ( i in key ) { jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); } chainable = 1; // Sets one value } else if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = pass === undefined && jQuery.isFunction( value ); if ( bulk ) { // Bulk operations only iterate when executing function values if ( exec ) { exec = fn; fn = function( elem, key, value ) { return exec.call( jQuery( elem ), value ); }; // Otherwise they run against the entire set } else { fn.call( elems, value ); fn = null; } } if ( fn ) { for (; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } } chainable = 1; } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }, now: function() { return ( new Date() ).getTime(); }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, sub: function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }, browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch(e) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } return jQuery; })(); // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; } /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how * the callback list behaves * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible flags: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // (we check in cache first) flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; var // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = [], // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Add one or several callbacks to the list add = function( args ) { var i, length, elem, type, actual; for ( i = 0, length = args.length; i < length; i++ ) { elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { // Inspect recursively add( elem ); } else if ( type === "function" ) { // Add if not in unique mode and callback is not in if ( !flags.unique || !self.has( elem ) ) { list.push( elem ); } } } }, // Fire callbacks fire = function( context, args ) { args = args || []; memory = !flags.memory || [ context, args ]; fired = true; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else { list = []; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { var length = list.length; add( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away, unless previous // firing was halted (stopOnFalse) } else if ( memory && memory !== true ) { firingStart = length; fire( memory[ 0 ], memory[ 1 ] ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { var args = arguments, argIndex = 0, argLength = args.length; for ( ; argIndex < argLength ; argIndex++ ) { for ( var i = 0; i < list.length; i++ ) { if ( args[ argIndex ] === list[ i ] ) { // Handle firingIndex and firingLength if ( firing ) { if ( i <= firingLength ) { firingLength--; if ( i <= firingIndex ) { firingIndex--; } } } // Remove the element list.splice( i--, 1 ); // If we have some unicity property then // we only need to do this once if ( flags.unique ) { break; } } } } } return this; }, // Control if a given callback is in the list has: function( fn ) { if ( list ) { var i = 0, length = list.length; for ( ; i < length; i++ ) { if ( fn === list[ i ] ) { return true; } } } return false; }, // Remove all callbacks from the list empty: function() { list = []; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory || memory === true ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); } } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; var // Static reference to slice sliceDeferred = [].slice; jQuery.extend({ Deferred: function( func ) { var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "memory" ), state = "pending", lists = { resolve: doneList, reject: failList, notify: progressList }, promise = { done: doneList.add, fail: failList.add, progress: progressList.add, state: function() { return state; }, // Deprecated isResolved: doneList.fired, isRejected: failList.fired, then: function( doneCallbacks, failCallbacks, progressCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); return this; }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, pipe: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], fail: [ fnFail, "reject" ], progress: [ fnProgress, "notify" ] }, function( handler, data ) { var fn = data[ 0 ], action = data[ 1 ], returned; if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } }); } else { deferred[ handler ]( newDefer[ action ] ); } }); }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { if ( obj == null ) { obj = promise; } else { for ( var key in promise ) { obj[ key ] = promise[ key ]; } } return obj; } }, deferred = promise.promise({}), key; for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; } // Handle state deferred.done( function() { state = "resolved"; }, failList.disable, progressList.lock ).fail( function() { state = "rejected"; }, doneList.disable, progressList.lock ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( firstParam ) { var args = sliceDeferred.call( arguments, 0 ), i = 0, length = args.length, pValues = new Array( length ), count = length, pCount = length, deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? firstParam : jQuery.Deferred(), promise = deferred.promise(); function resolveFunc( i ) { return function( value ) { args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; if ( !( --count ) ) { deferred.resolveWith( deferred, args ); } }; } function progressFunc( i ) { return function( value ) { pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; deferred.notifyWith( promise, pValues ); }; } if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); } else { --count; } } if ( !count ) { deferred.resolveWith( deferred, args ); } } else if ( deferred !== firstParam ) { deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); } return promise; } }); jQuery.support = (function() { var support, all, a, select, opt, input, fragment, tds, events, eventName, i, isSupported, div = document.createElement( "div" ), documentElement = document.documentElement; // Preliminary tests div.setAttribute("className", "t"); div.innerHTML = "
        a"; all = div.getElementsByTagName( "*" ); a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { return {}; } // First batch of supports tests select = document.createElement( "select" ); opt = select.appendChild( document.createElement("option") ); input = div.getElementsByTagName( "input" )[ 0 ]; support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText instead) style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: ( a.getAttribute("href") === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) getSetAttribute: div.className !== "t", // Tests for enctype support on a form(#6743) enctype: !!document.createElement("form").enctype, // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", // Will be defined later submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, reliableMarginRight: true, pixelMargin: true }; // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); // Make sure checked status is properly cloned input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete div.test; } catch( e ) { support.deleteExpando = false; } var onclicktmp = null; if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent( "onclick", onclicktmp = function() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) support.noCloneEvent = false; }); div.cloneNode( true ).fireEvent( "onclick" ); div.detachEvent( "onclick", onclicktmp); // adamki added } // Check if a radio maintains its value // after being appended to the DOM input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); // #11217 - WebKit loses check when the name is after the checked attribute input.setAttribute( "name", "t" ); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.lastChild ); // WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) support.appendChecked = input.checked; fragment.removeChild( input ); fragment.appendChild( div ); // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems // are used, namely in IE. Short-circuiting here helps us to // avoid an eval call (in setAttribute) which can cause CSP // to go haywire. See: https://developer.mozilla.org/en/Security/CSP if ( div.attachEvent ) { for ( i in { submit: 1, change: 1, focusin: 1 }) { eventName = "on" + i; isSupported = ( eventName in div ); if ( !isSupported ) { div.setAttribute( eventName, "return;" ); isSupported = ( typeof div[ eventName ] === "function" ); } support[ i + "Bubbles" ] = isSupported; } } fragment.removeChild( div ); // Null elements to avoid leaks in IE fragment = select = opt = div = input = null; // Run tests that need a body at doc ready jQuery(function() { var container, outer, inner, table, td, offsetSupport, marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, paddingMarginBorderVisibility, paddingMarginBorder, body = document.getElementsByTagName("body")[0]; if ( !body ) { // Return for frameset docs that don't have a body return; } conMarginTop = 1; paddingMarginBorder = "padding:0;margin:0;border:"; positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; html = "
        " + "" + "
        "; container = document.createElement("div"); container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element div = document.createElement("div"); container.appendChild( div ); // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) div.innerHTML = "
        t
        "; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); tds[ 0 ].style.display = ""; tds[ 1 ].style.display = "none"; // Check if empty table cells still have offsetWidth/Height // (IE <= 8 fail this test) support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. For more // info see bug #3333 // Fails in WebKit before Feb 2011 nightlies // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right if ( window.getComputedStyle ) { div.innerHTML = ""; marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.style.width = "2px"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } if ( typeof div.style.zoom !== "undefined" ) { // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout // (IE < 8 does this) div.innerHTML = ""; div.style.width = div.style.padding = "1px"; div.style.border = 0; div.style.overflow = "hidden"; div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); // Check if elements with layout shrink-wrap their children // (IE 6 does this) div.style.display = "block"; div.style.overflow = "visible"; div.innerHTML = "
        "; support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); } div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; div.innerHTML = html; outer = div.firstChild; inner = outer.firstChild; td = outer.nextSibling.firstChild.firstChild; offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; inner.style.position = "fixed"; inner.style.top = "20px"; // safari subtracts parent border width here which is 5px offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); if ( window.getComputedStyle ) { div.style.marginTop = "1%"; support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; } if ( typeof container.style.zoom !== "undefined" ) { container.style.zoom = 1; } body.removeChild( container ); marginDiv = div = container = null; jQuery.extend( support, offsetSupport ); }); return support; })(); var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([A-Z])/g; jQuery.extend({ cache: {}, // Please use with caution uuid: 0, // Unique for each copy of jQuery on the page // Non-digits removed to match rinlinejQuery expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, // Ban all objects except for Flash (which handle expandos) "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", "applet": true }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var privateCache, thisCache, ret, internalKey = jQuery.expando, getByName = typeof name === "string", // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, isEvents = name === "events"; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { elem[ internalKey ] = id = ++jQuery.uuid; } else { id = internalKey; } } if ( !cache[ id ] ) { cache[ id ] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify if ( !isNode ) { cache[ id ].toJSON = jQuery.noop; } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } privateCache = thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Users should not attempt to inspect the internal events object using jQuery.data, // it is undocumented and subject to change. But does anyone listen? No. if ( isEvents && !thisCache[ name ] ) { return privateCache.events; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( getByName ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, // See jQuery.data for more information id = isNode ? elem[ internalKey ] : internalKey; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } for ( i = 0, l = name.length; i < l; i++ ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject(cache[ id ]) ) { return; } } // Browsers that fail expando deletion also refuse to delete expandos on // the window, but it will allow it on all other JS objects; other browsers // don't care // Ensure that `cache` is not a window object #10080 if ( jQuery.support.deleteExpando || !cache.setInterval ) { delete cache[ id ]; } else { cache[ id ] = null; } // We destroyed the cache and need to eliminate the expando on the node to avoid // false lookups in the cache for entries that no longer exist if ( isNode ) { // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( jQuery.support.deleteExpando ) { delete elem[ internalKey ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } } }, // For internal use only. _data: function( elem, name, data ) { return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando acceptData: function( elem ) { if ( elem.nodeName ) { var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; if ( match ) { return !(match === true || elem.getAttribute("classid") !== match); } } return true; } }); jQuery.fn.extend({ data: function( key, value ) { var parts, part, attr, name, l, elem = this[0], i = 0, data = null; // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { attr = elem.attributes; for ( l = attr.length; i < l; i++ ) { name = attr[i].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.substring(5) ); dataAttr( elem, name, data[ name ] ); } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } parts = key.split( ".", 2 ); parts[1] = parts[1] ? "." + parts[1] : ""; part = parts[1] + "!"; return jQuery.access( this, function( value ) { if ( value === undefined ) { data = this.triggerHandler( "getData" + part, [ parts[0] ] ); // Try to fetch any internally stored data first if ( data === undefined && elem ) { data = jQuery.data( elem, key ); data = dataAttr( elem, key, data ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } parts[1] = value; this.each(function() { var self = jQuery( this ); self.triggerHandler( "setData" + part, parts ); jQuery.data( this, key, value ); self.triggerHandler( "changeData" + part, parts ); }); }, null, value, arguments.length > 1, null, false ); }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : jQuery.isNumeric( data ) ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { for ( var name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function handleQueueMarkDefer( elem, type, src ) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery._data( elem, deferDataKey ); if ( defer && ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { // Give room for hard-coded callbacks to fire first // and eventually mark/queue something else on the element setTimeout( function() { if ( !jQuery._data( elem, queueDataKey ) && !jQuery._data( elem, markDataKey ) ) { jQuery.removeData( elem, deferDataKey, true ); defer.fire(); } }, 0 ); } } jQuery.extend({ _mark: function( elem, type ) { if ( elem ) { type = ( type || "fx" ) + "mark"; jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); } }, _unmark: function( force, elem, type ) { if ( force !== true ) { type = elem; elem = force; force = false; } if ( elem ) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); if ( count ) { jQuery._data( elem, key, count ); } else { jQuery.removeData( elem, key, true ); handleQueueMarkDefer( elem, type, "mark" ); } } }, queue: function( elem, type, data ) { var q; if ( elem ) { type = ( type || "fx" ) + "queue"; q = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !q || jQuery.isArray(data) ) { q = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } } return q || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(), hooks = {}; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } jQuery._data( elem, type + ".run", hooks ); fn.call( elem, function() { jQuery.dequeue( elem, type ); }, hooks ); } if ( !queue.length ) { jQuery.removeData( elem, type + "queue " + type + ".run", true ); handleQueueMarkDefer( elem, type, "queue" ); } } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, object ) { if ( typeof type !== "string" ) { object = type; type = undefined; } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } } while( i-- ) { if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { count++; tmp.add( resolve ); } } resolve(); return defer.promise( object ); } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, getSetAttribute = jQuery.support.getSetAttribute, nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each(function() { // try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch( e ) {} }); }, addClass: function( value ) { var classNames, i, l, elem, setClass, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call(this, j, this.className) ); }); } if ( value && typeof value === "string" ) { classNames = value.split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 ) { if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { setClass = " " + elem.className + " "; for ( c = 0, cl = classNames.length; c < cl; c++ ) { if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { setClass += classNames[ c ] + " "; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { var classNames, i, l, elem, className, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } if ( (value && typeof value === "string") || value === undefined ) { classNames = ( value || "" ).split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { className = (" " + elem.className + " ").replace( rclass, " " ); for ( c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery._data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, self.val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, i, max, option, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options i = one ? index : 0; max = one ? index + 1 : options.length; for ( ; i < max; i++ ) { option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } // Fixes Bug #2551 -- select.val() broken in IE after form.reset() if ( one && !values.length && options.length ) { return jQuery( options[ index ] ).val(); } return values; }, set: function( elem, value ) { var values = jQuery.makeArray( value ); jQuery(elem).find("option").each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { elem.selectedIndex = -1; } return values; } } }, attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // All attributes are lowercase // Grab necessary hook if one is defined if ( notxml ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, "" + value ); return value; } } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return ret === null ? undefined : ret; } }, removeAttr: function( elem, value ) { var propName, attrNames, name, l, isBool, i = 0; if ( value && elem.nodeType === 1 ) { attrNames = value.toLowerCase().split( rspace ); l = attrNames.length; for ( ; i < l; i++ ) { name = attrNames[ i ]; if ( name ) { propName = jQuery.propFix[ name ] || name; isBool = rboolean.test( name ); // See #9699 for explanation of this approach (setting first, then removal) // Do not do this for boolean attributes (see #10870) if ( !isBool ) { jQuery.attr( elem, name, "" ); } elem.removeAttribute( getSetAttribute ? name : propName ); // Set corresponding property to false for boolean attributes if ( isBool && propName in elem ) { elem[ propName ] = false; } } } } }, attrHooks: { type: { set: function( elem, value ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } }, // Use the value property for back compat // Use the nodeHook for button elements in IE6/7 (#1954) value: { get: function( elem, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.get( elem, name ); } return name in elem ? elem.value : null; }, set: function( elem, value, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.set( elem, value, name ); } // Does not return so that setAttribute is also used elem.value = value; } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }, propHooks: { tabIndex: { get: function( elem ) { // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ var attributeNode = elem.getAttributeNode("tabindex"); return attributeNode && attributeNode.specified ? parseInt( attributeNode.value, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } } } }); // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties // Fall back to attribute presence where some booleans are not supported var attrNode, property = jQuery.prop( elem, name ); return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, set: function( elem, value, name ) { var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property propName = jQuery.propFix[ name ] || name; if ( propName in elem ) { // Only set the IDL specifically if it already exists on the element elem[ propName ] = true; } elem.setAttribute( name, name.toLowerCase() ); } return name; } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) { fixSpecified = { name: true, id: true, coords: true }; // Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = jQuery.valHooks.button = { get: function( elem, name ) { var ret; ret = elem.getAttributeNode( name ); return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? ret.nodeValue : undefined; }, set: function( elem, value, name ) { // Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { ret = document.createAttribute( name ); elem.setAttributeNode( ret ); } return ( ret.nodeValue = value + "" ); } }; // Apply the nodeHook to tabindex jQuery.attrHooks.tabindex.set = nodeHook.set; // Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each([ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }); }); // Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { get: nodeHook.get, set: function( elem, value, name ) { if ( value === "" ) { value = "false"; } nodeHook.set( elem, value, name ); } }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { var ret = elem.getAttribute( name, 2 ); return ret === null ? undefined : ret; } }); }); } if ( !jQuery.support.style ) { jQuery.attrHooks.style = { get: function( elem ) { // Return undefined in the case of empty string // Normalize to lowercase since IE uppercases css property names return elem.style.cssText.toLowerCase() || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = "" + value ); } }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { get: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; } }); } // IE6/7 call enctype encoding if ( !jQuery.support.enctype ) { jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { get: function( elem ) { // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; } }; }); } jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }); }); var rformElems = /^(?:textarea|input|select)$/i, rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; }, quickIs = function( elem, m ) { var attrs = elem.attributes || {}; return ( (!m[1] || elem.nodeName.toLowerCase() === m[1]) && (!m[2] || (attrs.id || {}).value === m[2]) && (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) ); }, hoverHack = function( events ) { return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); }; /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { add: function( elem, types, handler, data, selector ) { var elemData, eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, quick, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho) if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first events = elemData.events; if ( !events ) { elemData.events = events = {}; } eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = jQuery.trim( hoverHack(types) ).split( " " ); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = tns[1]; namespaces = ( tns[2] || "" ).split( "." ).sort(); // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: tns[1], data: data, handler: handler, guid: handler.guid, selector: selector, quick: selector && quickParse( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first handlers = events[ type ]; if ( !handlers ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector? special.delegateType : special.bindType ) || type; eventType = events[ type ] || []; origCount = eventType.length; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Remove matching events for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !namespaces || namespaces.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { eventType.splice( j--, 1 ); if ( handleObj.selector ) { eventType.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( eventType.length === 0 && origCount !== eventType.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { handle = elemData.handle; if ( handle ) { handle.elem = null; } // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery.removeData( elem, [ "events", "handle" ], true ); } }, // Events that are safe to short-circuit if no handlers are attached. // Native DOM events should not be added, they may have inline handlers. customEvent: { "getData": true, "setData": true, "changeData": true }, trigger: function( event, data, elem, onlyHandlers ) { // Don't do events on text and comment nodes if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { return; } // Event object or event type var type = event.type || event, namespaces = [], cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "!" ) >= 0 ) { // Exclusive events trigger only for the exact event (no namespaces) type = type.slice(0, -1); exclusive = true; } if ( type.indexOf( "." ) >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { // No jQuery handlers for this event type, and it can't have inline handlers return; } // Caller can pass in an Event, Object, or just an event type string event = typeof event === "object" ? // jQuery.Event object event[ jQuery.expando ] ? event : // Object literal new jQuery.Event( type, event ) : // Just the event type (string) new jQuery.Event( type ); event.type = type; event.isTrigger = true; event.exclusive = exclusive; event.namespace = namespaces.join( "." ); event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; // Handle a global trigger if ( !elem ) { // TODO: Stop taunting the data cache; remove global events and always attach to document cache = jQuery.cache; for ( i in cache ) { if ( cache[ i ].events && cache[ i ].events[ type ] ) { jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); } } return; } // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data != null ? jQuery.makeArray( data ) : []; data.unshift( event ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) eventPath = [[ elem, special.bindType || type ]]; if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; old = null; for ( ; cur; cur = cur.parentNode ) { eventPath.push([ cur, bubbleType ]); old = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( old && old === elem.ownerDocument ) { eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); } } // Fire handlers on the event path for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { cur = eventPath[i][0]; event.type = eventPath[i][1]; handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Note that this is a bare JS function and not a jQuery handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) // IE<9 dies on focus/blur to hidden element (#1486) if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method old = elem[ ontype ]; if ( old ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( old ) { elem[ ontype ] = old; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event || window.event ); var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), delegateCount = handlers.delegateCount, args = [].slice.call( arguments, 0 ), run_all = !event.exclusive && !event.namespace, special = jQuery.event.special[ event.type ] || {}, handlerQueue = [], i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers that should run if there are delegated events // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && !(event.button && event.type === "click") ) { // Pregenerate a single jQuery object for reuse with .is() jqcur = jQuery(this); jqcur.context = this.ownerDocument || this; for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { // Don't process events on disabled elements (#6911, #8165) if ( cur.disabled !== true ) { selMatch = {}; matches = []; jqcur[0] = cur; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; if ( selMatch[ sel ] === undefined ) { selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) ); } if ( selMatch[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } } } } // Add the remaining (directly-bound) handlers if ( handlers.length > delegateCount ) { handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); } // Run delegates first; they may want to stop propagation beneath us for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { matched = handlerQueue[ i ]; event.currentTarget = matched.elem; for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { handleObj = matched.matches[ j ]; // Triggered event must either 1) be non-exclusive and have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { event.data = handleObj.data; event.handleObj = handleObj; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, // Includes some event props shared by KeyEvent and MouseEvent // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, originalEvent = event, fixHook = jQuery.event.fixHooks[ event.type ] || {}, copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = jQuery.Event( originalEvent ); for ( i = copy.length; i; ) { prop = copy[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Target should not be a text node (#504, Safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) if ( event.metaKey === undefined ) { event.metaKey = event.ctrlKey; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady }, load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( jQuery.isWindow( this ) ) { this.onbeforeunload = eventHandle; } }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. jQuery.event.handle = jQuery.event.dispatch; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var target = this, related = event.relatedTarget, handleObj = event.handleObj, selector = handleObj.selector, ret; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !form._submit_attached ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); form._submit_attached = true; } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; jQuery.event.simulate( "change", this, event, true ); } }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); elem._change_attached = true; } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // && selector != null // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event var handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( var type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function( event ) { // Figure out which function to execute var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; }; // link all the functions, so any of them can unbind this click handler toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler ); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); jQuery.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( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { if ( fn == null ) { fn = data; data = null; } return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } if ( rkeyEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; } if ( rmouseEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; } }); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rReturn = /\r\n/g, rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { baseHasDuplicate = false; return 0; }); var Sizzle = function( selector, context, results, seed ) { results = results || []; context = context || document; var origContext = context; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML( context ), parts = [], soFar = selector; // Reset the position of the chunker regexp (start from head) do { chunker.exec( "" ); m = chunker.exec( soFar ); if ( m ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } } while ( m ); if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context, seed ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set, seed ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray( set ); } else { prune = false; } while ( parts.length ) { cur = parts.pop(); pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function( results ) { if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort( sortOrder ); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[ i - 1 ] ) { results.splice( i--, 1 ); } } } } return results; }; Sizzle.matches = function( expr, set ) { return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { var set, i, len, match, type, left; if ( !expr ) { return []; } for ( i = 0, len = Expr.order.length; i < len; i++ ) { type = Expr.order[i]; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { left = match[1]; match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( "*" ) : []; } return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { var match, anyFound, type, found, item, filter, left, i, pass, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); while ( expr && set.length ) { for ( type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { filter = Expr.filter[ type ]; left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); pass = not ^ found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Utility function for retreiving the text value of an array of DOM nodes * @param {Array|Element} elem */ var getText = Sizzle.getText = function( elem ) { var i, node, nodeType = elem.nodeType, ret = ""; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent || innerText for elements if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { // Replace IE's carriage returns return elem.innerText.replace( rReturn, '' ); } else { // Traverse it's children for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { // If no nodeType, this is expected to be an array for ( i = 0; (node = elem[i]); i++ ) { // Do not traverse comment nodes if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); }, type: function( elem ) { return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function( checkSet, part ) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); }, "~": function( checkSet, part, isXML ) { var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); } }, find: { ID: function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }, NAME: function( match, context ) { if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName( match[1] ); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function( match, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( match[1] ); } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function( match ) { return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { if ( !match[2] ) { Sizzle.error( match[0] ); } match[2] = match[2].replace(/^\+|\s*/g, ''); // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } else if ( match[2] ) { Sizzle.error( match[0] ); } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function( match, curLoop, inplace, result, not ) { if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function( match ) { match.unshift( true ); return match; } }, filters: { enabled: function( elem ) { return elem.disabled === false && elem.type !== "hidden"; }, disabled: function( elem ) { return elem.disabled === true; }, checked: function( elem ) { return elem.checked === true; }, selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, parent: function( elem ) { return !!elem.firstChild; }, empty: function( elem ) { return !elem.firstChild; }, has: function( elem, i, match ) { return !!Sizzle( match[3], elem ).length; }, header: function( elem ) { return (/h\d/i).test( elem.nodeName ); }, text: function( elem ) { var attr = elem.getAttribute( "type" ), type = elem.type; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, radio: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, password: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); }, focus: function( elem ) { return elem === elem.ownerDocument.activeElement; } }, setFilters: { first: function( elem, i ) { return i === 0; }, last: function( elem, i, match, array ) { return i === array.length - 1; }, even: function( elem, i ) { return i % 2 === 0; }, odd: function( elem, i ) { return i % 2 === 1; }, lt: function( elem, i, match ) { return i < match[3] - 0; }, gt: function( elem, i, match ) { return i > match[3] - 0; }, nth: function( elem, i, match ) { return match[3] - 0 === i; }, eq: function( elem, i, match ) { return match[3] - 0 === i; } }, filter: { PSEUDO: function( elem, match, i, array ) { var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var j = 0, l = not.length; j < l; j++ ) { if ( not[j] === elem ) { return false; } } return true; } else { Sizzle.error( name ); } }, CHILD: function( elem, match ) { var first, last, doneName, parent, cache, count, diff, type = match[1], node = elem; switch ( type ) { case "only": case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; /* falls through */ case "last": while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case "nth": first = match[2]; last = match[3]; if ( first === 1 && last === 0 ) { return true; } doneName = match[0]; parent = elem.parentNode; if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent[ expando ] = doneName; } diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function( elem, match ) { return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function( elem, match ) { return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; }, CLASS: function( elem, match ) { return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function( elem, match ) { var name = match[1], result = Sizzle.attr ? Sizzle.attr( elem, name ) : Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : !type && Sizzle.attr ? result != null : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function( elem, match, i, array ) { var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS, fescape = function(all, num){ return "\\" + (num - 0 + 1); }; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } // Expose origPOS // "global" as in regardless of relation to brackets/parens Expr.match.globalPOS = origPOS; var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { makeArray = function( array, results ) { var i = 0, ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( ; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; }; } else { sortOrder = function( a, b ) { // The nodes are identical, we can exit early if ( a === b ) { hasDuplicate = true; return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes } else if ( a.sourceIndex && b.sourceIndex ) { return a.sourceIndex - b.sourceIndex; } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; // If the nodes are siblings (or identical) we can do a quick check if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if ( !aup ) { return -1; } else if ( !bup ) { return 1; } // Otherwise they're somewhere else in the tree so we need // to build up a full list of the parentNodes for comparison while ( cur ) { ap.unshift( cur ); cur = cur.parentNode; } cur = bup; while ( cur ) { bp.unshift( cur ); cur = cur.parentNode; } al = ap.length; bl = bp.length; // Start walking down the tree looking for a discrepancy for ( var i = 0; i < al && i < bl; i++ ) { if ( ap[i] !== bp[i] ) { return siblingCheck( ap[i], bp[i] ); } } // We ended someplace up the tree so do a sibling check return i === al ? siblingCheck( a, bp[i], -1 ) : siblingCheck( ap[i], b, 1 ); }; siblingCheck = function( a, b, ret ) { if ( a === b ) { return ret; } var cur = a.nextSibling; while ( cur ) { if ( cur === b ) { return -1; } cur = cur.nextSibling; } return 1; }; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function( elem, match ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); // release memory in IE root = form = null; })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function( match, context ) { var results = context.getElementsByTagName( match[1] ); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function( elem ) { return elem.getAttribute( "href", 2 ); }; } // release memory in IE div = null; })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

        "; // Safari can't handle uppercase or unicode characters when // in quirks mode. if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function( query, context, extra, seed ) { context = context || document; // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && !Sizzle.isXML(context) ) { // See if we find a selector to speed up var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { // Speed-up: Sizzle("TAG") if ( match[1] ) { return makeArray( context.getElementsByTagName( query ), extra ); // Speed-up: Sizzle(".CLASS") } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { return makeArray( context.getElementsByClassName( match[2] ), extra ); } } if ( context.nodeType === 9 ) { // Speed-up: Sizzle("body") // The body element only exists once, optimize finding it if ( query === "body" && context.body ) { return makeArray( [ context.body ], extra ); // Speed-up: Sizzle("#ID") } else if ( match && match[3] ) { var elem = context.getElementById( match[3] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id === match[3] ) { return makeArray( [ elem ], extra ); } } else { return makeArray( [], extra ); } } try { return makeArray( context.querySelectorAll(query), extra ); } catch(qsaError) {} // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { var oldContext = context, old = context.getAttribute( "id" ), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test( query ); if ( !old ) { context.setAttribute( "id", nid ); } else { nid = nid.replace( /'/g, "\\$&" ); } if ( relativeHierarchySelector && hasParent ) { context = context.parentNode; } try { if ( !relativeHierarchySelector || hasParent ) { return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); } } catch(pseudoError) { } finally { if ( !old ) { oldContext.removeAttribute( "id" ); } } } } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } // release memory in IE div = null; })(); } (function(){ var html = document.documentElement, matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9 fails this) var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), pseudoWorks = false; try { // This should fail with an exception // Gecko does not error, returns false instead matches.call( document.documentElement, "[test!='']:sizzle" ); } catch( pseudoError ) { pseudoWorks = true; } Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { var ret = matches.call( node, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || !disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9, so check for that node.document && node.document.nodeType !== 11 ) { return ret; } } } catch(e) {} } return Sizzle(expr, null, null, [node]).length > 0; }; } })(); (function(){ var div = document.createElement("div"); div.innerHTML = "
        "; // Opera can't find a second classname (in 9.6) // Also, make sure that getElementsByClassName actually exists if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { return; } // Safari caches class attributes, doesn't catch changes (in 3.2) div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) { return; } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function( match, context, isXML ) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; // release memory in IE div = null; })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem[ expando ] = doneName; elem.sizset = i; } if ( elem.nodeName.toLowerCase() === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem[ expando ] = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } if ( document.documentElement.contains ) { Sizzle.contains = function( a, b ) { return a !== b && (a.contains ? a.contains(b) : true); }; } else if ( document.documentElement.compareDocumentPosition ) { Sizzle.contains = function( a, b ) { return !!(a.compareDocumentPosition(b) & 16); }; } else { Sizzle.contains = function() { return false; }; } Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; var posProcess = function( selector, context, seed ) { var match, tmpSet = [], later = "", root = context.nodeType ? [context] : context; // Position selectors must be done after the filter // And so must :not(positional) so we move all PSEUDOs to the end while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet, seed ); } return Sizzle.filter( later, tmpSet ); }; // EXPOSE // Override sizzle attribute retrieval Sizzle.attr = jQuery.attr; Sizzle.selectors.attrMap = {}; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, // Note: This RegExp should be improved, or likely pulled from Sizzle rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, POS = jQuery.expr.match.globalPOS, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend({ find: function( selector ) { var self = this, i, l; if ( typeof selector !== "string" ) { return jQuery( selector ).filter(function() { for ( i = 0, l = self.length; i < l; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }); } var ret = this.pushStack( "", "find", selector ), length, n, r; for ( i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique for ( n = length; n < ret.length; n++ ) { for ( r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; } } } } } return ret; }, has: function( target ) { var targets = jQuery( target ); return this.filter(function() { for ( var i = 0, l = targets.length; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector, false), "not", selector); }, filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, is: function( selector ) { return !!selector && ( typeof selector === "string" ? // If this is a positional selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". POS.test( selector ) ? jQuery( selector, this.context ).index( this[0] ) >= 0 : jQuery.filter( selector, this ).length > 0 : this.filter( selector ).length > 0 ); }, closest: function( selectors, context ) { var ret = [], i, l, cur = this[0]; // Array (deprecated as of jQuery 1.7) if ( jQuery.isArray( selectors ) ) { var level = 1; while ( cur && cur.ownerDocument && cur !== context ) { for ( i = 0; i < selectors.length; i++ ) { if ( jQuery( cur ).is( selectors[ i ] ) ) { ret.push({ selector: selectors[ i ], elem: cur, level: level }); } } cur = cur.parentNode; level++; } return ret; } // String var pos = POS.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( i = 0, l = this.length; i < l; i++ ) { cur = this[i]; while ( cur ) { if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { ret.push( cur ); break; } else { cur = cur.parentNode; if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { break; } } } } ret = ret.length > 1 ? jQuery.unique( ret ) : ret; return this.pushStack( ret, "closest", selectors ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context ) : jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? all : jQuery.unique( all ) ); }, andSelf: function() { return this.add( this.prevObject ); } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return jQuery.nth( elem, 2, "nextSibling" ); }, prev: function( elem ) { return jQuery.nth( elem, 2, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray( elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( !runtil.test( name ) ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } return this.pushStack( ret, name, slice.call( arguments ).join(",") ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, nth: function( cur, result, dir, elem ) { result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType === 1 && ++num === result ) { break; } } return cur; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { // Can't pass null or undefined to indexOf in Firefox 4 // Set to 0 to skip string check qualifier = qualifier || 0; if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { var retVal = !!qualifier.call( elem, i, elem ); return retVal === keep; }); } else if ( qualifier.nodeType ) { return jQuery.grep(elements, function( elem, i ) { return ( elem === qualifier ) === keep; }); } else if ( typeof qualifier === "string" ) { var filtered = jQuery.grep(elements, function( elem ) { return elem.nodeType === 1; }); if ( isSimple.test( qualifier ) ) { return jQuery.filter(qualifier, filtered, !keep); } else { qualifier = jQuery.filter( qualifier, filtered ); } } return jQuery.grep(elements, function( elem, i ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; }); } function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rtagName = /<([\w:]+)/, rtbody = /]", "i"), // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rscriptType = /\/(java|ecma)script/i, rcleanScript = /^\s*", "" ], legend: [ 1, "
        ", "
        " ], thead: [ 1, "", "
        " ], tr: [ 2, "", "
        " ], td: [ 3, "", "
        " ], col: [ 2, "", "
        " ], area: [ 1, "", "" ], _default: [ 0, "", "" ] }, safeFragment = createSafeFragment( document ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // IE can't serialize and ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/templates/admin/frame/index.html ================================================
        ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/templates/admin/frame/nav.html ================================================ ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/templates/admin/frame/sider_bar_bk.html ================================================ ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/templates/admin/order/order_content_wrap.html ================================================
        订单管理
        序号 订单编号 服务名称 服务商 服务时长 状态 提交时间 操作
        1 201604031212 网站漏洞扫描 dell 1年 正常 2016-04-03 详情处理续订
        1 201604031212 网站漏洞扫描 dell 1年 未支付 2016-04-03 详情处理续订
        1 201604031212 网站漏洞扫描 dell 1年 正常 2016-04-03 详情处理续订
        ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/templates/admin/order/order_list.html ================================================
        ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/templates/admin/user/user_center.html ================================================
        ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/templates/admin/user/user_content_wrap.html ================================================
        账户中心
        基本信息[修改]
        安全设置
        ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/resources/templates/login.html ================================================ 运营系统登录页 ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/webapp/WEB-INF/web.xml ================================================ Archetype Created Web Application ================================================ FILE: src/taoshop-manager/taoshop-manager-web/src/main/webapp/index.jsp ================================================

        Hello World!

        ================================================ FILE: src/taoshop-order/ReadMe.md ================================================ ### 订单系统 ================================================ FILE: src/taoshop-order/pom.xml ================================================ taoshop com.muses.taoshop 1.0-SNAPSHOT 4.0.0 taoshop-order 1.0-SNAPSHOT war taoshop-order Maven Webapp http://www.example.com UTF-8 1.7 1.7 junit junit 4.11 test taoshop-order maven-clean-plugin 3.0.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.7.0 maven-surefire-plugin 2.20.1 maven-war-plugin 3.2.0 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2 ================================================ FILE: src/taoshop-order/src/main/java/com/muses/taoshop/order/OrderApplication.java ================================================ package com.muses.taoshop.order; import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.cache.annotation.EnableCaching; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.EnableTransactionManagement; /** * *
         *  SpringBoot启动配置类
         * 
        * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期:     修改内容:
         * 
        */ @Controller @EnableScheduling//开启对计划任务的支持 @EnableTransactionManagement//开启对事务管理配置的支持 @EnableCaching @EnableAsync//开启对异步方法的支持 @EnableAutoConfiguration @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class}) public class OrderApplication { public static void main(String[] args) throws Exception{ SpringApplication.run(OrderApplication.class, args); } } ================================================ FILE: src/taoshop-order/src/main/java/com/muses/taoshop/order/web/controller/BaseController.java ================================================ package com.muses.taoshop.order.web.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; /** *
         *  基础控制类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.18 00:12    修改内容:
         * 
        */ public class BaseController { public Logger log = LoggerFactory.getLogger(BaseController.class); public void debug(String message , Exception e){ log.debug(message , e); } public void info(String message,Exception e){ log.info(message , e); } public void error(String message,Exception e){ log.error(message , e); } /*** * 获取request值 * @return */ public HttpServletRequest getRequest() { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } /** * 得到ModelAndView */ public ModelAndView getModelAndView(){ return new ModelAndView(); } } ================================================ FILE: src/taoshop-order/src/main/java/com/muses/taoshop/order/web/controller/OrderController.java ================================================ package com.muses.taoshop.order.web.controller; import org.springframework.stereotype.Controller; /** *
         *  订单控制类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.10.22 23:50    修改内容:
         * 
        */ @Controller public class OrderController { } ================================================ FILE: src/taoshop-order/src/main/resources/application.yml ================================================ server: port: 8082 #logging: # config: classpath:logback_spring.xml # level: # com.muses.taoshop: debug # path: /data/logs spring: datasource: # 主数据源 shop: url: jdbc:mysql://127.0.0.1:3306/taoshop?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 连接池设置 druid: initial-size: 5 min-idle: 5 max-active: 20 # 配置获取连接等待超时的时间 max-wait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 time-between-eviction-runs-millis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 min-evictable-idle-time-millis: 300000 # Oracle请使用select 1 from dual validation-query: SELECT 'x' test-while-idle: true test-on-borrow: false test-on-return: false # 打开PSCache,并且指定每个连接上PSCache的大小 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多个DruidDataSource的监控数据 use-global-data-source-stat: true # jpa: # database: mysql # hibernate: # show_sql: true # format_sql: true # ddl-auto: none # naming: # physical-strategy: org.hibernate.boot.entity.naming.PhysicalNamingStrategyStandardImpl # mvc: # view: # prefix: /WEB-INF/jsp/ # suffix: .jsp #添加Thymeleaf配置 thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html mode: HTML5 encoding: UTF-8 content-type: text/html #Jedis配置 # jedis : # pool : # host : 127.0.0.1 # port : 6379 # password : redispassword # timeout : 0 # config : # maxTotal : 100 # maxIdle : 10 # maxWaitMillis : 100000 ================================================ FILE: src/taoshop-order/src/main/webapp/WEB-INF/web.xml ================================================ Archetype Created Web Application ================================================ FILE: src/taoshop-order/src/main/webapp/index.jsp ================================================

        Hello World!

        ================================================ FILE: src/taoshop-portal/ReadMe.md ================================================ ### 门户网站 电商系统门户网站 电商门户网站,正在开发中... 技术栈:前端拟采用Themeleaf,后台SpringBoot ================================================ FILE: src/taoshop-portal/pom.xml ================================================ taoshop com.muses.taoshop 1.0-SNAPSHOT 4.0.0 taoshop-portal war taoshop-portal Maven Webapp http://www.example.com 3.7 3.4.1 UTF-8 org.springframework.boot spring-boot-devtools true org.springframework.boot spring-boot-starter-logging org.springframework.boot spring-boot-starter-thymeleaf com.muses.taoshop.provider taoshop-provider-item 1.0-SNAPSHOT com.muses.taoshop.provider taoshop-provider-usc 1.0-SNAPSHOT com.muses.taoshop.common taoshop-common-core 1.0-SNAPSHOT org.apache.poi poi ${poi.version} com.sun.mail javax.mail 1.5.6 org.jasig.cas.client cas-client-core ${cas.client.version} src/main/java **/*.xml true org.apache.maven.plugins maven-compiler-plugin 3.6.1 1.8 1.8 1.8 UTF-8 org.projectlombok lombok ${lombok.version} org.apache.maven.plugins maven-resources-plugin 3.0.2 UTF-8 ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/PortalApplication.java ================================================ package com.muses.taoshop; import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; import org.springframework.boot.*; import org.springframework.boot.autoconfigure.*; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.*; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.bind.annotation.*; /** * *
         *  SpringBoot启动配置类
         * 
        * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期:     修改内容:
         * 
        */ @Controller @EnableScheduling//开启对计划任务的支持 @EnableTransactionManagement//开启对事务管理配置的支持 @EnableCaching @EnableAsync//开启对异步方法的支持 @EnableAutoConfiguration @ServletComponentScan @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class}) public class PortalApplication { @RequestMapping("/") @ResponseBody String home() { return "portal web!"; } @RequestMapping("/doTest") @ResponseBody String doTest(){ System.out.println(Thread.currentThread().getName()); String threadName = Thread.currentThread().getName(); return threadName; } public static void main(String[] args) throws Exception { SpringApplication.run(PortalApplication.class, args); } } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/aop/OperationRecordLog.java ================================================ //package com.muses.taoshop.aop; // //import org.aspectj.lang.ProceedingJoinPoint; //import org.aspectj.lang.annotation.Around; //import org.aspectj.lang.annotation.Aspect; //import org.springframework.beans.factory.annotation.Autowired; //import org.springframework.stereotype.Component; // // // //@Component //@Aspect //public class OperationRecordLog { // // @Autowired // //private SystemService systemService; // // @Around(value = "execution(* org.springframework.orm.ibatis.SqlMapClientTemplate.delete(..)) or execution(* org.springframework.orm.ibatis.SqlMapClientTemplate.insert(..)) or execution(* org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(..)) or execution(* org.springframework.orm.ibatis.SqlMapClientTemplate.queryForMap(..)) or execution(* org.springframework.orm.ibatis.SqlMapClientTemplate.queryForObject(..)) or execution(* org.springframework.orm.ibatis.SqlMapClientTemplate.queryWithRowHandler(..)) or execution(* org.springframework.orm.ibatis.SqlMapClientTemplate.update(..))") // public Object exec(ProceedingJoinPoint invocation) throws Throwable { // Object result = invocation.proceed(); // Object[] args = invocation.getArgs(); // if (args.length > 0) { // if (!args[0].toString().equals("system.saveSqlOperationRecord")) { // try { // if (args.length>1) { // //systemService.saveSqlOperationRecord(args[0].toString(), args[1]); // } else { // //systemService.saveSqlOperationRecord(args[0].toString(), ""); // } // } catch (Exception e) { // e.printStackTrace(); // } // } // } // return result; // } // //} ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/base/ConfigConsts.java ================================================ package com.muses.taoshop.base; /** *
         *  配置相关常量类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.09.23 16:30    修改内容:
         * 
        */ public class ConfigConsts { } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/base/SessionConsts.java ================================================ package com.muses.taoshop.base; /** *
         *  会话常量类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.09.23 22:54    修改内容:
         * 
        */ public class SessionConsts { /** * 用户信息会话 */ public static final String PORTAL_SESSION_USER = "potalSessionUser"; /** * 验证码信息会话 */ public static final String SESSION_SECURITY_CODE = "sessionSecurityCode"; } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/base/ViewNameConsts.java ================================================ package com.muses.taoshop.base; /** *
         *  ModeAndView的viewName配置
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.09.23 22:47    修改内容:
         * 
        */ public class ViewNameConsts { } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/config/WebConfig.java ================================================ package com.muses.taoshop.config; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Configuration; import org.springframework.util.ResourceUtils; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @EnableWebMvc @Configuration @MapperScan("com.muese.taoshop.**.mapper*") public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/templates/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/templates/"); registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/"); super.addResourceHandlers(registry); } /* @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(new MybatisSqlInterceptor()); super.addInterceptors(registry); }*/ } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/util/CategoryTreeUtils.java ================================================ package com.muses.taoshop.util; import com.muses.taoshop.item.entity.ItemCategory; import javax.mail.FetchProfile; import java.util.ArrayList; import java.util.List; /** *
         *  构造一棵品类树
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.24 17:12    修改内容:
         * 
        */ public class CategoryTreeUtils { public List commonCategorys; public List list = new ArrayList(); public List buildCategoryTree(List categories ) { this.commonCategorys = categories; for (ItemCategory c : categories){ ItemCategory category = new ItemCategory(); if(c.getSjid() == 0){ category.setSjid(c.getSjid()); category.setId(c.getId()); category.setCategoryName(c.getCategoryName()); category.setSubCategorys(treeChild(c.getId())); list.add(category); } } return list; } public List treeChild(long id){ List list = new ArrayList(); for(ItemCategory c : commonCategorys){ ItemCategory category = new ItemCategory(); if(c.getSjid() == id){ category.setSjid(c.getSjid()); category.setId(c.getId()); category.setCategoryName(c.getCategoryName()); category.setSubCategorys(treeChild(c.getId()));//递归循环 list.add(category); } } return list; } } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/web/controller/BaseController.java ================================================ package com.muses.taoshop.web.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; /** *
         *  基础控制类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.18 00:12    修改内容:
         * 
        */ public class BaseController { public Logger log = LoggerFactory.getLogger(getClass()); public void debug(String message){ log.debug(message); } public void debug(String message , Exception e){ log.debug(message , e); } public void info(String message) { log.info(message); } public void info(String message,Exception e){ log.info(message , e); } public void error(String message) { log.error(message); } public void error(String message,Exception e){ log.error(message , e); } /*** * 获取request值 * @return */ public HttpServletRequest getRequest() { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } /** * 得到ModelAndView */ public ModelAndView getModelAndView(){ return new ModelAndView(); } } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/web/controller/CodeController.java ================================================ package com.muses.taoshop.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Random; import static com.muses.taoshop.base.SessionConsts.SESSION_SECURITY_CODE; @Controller @RequestMapping("/code") public class CodeController { @RequestMapping("/generate") public void generate(HttpServletRequest request, HttpServletResponse response){ ByteArrayOutputStream output = new ByteArrayOutputStream(); String code = drawImg(output); // Subject currentUser = SecurityUtils.getSubject(); // Session session = currentUser.getSession(); HttpSession session = request.getSession(); session.setAttribute(SESSION_SECURITY_CODE, code); try { ServletOutputStream out = response.getOutputStream(); output.writeTo(out); } catch (IOException e) { e.printStackTrace(); } } /** * 绘画验证码 * @param output * @return */ private String drawImg(ByteArrayOutputStream output){ String code = ""; //随机产生4个字符 for(int i=0; i<4; i++){ code += randomChar(); } int width = 70; int height = 25; BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR); Font font = new Font("Times New Roman",Font.PLAIN,20); //调用Graphics2D绘画验证码 Graphics2D g = bi.createGraphics(); g.setFont(font); Color color = new Color(66,2,82); g.setColor(color); g.setBackground(new Color(226,226,240)); g.clearRect(0, 0, width, height); FontRenderContext context = g.getFontRenderContext(); Rectangle2D bounds = font.getStringBounds(code, context); double x = (width - bounds.getWidth()) / 2; double y = (height - bounds.getHeight()) / 2; double ascent = bounds.getY(); double baseY = y - ascent; g.drawString(code, (int)x, (int)baseY); g.dispose(); try { ImageIO.write(bi, "jpg", output); } catch (IOException e) { e.printStackTrace(); } return code; } /** * 随机参数一个字符 * @return */ private char randomChar(){ Random r = new Random(); String s = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789"; return s.charAt(r.nextInt(s.length())); } /** * 获取随机颜色值 * @param fc * @param bc * @return */ Color getRandColor(int fc,int bc){ Random random=new Random(); if(fc>255) fc=255; if(bc>255) bc=255; int r=fc+random.nextInt(bc-fc); int g=fc+random.nextInt(bc-fc); int b=fc+random.nextInt(bc-fc); return new Color(r,g,b); } } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/web/controller/LoginController.java ================================================ package com.muses.taoshop.web.controller; import com.muses.taoshop.user.entity.User; import com.muses.taoshop.user.service.IUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.util.HashMap; import java.util.Map; import static com.muses.taoshop.base.SessionConsts.PORTAL_SESSION_USER; import static com.muses.taoshop.base.SessionConsts.SESSION_SECURITY_CODE; /** *
         *  登录控制类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.08.05 11:41    修改内容:
         * 
        */ @Controller @RequestMapping("/portal") public class LoginController extends BaseController{ @Autowired IUserService userService; /** * 跳转到登录页面 * @return */ @GetMapping(value = "/toLogin") public ModelAndView toLogin(){ ModelAndView mv = this.getModelAndView(); mv.setViewName("login"); return mv; } /** * 登录验证 * @return */ @RequestMapping(value = "/loginCheck") @ResponseBody public Map loginCheck(HttpServletRequest request){ Map result = new HashMap(); String flag = "faild"; String logindata[] = request.getParameter("LOGINDATA").split(","); HttpSession session = request.getSession(); if(logindata != null && logindata.length == 3) { String codeSession = (String)session.getAttribute(SESSION_SECURITY_CODE); String username = logindata[0]; String password = logindata[1]; String code = logindata[2]; //先不要验证码校验 //if(!code.equalsIgnoreCase(codeSession)){//验证码校验 // flag = "codeError"; //}else{ //账号密码校验 User user = userService.loginCheck(username, password); if(user != null){//校验成功 session.setAttribute(PORTAL_SESSION_USER,username); flag = "success"; }else{//账号或者密码错误 flag = "faild"; } //} } result.put("flag",flag); return result; } } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/web/controller/cart/ShopCartController.java ================================================ package com.muses.taoshop.web.controller.cart; import com.muses.taoshop.web.controller.BaseController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** *
         *  购物车控制类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.17 00:46    修改内容:
         * 
        */ @Controller @RequestMapping("/portal/shopcart") public class ShopCartController extends BaseController{ /** * 添加购物车成功 * @return */ @GetMapping(value = "/toAddSuccess") public ModelAndView toAddSuccess() { ModelAndView mv = this.getModelAndView(); mv.setViewName("/shopcart/add_shopcart_success"); return mv; } } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/web/controller/portal/IndexController.java ================================================ package com.muses.taoshop.web.controller.portal; import com.alibaba.fastjson.JSON; import com.muses.taoshop.item.entity.ItemBrand; import com.muses.taoshop.item.entity.ItemCategory; import com.muses.taoshop.item.entity.ItemPortal; import com.muses.taoshop.item.service.IItemBrankService; import com.muses.taoshop.item.service.IItemCategoryService; import com.muses.taoshop.item.service.IItemService; import com.muses.taoshop.util.CategoryTreeUtils; import com.muses.taoshop.web.controller.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import java.util.List; /** *
         *  门户网站控制类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期:     修改内容:
         * 
        */ @Controller @RequestMapping("/portal") public class IndexController extends BaseController{ @Autowired IItemService iItemService; @Autowired IItemBrankService iItemBrankService; @Autowired IItemCategoryService iItemCategoryService; /** * 跳转到门户网站 * @return */ @GetMapping(value = "/toIndex.do") public ModelAndView toIndex(){ info("跳转到门户网站"); ModelAndView mv = this.getModelAndView(); mv.setViewName("index"); List items = iItemService.listItemPortal(); CategoryTreeUtils treeUtil = new CategoryTreeUtils(); List list = iItemCategoryService.listCategory(); List categories = treeUtil.buildCategoryTree(list); mv.addObject("items" , items); mv.addObject("categories" , categories); return mv; } @GetMapping(value = "/doTest") @ResponseBody public String doTest(){ List itemBrands = iItemBrankService.listItemBrand(); String str = JSON.toJSON(itemBrands).toString(); return str; } /** * 加载root级商品品类 * @return */ @GetMapping(value = "/listCategory" , produces = "application/json;charset=UTF-8") @ResponseBody public String listCategory(){ CategoryTreeUtils treeUtil = new CategoryTreeUtils(); List list = iItemCategoryService.listCategory(); List categories = treeUtil.buildCategoryTree(list); String jsonString = ""; if(!CollectionUtils.isEmpty(categories)){ jsonString = JSON.toJSON(categories).toString(); log.debug("get category info:"+jsonString); return jsonString; } return jsonString; } } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/web/controller/portal/ItemCategoryController.java ================================================ package com.muses.taoshop.web.controller.portal; import com.muses.taoshop.item.entity.ItemList; import com.muses.taoshop.item.service.IItemCategoryService; import com.muses.taoshop.web.controller.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import java.util.List; /** *
         *  商品品类控制类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.10.27 11:53    修改内容:
         * 
        */ @Controller @RequestMapping(value = "/portal/category") public class ItemCategoryController extends BaseController{ @Autowired IItemCategoryService iItemCategoryService; /** * 根据品类id检索商品信息 * @param categoryId * @return */ @GetMapping(value = "/toCategoryList/{categoryId}") public ModelAndView toCategoryList(@PathVariable("categoryId")int categoryId) { ModelAndView mv = this.getModelAndView(); mv.setViewName("item/item_category"); List items = iItemCategoryService.listItemByCategoryId(categoryId); mv.addObject("items", items); return mv; } } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/web/controller/portal/ItemDetailController.java ================================================ package com.muses.taoshop.web.controller.portal; import com.muses.taoshop.item.entity.ItemDetail; import com.muses.taoshop.item.entity.ItemSpec; import com.muses.taoshop.item.entity.ItemSpecValue; import com.muses.taoshop.item.service.IItemService; import com.muses.taoshop.item.service.IItemSpecService; import com.muses.taoshop.web.controller.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import java.util.List; /** *
         *  商品详情页面控制类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.07.01 19:40    修改内容:
         * 
        */ @Controller @RequestMapping("/portal/item") public class ItemDetailController extends BaseController{ @Autowired IItemService iItemService; @Autowired IItemSpecService iItemSpecService; @GetMapping("/toDetail/{spuId}/{skuId}") public ModelAndView toDetail(@PathVariable int spuId, @PathVariable int skuId){ ModelAndView mv = this.getModelAndView(); ItemDetail itemDetail = iItemService.getItemDetailInfo(spuId); List itemSpecList = iItemSpecService.getSpecBySpuId(spuId); List itemSpecValueList = iItemSpecService.getSpecValueBySkuId(skuId); mv.addObject("itemDetail", itemDetail); mv.addObject("itemSpec", itemSpecList); mv.addObject("itemSpecValue", itemSpecValueList); mv.setViewName("item/item_detail"); return mv; } } ================================================ FILE: src/taoshop-portal/src/main/java/com/muses/taoshop/web/controller/user/UserController.java ================================================ package com.muses.taoshop.web.controller.user; import com.muses.taoshop.web.controller.BaseController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** *
         *  用户中心控制类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.08.11 11:08    修改内容:
         * 
        */ @RequestMapping("/portal/user") @Controller public class UserController extends BaseController{ /** * 跳转用户中心 * @return */ @GetMapping("/toUserCenter") public ModelAndView toUserCenter(){ ModelAndView mv = this.getModelAndView(); mv.setViewName("user/portal_user_center"); return mv; } } ================================================ FILE: src/taoshop-portal/src/main/resources/application-dev.properties ================================================ ##Դ #spring.datasource.shop.url=jdbc:mysql://localhost:3306/taoshop #spring.datasource.shop.username=root #spring.datasource.shop.password=root #spring.datasource.driver-class-name=com.mysql.jdbc.Driver #spring.datasource.type=com.alibaba.druid.pool.DruidDataSource ### Mybatis #mybatis.typeAliasesPackage=cn.muses.taoshop.entity #mybatis.mapperLocations=classpath:mapper/*.xml ================================================ FILE: src/taoshop-portal/src/main/resources/application-prod.properties ================================================ ##Դ #spring.datasource.url=jdbc:mysql://localhost:3306/taoshop #spring.datasource.username=root #spring.datasource.password=root #spring.datasource.driver-class-name=com.mysql.jdbc.Driver ### Mybatis #mybatis.typeAliasesPackage=cn.muses.taoshop.entity #mybatis.mapperLocations=classpath:mapper/*.xml ================================================ FILE: src/taoshop-portal/src/main/resources/application-uat.properties ================================================ ##Դ #spring.datasource.url=jdbc:mysql://localhost:3306/taoshop #spring.datasource.username=root #spring.datasource.password=root #spring.datasource.driver-class-name=com.mysql.jdbc.Driver ### Mybatis #mybatis.typeAliasesPackage=cn.muses.taoshop.entity #mybatis.mapperLocations=classpath:mapper/*.xml ================================================ FILE: src/taoshop-portal/src/main/resources/application.properties ================================================ ##server #server.port=8081 # ##logging ##logging.config=classpath:logback-spring.xml ##logging.level.com.muses.taoshop.*.mybatis: debug # ## datasource #spring.datasource.url=jdbc:mysql://127.0.0.1/taoshop?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true #spring.datasource.username=root #spring.datasource.password=root #spring.datasource.driver-class-name=com.mysql.jdbc.Driver #spring.datasource.type=com.alibaba.druid.pool.DruidDataSource ## ӳ #spring.datasource.druid.initial-size=5 #spring.datasource.druid.min-idle=5 #spring.datasource.druid.max-active=20 ## ûȡӵȴʱʱ #spring.datasource.druid.max-wait=60000 ## üòŽһμ⣬ҪرյĿӣλǺ #spring.datasource.druid.time-between-eviction-runs-millis=60000 ## һڳСʱ䣬λǺ #spring.datasource.druid.min-evictable-idle-time-millis=300000 ## Oracleʹselect 1 from dual #spring.datasource.druid.validation-query=SELECT 'X' #spring.datasource.druid.test-while-idle=true #spring.datasource.druid.test-on-borrow=false # # #spring.thymeleaf.prefix=classpath:/templates/ #spring.thymeleaf.suffix=.html #spring.thymeleaf.mode=HTML5 #spring.thymeleaf.encoding=UTF-8 #spring.thymeleaf.content-type=text/html #spring.thymeleaf.cache=false #spring.resources.chain.strategy.content.enabled=true #spring.resources.chain.strategy.content.paths=/** ================================================ FILE: src/taoshop-portal/src/main/resources/application.yml ================================================ server: port: 8081 #logging: # config: classpath:logback_spring.xml.bat # level: # com.muses.taoshop: debug # path: /data/logs spring: datasource: # 主数据源 shop: url: jdbc:mysql://127.0.0.1:3306/taoshop?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 连接池设置 druid: initial-size: 5 min-idle: 5 max-active: 20 # 配置获取连接等待超时的时间 max-wait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 time-between-eviction-runs-millis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 min-evictable-idle-time-millis: 300000 # Oracle请使用select 1 from dual validation-query: SELECT 'x' test-while-idle: true test-on-borrow: false test-on-return: false # 打开PSCache,并且指定每个连接上PSCache的大小 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多个DruidDataSource的监控数据 use-global-data-source-stat: true # jpa: # database: mysql # hibernate: # show_sql: true # format_sql: true # ddl-auto: none # naming: # physical-strategy: org.hibernate.boot.entity.naming.PhysicalNamingStrategyStandardImpl # mvc: # view: # prefix: /WEB-INF/jsp/ # suffix: .jsp #添加Thymeleaf配置 thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html mode: HTML5 encoding: UTF-8 content-type: text/html #Jedis配置 # jedis : # pool : # host : 127.0.0.1 # port : 6379 # password : redispassword # timeout : 0 # config : # maxTotal : 100 # maxIdle : 10 # maxWaitMillis : 100000 ================================================ FILE: src/taoshop-portal/src/main/resources/logback_spring.xml.bat ================================================ ${LOG_PATTERN} ${LOG_HOME}/all_${LOG_PREFIX}.log ${LOG_DIR}/all_${LOG_PREFIX}%d{yyyy-MM-dd}.%i.log ${MAX_HISTORY} ${MAX_FILE_SIZE} ${LOG_PATTERN} ${LOG_HOME}/err_${LOG_PREFIX}.log ${LOG_DIR}/err_${LOG_PREFIX}%d{yyyy-MM-dd}.%i.log ${MAX_HISTORY} ${MAX_FILE_SIZE} ${LOG_PATTERN} ================================================ FILE: src/taoshop-portal/src/main/resources/static/css/cart.css ================================================ @charset "utf-8"; .cart-step{position:absolute;left:440px;top:40px;} .cart-step ul{width:723px;padding-top:36px;} .cart-step li{width:32%;float:left;color:#8b8b8b;text-align:center;} .cart-step .cart-step-li01{width:29%;} .cart-step .cart-step-li02{width:38%;} .cart-step .cart-step-li03{width:27%;} .cart-step ul{background:url(../images/step-bg.png) no-repeat;} .cart-step .cart-step01{background-position:0 0;} .cart-step .cart-step02{background-position:-736px 0;} .cart-step .cart-step03{background-position:-1473px 0;} .cart,.orders{width:1200px;margin:25px auto;font-size:14px;} .cart-table th{border-top:2px solid #ea4621;padding:13px 0;font-size:14px;font-weight:bold;color:#787878;background:#fff7e5;} .cart-table td,.cart-table th{vertical-align:middle;text-align:center;} .cart-table .tl{text-align:left;} .cart-table .goods-price{color:#ef4218;} .cart-table .per-price,.cart-table .goods-delete,.cart-table .extra-per-price,.cart-table .extra-original-price{color:#919191;} .cart-table .goods-delete:hover{color:#f30;} .cart-table .extra-per-price{margin-left:56px;margin-right:15px;} .cart-table .goods-img{width:53px;height:53px;margin:15px 0;border:1px solid #e6e6e6;} .cart-table .goods-info,.cart-table .extra-goods-info{text-align:left;} .cart-table .goods-info{color:#999;font-size:12px;} .cart-table .goods-name{display:block;margin-bottom:10px;color:#333;font-size:14px;} .cart-table .extra-td{padding-bottom:25px;color:#787878;} .cart-table .num-action{padding:1px 4px;border:1px solid #c8c8c8;vertical-align:middle;} .cart-table .num-action:hover{text-decoration:none;} .cart-table .num-input{width:34px;height:18px;border:1px solid #999999;text-align:center;} .cart-other{margin-bottom:15px;} .cart-other .cart-other-hd{height:30px;text-align:left;background:#f1f1f1;} .cart-other .cart-other-tit{float:left;padding-left:10px;color:#636363;font:bold 14px/30px "Microsoft Yahei";} .cart-other .cart-other-action{float:right;width:12px;margin-right:12px;font:18px/30px "Microsoft Yahei";overflow:hidden;} .cart-other .cart-other-action:hover{color:#333;text-decoration:none;} .cart-other .cart-other-reset{float:right;border:1px solid #e13131;margin-right:12px;margin-top:4px;width:72px;color:#fff;font:12px/20px "Microsoft Yahei";text-align:center;background:#ef4218;} .cart-other .cart-other-reset:hover,.cart-other .cart-other-reset:active{color:#fff;background:#e13131;} .cart-other-bd .number-info{padding:12px 0;font-size:12px;text-align:left;} .number-info span{margin:0 9px;} .number-info input{margin-right:5px;} .number-info .search-number-input{width:106px;height:23px;line-height:23px;padding-left:3px;border:1px solid #b6b6b6;} .number-info .search-number-btn{width:53px;height:22px;border:1px solid #ef4218;color:#fff;font-size:14px;cursor:pointer; background:-moz-linear-gradient(top,#ec2e00,#f85601); background:-webkit-gradient(linear,0% 0%,0% 100%,from(#ec2e00),to(#f85601)); background:-webkit-linear-gradient(top,#ec2e00,#f85601); background:-o-linear-gradient(top,#ec2e00,#f85601); background: -ms-linear-gradient(top,#ec2e00, #f85601); filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0,startColorstr=#ec2e00,endColorstr=#f85601); background: linear-gradient(top,#ec2e00, #f85601);} .number-list,.package-action,.owner-info-forms{position:relative;overflow:hidden;zoom:1;} .number-list-box{margin-bottom:20px;margin-left:-13px;} .number-list-table{float:left;width:370px;margin-left:14px;_display:inline;} .number-list-table,.number-list-table td,.number-list-table th,.package-category-tab,.package-category-tab td,.package-category-tab th{border:1px solid #d3d3d3;text-align:center;line-height:34px;cursor:pointer;} .number-list-table th{padding:5px;font-weight:normal;background-color:#fbfbfb;} .number-list-table th,.number-list-table td{line-height:28px;} .list-cur td{background:#fff6e5;} .number-list-table .last-four{color:#ef4218;} .cart-other .confirm-btn{position:absolute;left:50%;top:15px;width:120px;margin-left:-60px;padding:5px 0;font-size:14px;line-height:1.5;} .package-action{height:3px;padding:15px 0 40px;} .contract-period{float:left;display:inline-block;*display:inline;*zoom:1;margin-top:18px;padding:4px 16px;text-align:left;color:#fff;background-color:#ef4218;} .package-category-tab th{font-weight:normal;background:#fbfbfb;} .package-category-tab th,.package-category-tab td{padding:5px 7px;font-size:12px;line-height:1.5;color:#404040;} .package-category-tab .list-cur th,.package-category-tab .list-cur td{background:#fff6e5;} .owner-info-forms p{margin-top:12px;line-height:32px;text-align:left;} .owner-info-forms .label{display:inline-block;width:90px;padding-right:5px;text-align:right;font-family:simsun;} .owner-info-forms .required{display:inline-block;margin-right:10px;color:#ef4218;font-weight:normal;} .owner-info-forms .user-text{width:285px;height:28px;border:1px solid #dfdfdf;padding-left:3px;line-height:28px;} .cart-settlement{margin-top:30px;border-top:1px solid #d5d5d5;} .cart-table-all .total-td{border-top:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;line-height:58px;background:#f0f0f0;} .cart-table-all .total-first-td{border-left:1px solid #dfdfdf;} .cart-table-all .total-last-td{border-right:1px solid #dfdfdf;} .cart-table-all .total-price-td{border-left:1px solid #dfdfdf;border-right:1px solid #dfdfdf;} .cart-table-all .total-action-td{text-align:left;} .cart-table-all .all-price{font:18px/58px "Microsoft Yahei";} .cart-table-all .goods-num,.cart-table-all .all-price .val{margin:0 5px;color:#ef4218;} .cart-table-all .settlement{display:inline-block;width:110px;font:18px/35px "Microsoft Yahei";border-radius:3px;background:#f30;} .cart-table-all .settlement:hover{background:#ef4218;} .cart-other-about{padding-left:10px;text-align:left;} .cart-other-about h4{color:#909090;font:bold 12px/40px "宋体";} .cart-other-about p{margin-bottom:6px;color:#909090;font-size:12px;} .cart-other-about a{color:#ef4218;} .cart-other-info{margin-left:100px;line-height:30px;font-family:"宋体";color:#636363;} .cart-other-info span{margin-right:20px;font-size:12px;} .cart-other-info span em{color:#ef4218;} .cart-other-info .u-number,.cart-other-info .u-package,.cart-other-info .u-name,.cart-other-info .u-id-card{color:#ef4218;} .number-list-page .pages{text-align:center;} .cart-top-line{border-top:1px solid #d5d5d5;} /***订单页***/ .bread-crumbs-tit{padding-bottom:20px;color:#333;font:bold 18px/26px "Microsoft Yahei";} .orders-item-hd{border-bottom:1px solid #e7e7e7;} .consignee-address,.send-time-category{padding-left:35px;} .consignee-default-address,.use-new-address,.consignee-new-address{margin-top:15px;padding-left:10px;} .edit-address{float:right;} .use-new-address{padding:5px 0 5px 10px;background:#f6f6f6;} .forms-box p{margin-top:12px;line-height:32px;} .forms-box .label{display:inline-block;width:90px;padding-right:5px;color:#6b6b6b;text-align:right;font-family:simsun;} .forms-box .required{display:inline-block;margin-right:4px;color:#ef4218;font-weight:normal;} .forms-box .user-text{width:200px;height:28px;border:1px solid #dfdfdf;padding-left:3px;line-height:28px;} .forms-box .user-pwd{width:126px;} .forms-box .user-code{width:78px;} .forms-box select{width:75px;margin-right:10px;} .sava-new-address{border:0 none;padding:8px 32px;color:#fff;font-size:14px;overflow:visible;cursor:pointer;} .send-time{margin-top:30px;margin-bottom:40px;} .send-time-item{float:left;border:1px solid #e7e7e7;margin-top:22px;margin-right:18px;padding:15px 40px;cursor:pointer;background:#fbfbfb;} .send-time-item:hover,.send-time-cur{border:1px solid #ef4218;background:#fff;} .send-time-item dt{color:#666;font-size:14px;} .send-time-item dd{color:#9e9e9e;} .receipt-select{padding:18px 0;} .receipt-select .note{color:#9e9e9e;font-size:12px;} .receipt-detail{margin-left:35px;padding:10px 0 10px 22px;font-size:12px;line-height:35px;background:#f6f6f6;} .receipt-detail span{margin-right:15px;} .receipt-detail .receipt-category{margin-right:8px;} .confirm-orders{margin-top:28px;} .subtotal-price{color:#ef4218;} .orders-total-table .solid-line-td{border-bottom:1px solid #d5d5d5;line-height:30px;} .activity .solid-line-td{border-bottom:1px solid #d5d5d5;line-height:30px;} .orders-total-table .dashed-line-td{border-bottom:1px dashed #d5d5d5;} tr.activity td{ background:#f0f0f0;} tr.activity td.spec{ text-align:left;} .yh-act{ margin:6px 10px 6px 62px; width:57px; height:29px; background:url(../images/login-reg-bg.png) 0 -112px no-repeat; display:inline-block; font:normal 12px/180% Microsoft YaHei; text-align:center; color:#fff; vertical-align:middle;} .yh-act.spec{ margin-left:0;} span.yh-info{ vertical-align:middle;} .orders-total-info,.orders-action{padding:20px 0;text-align:right;line-height:35px;} .orders-total-des{display:inline-block;width:120px;color:#ef4218;} .orders-total-des strong{font:bold 20px/50px "宋体";} .orders-action{background:#f6f6f6;} .orders-action a{display:inline-block;margin:0 9px;padding:0 28px;font-size:14px;} .order-about-item{margin:0 5px;color:#999;} .order-item-price{margin-left:3px;color:#ef4218;} .orders-tips{border:1px solid #dfdfdf;} .bg-td{width:240px;vertical-align:middle;background:#fbfbfb;} .bg-td .pay-way{padding:33px 0 33px 26px;} .bg-td strong{display:block;color:#666;font-size:14px;} .bg-td p{color:#7c7c7c;} .orders-success-icon{display:block;width:100px;height:100px;margin:0 auto;background:url(../images/orders-bg.png) 0 0 no-repeat;} .orders-failure-icon{display:block;width:100px;height:100px;margin:0 auto;background:url(../images/orders-bg.png) -100px 0 no-repeat;} .orders-info{padding-left:28px;padding-bottom:26px;line-height:26px;} .orders-tips-tit{color:#000;font:22px/100px "Microsoft Yahei";} .payment{margin-top:26px;} .payment-select{border:1px solid #dfdfdf;border-top:none;margin-bottom:22px;} .payment-select .line-td{border-bottom:1px solid #dfdfdf;} .payment-select .payment-td{padding-left:32px;vertical-align:middle;} .payment-select .alipay input{vertical-align:middle;} .payment-select .alipay label{display:inline-block;width:175px;margin:13px 0;} .payment-select .alipay span{display:inline-block;*display:inline;*zoom:1;width:130px;height:43px;overflow:hidden;border:1px solid #ddd;text-align:center;margin-left:5px;vertical-align:middle;} .payment-select .alipay label:hover span{border-color:#f50;} .bank-list{padding:20px 0 15px;} .bank-list-con{height:140px;overflow:hidden;} .bank-list label{display:inline-block;width:175px;margin:13px 0;} .bank-list span{display:inline-block;*display:inline;*zoom:1;width:130px;height:35px;overflow:hidden;border:1px solid #ddd;text-align:center;padding-top:8px;margin-left:5px;vertical-align:middle;} .bank-list label:hover span{border-color:#f50;} .payment-select .bank-list input{vertical-align:middle;} .bank-list-action{padding-right:22px;text-align:right;font:14px/30px "宋体";} .orders-info .payment-price{color:#ef4218;font:bold 22px/30px "宋体";} .orders-info .other-link a{margin:0 10px;color:#00469d;} /***热门商品***/ .hot-goods{width:1200px;margin:35px auto 20px;} .hot-goods-hd{border-bottom:1px solid #d5d5d5;} .hot-goods-tit,.cart-tit,.orders-item-tit{color:#6b6b6b;font: 18px/36px "Microsoft Yahei";} .hot-goods-bd .goods{width:185px;margin:30px 27px;float:left;display:inline;} .hot-goods-bd .goods-name{color:#393636;font: 16px/36px "Microsoft Yahei";} .hot-goods-bd .goods-des,.hot-goods-bd .goods-des a{color:#868686;} .hot-goods-bd .goods-des a:hover{color:#f30;} .hot-goods-bd .goods-price .val{color:#535353;font: 18px/36px "Microsoft Yahei";} .hot-goods-bd .goods-buy{margin-top:15px;text-align:center;} .hot-goods-bd .add-cart{border-top:1px solid #e4e4e4;border-bottom:1px solid #e4e4e4;} .hot-goods-bd .add-cart,.hot-goods-bd .add-cart span{display:inline-block;vertical-align:top;} .add-cart span{margin:0 -1px;_margin:0;padding:3px 10px;border-left:1px solid #e4e4e4;border-right:1px solid #e4e4e4;background:#fafafa;} .cart-nothing{border-top:2px solid #ea4621;background:url(../images/cart-nothing.jpg) 590px 120px no-repeat;} .cart-nothing-tips{padding:163px 656px 230px 285px;} .cart-nothing-tit{padding-bottom:37px;color:#6d6d6d;font:28px/38px "Microsoft Yahei";} .cart-nothing-tips .shopping-now{padding:10px 35px;} /***统一按钮***/ .gray-btn{border:1px solid #e3e3e3;border-radius:2px;color:#666;text-align:center;background:#fff;} .gray-btn:hover,.gray-btn:active{color:#666;background:#f8f8f8;} .orange-btn{color:#fff;text-align:center;background:#ef4218;} .orange-btn:hover,.orange-btn:active{color:#fff;background:#ff3300;} /***购物车遮罩层***/ .other-number-section-relative{ position:relative;} .car-block-bg{ background:#000;filter:alpha(opacity=30) !important; opacity:0.3; z-index:999; width:1140px; height:185px; position:absolute; left:0; top:0; } .car-block-bg img{ margin-top:110px;} .line{ height:1px; border-bottom:1px solid #CCC;} /*加入购物车成功*/ .success-toCart{ margin:60px auto 10px; width:760px; text-align:center;} .success-toCart .mb-3em{ width:290px; float:right; display:inline;} .success-toCart .btn{ font-size:16px; margin-right:10px;} .success-toCart .tip{ padding-left:70px; width:340px; float:left; display:inline; background:url(../images/login-reg-bg.png) 0 -150px no-repeat; font:normal 26px/180% '微软雅黑'; color:#8cc220; text-align:left;} /*购物车增加选择宽带20140804*/ .ymall-form.select-wb{ padding:0; overflow:hidden;} .select-wb p{ padding-left:10px; text-align:left;} .package-des p.title{ color:#f00;} .cart-other-reset.wb{ min-width:100px;} .select-wb p .label{ width:82px;} .select-wb p textarea{width:278px;line-height:20px;padding:4px;border:1px solid #dfdfdf;font-size:14px; resize:none;} .select-wb .left{ width:610px; float:left; display:inline;} .select-wb .right{ width:520px; float:left; display:inline;} .popbox.wb-con{ padding:30px; width:360px; background:#fff; text-align:center; color:#858585; border:none;} .popbox .wb-body{ position:relative; z-index:101;} .popbox .wb-body .close{ width:30px; height:30px; position:absolute; right:-60px; top:-30px; background:#ef4218; text-align:center; line-height:30px; font:normal 20px/30px Gotham, "Helvetica Neue", Helvetica, Arial, sans-serif; color:#f6b79f; cursor:pointer;} .popbox .wb-body a{ margin-top:30px; min-width:80px;} ================================================ FILE: src/taoshop-portal/src/main/resources/static/css/category.css ================================================ @charset "utf-8"; .header{margin-bottom:20px;} /**phoneSearch**/ .phoneSearch-title{padding:0 0 10px 10px;border-bottom:1px solid #ccc;font-size:18px;font-weight:bold;font-family:'微软雅黑';color:#666;} .phoneSearch-filter{position:relative;zoom:1;line-height:25px;margin-bottom:30px;padding-top:15px;} .phoneSearch-filter-item{position:relative;zoom:1;border-bottom:1px solid #f4f4f4;margin:0 5px 15px 5px;} .phoneSearch-filter-item h3{float:left;width:70px;font-weight:normal;padding-left:10px;} .phoneSearch-filter-item p{margin-left:80px;overflow:hidden;} .phoneSearch-filter-item p a{display:inline-block;*zoom:1;margin-right:20px;margin-bottom:15px;color:#666;} .phoneSearch-filter-item p a.selected{background:#ef4218;color:#fff;padding:0 10px;} .phoneSearch-filter-item p a:hover{color:#f30;} .phoneSearch-filter-item p a.selected:hover{color:#fff;} .phoneSearch-filter-more{height:5px;background:#ffddaa;border-top:1px solid #ffaa66;} .phoneSearch-filter-more a{display:block;margin:-1px auto -20px auto;width:100px;border:1px solid #ff6600;border-top-color:#fff;text-align:center;height:20px;line-height:20px;margin-bottom:-20px;*position:relative;background:#fff;} .phoneSearch-filter .ft{width:50px;line-height:26px;position:absolute;right:10px;top:-27px;} .phoneSearch-filter .ft a{color:#00469d;} .phoneSearch-filter .ft span{display:inline-block;*display:inline;*zoom:1;width:8px;height:7px;overflow:hidden;margin-left:9px;font-size:0;background:url(../images/more-expand.png) no-repeat;} .phoneSearch-filter .ft a:hover{color:#f30;} /*排序*/ .reorder{height:45px;overflow:hidden;background:#f7f7f7;border:1px solid #ddd;} .reorder .reorder-wrapper{float:left;line-height:45px;} .reorder .reorder-wrapper a{float:left;height:45px;display:block;border-right:1px solid #ddd;padding:0 20px;cursor:pointer;overflow:hidden;} .reorder .reorder-wrapper a:hover,.reorder .reorder-wrapper a.selected{position:relative;background:#fff;text-decoration:none;cursor:pointer;} .reorder .reorder-styles{float:right;line-height:26px;padding-top:10px;padding-right:15px;} /*商品列表*/ .phoneList{overflow:hidden;} .phoneList-wrap{position:relative;left:-10px;width:1220px;} .phoneListItem{float:left;display:inline;width:253px;height:358px;text-align:center;border:1px solid #fff;padding:15px;margin:10px;word-break:break-all;} .phoneListItem .item-img,.phoneListItem .item-img img{width:240px;height:240px;margin:0 auto;} .phoneListItem .item-name{font-weight:bold;white-space:nowrap;overflow:hidden;} .phoneListItem .item-name a{color:#5b5b5b;} .phoneListItem .item-name a:hover{color:#f30;} .phoneListItem .item-info{height:20px;line-height:20px;margin-bottom:5px;white-space:nowrap;overflow:hidden;color:#707070;} .phoneListItem .item-price{padding:2px 0 10px 0;font-size:16px;color:#f75831;} .phoneListItem .item-btn .btn{width:94px;height:34px;line-height:34px;padding:0;margin-right:10px;border-radius:0;font-size:14px;} .phoneListItem .item-btn .btn-gray{border:1px solid #e7e7e7;color:#898989;background-color:#f8f8f8;} .phoneListItem .item-btn .btn-red{border:1px solid #ef4218;background-color:#ef4218;} .phoneListItem .item-btn .btn-gray:hover{background:#fefefe;} .phoneListItem .item-btn .btn-red:hover{background:#f30;} .phoneListItem:hover{border-color:#f60;} /*相关搜索*/ .searchResult-key{color:#858585;padding-left:10px;margin-bottom:15px;} .searchResult-key a{color:#0444a6;margin-right:10px;} .searchResult-key a:hover{color:#f30;} ================================================ FILE: src/taoshop-portal/src/main/resources/static/css/detail.css ================================================ @charset "utf-8"; .header{margin-bottom:20px;} /* detail */ .product-intro{margin-bottom:10px;} .product-info-img{float:left;width:488px;} .img-wrap{width:488px;height:352px;margin-bottom:10px;} .img-wrap .img-big{width:486px;height:350px;border:1px solid #ccc;} .spec-lists{position:relative;height:54px;overflow:hidden;} .bx-prev{position:absolute;top:0;left:-20px;width:17px;outline:0;height:54px;background:url(../images/detail_sprices.png) no-repeat 0 0;cursor:pointer;text-indent:-999999px;} .bx-next{position:absolute;top:0;right:-23px;width:17px;outline:0;height:54px;background:url(../images/detail_sprices.png) no-repeat -83px 0;cursor:pointer;text-indent:-999999px;} .bx-prev:hover{background-position:0 -59px;} .bx-next:hover{background-position:-83px -59px;} .spec-items{float:left;width:468px;height:54px;padding-left:20px;} .spec-items .items-in{width:800%;} .spec-items li{float:left;width:54px;height:54px;display:inline;cursor:pointer;padding:0 17px 0 18px;} .spec-items li span,.spec_items li a{float:left;width:52px;height:52px;border:1px solid #ccc;} .spec-items li img{width:52px; height:52px;} .spec-items li span:hover,.spec_items li a:hover{border-color:#f30;} .spec-items .selected span,.spec-items .selected span:hover,.spec-items li .zoomThumbActive{border-color:#f30;} .share-sns{padding-top:20px;} .share-sns span{float:left;padding-left:10px;color:#666;} .share-sns a{float:left;width:16px;height:16px;overflow:hidden;margin:0 3px;display:inline;} .share-sns .collect{width:55px; height:18px; margin-left:40px;} /*右侧属性*/ .product_property{width:664px;overflow:hidden;padding-left:45px;color:#666;} .pro_meta ul{width:790px;} .pro_meta li{padding:11px 0 11px 10px;width:100%;float:left;} .pro_meta li.border-b{border-bottom:1px dotted #ccc;} .pro_meta .name{ width:660px; padding-left:0;color:#666;font-size:16px;font-weight:bold;} .pro_meta .sp_l{float:left;width:70px;font-family:'宋体';} .pro_meta .action-bate{width:600px;} .pro_meta .action-bate a{border:1px solid #ddd;padding:6px 11px;_padding-bottom:4px;margin-right:10px;cursor:pointer;position:relative;overflow:hidden;_zoom:1;} .pro_meta .action-bate a:hover{border-color:#e4393c;color:#333;text-decoration:none;} .pro_meta .action-bate a.selected{border:2px solid #e4393c;padding:5px 10px;_padding-bottom:3px;} .pro_meta .action-bate a.selected em{width:13px;height:13px;display:block;position:absolute;right:-2px;bottom:-2px;background:url(../images/detail_sprices.png) no-repeat 0 -266px;} .pro_meta .tb-rmb-num{color:#e94609;font-size:14px;font-weight:bold;} .phone_num{padding-top:5px;padding-left:10px;} .phone_num dt{width:70px;} .phone_num .tb_stock a{float:left;width:13px;height:13px;line-height:13px;border:1px solid #c9c9c9;background:#fff;text-align:center;overflow:hidden;font-family:Verdana, Geneva, sans-serif;color:#333;} .phone_num .tb_stock a:hover{text-decoration:none;color:#f60;} .phone_num .tb_stock input{position:relative;float:left;height:20px;line-height:20px;width:34px;margin:-3px 5px 0 5px;border:1px solid #ccc;color:#333;text-align:center;} .phone_choosed{padding-top:20px;padding-left:10px;} .phone_choosed span{color:#333;} .phone_choosed .add_btn{padding:20px 0 0 0;position:relative;} .phone_choosed .add_btn .btn{height:40px;line-height:40px;margin-right:25px;padding:0 40px;border-radius:0;font-size:16px;} /**详情**/ .product-detail{width:950px;} /*随心配*/ .bundle{border-bottom:1px solid #ccc;} .bundle .bundle-head{position:relative;height:40px;line-height:40px;border-bottom:1px solid #ccc;font-size:18px;font-family:'微软雅黑';text-indent:10px;} .bundle .bundle-head a{position:absolute;right:5px;top:0;font-size:14px;color:#e94609;} .bundle-list{float:left;width:669px;height:170px;border-right:1px solid #ccc;padding:15px 0 25px 41px;} .bundle-list ul{width:800%;} .bundle-list .bundle-item{float:left;width:110px;height:170px;overflow:hidden;padding:0 60px 0 35px;display:inline;cursor:pointer;background:url(../images/bundle_addIcon.png) no-repeat right center;word-break:break-all;} .bundle-item .item-img{text-align:center;} .bundle-item .item-img,.bundle-item .item-img img{width:110px;height:110px;margin:0 auto;} .bundle-item .item-info{height:40px;line-height:20px;overflow:hidden;} .bundle-item .item-info a{color:#666;display:block;} .bundle-item .item-info a:hover{color:#f30;} .bundle-item .item-price{line-height:20px;font-weight:bold;color:#ef4e2d;} .bundle-item .item-price em{font-weight:bold;} .bundle-item .item-price input{margin-right:4px;} .bundle .bx-prev{left:-41px;top:50%;margin-top:-34px;width:41px;height:69px;background:url(../images/detail_sprices.png) no-repeat 0 -118px;} .bundle .bx-next{right:-55px;top:50%;margin-top:-34px;width:41px;height:69px;background:url(../images/detail_sprices.png) no-repeat -59px -118px;} .bundle .bx-prev:hover{ background-position:0 -192px;} .bundle .bx-next:hover{ background-position:-59px -192px;} .bundle-extra{float:left;width:199px;overflow:hidden;padding:30px 10px 0 30px;} .bundle-extra p{line-height:30px;} .bundle-extra .extra-price{color:#ef4e2d;} .bundle-extra .extra-price,.bundle-extra .extra-price em{font-weight:bold;} .bundle-extra .btn-sku{padding-top:45px;} .bundle-extra .btn-sku .btn{height:40px;line-height:40px;margin-right:25px;padding:0 40px;border-radius:0;font-size:16px;} /*商品详情*/ .detail{position:relative;zoom:1;overflow:hidden;} .detail .btn-sku{width:122px;height:55px;position:absolute;right:20px;top:8px;background:url(../images/btn-sku.png) no-repeat;} .detail .cut{position:fixed;z-index:100;top:0;left:50%;margin-left:-350px;_position:absolute;_top:expression(eval(document.documentElement.scrollTop));width:950px;height:40px;border:1px solid #ccc;background:#fbfbfb;} .detail .fixed{position:static;margin-left:0;} .detail .cut li{width:130px;height:20px;line-height:20px;border-right:1px dotted #d2d2d2;overflow:hidden;margin-top:10px;font-size:14px;font-weight:bold;float:left;text-align:center;cursor:pointer;} .detail .cut li:hover{color:#e94609;} .detail .cut .current{height:38px;line-height:38px;margin-top:-1px;margin-left:-1px;color:#e94609;background:#fff;border-top:2px solid #f30;border-left:1px solid #ddd;border-right:1px solid #ddd;} .detail .detail-main{padding:20px;border-top:0;} .detail .detail-main img{display:block;margin:0 auto;max-width:910px;_width:910px;} .detail-main .detail-list{font-size:14px;background:#fffbe0;color:#666;padding:20px 40px;} .detail-main .detail-list li{float:left; width:259px; margin-right:10px; display:inline; line-height:35px;} .detail-main h4{padding:7px 15px;font-size:16px;font-weight:bold;border:1px solid #dfdfdf;background-color:#fbfbfb;} .detail-main table{width:100%;border:1px solid #ddd;margin:0 auto;} .detail-main table th{width:13%;vertical-align:middle;padding:8px;text-align:right;border:1px solid #ddd;} .detail-main table td{border:1px solid #ddd;padding:8px;} .detail-main .aq-head{font-size:16px;font-weight:bold;font-family:'微软雅黑';padding:0 0 10px 15px;} .detail-main .aq-con{border:1px solid #dfdfdf;} .detail-main .aq-con dl{padding:10px 15px;} .detail-main .aq-con dl dt{padding-top:10px;padding-bottom:5px;font-size:14px;color:#666;} .detail-main .aq-con dl dd{padding-bottom:15px;color:#999;border-bottom:1px dotted #d0d0d0;} span.span01{ color:#e4393c;} span.span02{ padding:1px 2px; background:#e4393c; color:#fff;} em.em01{ margin-left:10px; color:#e4393c;} a.to-detail{ margin-left:10px; color:#336699} a.to-detail:hover{ color:#e4393c;} ================================================ FILE: src/taoshop-portal/src/main/resources/static/css/index.css ================================================ @charset "utf-8"; /* index */ /**首页BANNER**/ .banner{position:relative;width:727px;height:350px;margin-left:235px;margin-bottom:15px; margin-top:4px; float:left; display:inline;} .banner-img{position:relative;height:350px;overflow:hidden;} .banner-img ul{width:2000em;position:absolute;} .banner-img ul li{float:left;height:350px;} .banner-btn{position:absolute;left:0;bottom:20px;width:100%;height:10px;text-align:center;} .banner-btn li{display:inline-block;*display:inline;*zoom:1;width:10px;height:10px;margin:0 8px;background-color:#8f8f8f;cursor:pointer;border-radius:10px;} .banner-btn .current{background-color:#ef4218;} /**first-pannel**/ .first-pannel .index-f{float:left;width:1200px;_overflow:hidden;} /*话费充值*/ .index-fast-recharge{ margin-top:5px;float:right;width:233px;} .index-fast-recharge .recharge-head h2{height:39px;line-height:39px;padding:0 8px;font-size:18px;font-family:'微软雅黑';color:#5f5e5e;} .index-fast-recharge .recharge-head h2 .icon-phone{display:inline-block;*zoom:1;*display:inline;width:15px;height:21px;background:url(../images/index_sprices.png) no-repeat;vertical-align:top;margin-top:10px;margin-right:8px;} .index-fast-recharge .recharge-body{overflow:hidden;padding:9px; padding-top:7px;border:1px solid #e3e3e3;background-color:#f5f7fa;} .index-fast-recharge .recharge-con{padding:17px 10px;background-color:#fff;} .index-fast-recharge .recharge-form p{padding-bottom:10px;} .index-fast-recharge .recharge-form p .name{display:block;padding-bottom:5px;} .index-fast-recharge .recharge-form .text-box{width:180px;height:18px;line-height:18px;padding:10px 5px;border:1px solid #e6e9ed;border-radius:5px;} .index-fast-recharge .recharge-form .rd{vertical-align:top;margin:2px 4px 0 0;*vertical-align:middle;*margin:0 2px 0 0;} .index-fast-recharge .recharge-form .recharge-sub-btn{padding-top:10px;margin-bottom:15px;} .index-fast-recharge .recharge-form .recharge-sub-btn .btn{width:100%;padding:9px 0;font-size:14px;} .index-fast-recharge .recharge-ad img{width:194px;height:70px;} /**index-f**/ .index-f{margin-bottom:15px;} .index-f-head{height:35px;line-height:35px;padding:0 5px;white-space:nowrap;overflow:hidden;font-size:18px;font-family:'微软雅黑';color:#5f5e5e;} .index-f-head span{padding-left:20px;font-size:12px;font-family:Arial, '宋体';color:#787878;} .index-f-head .more{float:right;font-size:14px;line-height:40px;font-family:'宋体';color:#5f5e5e;} .index-f-head .more em{font-size:12px;} .index-f-head .more:hover{color:#f30;} .index-f-body{position:relative;left:0;padding-top:5px;} .index-f-boxS li,.index-f-boxM,.index-f-boxL,.index-f-boxMixedS li,.index-f-boxMixedM li{float:left;margin:-1px 0 0 -1px;border:1px solid #dcdcdc;} .index-f-boxS li:hover,.index-f-boxM:hover,.index-f-boxL:hover,.index-f-boxMixedS li:hover,.index-f-boxMixedM li:hover{position:relative;border-color:#f60;} .index-f-boxS li,.index-f-boxS img{width:240px;height:160px;overflow:hidden;} .index-f-boxM,.index-f-boxM img{width:240px;height:321px;overflow:hidden;} .index-f-boxL,.index-f-boxL img{width:475px;height:321px;overflow:hidden;} .index-f-boxMixed{width:482px;float:left;} .index-f-boxMixedS li,.index-f-boxMixedS img{width:240px;height:160px;overflow:hidden;} .index-f-boxMixedM li,.index-f-boxMixedM img{width:481px;height:160px;overflow:hidden;} /*4f商家精选*/ .top-sales-item{float:left;display:inline;width:283px;margin-left:-1px;padding:8px;border:1px solid #dcdcdc;} .top-sales-item:hover{position:relative;border-color:#f60;} .top-sales-item .item-img,.top-sales-item .item-img img{width:200px;height:200px;margin:0 auto;} .top-sales-item .item-buss{line-height:30px;font-size:14px;text-align:center;padding:0 10px;white-space:nowrap;overflow:hidden;} .top-sales-item .item-buss a{font-weight:bold;color:#535353;} .top-sales-item .item-name{font-size:16px;font-family:'微软雅黑';padding:0 40px;white-space:nowrap;overflow:hidden;} .top-sales-item .item-name.spec{ margin:0 20px; padding:0;} .top-sales-item .item-name a{color:#393636;} .top-sales-item .item-info{padding:0 40px;white-space:nowrap;overflow:hidden;} .top-sales-item .item-info a{color:#868686;} .top-sales-item .item-price{font-size:18px;font-family:'微软雅黑';color:#535353;padding:0 40px;white-space:nowrap;overflow:hidden;} .top-sales-item a:hover{color:#f30;} /*新品上架0728*/ .top-sales-item.newProduct{ width:223px; margin-top:-1px;} .top-sales-item .item-price.spec{ margin-left:20px; margin-right:20px; padding:0; color:#f00;} .top-sales.newProduct{ margin-bottom:15px;} /*左侧菜单0804*/ .wrap { width: 1210px; margin: 0px auto; } .all-sort-list { position: relative; width: 223px; border-top: none; padding: 3px 3px 3px 0px; background: #FAFAFA; } .all-sort-list .item { height: 33px; border-top: 1px solid #FFFFFF; } .all-sort-list .item.bo { border-top: none; } .all-sort-list .item h3 { padding-left:16px; height: 30px; line-height: 30px; border: 1px 0px; font-size: 14px; font-weight: normal; width: 210px; overflow: hidden; } .all-sort-list .hover h3 { position: relative; z-index: 13; background: #FFF; border-color: #DDD; border-top:1px solid #ddd; line-height:32px; } .all-sort-list .item span { padding: 0px 5px; color: #A40000; font-family: "\5B8B\4F53"; } .all-sort-list .item a { color: #000; text-decoration: none; } .all-sort-list .item a:hover { font-weight: normal; color: #E4393C; } .all-sort-list .item-list { display: none; position: absolute; width: 746px; min-height: 160px; _height: 160px; background: #FFF; left: 220px; box-shadow: 0px 0px 10px #DDDDDD; border: 1px solid #DDD; top:0; z-index: 10; } .all-sort-list .item-list .close { position: absolute; width: 26px; height: 26px; color: #FFFFFF; cursor: pointer; top: -1px; right: -26px; font-size: 20px; line-height: 20px; text-align: center; font-family: "Microsoft Yahei"; background: rgba(0, 0, 0, 0.6); background-color: transparent\9; filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=1, startColorstr='#60000000', endColorstr='#60000000'); } .item-list .subitem { float: left; width: 520px; padding: 0px 4px 0px 8px; } .item-list .subitem dl { padding: 6px 0px; overflow: hidden; zoom: 1; } .item-list .subitem .fore1 { border-top: none; } .item-list .subitem dt { width:100%; font-size:14px; line-height: 22px; text-align:left; padding: 3px 6px 0px 0px; font-weight: 700; color: #f75730; border-bottom:1px solid #f75730; clear:both; } .item-list .subitem dt a { color: #f75730; } .item-list .subitem dd { float: left; width: 520px; padding: 3px 0px 0px; overflow: hidden; } .item-list .subitem dd em { float: left; height: 16px; line-height: 16px; padding: 0px 8px; margin-top:4px; margin-bottom: 8px; border-right: 1px solid #CCC; } .item-list .subitem dd em a, .item-list .cat-right dd a { color: #666; text-decoration: none; } .item-list .subitem dd em a:hover, .item-list .cat-right dd a:hover { font-weight: normal; text-decoration: underline; } .item-list .cat-right { float: right; width: 210px; } .item-list .cat-right dl { width: 194px; padding: 6px 8px; } .item-list .cat-right dl li{ margin:8px 0; width:194px; height:70px;} .item-list .cat-right dd { padding-top: 6px; line-height: 22px; overflow: hidden; padding: 3px 0px 0px; } .item-list .cat-right dt { padding: 3px 6px 0px 0px; font-weight: 700; color: #E4393C; } .item-list .cat-right dd a:hover { color: #666; } ================================================ FILE: src/taoshop-portal/src/main/resources/static/css/jqzoom.css ================================================ .zoomPad{ position:relative; float:left; z-index:99; cursor:crosshair; } .zoomPreload{ -moz-opacity:0.8; opacity: 0.8; filter: alpha(opacity = 80); color: #333; font-size: 12px; font-family: Tahoma; text-decoration: none; border: 1px solid #CCC; background-color: white; padding: 8px; text-align:center; background-image: url(../images/zoomloader.gif); background-repeat: no-repeat; background-position: 43px 30px; z-index:110; width:90px; height:43px; position:absolute; top:0px; left:0px; * width:100px; * height:49px; } .zoomPup{ overflow:hidden; background-color: #FFF; -moz-opacity:0.6; opacity: 0.6; filter: alpha(opacity = 60); z-index:120; position:absolute; border:1px solid #CCC; z-index:101; cursor:crosshair; } .zoomOverlay{ position:absolute; left:0px; top:0px; background:#FFF; /*opacity:0.5;*/ z-index:5000; width:100%; height:100%; display:none; z-index:101; } .zoomWindow{ position:absolute; left:110%; top:40px; background:#FFF; z-index:6000; height:auto; z-index:10000; z-index:110; } .zoomWrapper{ position:relative; border:1px solid #999; z-index:110; } .zoomWrapperTitle{ display:block; background:#999; color:#FFF; height:18px; line-height:18px; width:100%; overflow:hidden; text-align:center; font-size:10px; position:absolute; top:0px; left:0px; z-index:120; -moz-opacity:0.6; opacity: 0.6; filter: alpha(opacity = 60); } .zoomWrapperImage{ display:block; position:relative; overflow:hidden; z-index:110; } .zoomWrapperImage img{ border:0px; display:block; position:absolute; z-index:101; } .zoomIframe{ z-index: -1; filter:alpha(opacity=0); -moz-opacity: 0.80; opacity: 0.80; position:absolute; display:block; } /********************************************************* / When clicking on thumbs jqzoom will add the class / "zoomThumbActive" on the anchor selected /*********************************************************/ ================================================ FILE: src/taoshop-portal/src/main/resources/static/css/public.css ================================================ @charset "utf-8"; /* reset */ html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;outline:none;} address,cite,code,dfn,em,var{font-style:normal;font-weight:normal;} b,strong{font-weight:bold} h1,h2,h3,h4,h5,h6{font-weight:normal;font-size:12px;} ul,ol,li{list-style:none;} table{border-collapse:collapse;border-spacing:0;} th,td,caption{font-weight:normal;vertical-align:top;text-align:left;} img{border:0;} input,textarea,select{vertical-align:middle;} /*html5*/ article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;margin:0;padding:0;} audio{display:none} canvas,video{display:inline-block;*display:inline;*zoom:1} [hidden]{display:none} audio[controls]{display:inline-block;*display:inline;*zoom:1} mark{background-color:#ff0;color:#000} /*public*/ body{font:12px/1.5 Arial,"宋体",sans-serif;color:#333;background-color:#fff;} a{text-decoration:none;color:#333;} .clearfix:after{font-size:0;line-height:0;content:"\020";display:block;height:0;clear:both;} .clearfix{zoom:1;} a:hover{color:#f30;text-decoration:underline;} .layout{width:1200px;margin:auto;clear:both;} /*默认1200宽度*/ .c{clear:both;} /*清除浮动*/ /*****************public elements define*******************/ /*font style*/ .f-red1{color:#ff0000;} .f-red2{color:#cc0000;} .f-orange1{color:#ff6600;} .f-orange2{color:#ff9900;} .f-blue1{color:#0000ff;} .f-blue2{color:#336699;} .f-black{color:#000000;} .f-gray1{color:#333333;} .f-gray2{color:#666666;} .f-gray3{color:#999999;} .f-gray4{color:#cccccc;} .f-white{color:#ffffff;} .f-u{text-decoration:underline;} .f-b{font-weight:bold;} .f-big{font-size:1.2em;} /*float*/ .fl-l{float:left;} .fl-r{float:right;} /**col**/ .col-200{width:200px;} .col-260{width:260px;} .col-280{width:280px;} .col-265{width:265px;} .col-500{width:500px;} .col-740{width:740px;} .col-900{width:900px;} .col-930{width:930px;} /**margin 10**/ .m10-l{margin-left:10px;} .m10-r{margin-right:10px;} .m10-b{margin-bottom:10px;} .m20-b{margin-bottom:20px;} /*btn style*/ .btn{display:inline-block;*display:inline;*zoom:1;text-align:center;padding:9px 18px;font-size:100%;font-family:Arial,"宋体",sans-serif;line-height:normal;text-decoration:none;border:0 none;vertical-align:middle;box-shadow:0 1px 0 #e2e2e2;cursor:pointer;color:#333;background-color:#ddd;} .btn:hover{color:#333;text-decoration:none;background-color:#ccc;} .btn-disabled,.btn-disabled:hover{opacity:0.4;background-color:#e6e6e6;cursor:not-allowed;} .btn-red{color:#fff;background:#e94609;} .btn-orange{color:#fff;border-color:#f5b843; background:#ffa830;background:-moz-linear-gradient(top,#ffb761,#ff9a03); background:-webkit-gradient(linear,0% 0%,0% 100%,from(#ffb761),to(#ff9a03)); background:-webkit-linear-gradient(top,#ffb761,#ff9a03); background:-o-linear-gradient(top,#ffb761,#ff9a03); background: -ms-linear-gradient(top,#ffb761, #ff9a03); filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0,startColorstr=#ffb761,endColorstr=#ff9a03); background: linear-gradient(top,#ffb761, #ff9a03);} .btn-blue{color:#fff;background:#2fafe0;border-color:#2fafe0;} .btn-coffee{color:#fff;background:#b67136;} .btn-gray{color:#333;background:#eee;} .btn-orange:hover{color:#fff;background:#ff9a03;} .btn-red:hover{color:#fff;background:#f30;} .btn-blue:hover{color:#fff;background:#2ca2d1;} .btn-coffee:hover{color:#fff;background:#cf813e;} .btn-gray:hover{color:#525252;background:#f2f2f2;} /*tables style*/ .ymall-table{empty-cells:show;border:1px solid #cbcbcb;font-size:12px;} .ymall-table th,.ymall-table td{padding:8px 16px;border-left:1px solid #cbcbcb;border-width:0 0 0 1px;} .ymall-table th{font-weight:bold;color:#333;background:#e0e0e0;} .ymall-table td{color:#525252;} .ymall-table .ymall-table-odd td{background:#f2f2f2;border-width:0 0 0 1px;} ymall-table-border th,.ymall-table-border td{border-bottom:1px solid #cbcbcb;} .ymall-table-horizontal th,.ymall-table-horizontal td{border:0 none;border-bottom:1px solid #cbcbcb;} /***************public frameset***************/ /*header*/ .header{position:relative;z-index:100;zoom:1;width:100%;min-width:1200px;margin:0 auto;} /**topBar**/ .topBar{position:relative;z-index:100;width:100%;min-height:36px;_height:36px;line-height:36px;text-align:right;color:#8a8a8a;background-color:#f8f8f8;box-shadow:1px 1px 1px #ddd;border-bottom:1px solid #eee\0;*border:1px #eee;} .topBar-userWelcome{padding-right:10px;} .topBar-userWelcome a{color:#00469d;} .topBar-userWelcome a:hover{color:#f30;} .topBar .logined{padding-right:0;} .topBar-userWelcome .user{position:relative;zoom:1;*padding-right:5px;} .topBar-userWelcome .user .user-link{color:#584c4c;} .topBar-userWelcome .user .icon-arr{display:inline-block;*display:inline;*zoom:1;width:12px;height:5px;margin-left:5px;background:url(../images/base.png) no-repeat -218px -254px;*vertical-align:middle;*margin-top:4px;_vertical-align:-5px;_margin-top:16px;} .topBar-userWelcome .user .user-link:hover{color:#f30;} .topBar-userWelcome .user .user-cs{position:absolute;left:50%;top:10px;*top:23px;margin-left:-55px;padding-top:11px;text-align:left;} .topBar-userWelcome .user .user-cs .user-cs-con{display:block;width:110px;border:1px solid #e8ebed;background:#fff;} .topBar-userWelcome .user .user-cs a{display:block;line-height:30px;padding:0 15px;color:#979797;white-space:nowrap;overflow:hidden;} .topBar-userWelcome .user .user-cs a:hover{text-decoration:none;color:#f30;background:#f9f9f9;} .topBar-userWelcome .user .user-cs .icon-arr{position:absolute;left:50%;top:5px;display:block;margin-left:-6px;width:13px;height:7px;background:url(../images/base.png) no-repeat -216px -264px;*margin-top:0;} .topBar-menu a{padding:0 6px;color:#8a8a8a;} .topBar-menu a:hover{color:#f30;} /**headerMain**/ .headerMain{padding:30px 0 12px 0;position:relative;z-index:10;} .headerMain .siteLogo{background:url(../images/logo.png) no-repeat;width:360px;height:50px;float:left;} .headerMain .siteLogo a{height:50px;float:left;display:block;} .headerMain .siteLogo-homepage{width:165px;margin-right:25px;} .headerMain .siteLogo-mallpage{width:170px;} /***headerMain search***/ .headerMain .search{position:relative;width:491px;height:63px;float:left;padding-top:5px;padding-left:75px;} .search-area{width:487px;height:30px;border:2px solid #f75730;margin-bottom:8px;} .search-input-text, .search-input-submit{border:0 none;float:left;display:block;} .search-input-text{width:421px;height:20px;line-height:20px;padding:5px 8px;font-size:14px;} .search-input-submit{float:right;width:50px;height:30px;cursor:pointer;background:url(../images/base.png) no-repeat 12px 2px #f75730;} .search-suggest{position:absolute;left:77px;top:37px;width:435px;overflow:hidden;border:1px solid #d5d5d5;background:#fff;} .search-suggest li{line-height:29px;color:#868686;padding:0 5px;cursor:default;} .search-suggest li:hover{background:#39f;color:#fff;} .search-suggest li b{font-weight:bold;} .search-hotkey{padding-left:10px;color:#606060;} .search-hotkey a{margin-right:10px;color:#999;} .search-hotkey a:hover{color:#f30;} /*myYmall*/ .myYmall{float:left;height:32px;overflow:hidden;line-height:32px;margin:5px 0 0 15px;padding:0 10px;font-size:14px;text-align:center;border:1px solid #efefef;background-color:#f7f7f7;} .myYmall .icon-user{display:inline-block;*display:inline;*zoom:1;width:15px;height:19px;background:url(../images/base.png) no-repeat -48px -74px;vertical-align:top;margin:5px 5px 0 0;*margin-top:-1px;_vertical-align:-1px;_margin-top:5px;} .myYmall a{color:#666;} .myYmall a:hover{color:#f30;} /*to-cart*/ .to-cart{height:32px;position:relative;float:right;margin-top:5px;} .to-cart dt{position:relative;z-index:10;float:left;width:144px;height:32px;text-align:center;line-height:32px;border:1px solid #efefef;background-color:#f7f7f7;} .to-cart .selected{border-bottom:1px solid #fff;background-color:#fff;} .to-cart dt .shop-amount{position:absolute;left:30px;top:-14px;display:block;width:18px;height:19px;line-height:18px;text-align:center;color:#fff;background:url(../images/base.png) no-repeat 0 -32px;} .to-cart dt a{font-size:14px;color:#666;} .to-cart dt a:hover{color:#f30;} .to-cart dt .icon-cart{display:inline-block;*display:inline;*zoom:1;width:21px;height:20px;background:url(../images/base.png) no-repeat 0 -56px;vertical-align:top;margin:5px 5px 0 0;*margin-top:-1px;_vertical-align:-1px;_margin-top:5px;} .to-cart dt .angle{display:inline-block;*display:inline;*zoom:1;width:5px;height:9px;background:url(../images/base.png) no-repeat 0 -81px;vertical-align:top;margin:11px 0 0 5px;*margin-top:3px;_vertical-align:1px;} .to-cart dt .down{width:9px;height:5px;background:url(../images/base.png) no-repeat -21px -81px;margin:12px 0 0 1px;*margin-top:4px;_vertical-align:-1px;} .to-cart dd{position:absolute;top:33px;right:0;border:1px solid #efefef;background-color:#fff;} .to-cart dd .nogoods{width:200px;padding:20px 10px 20px 20px;color:#8d8d8d;} .to-cart .cart-table{width:300px;} .to-cart .cart-table .cart-table-body{height:144px;} .to-cart .cart-item{border-bottom:1px solid #e2e2e2;height:55px;padding:8px;overflow:hidden;} .to-cart .cart-item li{float:left;overflow:hidden;background:none;} .to-cart .cart-item img{width:55px;height:55px;} .to-cart .cart-item .item-operate{float:right;width:38px;} .to-cart .cart-item .item-img{width:55px;overflow:hidden;height:55px;} .to-cart .cart-item .item-intro{width:132px;height:54px;overflow:hidden;padding-left:10px;} .to-cart .cart-item .item-intro a{display:block;color:#666;} .to-cart .cart-item .item-intro a:hover{color:#f30;} .to-cart .cart-item .item-extra{float:right;color:#999;} .to-cart .cart-item .item-extra .delete{color:#016dca;} .to-cart .cart-item .item-extra .delete:hover{color:#f30;} .to-cart .cart-item .item-extra p{text-align:right;padding-top:20px;} .to-cart .cart-item .item-operate a{background:#eee;color:#999;padding:3px;} .to-cart .item-price{color:#f6572f;font-weight:bold;} .to-cart .cart-bottom{padding:10px 15px;background:#fff;line-height:20px;text-align:right;} .to-cart .cart-bottom .item-price{font-size:14px;} .to-cart .cart-goMyCart{display:inline-block;*display:inline;*zoom:1;height:32px;line-height:32px;padding:0 30px;margin-top:5px;font-size:14px;cursor:pointer;color:#fff;background-color:#f65730;border-radius:0;} .to-cart .cart-goMyCart:hover{background-color:#f30;} /**headerNav**/ .headerNav{height:38px;border-bottom:1px solid #f58e74;background-color:#ef4218;} .headerNav-main{width:970px;height:38px;float:left;display:inline;} /*商品分类*/ .headerNav .all-brands{position:relative;z-index:10;float:left;width:230px;height:38px;} .headerNav .all-brands .all-brands-head{width:230px;height:38px;overflow:hidden;} .headerNav .all-brands .all-brands-head a{display:block;height:34px;line-height:38px;color:#fff;font-size:15px;font-weight:bold;text-indent:1em;border:2px solid #f75730;background:#f75730;} .all-brands-list{position:relative;top:0;left:0;width:226px;height:350px;padding-bottom:3px;border:2px solid #ef4218; border-top:0;background-color:#fafafa;} .all-brands-item{padding:4px 15px;border-top:1px solid #fff;} .all-brands-item h3{margin-bottom:5px;font-size:14px;font-weight:normal;color:#353535;} .all-brands-item h3 i{font-size:12px;font-weight:bold;color:#ff6920;} .all-brands-item h3 em{margin-left:5px;font-size:12px;color:#ff6920;} .all-brands-item p{display:inline-block;*display:inline;*zoom:1;width:155px;white-space:nowrap;vertical-align:top;*vertical-align:0;} .all-brands-item p a{margin-right:20px;color:#838383;} .all-brands-item .more{color:#838383;} .all-brands-item p a:hover,.all-brands-item .more:hover{color:#f30;} /*导航*/ .headerNav-nav{float:left;width:600px;height:38px;font-size:16px;font-family:'微软雅黑';white-space:nowrap;} .headerNav-nav li{float:left;width:130px;height:38px;line-height:38px;margin-right:5px;} .headerNav-nav li a{display:block;width:100%;height:38px;text-align:center;text-decoration:none;color:#fff;} .headerNav-nav li a:hover{color:#fff;text-decoration:none;background-color:#d62a00;} .headerNav-nav li .selected{background:#d62a00;} /*container*/ .container{width:100%;min-width:1200px;margin:auto;} /*footer*/ .footer{width:100%;min-width:1200px;margin:auto;border-top:1px solid #f3f1f1;background-color:#f6f6f6;} .footer-service{float:left;width:983px;padding:105px 0 20px 7px;background:url(../images/foot_service.png) no-repeat 5px 30px;} .footer-service dl{display:inline-block;*display:inline;*zoom:1;width:205px;vertical-align:top;position:relative;padding-left:40px;} .footer-service dt{position:relative;zoom:1;font-size:14px;font-weight:bold;margin-bottom:5px;} .footer-service dt .icon-aq{position:absolute;left:-28px;top:0;display:block;width:22px;height:22px;background:url(../images/base.png) no-repeat -207px 0;} .footer-service dt .icon-service{position:absolute;left:-28px;top:0;display:block;width:22px;height:22px;background:url(../images/base.png) no-repeat -207px -27px;} .footer-service dt .icon-pay{position:absolute;left:-28px;top:0;display:block;width:22px;height:22px;background:url(../images/base.png) no-repeat -207px -54px;} .footer-service dd{line-height:22px;} .footer-service dd a{color:#666;} .footer-service dd a:hover{color:#333;} .online{float:left;display:inline;width:210px;padding-top:25px;padding-bottom:20px;} .online li{float:left;display:inline;width:98px;height:27px;margin:0 0 7px 7px;overflow:hidden;} .online li a{display:block;width:96px;height:25px;border:1px solid #c0c0c0;background:url(../images/base.png) no-repeat;} .online .line1 a{background-position:0 -96px;} .online .line2 a{background-position:0 -126px;} .online .line3 a{background-position:0 -156px;} .online .line4 a{background-position:0 -186px;} .online .line5 a{background-position:0 -216px;} .online .line6 a{background-position:0 -246px;} .online li a:hover{border-color:#f70;} .footer-copyright{color:#777;border-top:1px solid #dddddd;padding:25px 0;text-align:center;line-height:25px;background-color:#fff;} .footer-copyright p a{color:#777;margin:0 5px;} .footer-copyright p a:hover{color:#333;} .copyright{padding-bottom:5px;color:#999;} .footer-copyright .cr-icon{display:block;width:229px;height:41px;margin:0 auto;background:url(../images/base.png) no-repeat 0 -276px;} /*popbox*/ .mark{position:fixed;top:0;left:0;z-index:100;width:100%;height:100%;background-color:#000;filter:alpha(opacity=30);-moz-opacity:0.3;-khtml-opacity:0.3;opacity:0.3;} * html .mark{position:absolute;top:expression(eval(document.documentElement.scrollTop))} .popbox{position:fixed;z-index:100;width:470px;font-size:14px;border:3px solid #ef421a;background:#fff;} * html .popbox{position:absolute;top:expression(eval(document.documentElement.scrollTop)+110)} .popbox .pop-head{height:50px;line-height:50px;position:relative;} .popbox .pop-head h2{padding:0 18px;font-size:18px;font-family:'微软雅黑';color:#535353;} .popbox .pop-head .pop-close{width:21px;height:21px;display:block;cursor:pointer;position:absolute;top:50%;margin-top:-11px;right:15px;background:url(../images/pop_sprices.png) no-repeat 0 0;} .popbox .pop-foot{text-align:center;padding:0 15px 30px 15px;} .popbox .pop-foot .btn{width:120px;} .pop-body{padding:15px;} .pop-body .icon-cue{width:29px;height:29px;display:inline-block;*display:inline;*zoom:1;background:url(../images/popbox_sprices.png) no-repeat -1px -24px;vertical-align:middle;margin-right:8px;} .pop-body .icon-suc{width:29px;height:30px;display:inline-block;*display:inline;*zoom:1;background:url(../images/popbox_sprices.png) no-repeat -1px -119px;vertical-align:middle;margin-right:8px;} .pop-body .icon-fai{width:29px;height:30px;display:inline-block;*display:inline;*zoom:1;background:url(../images/popbox_sprices.png) no-repeat -1px -85px;vertical-align:middle;margin-right:8px;} .pop-massage{padding:30px 0 20px 0;text-align:center;} /*popform*/ .pop-form .text-box{width:120px;height:18px;padding:2px;line-height:18px;border:1px solid #ccc;} .pop-form .select-box{width:126px;height:22px;border:1px solid #ccc;} .pop-form .textarea-box{width:535px;height:54px;padding:3px;border:1px solid #ccc;} .pop-form .pop-form-btn{margin-top:26px;text-align:right;} .pop-form .pop-form-btn .btn{width:120px;font-size:14px;font-weight:bold;} /*pop-login*/ .pop-login-cut{border-top:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;} .pop-login-cut li{float:left;width:50%;text-align:center;line-height:48px;font-size:14px;background-color:#f7f7f7;cursor:pointer;} .pop-login-cut .current{color:#fff;background-color:#ef4218;} .pop-login-form{width:385px;margin:0 auto;padding-top:20px;color:#606060;} .pop-login-form p{padding-bottom:10px;} .pop-login-form .tyhz{padding:2px 0 12px 0;} .pop-login-form .sub-btn{padding-bottom:20px;} .pop-login-form .label{display:inline-block;*display:inline;*zoom:1;width:89px;font-size:14px; font-family:'宋体';} .pop-login-form .label em{margin-right:8px;} .pop-login-form .text-box{height:34px;line-height:34px;text-indent:4px;border:1px solid #dfdfdf;} .pop-login-form .code-img{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin-top:5px;margin-left:15px;} .pop-login-form .code-img img{width:48px;height:31px;} .pop-login-form .cg{margin-left:15px;color:#3399e0;} .pop-login-form .cg:hover{color:#f30;} .pop-login-form .btn{width:122px;border-radius:2px;} .pop-login-form .btn-red{background-color:#ff3300;} .pop-login-form .btn-red:hover{background-color:#e94609;} .pop-login-extra{width:385px;margin:0 auto;padding:15px 0;text-align:center;border-top:1px dotted #d0d0d0;color:#606060;} .pop-login-extra a{margin-left:15px;color:#f30;text-decoration:underline;} .pop-login-form .gt{width:33px;height:14px;line-height:1em;margin-left:15px;} /*通用模块(框架)*/ .module .module-head{background:#f2f2f2;padding:15px;} .module .module-head h2{font-size:14px;font-weight:bold;} .module .module-head h2 .sub-text{font-weight:normal;padding:0 30px;} .module .module-body{border:1px solid #ccc;border-top:3px solid #f30;background:#fff;} /*表单*/ .ymall-form{padding:20px;font-size:14px;color:#666;} .ymall-form p{height:45px;} .ymall-form .label{display:inline-block;*display:inline;*zoom:1;width:126px;font-family:'宋体';text-align:right;vertical-align:middle;} .ymall-form .label em{margin-right:5px;} .ymall-form .tt{margin-left:5px;font-size:12px;color:#999;} .ymall-form .text-boxS{width:120px;height:20px;line-height:20px;padding:4px;border:1px solid #dfdfdf;font-size:14px;} .ymall-form .text-boxM{width:278px;height:20px;line-height:20px;padding:4px;border:1px solid #dfdfdf;font-size:14px;} .ymall-form .text-boxL{width:417px;height:20px;line-height:20px;padding:4px;border:1px solid #dfdfdf;font-size:14px;} .ymall-form .select-box{height:22px;border:1px solid #dfdfdf;} .ymall-form .ck-box{margin:4px 4px 0 0;vertical-align:top;*vertical-align:-1px;} .ymall-form .sub-btn{height:36px;line-height:36px;padding:0 30px;*padding:0 15px;font-size:14px;border-radius:0;} /*tabs*/ .ymall-cut{height:40px;border:1px solid #ccc;background:#fbfbfb;} .ymall-cut li{width:130px;height:20px;line-height:20px;border-right:1px dotted #d2d2d2;overflow:hidden;margin-top:10px;font-size:14px;font-weight:bold;float:left;text-align:center;cursor:pointer;} .ymall-cut li:hover{color:#e94609;} .ymall-cut .current{height:38px;line-height:38px;margin-top:-1px;margin-left:-1px;color:#e94609;background:#fff;border-top:2px solid #f30;border-left:1px solid #ddd;border-right:1px solid #ddd;} .ymall-tab{padding:20px;} /*翻页*/ .pages{text-align:center;} .pages a{display:inline-block;*zoom:1;*display:inline;width:30px;padding:5px 0;margin-left:5px;font-family:"宋体";background:url(../images/page-bg.png) no-repeat;} .pages .page-action{width:66px;} .pages .page-num{background-position:0 -127px;} .pages .selected{background:none;} .pages .page-prev{background-position:0 -31px;} .pages .page-prev-unable{background-position:0 0;cursor:default;} .pages .page-prev-unable:hover{color:#333;text-decoration:none;} .pages .page-next{background-position:0 -95px;} .pages .page-next-unable{background-position:0 -62px;} .pages .page-next-unable:hover{color:#333;text-decoration:none;} /*面包屑*/ .breadcrumb{padding-left:10px;padding-bottom:15px;font-family:"宋体";color:#858585;} .breadcrumb a{color:#858585;} .breadcrumb a:hover{color:#f30;} /*温馨提示*/ .reminder{padding:20px 35px;margin-bottom:30px;line-height:30px;color:#666;background-color:#fbfbfb;} .reminder h3{font-weight:bold;} /*提示信息*/ .alarm{border:1px solid #ff9900;padding:20px;color:#ff6600;background:#ffffcc;} .prompt{padding:20px;color:#666;background:#fff;overflow:hidden;border:1px solid #ddd;} .warning{border:1px solid #ff0000;padding:20px;color:#ff0000;background:#ffff99;} .hello-notice{display:none!important;} ================================================ FILE: src/taoshop-portal/src/main/resources/static/css/reg-login.css ================================================ @charset "utf-8"; .login-reg-page .siteLogo{margin-left:100px;} .login-reg-section{width:985px;margin:0 auto 30px;border:4px solid #eaeaea;font-size:14px;color:#606060;} .login-reg-main{position:relative;padding:25px 45px 25px 0;} .login-pic{position:absolute;left:0;top:25px;} .login{margin-left:548px;width:390px;border:1px solid #dfdfdf;} .login-hd li{float:left;width:195px;height:40px;border-bottom:1px solid #dfdfdf;text-align:center;line-height:40px;cursor:pointer;background:#f7f7f7;} .login-hd .current{color:#fff;background:#ef4218;} .login-bd{height:266px;padding:18px 25px 0 30px;} .login-bd .login-tips{font-size:12px;color:#ef4218;} .login-box-phone{padding-bottom:25px;} .forms-box p{margin-top:12px;line-height:32px;} .forms-box .label{display:inline-block;width:90px;padding-right:5px;text-align:right;font-family:simsun;} .forms-box .required{display:inline-block;margin-right:10px;color:#ef4218;font-weight:normal;} .forms-box .user-text{width:200px;height:28px;border:1px solid #dfdfdf;padding-left:3px;line-height:28px;} .forms-box .user-pwd{width:126px;} .forms-box .user-code{width:78px;} .forms-box .code-img{width:40px;height:26px;margin:0 8px;vertical-align:-9px;} .forms-box .smsCapt{font-size:12px;} .forms-box .input-tips{margin-left:5px;color:#3399e0;font-size:12px;} .forms-box .input-tips:hover{color:#f30;} .forms-box .get-pwd{display:inline-block;width:58px;height:24px;margin-left:17px;font-size:12px;line-height:24px;vertical-align:middle;} .forms-box .pwd-type{margin:0 5px;font-size:12px;} .forms-box .enter-btn{width:116px;height:31px;cursor:pointer;} .forms-box .reg-tips{margin-top:20px;padding-top:6px;padding-bottom:11px;border-top:1px dotted #d0d0d0;text-align:center;} .forms-box .reg-now{margin-left:5px;color:#3399e0;text-decoration:underline;} .forms-box .reg-now:hover{color:#f30;} .reg-main{padding:25px 45px; } .reg-top{padding-left:28px;border-bottom:1px dotted #d0d0d0;} .reg-top-tit{color:#ef4218;font:18px/20px "Microsoft Yahei";} .reg-top-tips{padding:20px 0;font-size:12px;} .reg-forms{padding:30px 0 30px 90px;border-bottom:1px dotted #d0d0d0;} .reg-forms .user-pwd{width:200px;} .reg-forms-tips{font-size:12px;} /***统一按钮***/ .brown-btn{border-radius:2px;color:#fff;text-align:center;background:#b67136;} .brown-btn:hover,.brown-btn:active{color:#fff;background:#9f5e27;} .orange-btn{border:1px solid #ff3300;border-radius:2px;color:#fff;text-align:center;background:#ff3300;} .orange-btn:hover,.orange-btn:active{color:#fff;background:#ef4218;} .forms-box .entry{margin-left:15px;font-size:12px;color:#3399e0;text-decoration:underline;} .forms-box .entry:hover{color:#f30;} /**成功绑定**/ .binding-cue{padding:35px 0;text-align:center;} .binding-cue .icon-cue{display:inline-block;*display:inline;*zoom:1;width:44px;height:40px;overflow:hidden;background:url(../images/login-reg-bg.png) no-repeat 0 -72px;vertical-align:top;margin:-8px 20px 0 0;} .binding-cue .btn-action{padding-top:30px;} .binding-cue .btn-action .btn-red{padding:9px 24px;border-radius:5px;background-color:#f65730;} .binding-cue .btn-action .btn-red:hover{background-color:#f30;} /**电信手机初次登录**/ .reg-binding{float:left;width:365px;margin-top:10px;} .reg-binding .reg-top{padding-left:10px;} .reg-binding .reg-top-tips{padding:15px 0;} .reg-binding .reg-forms{padding:5px 0 0 10px;border-bottom:0;} .reg-binding .reg-forms p{margin-top:10px;} .reg-binding .reg-forms .action{float:right;margin-right:44px;color:#3399e0;} .reg-binding .reg-forms .action:hover{color:#f30;} .reg-binding .reg-forms .j-massage{display:block;line-height:18px;padding-top:5px;padding-left:95px;font-size:12px;color:#f40;} .reg-binding .reg-forms .reg-forms-tips{margin-top:25px;padding-top:5px;border-top:1px dotted #d0d0d0;} .reg-binding .reg-forms .reg-forms-tips a{text-decoration:underline;color:#3399e0;} .reg-binding .reg-forms .reg-forms-tips a:hover{color:#f30;} .direct-binding{float:right;width:355px;margin-top:25px;padding:30px;border:3px solid #eaeaea;} .direct-binding .reg-top{padding-left:10px;} .direct-binding .reg-top-tit{padding:0 0 15px 0;color:#606060;} .direct-binding .reg-forms{padding:5px 0 0 10px;border-bottom:0;} .direct-binding .forms-box .label{display:block;width:auto;text-align:left;} .direct-binding .reg-forms .j-massage{display:block;line-height:18px;padding-top:5px;padding-left:0;font-size:12px;color:#f40;} ================================================ FILE: src/taoshop-portal/src/main/resources/static/css/user.css ================================================ @charset "utf-8"; .user{padding:20px 0;} .user-aside{width:230px;float:left;padding:10px 0;background:#fbfbfb;} .user-aside .user-list-items{padding:0 18px;margin-bottom:18px;} .user-list-items .user-list-tit{border-bottom:1px solid #e7e7e7;color:#333;font:18px/45px "Microsoft Yahei";} .user-list-items li{margin-top:15px;font-size:14px;} .user-list-items li a{border-left:2px solid #fbfbfb;padding-left:10px;} .user-list-items .cur a,.user-list-items li a:hover{border-left:2px solid #f76a48;color:#f76a48;} .user-main{width:950px;float:right;} .user-main .user-info{height:80px;padding:18px 25px;border:1px solid #dfdfdf;} .user-info .user-avatar{vertical-align:middle; cursor:pointer;} .user-info .user-name{margin:0 30px;color:#333;font:20px/30px "Microsoft Yahei";} .user-info .user-welcome{color:#666;font:16px/30px "Microsoft Yahei";} .user-about-items{margin-top:15px;border:1px solid #dfdfdf;} .user-about-items .user-about-hd{height:40px;border-bottom:1px solid #dfdfdf;background:#fbfbfb;} .user-about-hd .user-about-tit{float:left;padding-left:16px;font:bold 14px/40px "宋体";} .user-about-hd .view-cart{float:right;margin:13px 14px 0 0;color:#ef4218;} .user-about-bd{font-size:14px;} .user-about-none{padding:45px 0;color:#8c8c8c;text-align:center;} .user-about-none a{color:#ef4218;} .orders-table{width:96%;margin:0 auto;} .orders-table td{padding:28px 0;vertical-align:middle;border-bottom:1px solid #f8f8f8;} .orders-table .orders-pic-td{padding-left:15px;} .orders-table .tc{text-align:center;} .orders-table .orders-pic{width:58px;height:58px;border:1px solid #e5e5e5;} .orders-table .orders-price,.orders-table .orders-detail{display:inline-block;padding:16px 35px;border-left:1px dotted #b8b8b8;} .orders-table .orders-price{color:#919191;} .orders-table .orders-detail{border-right:1px dotted #b8b8b8;color:#919191;text-decoration:underline;} .paid-orders-table .orders-detail{border-right:none;} .buynow{padding:8px 28px;} .my-cart{width:950px;overflow:hidden;} .my-cart-list{width:1000px;padding:30px 0 15px;} .my-cart-list li{float:left;width:120px;margin-left:35px;font-size:12px;line-height:30px;} .my-cart-list img{width:103px;height:103px;border:1px solid #e5e5e5;} .my-cart-list img:hover{border:1px solid #ef4218;} .my-cart-list a{color:#707070;} .my-cart-list a:hover{color:#ef4218;} .user-bread-crumbs{padding-top:13px;border-bottom:1px solid #d5d5d5;} .bread-crumbs-tit{color:#666;font:18px/40px "Microsoft Yahei";} .my-address{width:952px;padding-top:25px;overflow:hidden;} .address-section{width:1100px;padding-bottom:200px;} .my-address .address-box{position:relative;float:left;width:298px;height:192px;border:1px solid #dfdfdf;margin-left:10px;margin-right:6px;margin-bottom:25px;color:#999;font-size:14px;background:#fbfbfb;} .my-address .address-add,.my-address .address-info,.my-address .address-edit{position:absolute;top:0;left:0;display:none;} .my-address .address-add{text-align:center;width:100%;height:100%;} .my-address .address-add-control{display:inline-block;width:60px;margin-top:25px;padding-top:90px;background:url(../images/add-address.png) center center no-repeat;} .my-address .address-add a{color:#999;} .address-info{padding:15px 10px;} .address-info p{padding:10px 0;} .address-info .important-info{border-bottom:1px solid #d5d5d5;color:#666;} .important-info .phone{float:right;} .address-action a{margin-right:10px;padding:6px 28px;} .address-action .address-confirm{padding:6px 15px;} .address-info .location-info,.address-info .address-action{padding-left:6px;} .my-address .address-edit{left:-1px;top:-1px;width:250px;padding:20px 22px;color:#999;border:3px solid #f3f3f3;overflow:hidden;background:#fff;} .address-edit p{margin-bottom:12px;} .address-edit .address-text{width:242px;height:28px;line-height:28px;border:1px solid #e7e7e7;padding-left:10px;} .address-edit .address-text-area{height:100px;resize:none;} .address-edit .address-province,.address-edit .address-city{width:123px;border:1px solid #e7e7e7;} .address-edit .address-district{width:254px;border:1px solid #e7e7e7;} .address-add-box .address-add{display:block;} .address-info-box .address-info{display:block;} .address-edit-box .address-edit{display:block;} .my-orders-items{margin-top:15px;line-height:35px;} .orders-info-table{border:1px solid #dfdfdf;font-size:14px;} .orders-info-table th{border-bottom:1px solid #dfdfdf;padding-left:15px;color:#666;background:#fbfbfb;} .orders-info-table .orders-items-status{color:#ef4218;} .orders-info-table .orders-items-number,.orders-info-table .orders-items-time{margin:0 20px;} .orders-info-table td{border:1px solid #dfdfdf;padding:5px 0;text-align:center;vertical-align:middle;} .orders-info-table .orders-items-descri{padding-left:30px;text-align:left;border-left:none;} .orders-info-table .orders-items-pic{border-right:none;} .orders-info-table .orders-pic{width:58px;height:58px;border:1px solid #e5e5e5;margin-top:15px;} .orders-info-table .orders-items-price,.orders-info-table .my-number{color:#ef4218;} .orders-info-table .orders-items-price{margin-right:5px;} .orders-info-table .orders-items-num{margin-left:5px;} .my-orders-link{text-decoration:underline;margin:0 5px;} .my-orders-detail{color:#ef4218;} .my-orders-cancel{color:#00469d;} .orders-items-descri p{color:#999;font-size:12px;line-height:22px;} .orders-detail-table th{text-align:center;} .orders-total-info{padding:15px 28px 15px 0;text-align:right;line-height:35px;} .orders-total-des{display:inline-block;width:120px;color:#ef4218;} .orders-total-des strong{font:bold 20px/50px "宋体";} .order-about-item{margin:0 5px;color:#999;} .order-item-price{margin-left:3px;color:#ef4218;} .receive-info{margin:18px 0;padding:18px 0 18px 38px;line-height:32px;background:#fbfbfb;} .application-table{margin-top:25px;} .application-table th{border-top:2px solid #ea4621;padding:10px 0 10px 22px;font-size:14px;font-weight:bold;color:#787878;background:#fff7e5;} .application-table td{line-height:45px;font-size:14px;vertical-align:middle;} .application-table .key-td{padding-right:10px;text-align:right;} .application-table label{margin-right:40px;vertical-align:middle;} .application-table .return-type{margin-right:5px;} .application-table .form-text{width:285px;height:26px;border:1px solid #dfdfdf;padding-left:3px;line-height:28px;} .application-table .form-text-area{height:115px;resize:none;} .application-table .note{color:#fe0000;} .application-table .submit-form{border:0 none;padding:8px 32px;font-size:14px;overflow:visible;cursor:pointer;} /***统一按钮***/ .gray-btn{border:1px solid #e3e3e3;border-radius:2px;color:#666;text-align:center;background:#fff;} .gray-btn:hover,.gray-btn:active{color:#666;background:#f8f8f8;} .orange-btn{border:1px solid #ff3300;border-radius:2px;color:#fff;text-align:center;background:#ff3300;} .orange-btn:hover,.orange-btn:active{color:#fff;background:#ef4218;} /**找回密码**/ .gb-password{margin-bottom:50px;padding-top:40px;} .gb-password h3{padding-bottom:3px;text-indent:9px;font-size:18px;font-family:'微软雅黑';color:#656565;} .gb-password .gb-password-main{padding:20px;border:1px solid #cfcfcf;} .gb-password-proBar{width:1000px;height:29px;line-height:29px;margin:0 auto 60px;background:url(../images/parbar.png) no-repeat;} .bar02{background-position:0 -29px;} .bar03{background-position:0 -58px;} .bar04{background-position:0 -87px;} .gb-password-proBar span{display:block;width:270px;text-align:center;float:left;font-size:18px;font-family:'微软雅黑';color:#fff;} .gb-password-proBar .ft{width:250px} .gb-password-proBar .lt{width:185px} .gb-password-proBar .cur{color:#ff8601;} .gb-password-form{width:400px;margin:0 auto;padding-bottom:30px;} .gb-password-form .gb-password-tip{display:inline-block;*display:inline;*zoom:1;padding:0 8px;margin-bottom:20px;font-size:14px;line-height:24px;border:1px solid #b9b9b9;background:url(../images/kengdie_sheji.png) repeat-x;} .gb-password-form .gb-password-tip a{font-family:'宋体';color:#087cdf;} .gb-password-form p{padding-bottom:15px;} .gb-password-form .label{display:inline-block;width:112px;text-align:right;font-size:14px;color:#333;} .gb-password-form .text-box{text-indent:3px;height:30px;line-height:30px;border:1px solid #dfdfdf;} .gb-password-form .code-img{display:inline-block;*display:inline;*zoom:1;width:50px;height:30px;vertical-align:middle;margin:2px 0 0 10px;} .gb-password-form .code-img img{width:50px;height:28px;} .gb-password-form .entry{display:inline-block;*display:inline;*zoom:1;margin-left:15px;line-height:32px;} .gb-password-form .entry a{color:#3399e0;} .gb-password-form .entry a:hover{color:#f30;} .gb-password-form .sub-btn{font-size:14px;} .gb-password-suc{width:400px;margin:0 auto;padding-bottom:40px;font-size:14px;} .gb-password-suc .emall{padding-bottom:20px;text-align:center;font-family:'宋体';} .gb-password-suc .reset{padding-bottom:20px;text-align:center;font-size:14px;color:#18b71c;} .gb-password-suc .reset-btn{padding-bottom:20px;text-align:center;} .gb-password-suc .btn-red{font-size:14px;} .gb-password-suc .tips{line-height:24px;} .gb-password-suc .icon-suc{display:inline-block;*display:inline;*zoom:1;width:35px;height:29px;background:url(../images/xdyz.png) no-repeat;vertical-align:top;margin:-6px 5px 0 0;} .user-main .gb-password-form{padding:30px 275px 20px 275px;background-color:#fbfbfb;} .user-main .gb-password-suc{padding:50px 275px 40px 275px;background-color:#fbfbfb;} /**安全中心**/ .safe-center{margin-bottom:40px;border:1px solid #dfdfdf;border-bottom:0;} .safe-center h2{padding:6px;font-size:16px;text-indent:10px;font-weight:bold;border-bottom:1px solid #dfdfdf;background-color:#fbfbfb;} .safe-plate{padding:20px 0;border-bottom:1px solid #dfdfdf;} .safe-plate .safe-plate-method{float:left;padding:0 40px;height:70px;line-height:70px;font-size:20px;font-weight:bold;border-right:1px solid #dfdfdf;} .safe-plate .safe-plate-method .icon-password{display:inline-block;*display:inline;*zoom:1;width:35px;height:38px;overflow:hidden;background:url(../images/safe_plate.png) no-repeat;vertical-align:top;margin:14px 10px 0 0;} .safe-plate .safe-plate-method .icon-email{display:inline-block;*display:inline;*zoom:1;width:35px;height:38px;overflow:hidden;background:url(../images/safe_plate.png) no-repeat 0 -38px;vertical-align:top;margin:14px 10px 0 0;} .safe-plate .safe-plate-method .icon-tel{display:inline-block;*display:inline;*zoom:1;width:35px;height:38px;overflow:hidden;background:url(../images/safe_plate.png) no-repeat 0 -76px;vertical-align:top;margin:14px 10px 0 0;} .safe-plate .safe-plate-span{float:left;padding:0 40px;height:70px;line-height:70px;overflow:hidden;font-size:14px;white-space:nowrap;} .safe-plate .safe-plate-action{float:right;padding-right:40px;line-height:70px;font-size:14px;} /**验证手机**/ .code-proBar {height:29px;line-height:29px;overflow:hidden;margin:0 auto 10px;background:url(../images/code_parbar.png) no-repeat;} .bar02{background-position:0 -29px;} .bar03{background-position:0 -58px;} .code-proBar span{display:block;width:310px;text-align:center;float:left;font-size:18px;font-family:'微软雅黑';color:#fff;} .code-proBar .ft{width:305px} .code-proBar .lt{width:335px} .code-proBar .cur{color:#ff8601;} .code-main{padding:20px;border:1px solid #cfcfcf;} .code-cue{font-size:14px;padding:35px 0;text-align:center;} .code-cue .icon-cue{display:inline-block;*display:inline;*zoom:1;width:44px;height:40px;overflow:hidden;background:url(../images/login-reg-bg.png) no-repeat 0 -72px;vertical-align:top;margin:-8px 20px 0 0;} .code-main .gb-password-form,.code-main .gb-password-suc{padding:30px 255px 20px 255px;background-color:#fff;} .gb-password-form .j-massage{display:block;line-height:18px;padding-top:5px;padding-left:115px;font-size:12px;color:#f40;} .code-main .gb-password-form .btn-coffee{padding:6px 15px;} ================================================ FILE: src/taoshop-portal/src/main/resources/static/css/you_like.css ================================================ @charset "utf-8"; .you-like{float:left;width:225px;} .you-like h3{height:40px;line-height:40px;border-bottom:1px solid #ccc;font-size:18px;font-family:'微软雅黑';text-indent:10px;} .you-like-list{padding:0 15px;} .you-like-item{padding:10px 0;border-bottom:1px dotted #ddd;word-break:break-all;} .you-like-item .item-img{text-align:center;} .you-like-item .item-img,.you-like-item .item-img img{width:110px;height:110px;margin:0 auto;} .you-like-item .item-info a{color:#666;display:block;text-align:center;} .you-like-item .item-info a:hover{color:#f30;} .you-like-item .item-price{text-align:center;color:#ef4e2d;} ================================================ FILE: src/taoshop-portal/src/main/resources/static/js/html5.js ================================================ (function(){if(!/*@cc_on!@*/0)return;var e = "abbr,article,aside,audio,canvas,datalist,details,dialog,eventsource,figure,footer,header,hgroup,mark,menu,meter,nav,output,progress,section,time,video".split(','),i=e.length;while(i--){document.createElement(e[i])}})() ================================================ FILE: src/taoshop-portal/src/main/resources/static/js/jquery.cookie.js ================================================ /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2006, 2014 Klaus Hartl * Released under the MIT license */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports === 'object') { // CommonJS factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function ($) { var pluses = /\+/g; function encode(s) { return config.raw ? s : encodeURIComponent(s); } function decode(s) { return config.raw ? s : decodeURIComponent(s); } function stringifyCookieValue(value) { return encode(config.json ? JSON.stringify(value) : String(value)); } function parseCookieValue(s) { if (s.indexOf('"') === 0) { // This is a quoted cookie as according to RFC2068, unescape... s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); } try { // Replace server-side written pluses with spaces. // If we can't decode the cookie, ignore it, it's unusable. // If we can't parse the cookie, ignore it, it's unusable. s = decodeURIComponent(s.replace(pluses, ' ')); return config.json ? JSON.parse(s) : s; } catch(e) {} } function read(s, converter) { var value = config.raw ? s : parseCookieValue(s); return $.isFunction(converter) ? converter(value) : value; } var config = $.cookie = function (key, value, options) { // Write if (arguments.length > 1 && !$.isFunction(value)) { options = $.extend({}, config.defaults, options); if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setTime(+t + days * 864e+5); } return (document.cookie = [ encode(key), '=', stringifyCookieValue(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : '' ].join('')); } // Read var result = key ? undefined : {}; // To prevent the for loop in the first place assign an empty array // in case there are no cookies at all. Also prevents odd result when // calling $.cookie(). var cookies = document.cookie ? document.cookie.split('; ') : []; for (var i = 0, l = cookies.length; i < l; i++) { var parts = cookies[i].split('='); var name = decode(parts.shift()); var cookie = parts.join('='); if (key && key === name) { // If second argument (value) is a function it's a converter... result = read(cookie, value); break; } // Prevent storing a cookie that we couldn't decode. if (!key && (cookie = read(cookie)) !== undefined) { result[name] = cookie; } } return result; }; config.defaults = {}; $.removeCookie = function (key, options) { if ($.cookie(key) === undefined) { return false; } // Must not alter options, thus extending a fresh object... $.cookie(key, '', $.extend({}, options, { expires: -1 })); return !$.cookie(key); }; })); ================================================ FILE: src/taoshop-portal/src/main/resources/static/js/jquery.js ================================================ /*! * jQuery JavaScript Library v1.7.2 * http://jquery.com/ * * Copyright 2011, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Wed Mar 21 12:46:34 2012 -0700 */ (function( window, undefined ) { // Use the correct document accordingly with window argument (sandbox) var document = window.document, navigator = window.navigator, location = window.location; var jQuery = (function() { // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); }, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // A central reference to the root jQuery(document) rootjQuery, // A simple way to check for HTML strings or ID strings // Prioritize #id over to avoid XSS via location.hash (#9521) quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace trimLeft = /^\s+/, trimRight = /\s+$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // JSON RegExp rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, // Useragent RegExp rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, // Matches dashed string for camelizing rdashAlpha = /-([a-z]|[0-9])/ig, rmsPrefix = /^-ms-/, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return ( letter + "" ).toUpperCase(); }, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // The deferred used on DOM ready readyList, // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, // [[Class]] -> type pairs class2type = {}; jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = quickExpr.exec( selector ); } // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; doc = ( context ? context.ownerDocument || context : document ); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.7.2", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // Add the callback readyList.add( fn ); return this; }, eq: function( i ) { i = +i; return i === -1 ? this.slice( i ) : this.slice( i, i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Either a released hold or an DOMready/load event and not yet ready if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.fireWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger( "ready" ).off( "ready" ); } } }, bindReady: function() { if ( readyList ) { return; } readyList = jQuery.Callbacks( "once memory" ); // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready return setTimeout( jQuery.ready, 1 ); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { return obj != null && obj == obj.window; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return ( new Function( "return " + data ) )(); } jQuery.error( "Invalid JSON: " + data ); }, // Cross-browser xml parsing parseXML: function( data ) { if ( typeof data !== "string" || !data ) { return null; } var xml, tmp; try { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; }, // Use native String.trim function wherever possible trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 var type = jQuery.type( array ); if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array, i ) { var len; if ( array ) { if ( indexOf ) { return indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, key, ret = [], i = 0, length = elems.length, // jquery objects are treated as arrays isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( key in elems ) { value = callback( elems[ key ], key, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { if ( typeof context === "string" ) { var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; }, // Mutifunctional method to get and set values to a collection // The value/s can optionally be executed if it's a function access: function( elems, fn, key, value, chainable, emptyGet, pass ) { var exec, bulk = key == null, i = 0, length = elems.length; // Sets many values if ( key && typeof key === "object" ) { for ( i in key ) { jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); } chainable = 1; // Sets one value } else if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = pass === undefined && jQuery.isFunction( value ); if ( bulk ) { // Bulk operations only iterate when executing function values if ( exec ) { exec = fn; fn = function( elem, key, value ) { return exec.call( jQuery( elem ), value ); }; // Otherwise they run against the entire set } else { fn.call( elems, value ); fn = null; } } if ( fn ) { for (; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } } chainable = 1; } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }, now: function() { return ( new Date() ).getTime(); }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, sub: function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }, browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch(e) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } return jQuery; })(); // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; } /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how * the callback list behaves * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible flags: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // (we check in cache first) flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; var // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = [], // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Add one or several callbacks to the list add = function( args ) { var i, length, elem, type, actual; for ( i = 0, length = args.length; i < length; i++ ) { elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { // Inspect recursively add( elem ); } else if ( type === "function" ) { // Add if not in unique mode and callback is not in if ( !flags.unique || !self.has( elem ) ) { list.push( elem ); } } } }, // Fire callbacks fire = function( context, args ) { args = args || []; memory = !flags.memory || [ context, args ]; fired = true; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else { list = []; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { var length = list.length; add( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away, unless previous // firing was halted (stopOnFalse) } else if ( memory && memory !== true ) { firingStart = length; fire( memory[ 0 ], memory[ 1 ] ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { var args = arguments, argIndex = 0, argLength = args.length; for ( ; argIndex < argLength ; argIndex++ ) { for ( var i = 0; i < list.length; i++ ) { if ( args[ argIndex ] === list[ i ] ) { // Handle firingIndex and firingLength if ( firing ) { if ( i <= firingLength ) { firingLength--; if ( i <= firingIndex ) { firingIndex--; } } } // Remove the element list.splice( i--, 1 ); // If we have some unicity property then // we only need to do this once if ( flags.unique ) { break; } } } } } return this; }, // Control if a given callback is in the list has: function( fn ) { if ( list ) { var i = 0, length = list.length; for ( ; i < length; i++ ) { if ( fn === list[ i ] ) { return true; } } } return false; }, // Remove all callbacks from the list empty: function() { list = []; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory || memory === true ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); } } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; var // Static reference to slice sliceDeferred = [].slice; jQuery.extend({ Deferred: function( func ) { var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "memory" ), state = "pending", lists = { resolve: doneList, reject: failList, notify: progressList }, promise = { done: doneList.add, fail: failList.add, progress: progressList.add, state: function() { return state; }, // Deprecated isResolved: doneList.fired, isRejected: failList.fired, then: function( doneCallbacks, failCallbacks, progressCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); return this; }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, pipe: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], fail: [ fnFail, "reject" ], progress: [ fnProgress, "notify" ] }, function( handler, data ) { var fn = data[ 0 ], action = data[ 1 ], returned; if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } }); } else { deferred[ handler ]( newDefer[ action ] ); } }); }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { if ( obj == null ) { obj = promise; } else { for ( var key in promise ) { obj[ key ] = promise[ key ]; } } return obj; } }, deferred = promise.promise({}), key; for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; } // Handle state deferred.done( function() { state = "resolved"; }, failList.disable, progressList.lock ).fail( function() { state = "rejected"; }, doneList.disable, progressList.lock ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( firstParam ) { var args = sliceDeferred.call( arguments, 0 ), i = 0, length = args.length, pValues = new Array( length ), count = length, pCount = length, deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? firstParam : jQuery.Deferred(), promise = deferred.promise(); function resolveFunc( i ) { return function( value ) { args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; if ( !( --count ) ) { deferred.resolveWith( deferred, args ); } }; } function progressFunc( i ) { return function( value ) { pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; deferred.notifyWith( promise, pValues ); }; } if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); } else { --count; } } if ( !count ) { deferred.resolveWith( deferred, args ); } } else if ( deferred !== firstParam ) { deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); } return promise; } }); jQuery.support = (function() { var support, all, a, select, opt, input, fragment, tds, events, eventName, i, isSupported, div = document.createElement( "div" ), documentElement = document.documentElement; // Preliminary tests div.setAttribute("className", "t"); div.innerHTML = "
        a"; all = div.getElementsByTagName( "*" ); a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { return {}; } // First batch of supports tests select = document.createElement( "select" ); opt = select.appendChild( document.createElement("option") ); input = div.getElementsByTagName( "input" )[ 0 ]; support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText instead) style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: ( a.getAttribute("href") === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) getSetAttribute: div.className !== "t", // Tests for enctype support on a form(#6743) enctype: !!document.createElement("form").enctype, // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", // Will be defined later submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, reliableMarginRight: true, pixelMargin: true }; // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); // Make sure checked status is properly cloned input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete div.test; } catch( e ) { support.deleteExpando = false; } var onclicktmp = null; if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent( "onclick", onclicktmp = function() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) support.noCloneEvent = false; }); div.cloneNode( true ).fireEvent( "onclick" ); div.detachEvent( "onclick", onclicktmp); // adamki added } // Check if a radio maintains its value // after being appended to the DOM input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); // #11217 - WebKit loses check when the name is after the checked attribute input.setAttribute( "name", "t" ); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.lastChild ); // WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) support.appendChecked = input.checked; fragment.removeChild( input ); fragment.appendChild( div ); // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems // are used, namely in IE. Short-circuiting here helps us to // avoid an eval call (in setAttribute) which can cause CSP // to go haywire. See: https://developer.mozilla.org/en/Security/CSP if ( div.attachEvent ) { for ( i in { submit: 1, change: 1, focusin: 1 }) { eventName = "on" + i; isSupported = ( eventName in div ); if ( !isSupported ) { div.setAttribute( eventName, "return;" ); isSupported = ( typeof div[ eventName ] === "function" ); } support[ i + "Bubbles" ] = isSupported; } } fragment.removeChild( div ); // Null elements to avoid leaks in IE fragment = select = opt = div = input = null; // Run tests that need a body at doc ready jQuery(function() { var container, outer, inner, table, td, offsetSupport, marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, paddingMarginBorderVisibility, paddingMarginBorder, body = document.getElementsByTagName("body")[0]; if ( !body ) { // Return for frameset docs that don't have a body return; } conMarginTop = 1; paddingMarginBorder = "padding:0;margin:0;border:"; positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; html = "
        " + "" + "
        "; container = document.createElement("div"); container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element div = document.createElement("div"); container.appendChild( div ); // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) div.innerHTML = "
        t
        "; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); tds[ 0 ].style.display = ""; tds[ 1 ].style.display = "none"; // Check if empty table cells still have offsetWidth/Height // (IE <= 8 fail this test) support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. For more // info see bug #3333 // Fails in WebKit before Feb 2011 nightlies // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right if ( window.getComputedStyle ) { div.innerHTML = ""; marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.style.width = "2px"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } if ( typeof div.style.zoom !== "undefined" ) { // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout // (IE < 8 does this) div.innerHTML = ""; div.style.width = div.style.padding = "1px"; div.style.border = 0; div.style.overflow = "hidden"; div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); // Check if elements with layout shrink-wrap their children // (IE 6 does this) div.style.display = "block"; div.style.overflow = "visible"; div.innerHTML = "
        "; support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); } div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; div.innerHTML = html; outer = div.firstChild; inner = outer.firstChild; td = outer.nextSibling.firstChild.firstChild; offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; inner.style.position = "fixed"; inner.style.top = "20px"; // safari subtracts parent border width here which is 5px offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); if ( window.getComputedStyle ) { div.style.marginTop = "1%"; support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; } if ( typeof container.style.zoom !== "undefined" ) { container.style.zoom = 1; } body.removeChild( container ); marginDiv = div = container = null; jQuery.extend( support, offsetSupport ); }); return support; })(); var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([A-Z])/g; jQuery.extend({ cache: {}, // Please use with caution uuid: 0, // Unique for each copy of jQuery on the page // Non-digits removed to match rinlinejQuery expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, // Ban all objects except for Flash (which handle expandos) "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", "applet": true }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var privateCache, thisCache, ret, internalKey = jQuery.expando, getByName = typeof name === "string", // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, isEvents = name === "events"; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { elem[ internalKey ] = id = ++jQuery.uuid; } else { id = internalKey; } } if ( !cache[ id ] ) { cache[ id ] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify if ( !isNode ) { cache[ id ].toJSON = jQuery.noop; } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } privateCache = thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Users should not attempt to inspect the internal events object using jQuery.data, // it is undocumented and subject to change. But does anyone listen? No. if ( isEvents && !thisCache[ name ] ) { return privateCache.events; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( getByName ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, // See jQuery.data for more information id = isNode ? elem[ internalKey ] : internalKey; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } for ( i = 0, l = name.length; i < l; i++ ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject(cache[ id ]) ) { return; } } // Browsers that fail expando deletion also refuse to delete expandos on // the window, but it will allow it on all other JS objects; other browsers // don't care // Ensure that `cache` is not a window object #10080 if ( jQuery.support.deleteExpando || !cache.setInterval ) { delete cache[ id ]; } else { cache[ id ] = null; } // We destroyed the cache and need to eliminate the expando on the node to avoid // false lookups in the cache for entries that no longer exist if ( isNode ) { // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( jQuery.support.deleteExpando ) { delete elem[ internalKey ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } } }, // For internal use only. _data: function( elem, name, data ) { return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando acceptData: function( elem ) { if ( elem.nodeName ) { var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; if ( match ) { return !(match === true || elem.getAttribute("classid") !== match); } } return true; } }); jQuery.fn.extend({ data: function( key, value ) { var parts, part, attr, name, l, elem = this[0], i = 0, data = null; // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { attr = elem.attributes; for ( l = attr.length; i < l; i++ ) { name = attr[i].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.substring(5) ); dataAttr( elem, name, data[ name ] ); } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } parts = key.split( ".", 2 ); parts[1] = parts[1] ? "." + parts[1] : ""; part = parts[1] + "!"; return jQuery.access( this, function( value ) { if ( value === undefined ) { data = this.triggerHandler( "getData" + part, [ parts[0] ] ); // Try to fetch any internally stored data first if ( data === undefined && elem ) { data = jQuery.data( elem, key ); data = dataAttr( elem, key, data ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } parts[1] = value; this.each(function() { var self = jQuery( this ); self.triggerHandler( "setData" + part, parts ); jQuery.data( this, key, value ); self.triggerHandler( "changeData" + part, parts ); }); }, null, value, arguments.length > 1, null, false ); }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : jQuery.isNumeric( data ) ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { for ( var name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function handleQueueMarkDefer( elem, type, src ) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery._data( elem, deferDataKey ); if ( defer && ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { // Give room for hard-coded callbacks to fire first // and eventually mark/queue something else on the element setTimeout( function() { if ( !jQuery._data( elem, queueDataKey ) && !jQuery._data( elem, markDataKey ) ) { jQuery.removeData( elem, deferDataKey, true ); defer.fire(); } }, 0 ); } } jQuery.extend({ _mark: function( elem, type ) { if ( elem ) { type = ( type || "fx" ) + "mark"; jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); } }, _unmark: function( force, elem, type ) { if ( force !== true ) { type = elem; elem = force; force = false; } if ( elem ) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); if ( count ) { jQuery._data( elem, key, count ); } else { jQuery.removeData( elem, key, true ); handleQueueMarkDefer( elem, type, "mark" ); } } }, queue: function( elem, type, data ) { var q; if ( elem ) { type = ( type || "fx" ) + "queue"; q = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !q || jQuery.isArray(data) ) { q = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } } return q || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(), hooks = {}; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } jQuery._data( elem, type + ".run", hooks ); fn.call( elem, function() { jQuery.dequeue( elem, type ); }, hooks ); } if ( !queue.length ) { jQuery.removeData( elem, type + "queue " + type + ".run", true ); handleQueueMarkDefer( elem, type, "queue" ); } } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, object ) { if ( typeof type !== "string" ) { object = type; type = undefined; } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } } while( i-- ) { if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { count++; tmp.add( resolve ); } } resolve(); return defer.promise( object ); } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, getSetAttribute = jQuery.support.getSetAttribute, nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each(function() { // try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch( e ) {} }); }, addClass: function( value ) { var classNames, i, l, elem, setClass, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call(this, j, this.className) ); }); } if ( value && typeof value === "string" ) { classNames = value.split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 ) { if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { setClass = " " + elem.className + " "; for ( c = 0, cl = classNames.length; c < cl; c++ ) { if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { setClass += classNames[ c ] + " "; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { var classNames, i, l, elem, className, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } if ( (value && typeof value === "string") || value === undefined ) { classNames = ( value || "" ).split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { className = (" " + elem.className + " ").replace( rclass, " " ); for ( c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery._data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, self.val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, i, max, option, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options i = one ? index : 0; max = one ? index + 1 : options.length; for ( ; i < max; i++ ) { option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } // Fixes Bug #2551 -- select.val() broken in IE after form.reset() if ( one && !values.length && options.length ) { return jQuery( options[ index ] ).val(); } return values; }, set: function( elem, value ) { var values = jQuery.makeArray( value ); jQuery(elem).find("option").each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { elem.selectedIndex = -1; } return values; } } }, attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // All attributes are lowercase // Grab necessary hook if one is defined if ( notxml ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, "" + value ); return value; } } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return ret === null ? undefined : ret; } }, removeAttr: function( elem, value ) { var propName, attrNames, name, l, isBool, i = 0; if ( value && elem.nodeType === 1 ) { attrNames = value.toLowerCase().split( rspace ); l = attrNames.length; for ( ; i < l; i++ ) { name = attrNames[ i ]; if ( name ) { propName = jQuery.propFix[ name ] || name; isBool = rboolean.test( name ); // See #9699 for explanation of this approach (setting first, then removal) // Do not do this for boolean attributes (see #10870) if ( !isBool ) { jQuery.attr( elem, name, "" ); } elem.removeAttribute( getSetAttribute ? name : propName ); // Set corresponding property to false for boolean attributes if ( isBool && propName in elem ) { elem[ propName ] = false; } } } } }, attrHooks: { type: { set: function( elem, value ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } }, // Use the value property for back compat // Use the nodeHook for button elements in IE6/7 (#1954) value: { get: function( elem, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.get( elem, name ); } return name in elem ? elem.value : null; }, set: function( elem, value, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.set( elem, value, name ); } // Does not return so that setAttribute is also used elem.value = value; } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }, propHooks: { tabIndex: { get: function( elem ) { // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ var attributeNode = elem.getAttributeNode("tabindex"); return attributeNode && attributeNode.specified ? parseInt( attributeNode.value, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } } } }); // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties // Fall back to attribute presence where some booleans are not supported var attrNode, property = jQuery.prop( elem, name ); return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, set: function( elem, value, name ) { var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property propName = jQuery.propFix[ name ] || name; if ( propName in elem ) { // Only set the IDL specifically if it already exists on the element elem[ propName ] = true; } elem.setAttribute( name, name.toLowerCase() ); } return name; } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) { fixSpecified = { name: true, id: true, coords: true }; // Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = jQuery.valHooks.button = { get: function( elem, name ) { var ret; ret = elem.getAttributeNode( name ); return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? ret.nodeValue : undefined; }, set: function( elem, value, name ) { // Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { ret = document.createAttribute( name ); elem.setAttributeNode( ret ); } return ( ret.nodeValue = value + "" ); } }; // Apply the nodeHook to tabindex jQuery.attrHooks.tabindex.set = nodeHook.set; // Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each([ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }); }); // Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { get: nodeHook.get, set: function( elem, value, name ) { if ( value === "" ) { value = "false"; } nodeHook.set( elem, value, name ); } }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { var ret = elem.getAttribute( name, 2 ); return ret === null ? undefined : ret; } }); }); } if ( !jQuery.support.style ) { jQuery.attrHooks.style = { get: function( elem ) { // Return undefined in the case of empty string // Normalize to lowercase since IE uppercases css property names return elem.style.cssText.toLowerCase() || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = "" + value ); } }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { get: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; } }); } // IE6/7 call enctype encoding if ( !jQuery.support.enctype ) { jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { get: function( elem ) { // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; } }; }); } jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }); }); var rformElems = /^(?:textarea|input|select)$/i, rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; }, quickIs = function( elem, m ) { var attrs = elem.attributes || {}; return ( (!m[1] || elem.nodeName.toLowerCase() === m[1]) && (!m[2] || (attrs.id || {}).value === m[2]) && (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) ); }, hoverHack = function( events ) { return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); }; /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { add: function( elem, types, handler, data, selector ) { var elemData, eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, quick, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho) if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first events = elemData.events; if ( !events ) { elemData.events = events = {}; } eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = jQuery.trim( hoverHack(types) ).split( " " ); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = tns[1]; namespaces = ( tns[2] || "" ).split( "." ).sort(); // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: tns[1], data: data, handler: handler, guid: handler.guid, selector: selector, quick: selector && quickParse( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first handlers = events[ type ]; if ( !handlers ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector? special.delegateType : special.bindType ) || type; eventType = events[ type ] || []; origCount = eventType.length; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Remove matching events for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !namespaces || namespaces.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { eventType.splice( j--, 1 ); if ( handleObj.selector ) { eventType.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( eventType.length === 0 && origCount !== eventType.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { handle = elemData.handle; if ( handle ) { handle.elem = null; } // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery.removeData( elem, [ "events", "handle" ], true ); } }, // Events that are safe to short-circuit if no handlers are attached. // Native DOM events should not be added, they may have inline handlers. customEvent: { "getData": true, "setData": true, "changeData": true }, trigger: function( event, data, elem, onlyHandlers ) { // Don't do events on text and comment nodes if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { return; } // Event object or event type var type = event.type || event, namespaces = [], cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "!" ) >= 0 ) { // Exclusive events trigger only for the exact event (no namespaces) type = type.slice(0, -1); exclusive = true; } if ( type.indexOf( "." ) >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { // No jQuery handlers for this event type, and it can't have inline handlers return; } // Caller can pass in an Event, Object, or just an event type string event = typeof event === "object" ? // jQuery.Event object event[ jQuery.expando ] ? event : // Object literal new jQuery.Event( type, event ) : // Just the event type (string) new jQuery.Event( type ); event.type = type; event.isTrigger = true; event.exclusive = exclusive; event.namespace = namespaces.join( "." ); event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; // Handle a global trigger if ( !elem ) { // TODO: Stop taunting the data cache; remove global events and always attach to document cache = jQuery.cache; for ( i in cache ) { if ( cache[ i ].events && cache[ i ].events[ type ] ) { jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); } } return; } // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data != null ? jQuery.makeArray( data ) : []; data.unshift( event ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) eventPath = [[ elem, special.bindType || type ]]; if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; old = null; for ( ; cur; cur = cur.parentNode ) { eventPath.push([ cur, bubbleType ]); old = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( old && old === elem.ownerDocument ) { eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); } } // Fire handlers on the event path for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { cur = eventPath[i][0]; event.type = eventPath[i][1]; handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Note that this is a bare JS function and not a jQuery handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) // IE<9 dies on focus/blur to hidden element (#1486) if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method old = elem[ ontype ]; if ( old ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( old ) { elem[ ontype ] = old; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event || window.event ); var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), delegateCount = handlers.delegateCount, args = [].slice.call( arguments, 0 ), run_all = !event.exclusive && !event.namespace, special = jQuery.event.special[ event.type ] || {}, handlerQueue = [], i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers that should run if there are delegated events // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && !(event.button && event.type === "click") ) { // Pregenerate a single jQuery object for reuse with .is() jqcur = jQuery(this); jqcur.context = this.ownerDocument || this; for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { // Don't process events on disabled elements (#6911, #8165) if ( cur.disabled !== true ) { selMatch = {}; matches = []; jqcur[0] = cur; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; if ( selMatch[ sel ] === undefined ) { selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) ); } if ( selMatch[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } } } } // Add the remaining (directly-bound) handlers if ( handlers.length > delegateCount ) { handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); } // Run delegates first; they may want to stop propagation beneath us for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { matched = handlerQueue[ i ]; event.currentTarget = matched.elem; for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { handleObj = matched.matches[ j ]; // Triggered event must either 1) be non-exclusive and have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { event.data = handleObj.data; event.handleObj = handleObj; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, // Includes some event props shared by KeyEvent and MouseEvent // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, originalEvent = event, fixHook = jQuery.event.fixHooks[ event.type ] || {}, copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = jQuery.Event( originalEvent ); for ( i = copy.length; i; ) { prop = copy[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Target should not be a text node (#504, Safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) if ( event.metaKey === undefined ) { event.metaKey = event.ctrlKey; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady }, load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( jQuery.isWindow( this ) ) { this.onbeforeunload = eventHandle; } }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. jQuery.event.handle = jQuery.event.dispatch; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var target = this, related = event.relatedTarget, handleObj = event.handleObj, selector = handleObj.selector, ret; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !form._submit_attached ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); form._submit_attached = true; } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; jQuery.event.simulate( "change", this, event, true ); } }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); elem._change_attached = true; } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // && selector != null // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event var handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( var type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function( event ) { // Figure out which function to execute var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; }; // link all the functions, so any of them can unbind this click handler toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler ); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); jQuery.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( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { if ( fn == null ) { fn = data; data = null; } return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } if ( rkeyEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; } if ( rmouseEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; } }); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rReturn = /\r\n/g, rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { baseHasDuplicate = false; return 0; }); var Sizzle = function( selector, context, results, seed ) { results = results || []; context = context || document; var origContext = context; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML( context ), parts = [], soFar = selector; // Reset the position of the chunker regexp (start from head) do { chunker.exec( "" ); m = chunker.exec( soFar ); if ( m ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } } while ( m ); if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context, seed ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set, seed ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray( set ); } else { prune = false; } while ( parts.length ) { cur = parts.pop(); pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function( results ) { if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort( sortOrder ); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[ i - 1 ] ) { results.splice( i--, 1 ); } } } } return results; }; Sizzle.matches = function( expr, set ) { return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { var set, i, len, match, type, left; if ( !expr ) { return []; } for ( i = 0, len = Expr.order.length; i < len; i++ ) { type = Expr.order[i]; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { left = match[1]; match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( "*" ) : []; } return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { var match, anyFound, type, found, item, filter, left, i, pass, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); while ( expr && set.length ) { for ( type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { filter = Expr.filter[ type ]; left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); pass = not ^ found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Utility function for retreiving the text value of an array of DOM nodes * @param {Array|Element} elem */ var getText = Sizzle.getText = function( elem ) { var i, node, nodeType = elem.nodeType, ret = ""; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent || innerText for elements if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { // Replace IE's carriage returns return elem.innerText.replace( rReturn, '' ); } else { // Traverse it's children for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { // If no nodeType, this is expected to be an array for ( i = 0; (node = elem[i]); i++ ) { // Do not traverse comment nodes if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); }, type: function( elem ) { return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function( checkSet, part ) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); }, "~": function( checkSet, part, isXML ) { var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); } }, find: { ID: function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }, NAME: function( match, context ) { if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName( match[1] ); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function( match, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( match[1] ); } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function( match ) { return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { if ( !match[2] ) { Sizzle.error( match[0] ); } match[2] = match[2].replace(/^\+|\s*/g, ''); // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } else if ( match[2] ) { Sizzle.error( match[0] ); } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function( match, curLoop, inplace, result, not ) { if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function( match ) { match.unshift( true ); return match; } }, filters: { enabled: function( elem ) { return elem.disabled === false && elem.type !== "hidden"; }, disabled: function( elem ) { return elem.disabled === true; }, checked: function( elem ) { return elem.checked === true; }, selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, parent: function( elem ) { return !!elem.firstChild; }, empty: function( elem ) { return !elem.firstChild; }, has: function( elem, i, match ) { return !!Sizzle( match[3], elem ).length; }, header: function( elem ) { return (/h\d/i).test( elem.nodeName ); }, text: function( elem ) { var attr = elem.getAttribute( "type" ), type = elem.type; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, radio: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, password: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); }, focus: function( elem ) { return elem === elem.ownerDocument.activeElement; } }, setFilters: { first: function( elem, i ) { return i === 0; }, last: function( elem, i, match, array ) { return i === array.length - 1; }, even: function( elem, i ) { return i % 2 === 0; }, odd: function( elem, i ) { return i % 2 === 1; }, lt: function( elem, i, match ) { return i < match[3] - 0; }, gt: function( elem, i, match ) { return i > match[3] - 0; }, nth: function( elem, i, match ) { return match[3] - 0 === i; }, eq: function( elem, i, match ) { return match[3] - 0 === i; } }, filter: { PSEUDO: function( elem, match, i, array ) { var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var j = 0, l = not.length; j < l; j++ ) { if ( not[j] === elem ) { return false; } } return true; } else { Sizzle.error( name ); } }, CHILD: function( elem, match ) { var first, last, doneName, parent, cache, count, diff, type = match[1], node = elem; switch ( type ) { case "only": case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; /* falls through */ case "last": while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case "nth": first = match[2]; last = match[3]; if ( first === 1 && last === 0 ) { return true; } doneName = match[0]; parent = elem.parentNode; if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent[ expando ] = doneName; } diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function( elem, match ) { return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function( elem, match ) { return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; }, CLASS: function( elem, match ) { return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function( elem, match ) { var name = match[1], result = Sizzle.attr ? Sizzle.attr( elem, name ) : Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : !type && Sizzle.attr ? result != null : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function( elem, match, i, array ) { var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS, fescape = function(all, num){ return "\\" + (num - 0 + 1); }; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } // Expose origPOS // "global" as in regardless of relation to brackets/parens Expr.match.globalPOS = origPOS; var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { makeArray = function( array, results ) { var i = 0, ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( ; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; }; } else { sortOrder = function( a, b ) { // The nodes are identical, we can exit early if ( a === b ) { hasDuplicate = true; return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes } else if ( a.sourceIndex && b.sourceIndex ) { return a.sourceIndex - b.sourceIndex; } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; // If the nodes are siblings (or identical) we can do a quick check if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if ( !aup ) { return -1; } else if ( !bup ) { return 1; } // Otherwise they're somewhere else in the tree so we need // to build up a full list of the parentNodes for comparison while ( cur ) { ap.unshift( cur ); cur = cur.parentNode; } cur = bup; while ( cur ) { bp.unshift( cur ); cur = cur.parentNode; } al = ap.length; bl = bp.length; // Start walking down the tree looking for a discrepancy for ( var i = 0; i < al && i < bl; i++ ) { if ( ap[i] !== bp[i] ) { return siblingCheck( ap[i], bp[i] ); } } // We ended someplace up the tree so do a sibling check return i === al ? siblingCheck( a, bp[i], -1 ) : siblingCheck( ap[i], b, 1 ); }; siblingCheck = function( a, b, ret ) { if ( a === b ) { return ret; } var cur = a.nextSibling; while ( cur ) { if ( cur === b ) { return -1; } cur = cur.nextSibling; } return 1; }; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function( elem, match ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); // release memory in IE root = form = null; })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function( match, context ) { var results = context.getElementsByTagName( match[1] ); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function( elem ) { return elem.getAttribute( "href", 2 ); }; } // release memory in IE div = null; })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

        "; // Safari can't handle uppercase or unicode characters when // in quirks mode. if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function( query, context, extra, seed ) { context = context || document; // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && !Sizzle.isXML(context) ) { // See if we find a selector to speed up var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { // Speed-up: Sizzle("TAG") if ( match[1] ) { return makeArray( context.getElementsByTagName( query ), extra ); // Speed-up: Sizzle(".CLASS") } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { return makeArray( context.getElementsByClassName( match[2] ), extra ); } } if ( context.nodeType === 9 ) { // Speed-up: Sizzle("body") // The body element only exists once, optimize finding it if ( query === "body" && context.body ) { return makeArray( [ context.body ], extra ); // Speed-up: Sizzle("#ID") } else if ( match && match[3] ) { var elem = context.getElementById( match[3] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id === match[3] ) { return makeArray( [ elem ], extra ); } } else { return makeArray( [], extra ); } } try { return makeArray( context.querySelectorAll(query), extra ); } catch(qsaError) {} // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { var oldContext = context, old = context.getAttribute( "id" ), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test( query ); if ( !old ) { context.setAttribute( "id", nid ); } else { nid = nid.replace( /'/g, "\\$&" ); } if ( relativeHierarchySelector && hasParent ) { context = context.parentNode; } try { if ( !relativeHierarchySelector || hasParent ) { return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); } } catch(pseudoError) { } finally { if ( !old ) { oldContext.removeAttribute( "id" ); } } } } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } // release memory in IE div = null; })(); } (function(){ var html = document.documentElement, matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9 fails this) var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), pseudoWorks = false; try { // This should fail with an exception // Gecko does not error, returns false instead matches.call( document.documentElement, "[test!='']:sizzle" ); } catch( pseudoError ) { pseudoWorks = true; } Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { var ret = matches.call( node, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || !disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9, so check for that node.document && node.document.nodeType !== 11 ) { return ret; } } } catch(e) {} } return Sizzle(expr, null, null, [node]).length > 0; }; } })(); (function(){ var div = document.createElement("div"); div.innerHTML = "
        "; // Opera can't find a second classname (in 9.6) // Also, make sure that getElementsByClassName actually exists if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { return; } // Safari caches class attributes, doesn't catch changes (in 3.2) div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) { return; } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function( match, context, isXML ) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; // release memory in IE div = null; })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem[ expando ] = doneName; elem.sizset = i; } if ( elem.nodeName.toLowerCase() === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem[ expando ] = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } if ( document.documentElement.contains ) { Sizzle.contains = function( a, b ) { return a !== b && (a.contains ? a.contains(b) : true); }; } else if ( document.documentElement.compareDocumentPosition ) { Sizzle.contains = function( a, b ) { return !!(a.compareDocumentPosition(b) & 16); }; } else { Sizzle.contains = function() { return false; }; } Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; var posProcess = function( selector, context, seed ) { var match, tmpSet = [], later = "", root = context.nodeType ? [context] : context; // Position selectors must be done after the filter // And so must :not(positional) so we move all PSEUDOs to the end while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet, seed ); } return Sizzle.filter( later, tmpSet ); }; // EXPOSE // Override sizzle attribute retrieval Sizzle.attr = jQuery.attr; Sizzle.selectors.attrMap = {}; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, // Note: This RegExp should be improved, or likely pulled from Sizzle rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, POS = jQuery.expr.match.globalPOS, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend({ find: function( selector ) { var self = this, i, l; if ( typeof selector !== "string" ) { return jQuery( selector ).filter(function() { for ( i = 0, l = self.length; i < l; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }); } var ret = this.pushStack( "", "find", selector ), length, n, r; for ( i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique for ( n = length; n < ret.length; n++ ) { for ( r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; } } } } } return ret; }, has: function( target ) { var targets = jQuery( target ); return this.filter(function() { for ( var i = 0, l = targets.length; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector, false), "not", selector); }, filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, is: function( selector ) { return !!selector && ( typeof selector === "string" ? // If this is a positional selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". POS.test( selector ) ? jQuery( selector, this.context ).index( this[0] ) >= 0 : jQuery.filter( selector, this ).length > 0 : this.filter( selector ).length > 0 ); }, closest: function( selectors, context ) { var ret = [], i, l, cur = this[0]; // Array (deprecated as of jQuery 1.7) if ( jQuery.isArray( selectors ) ) { var level = 1; while ( cur && cur.ownerDocument && cur !== context ) { for ( i = 0; i < selectors.length; i++ ) { if ( jQuery( cur ).is( selectors[ i ] ) ) { ret.push({ selector: selectors[ i ], elem: cur, level: level }); } } cur = cur.parentNode; level++; } return ret; } // String var pos = POS.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( i = 0, l = this.length; i < l; i++ ) { cur = this[i]; while ( cur ) { if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { ret.push( cur ); break; } else { cur = cur.parentNode; if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { break; } } } } ret = ret.length > 1 ? jQuery.unique( ret ) : ret; return this.pushStack( ret, "closest", selectors ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context ) : jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? all : jQuery.unique( all ) ); }, andSelf: function() { return this.add( this.prevObject ); } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return jQuery.nth( elem, 2, "nextSibling" ); }, prev: function( elem ) { return jQuery.nth( elem, 2, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray( elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( !runtil.test( name ) ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } return this.pushStack( ret, name, slice.call( arguments ).join(",") ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, nth: function( cur, result, dir, elem ) { result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType === 1 && ++num === result ) { break; } } return cur; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { // Can't pass null or undefined to indexOf in Firefox 4 // Set to 0 to skip string check qualifier = qualifier || 0; if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { var retVal = !!qualifier.call( elem, i, elem ); return retVal === keep; }); } else if ( qualifier.nodeType ) { return jQuery.grep(elements, function( elem, i ) { return ( elem === qualifier ) === keep; }); } else if ( typeof qualifier === "string" ) { var filtered = jQuery.grep(elements, function( elem ) { return elem.nodeType === 1; }); if ( isSimple.test( qualifier ) ) { return jQuery.filter(qualifier, filtered, !keep); } else { qualifier = jQuery.filter( qualifier, filtered ); } } return jQuery.grep(elements, function( elem, i ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; }); } function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rtagName = /<([\w:]+)/, rtbody = /]", "i"), // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rscriptType = /\/(java|ecma)script/i, rcleanScript = /^\s*", "" ], legend: [ 1, "
        ", "
        " ], thead: [ 1, "", "
        " ], tr: [ 2, "", "
        " ], td: [ 3, "", "
        " ], col: [ 2, "", "
        " ], area: [ 1, "", "" ], _default: [ 0, "", "" ] }, safeFragment = createSafeFragment( document ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // IE can't serialize and ================================================ FILE: src/taoshop-portal/src/main/resources/templates/header_nav.html ================================================
        全部商品分类
        ================================================ FILE: src/taoshop-portal/src/main/resources/templates/index.html ================================================ 电商门户网站

        话费充值

        最新上架 每天都有上新,每天都有惊喜

        ================================================ FILE: src/taoshop-portal/src/main/resources/templates/index_header_nav.html ================================================
        全部商品分类

        x
        ================================================ FILE: src/taoshop-portal/src/main/resources/templates/item/item_category.html ================================================ 无标题文档

        手机汇

        ================================================ FILE: src/taoshop-portal/src/main/resources/templates/item/item_detail.html ================================================ 商品详情
        • 苹果(APPLE)iPhone 5s 16G版 3G手机(金色)WCDMA/GSM 商品卖点显示在商品名称之后字体字 号粗细同商品名称,字体颜色为红色。卖点最多为50个字符。每行最多显示50字符,超出换行。
        • 商 城 价:
          ¥
        • 活 动 价:
          ¥3558
        • 品牌信息:
        • 可选颜色:
        • 选择容量:
        • 购买方式:
        • 库  存:
          现货
        购买数量:
        - +
        此商品由  负责销售及发货
        立即购买加入购物车请移步购物车选择合约套餐

        随心配 进入配件选购中心>>

        已选择0个配件

        商城价格合计:4898

        搭配购买

        • 商品详情
        • 规格参数
        • 包装清单
        • 常见问题

        规格参数

        测试数据

        包装清单

        电池型号: 内置充电式锂离子电池 电池类型: 锂电池
        数据线: 苹果8pin 耳机: 1057746
        系统: 苹果(IOS) 商品毛重: 3.5mm
        机身尺寸: 高:123.8 毫米 (4.87 英寸) 宽:58.6 毫米 (2.31 英寸) ... 机身重量: 重量:112 克 (3.95 盎司)
        常见问题?
        如何条哦选商品?
        点击页面上方“加入购物车”按钮或页面下拉时顶部导航上的“加入购物车”按钮将商品加入购物车,再点击页面右上角的“购物车”前往购物车页面进行结算。
        收藏商品功能
        点击“收藏按钮”后,按钮中的白心亮起,背景由黑色变为黄色代表收藏成功,再次点击取消收藏。您可在“个人中心”中的我的收藏查看所有收藏商品。
        维修网点销售配件吗?
        所有授权维修网点具备维修手机标配里配件的功能,部分指定授权维修网点可销售标配及部分官网配件,具体销售的产品及价格请以修网点信息为准。
        退换货办理流程
        您可拨打小米客服中心400-100-5678与客服人员沟通,或登录小米网“我的订单” ->“订单详情”下方点击“申请售后服务”并填写相应信息,小米看到您的申请,会安排工作人员与您进行退换货质量确认并办理相关事宜.
        ================================================ FILE: src/taoshop-portal/src/main/resources/templates/login.html ================================================  登录注册页

        ================================================ FILE: src/taoshop-portal/src/main/resources/templates/shopcart/add_shopcart_success.html ================================================ 成功加入购物车
        商品已成功加入购物车!

        热门商品

        学院风帆布双肩包 卡其色

        使用500g纯棉帆布,材质上乘

        79元

        加入购物车

        学院风帆布双肩包 卡其色

        使用500g纯棉帆布,材质上乘

        79元

        加入购物车

        学院风帆布双肩包 卡其色

        使用500g纯棉帆布,材质上乘

        79元

        加入购物车

        学院风帆布双肩包 卡其色

        使用500g纯棉帆布,材质上乘

        79元

        加入购物车

        学院风帆布双肩包 卡其色

        使用500g纯棉帆布,材质上乘

        79元

        加入购物车

        ================================================ FILE: src/taoshop-portal/src/main/resources/templates/test.html ================================================ Getting Started: Serving Web Content


        ================================================ FILE: src/taoshop-portal/src/main/resources/templates/top_bar.html ================================================

        本商城在试运行阶段,暂不接收任何订单。 您好,欢迎来商城![登录] [注册] 欢迎您 商户入驻申请| 我的订单| 网上营业厅
        ================================================ FILE: src/taoshop-portal/src/main/resources/templates/user/portal_user_center.html ================================================  个人中心首页

        未支付订单

        订单号:1140424450009291 ¥1969 订单详情 立即支付
        订单号:1140424450009291 ¥1969 订单详情 立即支付

        已支付订单

        您暂时没有已支付订单,挑挑喜欢的商品去>>

        ================================================ FILE: src/taoshop-portal/src/main/webapp/WEB-INF/web.xml ================================================ Archetype Created Web Application org.jasig.cas.client.session.SingleSignOutHttpSessionListener CAS Single Sign Out Filter org.jasig.cas.client.session.SingleSignOutFilter casServerUrlPrefix http://127.0.0.1:8080/cas-server/ CAS Single Sign Out Filter /* ================================================ FILE: src/taoshop-portal/src/main/webapp/index.jsp ================================================

        Hello World!

        ================================================ FILE: src/taoshop-portal/src/test/java/com/muses/taoshop/Attachment.java ================================================ package com.muses.taoshop; import java.io.*; public class Attachment implements Serializable { public void download() { System.out.println("下载附件"); } } ================================================ FILE: src/taoshop-portal/src/test/java/com/muses/taoshop/Client.java ================================================ package com.muses.taoshop; public class Client { public static void main(String a[]) { Email email,copyEmail=null; email=new Email(); try{ copyEmail=(Email)email.deepClone(); } catch(Exception e) { e.printStackTrace(); } System.out.println("email==copyEmail?"); System.out.println(email==copyEmail); System.out.println("email.getAttachment==copyEmail.getAttachment?"); System.out.println(email.getAttachment()==copyEmail.getAttachment()); } } ================================================ FILE: src/taoshop-portal/src/test/java/com/muses/taoshop/Email.java ================================================ package com.muses.taoshop; import java.io.*; public class Email implements Serializable { private Attachment attachment=null; public Email() { this.attachment=new Attachment(); } public Object deepClone() throws IOException, ClassNotFoundException, OptionalDataException { //将对象写入流中 ByteArrayOutputStream bao=new ByteArrayOutputStream(); ObjectOutputStream oos=new ObjectOutputStream(bao); oos.writeObject(this); //将对象从流中取出 ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray()); ObjectInputStream ois=new ObjectInputStream(bis); return(ois.readObject()); } public Attachment getAttachment() { return this.attachment; } public void display() { System.out.println("查看邮件"); } } ================================================ FILE: src/taoshop-portal/src/test/java/com/muses/taoshop/JDBCFacade.java ================================================ package com.muses.taoshop; import java.sql.*; public class JDBCFacade { private Connection conn=null; private Statement statement=null; public void open(String driver,String jdbcUrl,String userName,String userPwd) { try { Class.forName(driver).newInstance(); conn = DriverManager.getConnection(jdbcUrl,userName,userPwd); statement = conn.createStatement(); } catch (Exception e) { e.printStackTrace(); } } public int executeUpdate(String sql) { try { return statement.executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); return -1; } } public ResultSet executeQuery(String sql) { try { return statement.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); return null; } } public void close() { try { conn.close(); statement.close(); } catch (SQLException e) { e.printStackTrace(); } } } ================================================ FILE: src/taoshop-portal/src/test/java/com/muses/taoshop/ParseDateTest.java ================================================ package com.muses.taoshop; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** *
         *  ParseDateTest
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.12.23 11:59    修改内容:
         * 
        */ public class ParseDateTest implements Runnable{ private int i ; private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public ParseDateTest(int i){ this.i = i; } /** * When an object implementing interface Runnable is used * to create a thread, starting the thread causes the object's * run method to be called in that separately executing * thread. *

        * The general contract of the method run is that it may * take any action whatsoever. * * @see Thread#run() */ @Override public void run() { try { Date t = sdf.parse("2018-12-22 19:30:"+i%60); System.out.println(i+":"+t.toString()); } catch (ParseException e) { e.printStackTrace(); } } public static void main(String[] args){ ExecutorService es = Executors.newFixedThreadPool(10); for(int i =0;i<=1000;i++){ es.execute(new ThreadLocalTest(i)); } } } ================================================ FILE: src/taoshop-portal/src/test/java/com/muses/taoshop/ThreadLocalTest.java ================================================ package com.muses.taoshop; import java.lang.ref.SoftReference; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** *

         *  ThreadLocal测试类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.12.22 22:51    修改内容:
         * 
        */ public class ThreadLocalTest implements Runnable { private int i ; private static final ThreadLocal threadLocal = new ThreadLocal(); public ThreadLocalTest(int i){ this.i = i; } /** * When an object implementing interface Runnable is used * to create a thread, starting the thread causes the object's * run method to be called in that separately executing * thread. *

        * The general contract of the method run is that it may * take any action whatsoever. * * @see Thread#run() */ @Override public void run() { threadLocal.set(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); try { Date t = threadLocal.get().parse("2018-12-22 19:30:"+i%60); System.out.println(i+":"+t.toString()); } catch (ParseException e) { e.printStackTrace(); } } public static void main(String[] args){ ExecutorService es = Executors.newFixedThreadPool(10); for(int i =0;i<=1000;i++){ es.execute(new ThreadLocalTest(i)); } threadLocal.remove(); } } ================================================ FILE: src/taoshop-provider/ReadMe.md ================================================ ### 电商平台服务中心 ================================================ FILE: src/taoshop-provider/pom.xml ================================================ taoshop com.muses.taoshop 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.provider taoshop-provider 1.0-SNAPSHOT taoshop-provider-usc taoshop-provider-item taoshop-provider-order taoshop-provider-shop pom http://www.example.com website scp://webhost.company.com/www/website UTF-8 ================================================ FILE: src/taoshop-provider/taoshop-provider-item/pom.xml ================================================ taoshop-provider com.muses.taoshop.provider 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.provider taoshop-provider-item 1.0-SNAPSHOT com.muses.taoshop.provider-api taoshop-provider-api-item 1.0-SNAPSHOT ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/java/com/muses/taoshop/item/mapper/ItemBrandMapper.java ================================================ package com.muses.taoshop.item.mapper; import com.muses.taoshop.item.entity.ItemBrand; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface ItemBrandMapper { List listItemBrand(); } ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/java/com/muses/taoshop/item/mapper/ItemCategoryMapper.java ================================================ package com.muses.taoshop.item.mapper; import com.muses.taoshop.item.entity.ItemCategory; import com.muses.taoshop.item.entity.ItemList; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface ItemCategoryMapper { List listRootCategory(); List listCategory(); List listItemByCategoryId(@Param("categoryId") int categoryId); } ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/java/com/muses/taoshop/item/mapper/ItemMapper.java ================================================ package com.muses.taoshop.item.mapper; import com.muses.taoshop.item.entity.ItemDetail; import com.muses.taoshop.item.entity.ItemPortal; import com.muses.taoshop.item.entity.ItemSpec; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface ItemMapper { List listItemPortal(); ItemDetail getItemDetail(@Param("spuId")int spuId); } ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/java/com/muses/taoshop/item/mapper/ItemSpecMapper.java ================================================ package com.muses.taoshop.item.mapper; import com.muses.taoshop.item.entity.ItemSpec; import com.muses.taoshop.item.entity.ItemSpecValue; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface ItemSpecMapper { List getSpecBySpuId(@Param("spuId")int spuId); List getSpecValueBySkuId(@Param("skuId")int skuId); } ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/java/com/muses/taoshop/item/service/ItemBrankServiceImpl.java ================================================ package com.muses.taoshop.item.service; import com.muses.taoshop.item.entity.ItemBrand; import com.muses.taoshop.item.mapper.ItemBrandMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** *

         *  商品品牌信息服务实现类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.15 22:54    修改内容:
         * 
        */ @Service public class ItemBrankServiceImpl implements IItemBrankService{ @Autowired ItemBrandMapper itemBrandMapper; @Override public List listItemBrand() { return itemBrandMapper.listItemBrand(); } } ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/java/com/muses/taoshop/item/service/ItemCategoryServiceImpl.java ================================================ package com.muses.taoshop.item.service; import com.muses.taoshop.item.entity.ItemCategory; import com.muses.taoshop.item.entity.ItemList; import com.muses.taoshop.item.mapper.ItemCategoryMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** *
         *  商品品类信息服务实现类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.17 11:01    修改内容:
         * 
        */ @Service public class ItemCategoryServiceImpl implements IItemCategoryService{ @Autowired ItemCategoryMapper itemCategoryMapper; /** * 查询根级商品品类信息 * * @return */ @Override public List listRootCategory() { return itemCategoryMapper.listRootCategory(); } /** * 查询所有的商品品类信息 * @return */ @Override public List listCategory() { return itemCategoryMapper.listCategory(); } /** * 根据品目id获取商品信息 * * @return */ @Override public List listItemByCategoryId(int categoryId) { return itemCategoryMapper.listItemByCategoryId(categoryId); } } ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/java/com/muses/taoshop/item/service/ItemServiceImpl.java ================================================ package com.muses.taoshop.item.service; import com.muses.taoshop.item.entity.ItemDetail; import com.muses.taoshop.item.entity.ItemPortal; import com.muses.taoshop.item.entity.ItemSpec; import com.muses.taoshop.item.mapper.ItemMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** *
         *  商品信息服务实现类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.24 22:37    修改内容:
         * 
        */ @Service public class ItemServiceImpl implements IItemService { @Autowired ItemMapper itemMapper; /** * 在门户网站列出商品粗略信息 * * @return */ @Override public List listItemPortal() { return itemMapper.listItemPortal(); } /** * 获取商品详情信息 * @return ItemDetail */ @Override public ItemDetail getItemDetailInfo(int spuId){ ItemDetail itemDetail = itemMapper.getItemDetail(spuId); return itemDetail; } } ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/java/com/muses/taoshop/item/service/ItemSpecServiceImpl.java ================================================ package com.muses.taoshop.item.service; import com.muses.taoshop.item.entity.ItemSpec; import com.muses.taoshop.item.entity.ItemSpecValue; import com.muses.taoshop.item.mapper.ItemSpecMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class ItemSpecServiceImpl implements IItemSpecService { @Autowired ItemSpecMapper itemSpecMapper; /** * 获取spuId获取规格参数列表 * @param spuId * @return */ @Override public List getSpecBySpuId(int spuId) { return itemSpecMapper.getSpecBySpuId(spuId); } /** * 通过SkuId获取规格参数Value列表 * * @param skuId * @return */ @Override public List getSpecValueBySkuId(int skuId) { return itemSpecMapper.getSpecValueBySkuId(skuId); } } ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/resources/mybatis/ItemBrandMapper.xml ================================================ ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/resources/mybatis/ItemCategoryMapper.xml ================================================ id, category_name as categoryName, sjid, last_modify_time as lastModifyTime, create_time as createTime ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/resources/mybatis/ItemMapper.xml ================================================ id , sku_code , sku_name , price , stock , last_modify_time as lastModifyTime, create_time as createTime ORDER BY price ================================================ FILE: src/taoshop-provider/taoshop-provider-item/src/main/resources/mybatis/ItemSpecMapper.xml ================================================ ================================================ FILE: src/taoshop-provider/taoshop-provider-order/pom.xml ================================================ taoshop-provider com.muses.taoshop.provider 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.provider taoshop-provider-order 1.0-SNAPSHOT ================================================ FILE: src/taoshop-provider/taoshop-provider-shop/pom.xml ================================================ taoshop-provider com.muses.taoshop.provider 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.provider taoshop-provider-shop 1.0-SNAPSHOT ================================================ FILE: src/taoshop-provider/taoshop-provider-usc/ReadMe.md ================================================ ### 电商平台用户信息服务中心 ================================================ FILE: src/taoshop-provider/taoshop-provider-usc/pom.xml ================================================ taoshop-provider com.muses.taoshop.provider 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.provider taoshop-provider-usc 1.0-SNAPSHOT jar http://www.example.com com.muses.taoshop.provider-api taoshop-provider-api-usc 1.0-SNAPSHOT ================================================ FILE: src/taoshop-provider/taoshop-provider-usc/src/main/java/com/muses/taoshop/user/mapper/UserMapper.java ================================================ package com.muses.taoshop.user.mapper; import com.muses.taoshop.user.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @Mapper public interface UserMapper { User loginCheck(@Param("username") String username, @Param("password") String password); } ================================================ FILE: src/taoshop-provider/taoshop-provider-usc/src/main/java/com/muses/taoshop/user/service/UserServiceImpl.java ================================================ package com.muses.taoshop.user.service; import com.muses.taoshop.user.entity.User; import com.muses.taoshop.user.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements IUserService{ @Autowired UserMapper userMapper; /** * 登录验证 * * @param username * @param password */ @Override public User loginCheck(String username, String password) { return userMapper.loginCheck(username, password); } } ================================================ FILE: src/taoshop-provider/taoshop-provider-usc/src/main/resources/mybatis/UserMapper.xml ================================================ ================================================ FILE: src/taoshop-provider-api/ReadMe.md ================================================ ### 电商平台API ================================================ FILE: src/taoshop-provider-api/pom.xml ================================================ taoshop com.muses.taoshop 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.provider-api taoshop-provider-api 1.0-SNAPSHOT taoshop-provider-api-order taoshop-provider-api-item taoshop-provider-api-usc taoshop-provider-api-shop pom taoshop-provider-api http://www.example.com UTF-8 1.7 1.7 junit junit 4.11 test ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/pom.xml ================================================ taoshop-provider-api com.muses.taoshop.provider-api 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.provider-api taoshop-provider-api-item 1.0-SNAPSHOT ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemBrand.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.util.Date; /** *
         *  商品品牌VO类
         * 
        * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.09 21:49    修改内容:
         * 
        */ @Data public class ItemBrand { /** * 品牌id */ private Long id; /** * 品牌名称 */ private String brandName; /** * 上次修改时间 */ private Date lastModifyTime; /** * 创建时间 */ private Date createTime; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemCategory.java ================================================ package com.muses.taoshop.item.entity; import com.alibaba.fastjson.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotNull; import java.util.Date; import java.util.List; /** *
         *  商品品类
         * 
        * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.09 21:49    修改内容:
         * 
        */ @Data public class ItemCategory { /** * 商品品类id */ private Long id; /** * 商品品类名称 */ private String categoryName; /** * 上级id */ private Long sjid; /** * 上次修改时间 */ @JSONField(format ="yyyy-MM-dd HH:mm:ss") private Date lastModifyTime; /** * 创建时间 */ @JSONField(format ="yyyy-MM-dd HH:mm:ss") private Date createTime; /** * 子菜单 */ private List subCategorys; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemDetail.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; import java.util.List; /** *
         *  商品详情VO类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.07.15 16:16    修改内容:
         * 
        */ @Data public class ItemDetail { /** * 品牌名称 */ private String brandName; /** * 商铺名称 */ private String shopName; /** * 商品名称 */ private String itemName; /** * 商城售价 */ private long price; /** * 促销售价 */ private long promotionPrice; /** * 图片路径 */ private String imgPath; /** * 商品库存(SKU) */ private int stock; /** * 规格名称 */ private String specName; /** * 规格参数 */ private List itemSpecs; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemDto.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; /** *
         *  商品信息DTO类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.10.28 11:51    修改内容:
         * 
        */ @Data public class ItemDto { /** * spu编号 */ private String spuCode; /** * 商品名称 */ private String itemName; /** * 品类id */ private Long categoryId; /** * 品牌id */ private Long brandId; /** * 商家id */ private Long shopId; /** * 品目名称 */ private String categoryName; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemList.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; /** *
         *  商品信息Vo类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.10.27 23:46    修改内容:
         * 
        */ @Data public class ItemList { /** * spu id */ private Long spuId; /** * 商品名称 */ private String itemName; /** * sku id */ private Long skuId; /** * 商品价钱 */ private Long skuPrice; /** * 图片路径 */ private String imgPath; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemPortal.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; /** *
         *  定义一个在门户网站显示商品信息的VO类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.30 17:17    修改内容:
         * 
        */ @Data public class ItemPortal { /** * skuId */ private int skuId; /** * spuId */ private int spuId; /** * sku的最低售价 */ private long mPrice; /** * 产品名称 */ private String itemName ; /** * 图片路径 */ private String imgPath; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemSku.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** *
         *  商品SKU类
         * 
        * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.09 21:49    修改内容:
         * 
        */ @Data public class ItemSku { /** * id */ private Long id; /** * sku编码 */ private String skuCode; /** * sku名称 */ private String skuName; /** * 价钱 */ private BigDecimal price; /** * 库存 */ private Integer stock; /** * 店铺id */ private Long shopId; /** * spu id */ private Long spuId; /** * 上一次修改时间 */ private Date lastModifyTime; /** * 创建时间 */ private Date createTime; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemSkuSpecValue.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.util.Date; /** *
         *  商品SKU规格值VO类
         * 
        * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.09 21:49    修改内容:
         * 
        */ @Data public class ItemSkuSpecValue { /** * id */ private Long id; /** * spu id */ private Long spuId; /** * 规格值id */ private Long specValueId; /** * 上一次修改时间 */ private Date lastModifyTime; /** * 创建时间 */ private Date createTime; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemSpec.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.util.Date; /** *
         *  商品规格VO类
         * 
        * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.09 21:49    修改内容:
         * 
        */ @Data public class ItemSpec { /** * id */ private Long id; /** * 规格编号 */ private String specNo; /** * 规格名称 */ private String specName; private Date lastModifyTime; private Date createTime; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemSpecValue.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.util.Date; /** *
         *  商品规格值VO类
         * 
        * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.09 21:49    修改内容:
         * 
        */ @Data public class ItemSpecValue { /** * id */ private Long id; /** * 规格id */ private Long specId; /** * 规格值 */ private String specValue; private Date lastModifyTime; private Date createTime; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemSpu.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.util.Date; import java.util.List; /** *
         *  商品SPU类
         * 
        * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.09 21:49    修改内容:
         * 
        */ @Data public class ItemSpu { /** * id */ private Long id; /** * spu编号 */ private String spuCode; /** * 商品名称 */ private String itemName; /** * 品类id */ private Long categoryId; /** * 品牌id */ private Long brandId; private Date lastModifyTime; private Date createTime; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/entity/ItemSpuSpec.java ================================================ package com.muses.taoshop.item.entity; import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.util.Date; /** *
         *  商品SPU规格类
         * 
        * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.09 21:49    修改内容:
         * 
        */ @Data public class ItemSpuSpec { /** * id */ private Long id; /** * spu id */ private Long spuId; /** * 规格值id */ private Long specId; private Date lastModifyTime; private Date createTime; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/service/IItemBrankService.java ================================================ package com.muses.taoshop.item.service; import com.muses.taoshop.item.entity.ItemBrand; import java.util.List; /** *
         *  商品品牌服务类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.15 22:56    修改内容:
         * 
        */ public interface IItemBrankService { /** * 查询所有的商品品牌信息 * @return */ List listItemBrand(); } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/service/IItemCategoryService.java ================================================ package com.muses.taoshop.item.service; import com.muses.taoshop.item.entity.ItemCategory; import com.muses.taoshop.item.entity.ItemList; import java.util.List; /** *
         *  商品品类信息接口
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.17 10:59    修改内容:
         * 
        */ public interface IItemCategoryService { /** * 查询根级商品品类信息 * @return */ List listRootCategory(); /** * 查询所有商品品类信息 * @return */ List listCategory(); /** * 根据品目id获取商品信息 * @return */ List listItemByCategoryId(int categoryId); } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/service/IItemService.java ================================================ package com.muses.taoshop.item.service; import com.muses.taoshop.item.entity.ItemDetail; import com.muses.taoshop.item.entity.ItemPortal; import com.muses.taoshop.item.entity.ItemSpec; import java.util.List; /** *
         *  商品信息服务接口
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.24 22:34    修改内容:
         * 
        */ public interface IItemService { /** * 在门户网站列出商品粗略信息 * @return */ List listItemPortal(); /** * 获取商品详情信息 * @return ItemDetail */ ItemDetail getItemDetailInfo(int spuId); } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-item/src/main/java/com/muses/taoshop/item/service/IItemSpecService.java ================================================ package com.muses.taoshop.item.service; import com.muses.taoshop.item.entity.ItemSpec; import com.muses.taoshop.item.entity.ItemSpecValue; import org.apache.ibatis.annotations.Param; import java.util.List; public interface IItemSpecService { /** * 获取spuId获取规格参数列表 * @return */ List getSpecBySpuId(int spuId); /** * 通过SkuId获取规格参数Value列表 * @param skuId * @return */ List getSpecValueBySkuId(int skuId); } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-order/ReadMe.md ================================================ ### 电商平台订单服务中心API ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-order/pom.xml ================================================ 4.0.0 org.muses.provider.api taoshop-provider-api-order 1.0-SNAPSHOT taoshop-provider-api-order http://www.example.com UTF-8 1.7 1.7 junit junit 4.11 test ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-order/src/main/java/org/muses/provider/api/App.java ================================================ package org.muses.provider.api; /** * Hello world! * */ public class App { public static void main( String[] args ) { System.out.println( "Hello World!" ); } } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-order/src/test/java/org/muses/provider/api/AppTest.java ================================================ package org.muses.provider.api; import static org.junit.Assert.assertTrue; import org.junit.Test; /** * Unit test for simple App. */ public class AppTest { /** * Rigorous Test :-) */ @Test public void shouldAnswerWithTrue() { assertTrue( true ); } } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-shop/pom.xml ================================================ taoshop-provider-api com.muses.taoshop.provider-api 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.provider-api taoshop-provider-api-shop 1.0-SNAPSHOT ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-shop/src/main/java/com/muses/taoshop/item/entity/ShopInfo.java ================================================ package com.muses.taoshop.item.entity; import java.util.Date; public class ShopInfo { private Long id; private String shopName; private Date lastModifyTime; private Date createTime; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getShopName() { return shopName; } public void setShopName(String shopName) { this.shopName = shopName == null ? null : shopName.trim(); } public Date getLastModifyTime() { return lastModifyTime; } public void setLastModifyTime(Date lastModifyTime) { this.lastModifyTime = lastModifyTime; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-shop/src/main/java/com/muses/taoshop/item/entity/ShopInfoExample.java ================================================ package com.muses.taoshop.item.entity; import java.util.ArrayList; import java.util.Date; import java.util.List; public class ShopInfoExample { protected String orderByClause; protected boolean distinct; protected List oredCriteria; public ShopInfoExample() { oredCriteria = new ArrayList(); } public void setOrderByClause(String orderByClause) { this.orderByClause = orderByClause; } public String getOrderByClause() { return orderByClause; } public void setDistinct(boolean distinct) { this.distinct = distinct; } public boolean isDistinct() { return distinct; } public List getOredCriteria() { return oredCriteria; } public void or(Criteria criteria) { oredCriteria.add(criteria); } public Criteria or() { Criteria criteria = createCriteriaInternal(); oredCriteria.add(criteria); return criteria; } public Criteria createCriteria() { Criteria criteria = createCriteriaInternal(); if (oredCriteria.size() == 0) { oredCriteria.add(criteria); } return criteria; } protected Criteria createCriteriaInternal() { Criteria criteria = new Criteria(); return criteria; } public void clear() { oredCriteria.clear(); orderByClause = null; distinct = false; } protected abstract static class GeneratedCriteria { protected List criteria; protected GeneratedCriteria() { super(); criteria = new ArrayList(); } public boolean isValid() { return criteria.size() > 0; } public List getAllCriteria() { return criteria; } public List getCriteria() { return criteria; } protected void addCriterion(String condition) { if (condition == null) { throw new RuntimeException("Value for condition cannot be null"); } criteria.add(new Criterion(condition)); } protected void addCriterion(String condition, Object value, String property) { if (value == null) { throw new RuntimeException("Value for " + property + " cannot be null"); } criteria.add(new Criterion(condition, value)); } protected void addCriterion(String condition, Object value1, Object value2, String property) { if (value1 == null || value2 == null) { throw new RuntimeException("Between values for " + property + " cannot be null"); } criteria.add(new Criterion(condition, value1, value2)); } public Criteria andIdIsNull() { addCriterion("id is null"); return (Criteria) this; } public Criteria andIdIsNotNull() { addCriterion("id is not null"); return (Criteria) this; } public Criteria andIdEqualTo(Long value) { addCriterion("id =", value, "id"); return (Criteria) this; } public Criteria andIdNotEqualTo(Long value) { addCriterion("id <>", value, "id"); return (Criteria) this; } public Criteria andIdGreaterThan(Long value) { addCriterion("id >", value, "id"); return (Criteria) this; } public Criteria andIdGreaterThanOrEqualTo(Long value) { addCriterion("id >=", value, "id"); return (Criteria) this; } public Criteria andIdLessThan(Long value) { addCriterion("id <", value, "id"); return (Criteria) this; } public Criteria andIdLessThanOrEqualTo(Long value) { addCriterion("id <=", value, "id"); return (Criteria) this; } public Criteria andIdIn(List values) { addCriterion("id in", values, "id"); return (Criteria) this; } public Criteria andIdNotIn(List values) { addCriterion("id not in", values, "id"); return (Criteria) this; } public Criteria andIdBetween(Long value1, Long value2) { addCriterion("id between", value1, value2, "id"); return (Criteria) this; } public Criteria andIdNotBetween(Long value1, Long value2) { addCriterion("id not between", value1, value2, "id"); return (Criteria) this; } public Criteria andShopNameIsNull() { addCriterion("shop_name is null"); return (Criteria) this; } public Criteria andShopNameIsNotNull() { addCriterion("shop_name is not null"); return (Criteria) this; } public Criteria andShopNameEqualTo(String value) { addCriterion("shop_name =", value, "shopName"); return (Criteria) this; } public Criteria andShopNameNotEqualTo(String value) { addCriterion("shop_name <>", value, "shopName"); return (Criteria) this; } public Criteria andShopNameGreaterThan(String value) { addCriterion("shop_name >", value, "shopName"); return (Criteria) this; } public Criteria andShopNameGreaterThanOrEqualTo(String value) { addCriterion("shop_name >=", value, "shopName"); return (Criteria) this; } public Criteria andShopNameLessThan(String value) { addCriterion("shop_name <", value, "shopName"); return (Criteria) this; } public Criteria andShopNameLessThanOrEqualTo(String value) { addCriterion("shop_name <=", value, "shopName"); return (Criteria) this; } public Criteria andShopNameLike(String value) { addCriterion("shop_name like", value, "shopName"); return (Criteria) this; } public Criteria andShopNameNotLike(String value) { addCriterion("shop_name not like", value, "shopName"); return (Criteria) this; } public Criteria andShopNameIn(List values) { addCriterion("shop_name in", values, "shopName"); return (Criteria) this; } public Criteria andShopNameNotIn(List values) { addCriterion("shop_name not in", values, "shopName"); return (Criteria) this; } public Criteria andShopNameBetween(String value1, String value2) { addCriterion("shop_name between", value1, value2, "shopName"); return (Criteria) this; } public Criteria andShopNameNotBetween(String value1, String value2) { addCriterion("shop_name not between", value1, value2, "shopName"); return (Criteria) this; } public Criteria andLastModifyTimeIsNull() { addCriterion("last_modify_time is null"); return (Criteria) this; } public Criteria andLastModifyTimeIsNotNull() { addCriterion("last_modify_time is not null"); return (Criteria) this; } public Criteria andLastModifyTimeEqualTo(Date value) { addCriterion("last_modify_time =", value, "lastModifyTime"); return (Criteria) this; } public Criteria andLastModifyTimeNotEqualTo(Date value) { addCriterion("last_modify_time <>", value, "lastModifyTime"); return (Criteria) this; } public Criteria andLastModifyTimeGreaterThan(Date value) { addCriterion("last_modify_time >", value, "lastModifyTime"); return (Criteria) this; } public Criteria andLastModifyTimeGreaterThanOrEqualTo(Date value) { addCriterion("last_modify_time >=", value, "lastModifyTime"); return (Criteria) this; } public Criteria andLastModifyTimeLessThan(Date value) { addCriterion("last_modify_time <", value, "lastModifyTime"); return (Criteria) this; } public Criteria andLastModifyTimeLessThanOrEqualTo(Date value) { addCriterion("last_modify_time <=", value, "lastModifyTime"); return (Criteria) this; } public Criteria andLastModifyTimeIn(List values) { addCriterion("last_modify_time in", values, "lastModifyTime"); return (Criteria) this; } public Criteria andLastModifyTimeNotIn(List values) { addCriterion("last_modify_time not in", values, "lastModifyTime"); return (Criteria) this; } public Criteria andLastModifyTimeBetween(Date value1, Date value2) { addCriterion("last_modify_time between", value1, value2, "lastModifyTime"); return (Criteria) this; } public Criteria andLastModifyTimeNotBetween(Date value1, Date value2) { addCriterion("last_modify_time not between", value1, value2, "lastModifyTime"); return (Criteria) this; } public Criteria andCreateTimeIsNull() { addCriterion("create_time is null"); return (Criteria) this; } public Criteria andCreateTimeIsNotNull() { addCriterion("create_time is not null"); return (Criteria) this; } public Criteria andCreateTimeEqualTo(Date value) { addCriterion("create_time =", value, "createTime"); return (Criteria) this; } public Criteria andCreateTimeNotEqualTo(Date value) { addCriterion("create_time <>", value, "createTime"); return (Criteria) this; } public Criteria andCreateTimeGreaterThan(Date value) { addCriterion("create_time >", value, "createTime"); return (Criteria) this; } public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { addCriterion("create_time >=", value, "createTime"); return (Criteria) this; } public Criteria andCreateTimeLessThan(Date value) { addCriterion("create_time <", value, "createTime"); return (Criteria) this; } public Criteria andCreateTimeLessThanOrEqualTo(Date value) { addCriterion("create_time <=", value, "createTime"); return (Criteria) this; } public Criteria andCreateTimeIn(List values) { addCriterion("create_time in", values, "createTime"); return (Criteria) this; } public Criteria andCreateTimeNotIn(List values) { addCriterion("create_time not in", values, "createTime"); return (Criteria) this; } public Criteria andCreateTimeBetween(Date value1, Date value2) { addCriterion("create_time between", value1, value2, "createTime"); return (Criteria) this; } public Criteria andCreateTimeNotBetween(Date value1, Date value2) { addCriterion("create_time not between", value1, value2, "createTime"); return (Criteria) this; } } public static class Criteria extends GeneratedCriteria { protected Criteria() { super(); } } public static class Criterion { private String condition; private Object value; private Object secondValue; private boolean noValue; private boolean singleValue; private boolean betweenValue; private boolean listValue; private String typeHandler; public String getCondition() { return condition; } public Object getValue() { return value; } public Object getSecondValue() { return secondValue; } public boolean isNoValue() { return noValue; } public boolean isSingleValue() { return singleValue; } public boolean isBetweenValue() { return betweenValue; } public boolean isListValue() { return listValue; } public String getTypeHandler() { return typeHandler; } protected Criterion(String condition) { super(); this.condition = condition; this.typeHandler = null; this.noValue = true; } protected Criterion(String condition, Object value, String typeHandler) { super(); this.condition = condition; this.value = value; this.typeHandler = typeHandler; if (value instanceof List) { this.listValue = true; } else { this.singleValue = true; } } protected Criterion(String condition, Object value) { this(condition, value, null); } protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { super(); this.condition = condition; this.value = value; this.secondValue = secondValue; this.typeHandler = typeHandler; this.betweenValue = true; } protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } } } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-usc/pom.xml ================================================ taoshop-provider-api com.muses.taoshop.provider-api 1.0-SNAPSHOT 4.0.0 jar com.muses.taoshop.provider-api taoshop-provider-api-usc 1.0-SNAPSHOT ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-usc/src/main/java/com/muses/taoshop/user/entity/User.java ================================================ package com.muses.taoshop.user.entity; import lombok.Data; /** *
         *  商城用户信息VO类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.08.05 15:24    修改内容:
         * 
        */ @Data public class User { /** * 用户名 */ private String username; /** * 密码 */ private String password; } ================================================ FILE: src/taoshop-provider-api/taoshop-provider-api-usc/src/main/java/com/muses/taoshop/user/service/IUserService.java ================================================ package com.muses.taoshop.user.service; import com.muses.taoshop.user.entity.User; public interface IUserService { /** * 登录验证 * @param username * @param password */ User loginCheck(String username, String password); } ================================================ FILE: src/taoshop-quartz/ReadMe.md ================================================ ### 任务调度框架 //TODO 要求支持高并发 ================================================ FILE: src/taoshop-quartz/pom.xml ================================================ taoshop com.muses.taoshop 1.0-SNAPSHOT 4.0.0 taoshop-quartz jar ================================================ FILE: src/taoshop-search/ReadMe.md ================================================ 全局搜索引擎 ### 数据库索引和Lucene检索对比 |比较项 |Lucene检索| 数据库检索| |:--------|:--------|:--------| |数据检索 | 从Lucene的索引文件中检出 | 由数据库索引检索记录| |索引结构 | Document(文档)| Record(记录)| |全文检索 | 支持 | 不支持| |模糊查询 | 支持 | 不支持| |结果排序 | 支持排序 | 不能排序| Lucene搜索的API类主要有4个 IndexSearch,Query,QueryParser,Hits ### Lucene搜索过程 Lucene的索引结构是文档(Document)形式的,下面简单介绍一下Lucene搜索的过程 1. 将文档传给分词组件(Tokenizer),分词组件根据标点符号和停词将文档分成词元(Token),并将标点符号和停词去掉。 停词是指没有特别意思的词。英语的是指比如a、the等等单词 文章1内容:Tom favorite fruit is apple. 经过分词处理后,变成[Tom][facorite][fruit][apple] 2. 再将词元传给语言处理组件(Linguistic Processor) 英语的单词经过语言处理组件处理后,字母变为小写,词元会变成最基本的词根形式,比如likes变成like 经过分词处理后,变成[tom][favorite][fruit][apple] 3. 然后得到的词元传给索引组件(Indexer),索引组件处理得到索引结构,得到关键字、出现频率、出现位置分别作为词典文件(Term Dictionary)、频率文件(frequencies)和位置文件(positions)保存起来,然后通过二元搜索算法快速查找关键字 |关键字 |文章号[出现频率]| 出现位置| |:--------|:--------|:--------| |tom | 1[1] | 1 | |favorite| 1[2] | 2 | |fruit| 1[3] | 3 | [apple| 1[4] | 4 | ================================================ FILE: src/taoshop-search/pom.xml ================================================ taoshop com.muses.taoshop 1.0-SNAPSHOT 4.0.0 taoshop-search jar taoshop-search Maven Webapp http://www.example.com UTF-8 1.7 1.7 7.1.0 junit junit 4.11 test org.apache.lucene lucene-core ${lucene.version} org.apache.lucene lucene-analyzers-common ${lucene.version} org.apache.lucene lucene-queryparser ${lucene.version} org.apache.lucene lucene-analyzers-smartcn ${lucene.version} org.apache.lucene lucene-highlighter ${lucene.version} ================================================ FILE: src/taoshop-search/src/main/java/com/muses/base/search/LuceneConstants.java ================================================ package com.muses.base.search; public class LuceneConstants { } ================================================ FILE: src/taoshop-search/src/main/java/com/muses/base/search/TestLucene.java ================================================ package com.muses.base.search; public class TestLucene { } ================================================ FILE: src/taoshop-search/src/main/java/com/muses/base/search/biz/LuceneIndexer.java ================================================ package com.muses.base.search.biz; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.IndexableField; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.springframework.stereotype.Component; /** *
         * 	Lucene创建索引服务类
         * 
        * * @author nicky * @version 1.00.00 * *
         * 修改记录
         *    修改后版本:     修改人:  修改日期:2018年04月18日     修改内容:
         *          
        */ @Component public class LuceneIndexer { private volatile static LuceneIndexer instance; // // private LuceneIndexer(){} /** * 双检锁/双重校验锁(DCL,即 double-checked locking) * @return instance */ // public static LuceneIndexer getInstance(){ // if(instance == null){ // synchronized (LuceneIndexer.class) { // if(instance == null){ // instance = new LuceneIndexer(); // } // } // } // return instance; // } // private static Analyzer analyzer; // private static Directory directory; private IndexWriter indexWriter; // private static IndexWriterConfig config; private final static String INDEX_DIR = "D:\\lucene"; private static class SingletonHolder{ private final static LuceneIndexer instance=new LuceneIndexer(); } public static LuceneIndexer getInstance(){ return SingletonHolder.instance; } public boolean createIndex(String indexDir) throws IOException{ //加点测试的静态数据 Integer ids[] = {1 , 2 , 3}; String titles[] = {"标题1" , "标题2" , "标题3"}; String tcontents[] = { "内容1内容啊哈哈哈", "内容2内容啊哈哈哈", "内容3内容啊哈哈哈" }; long startTime = System.currentTimeMillis();//记录索引开始时间 Analyzer analyzer = new SmartChineseAnalyzer(); Directory directory = FSDirectory.open(Paths.get(indexDir)); IndexWriterConfig config = new IndexWriterConfig(analyzer); IndexWriter indexWriter = new IndexWriter(directory, config); for(int i = 0; i < ids.length;i++){ Document doc = new Document(); //添加字段 doc.add(new TextField("id", ids[i].toString(),Field.Store.YES)); //添加内容 doc.add(new TextField("title", titles[i], Field.Store.YES)); //添加文件名,并把这个字段存到索引文件里 doc.add(new TextField("tcontent", tcontents[i], Field.Store.YES)); //添加文件路径 indexWriter.addDocument(doc); } indexWriter.commit(); System.out.println("共索引了"+indexWriter.numDocs()+"个文件"); indexWriter.close(); System.out.println("创建索引所用时间:"+(System.currentTimeMillis()-startTime)+"毫秒"); return true; } // private void addDocument(File file) throws IOException{ // Document doc = new Document(); // //添加字段 // doc.add(new TextField("contents", new FileReader(file))); //添加内容 // doc.add(new TextField("fileName", file.getName(), Field.Store.YES)); //添加文件名,并把这个字段存到索引文件里 // doc.add(new TextField("fullPath", file.getCanonicalPath(), Field.Store.YES)); //添加文件路径 // // indexWriter.addDocument(doc); // } // // private void closeWriter() throws IOException{ // if (indexWriter != null) { // indexWriter.close(); // } // } public static void main(String[] args) { try { boolean r = LuceneIndexer.getInstance().createIndex(INDEX_DIR); if(r){ System.out.println("索引创建成功!"); }else{ System.out.println("索引创建失败!"); } } catch (IOException e) { e.printStackTrace(); } } } ================================================ FILE: src/taoshop-search/src/main/java/com/muses/base/search/biz/SearchBuilder.java ================================================ package com.muses.base.search.biz; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.highlight.*; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import java.io.IOException; import java.io.StringReader; import java.nio.file.Paths; /** *
         * 	Lucene全局搜索服务类
         * 
        * * @author nicky * @version 1.00.00 * *
         * 修改记录
         *    修改后版本:     修改人:  修改日期:2018年04月18日     修改内容:
         *          
        */ public class SearchBuilder { public static void doSearch(String indexDir , String queryStr) throws IOException, ParseException, InvalidTokenOffsetsException { Directory directory = FSDirectory.open(Paths.get(indexDir)); DirectoryReader reader = DirectoryReader.open(directory); IndexSearcher searcher = new IndexSearcher(reader); Analyzer analyzer = new SmartChineseAnalyzer(); QueryParser parser = new QueryParser("tcontent",analyzer); Query query = parser.parse(queryStr); long startTime = System.currentTimeMillis(); TopDocs docs = searcher.search(query,10); System.out.println("查找"+queryStr+"所用时间:"+(System.currentTimeMillis()-startTime)); System.out.println("查询到"+docs.totalHits+"条记录"); //加入高亮显示的 SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("",""); QueryScorer scorer = new QueryScorer(query);//计算查询结果最高的得分 Fragmenter fragmenter = new SimpleSpanFragmenter(scorer);//根据得分算出一个片段 Highlighter highlighter = new Highlighter(simpleHTMLFormatter,scorer); highlighter.setTextFragmenter(fragmenter);//设置显示高亮的片段 //遍历查询结果 for(ScoreDoc scoreDoc : docs.scoreDocs){ Document doc = searcher.doc(scoreDoc.doc); System.out.println(doc.get("title")); System.out.println(doc.get("tcontent")); String tcontent = doc.get("tcontent"); if(tcontent != null){ TokenStream tokenStream = analyzer.tokenStream("tcontent", new StringReader(tcontent)); String summary = highlighter.getBestFragment(tokenStream, tcontent); System.out.println(summary); } } reader.close(); } public static void main(String[] args){ String indexDir = "D:\\lucene"; String q = "内容1"; //查询这个字符串 try { doSearch(indexDir, q); } catch (Exception e) { e.printStackTrace(); } } } ================================================ FILE: src/taoshop-search/src/test/java/com/test/lucene/LuceneIndexer.java ================================================ package com.test.lucene; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.springframework.stereotype.Component; /** *
         * 	Lucene创建索引、全局搜索服务类
         * 
        * * @author nicky * @version 1.00.00 * *
         * 修改记录
         *    修改后版本:     修改人:  修改日期:2018年04月18日     修改内容:
         *          
        */ @Component public class LuceneIndexer { private volatile static LuceneIndexer instance; // // private LuceneIndexer(){} /** * 双检锁/双重校验锁(DCL,即 double-checked locking) * @return instance */ // public static LuceneIndexer getInstance(){ // if(instance == null){ // synchronized (LuceneIndexer.class) { // if(instance == null){ // instance = new LuceneIndexer(); // } // } // } // return instance; // } // private static Analyzer analyzer; // private static Directory directory; private IndexWriter indexWriter; // private static IndexWriterConfig config; private final static String INDEX_DIR = "D:\\lucene"; private static class SingletonHolder{ private final static LuceneIndexer instance=new LuceneIndexer(); } public static LuceneIndexer getInstance(){ return SingletonHolder.instance; } public boolean createIndex(String indexDir) throws IOException{ //加点测试的静态数据 Integer ids[] = {1 , 2 , 3}; String titles[] = {"标题1" , "标题2" , "标题3"}; String tcontents[] = { "内容1内容啊哈哈哈", "内容2内容啊哈哈哈", "内容3内容啊哈哈哈" }; long startTime = System.currentTimeMillis();//记录索引开始时间 Analyzer analyzer = new SmartChineseAnalyzer(); Directory directory = FSDirectory.open(Paths.get(indexDir)); IndexWriterConfig config = new IndexWriterConfig(analyzer); IndexWriter indexWriter = new IndexWriter(directory, config); for(int i = 0; i < ids.length;i++){ Document doc = new Document(); //添加字段 doc.add(new TextField("id", ids[i].toString(),Field.Store.YES)); //添加内容 doc.add(new TextField("title", titles[i], Field.Store.YES)); //添加文件名,并把这个字段存到索引文件里 doc.add(new TextField("tcontent", tcontents[i], Field.Store.YES)); //添加文件路径 indexWriter.addDocument(doc); } indexWriter.commit(); System.out.println("共索引了"+indexWriter.numDocs()+"个文件"); indexWriter.close(); System.out.println("创建索引所用时间:"+(System.currentTimeMillis()-startTime)+"毫秒"); return true; } // private void addDocument(File file) throws IOException{ // Document doc = new Document(); // //添加字段 // doc.add(new TextField("contents", new FileReader(file))); //添加内容 // doc.add(new TextField("fileName", file.getName(), Field.Store.YES)); //添加文件名,并把这个字段存到索引文件里 // doc.add(new TextField("fullPath", file.getCanonicalPath(), Field.Store.YES)); //添加文件路径 // // indexWriter.addDocument(doc); // } // // private void closeWriter() throws IOException{ // if (indexWriter != null) { // indexWriter.close(); // } // } public static void main(String[] args) { try { boolean r = LuceneIndexer.getInstance().createIndex(INDEX_DIR); if(r){ System.out.println("索引创建成功!"); }else{ System.out.println("索引创建失败!"); } } catch (IOException e) { e.printStackTrace(); } } } ================================================ FILE: src/taoshop-search/src/test/java/com/test/lucene/SearchBuilder.java ================================================ package com.test.lucene; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.highlight.*; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import java.io.IOException; import java.io.StringReader; import java.nio.file.Paths; public class SearchBuilder { public static void doSearch(String indexDir , String queryStr) throws IOException, ParseException, InvalidTokenOffsetsException { Directory directory = FSDirectory.open(Paths.get(indexDir)); DirectoryReader reader = DirectoryReader.open(directory); IndexSearcher searcher = new IndexSearcher(reader); Analyzer analyzer = new SmartChineseAnalyzer(); QueryParser parser = new QueryParser("tcontent",analyzer); Query query = parser.parse(queryStr); long startTime = System.currentTimeMillis(); TopDocs docs = searcher.search(query,10); System.out.println("查找"+queryStr+"所用时间:"+(System.currentTimeMillis()-startTime)); System.out.println("查询到"+docs.totalHits+"条记录"); //加入高亮显示的 SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("",""); QueryScorer scorer = new QueryScorer(query);//计算查询结果最高的得分 Fragmenter fragmenter = new SimpleSpanFragmenter(scorer);//根据得分算出一个片段 Highlighter highlighter = new Highlighter(simpleHTMLFormatter,scorer); highlighter.setTextFragmenter(fragmenter);//设置显示高亮的片段 //遍历查询结果 for(ScoreDoc scoreDoc : docs.scoreDocs){ Document doc = searcher.doc(scoreDoc.doc); System.out.println(doc.get("title")); String tcontent = doc.get("tcontent"); if(tcontent != null){ TokenStream tokenStream = analyzer.tokenStream("tcontent", new StringReader(tcontent)); String summary = highlighter.getBestFragment(tokenStream, tcontent); System.out.println(summary); } } reader.close(); } public static void main(String[] args){ String indexDir = "D:\\lucene"; String q = "内容1"; //查询这个字符串 try { doSearch(indexDir, q); } catch (Exception e) { e.printStackTrace(); } } } ================================================ FILE: src/taoshop-search/src/test/java/com/test/pattern/CurrentConditionsDisplay.java ================================================ package com.test.pattern; import java.util.Observable; import java.util.Observer; public class CurrentConditionsDisplay implements Observer, DisplayElement { private float temperature; private float humidity; Observable observable; public CurrentConditionsDisplay(Observable observable) { // weatherData.registerObserver(this); this.observable = observable; observable.addObserver(this); } // public void update(float temperature, float humidity, float pressure) { // this.temperature = temperature; // this.humidity = humidity; // display(); // } /** * This method is called whenever the observed object is changed. An * application calls an Observable object's * notifyObservers method to have all the object's * observers notified of the change. * * @param o the observable object. * @param arg an argument passed to the notifyObservers */ @Override public void update(Observable o, Object arg) { if(o instanceof WeatherData){ WeatherData wd = (WeatherData)o; temperature = wd.getTemperature(); humidity = wd.getHumidity(); display(); } } public void display() { System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity"); } } ================================================ FILE: src/taoshop-search/src/test/java/com/test/pattern/DisplayElement.java ================================================ package com.test.pattern; public interface DisplayElement { public void display(); } ================================================ FILE: src/taoshop-search/src/test/java/com/test/pattern/ForecastDisplay.java ================================================ package com.test.pattern; public class ForecastDisplay implements Observer, DisplayElement { private float currentPressure = 29.92f; private float lastPressure; public ForecastDisplay(WeatherData weatherData) { weatherData.registerObserver(this); } public void update(float temp, float humidity, float pressure) { lastPressure = currentPressure; currentPressure = pressure; display(); } public void display() { System.out.print("Forecast: "); if (currentPressure > lastPressure) { System.out.println("Improving weather on the way!"); } else if (currentPressure == lastPressure) { System.out.println("More of the same"); } else if (currentPressure < lastPressure) { System.out.println("Watch out for cooler, rainy weather"); } } } ================================================ FILE: src/taoshop-search/src/test/java/com/test/pattern/Observer.java ================================================ package com.test.pattern; public interface Observer { public void update(float temp, float humidity, float pressure); } ================================================ FILE: src/taoshop-search/src/test/java/com/test/pattern/Singleton.java ================================================ package com.test.pattern; /** *
         * 	设计模式之单例模式
         * 
        * * @author nicky * @version 1.00.00 * *
         * 修改记录
         *    修改后版本:     修改人:  修改日期:2018年04月18日     修改内容:
         *          
        */ public class Singleton { private static Singleton instance; //定义private构造函数,使类不可以被实例 private Singleton (){} // /** // * 懒汉模式,线程不安全,懒加载 // * @return // */ // public static Singleton getInstance() { // if (instance == null) { // instance = new Singleton(); // } // return instance; // } // /** // * 懒汉模式,线程安全,懒加载 // * @return // */ // public static synchronized Singleton getInstance() { // if (instance == null) { // instance = new Singleton(); // } // return instance; // } //加载类的时候,利用JVM的类加载机制创建对象,保证了线程安全,但是效率不好 // private static Singleton instance = new Singleton(); // /** // * 饿汉模式,线程安全,非懒加载 // * @return // */ // public static Singleton getInstance() { // return instance; // } // private volatile static Singleton instance; // /** // * 双检锁/双重校验锁(DCL,即 double-checked locking)线程安全,懒加载 // * @return // */ // public static Singleton getInstance(){ // if(instance == null){ // synchronized (Singleton.class){ // if(instance == null){ // instance = new Singleton(); // } // } // } // return instance; // } public static class SingletonHolder{ private final static Singleton INSTANCE = new Singleton(); } /** * 登记式/静态内部类,线程安全,懒加载 * @return */ public static Singleton getInstance(){ return SingletonHolder.INSTANCE; } // /** // * 枚举方式 // */ // public enum Singleton { // INSTANCE; // public void whateverMethod() { // } // } } ================================================ FILE: src/taoshop-search/src/test/java/com/test/pattern/StatisticsDisplay.java ================================================ package com.test.pattern; public class StatisticsDisplay implements Observer, DisplayElement { private float maxTemp = 0.0f; private float minTemp = 200; private float tempSum= 0.0f; private int numReadings; public StatisticsDisplay(WeatherData weatherData) { weatherData.registerObserver(this); } public void update(float temp, float humidity, float pressure) { tempSum += temp; numReadings++; if (temp > maxTemp) { maxTemp = temp; } if (temp < minTemp) { minTemp = temp; } display(); } public void display() { System.out.println("Avg/Max/Min temperature = " + (tempSum / numReadings) + "/" + maxTemp + "/" + minTemp); } } ================================================ FILE: src/taoshop-search/src/test/java/com/test/pattern/Subject.java ================================================ package com.test.pattern; public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); } ================================================ FILE: src/taoshop-search/src/test/java/com/test/pattern/WeatherData.java ================================================ package com.test.pattern; import java.util.ArrayList; import java.util.Observable; /** * 用JDK内置类来实现 */ public class WeatherData extends Observable { private ArrayList observers; private float temperature; private float humidity; private float pressure; public WeatherData() { observers = new ArrayList(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { int i = observers.indexOf(o); if (i >= 0) { observers.remove(i); } } public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer = (Observer)observers.get(i); observer.update(temperature, humidity, pressure); } } public void measurementsChanged() { setChanged();//调用setChanged方法,标记状态改变 notifyObservers(); } public void setMeasurements(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } // other WeatherData methods here public float getTemperature() { return temperature; } public float getHumidity() { return humidity; } public float getPressure() { return pressure; } } ================================================ FILE: src/taoshop-search/src/test/java/com/test/pattern/WeatherStation.java ================================================ package com.test.pattern; public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); weatherData.setMeasurements(80, 65, 30.4f); weatherData.setMeasurements(82, 70, 29.2f); weatherData.setMeasurements(78, 90, 29.2f); } } ================================================ FILE: src/taoshop-search/src/test/java/com/test/thread/ThreadTest.java ================================================ package com.test.thread; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** *
         *  测试类
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.06.18 14:51    修改内容:
         * 
        */ @WebServlet(name = "/testThread") public class ThreadTest extends HttpServlet{ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); System.out.println(Thread.currentThread().getName()); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } public static void main(String[] args){ System.out.println(Thread.currentThread().getName()); // System.out.println(Thread.currentThread().getName()); Thread t = new Thread(); System.out.println(t.getName()); Thread t1 = new Thread(); System.out.println(t1.getName()); } } ================================================ FILE: src/taoshop-sso/pom.xml ================================================ taoshop com.muses.taoshop 1.0-SNAPSHOT 4.0.0 com.muses.taoshop.taoshop-sso taoshop-sso 1.0-SNAPSHOT war UTF-8 1.8 4.2.7 1.8 1.8 UTF-8 2.3.2 4.12 2.0.0-RC1 3.3.6 1.1.1-RELEASE 3.0 org.jasig.cas cas-server-core ${cas.version} org.jasig.cas cas-server-webapp-actions ${cas.version} org.jasig.cas cas-server-support-rest-services ${cas.version} org.jasig.cas cas-server-core-logout ${cas.version} junit junit ${junit.version} test org.pac4j pac4j-cas ${pac4j-cas.version} test org.pac4j pac4j-core ${pac4j-cas.version} test taoshop-sso org.apache.maven.plugins maven-war-plugin 2.6 cas org.jasig.cas cas-server-webapp WEB-INF/cas_dev.properties WEB-INF/classes/log4j2.xml WEB-INF/classes/message*.properties WEB-INF/classes/services org.apache.maven.plugins maven-compiler-plugin 3.5.1 1.8 1.8 ================================================ FILE: src/taoshop-sso/src/main/java/ReadMe.txt ================================================ cas-server-core-authentication\src\main\java\org\jasig\cas\authentication\UsernamePasswordCredential.java cas-server-support-rest\src\main\java\org\jasig\cas\support\rest\TicketsResource.java cas-server-core-authentication\src\main\java\org\jasig\cas\web\flow\AuthenticationExceptionHandler.java cas-server-webapp-actions\src\main\java\org\jasig\cas\web\flow\AuthenticationViaFormAction.java cas-server-core\src\main\java\org\jasig\cas\CentralAuthenticationServiceImpl.java ================================================ FILE: src/taoshop-sso/src/main/java/com/muses/taoshop/sso/authentication/UsernamePasswordAuthenticationHandler.java ================================================ package com.muses.taoshop.sso.authentication; import org.jasig.cas.authentication.HandlerResult; import org.jasig.cas.authentication.PreventedException; import org.jasig.cas.authentication.UsernamePasswordCredential; import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; import java.security.GeneralSecurityException; /** *
         *  Cas单点登录用户名密码校验
         * 
        * * @author nicky * @version 1.00.00 *
         * 修改记录
         *    修改后版本:     修改人:  修改日期: 2018.08.19 22:16    修改内容:
         * 
        */ public class UsernamePasswordAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler{ @Override protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential usernamePasswordCredential) throws GeneralSecurityException, PreventedException { return null; } protected void doTest(){ try{ System.out.println(); }catch (Exception e){ e.printStackTrace(); } } } ================================================ FILE: src/taoshop-sso/src/main/java/org/jasig/cas/CentralAuthenticationServiceImpl.java ================================================ package org.jasig.cas; import com.codahale.metrics.annotation.Counted; import com.codahale.metrics.annotation.Metered; import com.codahale.metrics.annotation.Timed; import org.jasig.cas.authentication.Authentication; import org.jasig.cas.authentication.AuthenticationBuilder; import org.jasig.cas.authentication.AuthenticationContext; import org.jasig.cas.authentication.AuthenticationException; import org.jasig.cas.authentication.DefaultAuthenticationBuilder; import org.jasig.cas.authentication.MixedPrincipalException; import org.jasig.cas.authentication.principal.Principal; import org.jasig.cas.authentication.principal.Service; import org.jasig.cas.logout.LogoutManager; import org.jasig.cas.logout.LogoutRequest; import org.jasig.cas.services.RegisteredService; import org.jasig.cas.services.RegisteredServiceAttributeReleasePolicy; import org.jasig.cas.services.ServiceContext; import org.jasig.cas.services.ServicesManager; import org.jasig.cas.services.UnauthorizedProxyingException; import org.jasig.cas.services.UnauthorizedServiceForPrincipalException; import org.jasig.cas.services.UnauthorizedSsoServiceException; import org.jasig.cas.support.events.CasProxyGrantingTicketCreatedEvent; import org.jasig.cas.support.events.CasProxyTicketGrantedEvent; import org.jasig.cas.support.events.CasServiceTicketGrantedEvent; import org.jasig.cas.support.events.CasServiceTicketValidatedEvent; import org.jasig.cas.support.events.CasTicketGrantingTicketCreatedEvent; import org.jasig.cas.support.events.CasTicketGrantingTicketDestroyedEvent; import org.jasig.cas.ticket.AbstractTicketException; import org.jasig.cas.ticket.InvalidTicketException; import org.jasig.cas.ticket.ServiceTicket; import org.jasig.cas.ticket.ServiceTicketFactory; import org.jasig.cas.ticket.TicketFactory; import org.jasig.cas.ticket.TicketGrantingTicket; import org.jasig.cas.ticket.TicketGrantingTicketFactory; import org.jasig.cas.ticket.UnrecognizableServiceForServiceTicketValidationException; import org.jasig.cas.ticket.proxy.ProxyGrantingTicket; import org.jasig.cas.ticket.proxy.ProxyGrantingTicketFactory; import org.jasig.cas.ticket.proxy.ProxyTicket; import org.jasig.cas.ticket.proxy.ProxyTicketFactory; import org.jasig.cas.ticket.registry.TicketRegistry; import org.jasig.cas.validation.Assertion; import org.jasig.cas.validation.ImmutableAssertion; import org.jasig.inspektr.audit.annotation.Audit; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.validation.constraints.NotNull; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Concrete implementation of a {@link CentralAuthenticationService}, and also the * central, organizing component of CAS's internal implementation. * This class is threadsafe. * * @author William G. Thompson, Jr. * @author Scott Battaglia * @author Dmitry Kopylenko * @author Misagh Moayyed * @since 3.0.0 */ @Component("centralAuthenticationService") @Transactional(readOnly = false, transactionManager = "ticketTransactionManager") public class CentralAuthenticationServiceImpl extends AbstractCentralAuthenticationService { private static final long serialVersionUID = -8943828074939533986L; /** * Instantiates a new Central authentication service impl. */ public CentralAuthenticationServiceImpl() { super(); } /** * Build the central authentication service implementation. * * @param ticketRegistry the tickets registry. * @param ticketFactory the ticket factory * @param servicesManager the services manager. * @param logoutManager the logout manager. */ public CentralAuthenticationServiceImpl( final TicketRegistry ticketRegistry, final TicketFactory ticketFactory, final ServicesManager servicesManager, final LogoutManager logoutManager) { super(ticketRegistry, ticketFactory, servicesManager, logoutManager); } /** * {@inheritDoc} * Destroy a TicketGrantingTicket and perform back channel logout. This has the effect of invalidating any * Ticket that was derived from the TicketGrantingTicket being destroyed. May throw an * {@link IllegalArgumentException} if the TicketGrantingTicket ID is null. * * @param ticketGrantingTicketId the id of the ticket we want to destroy * @return the logout requests. */ @Audit( action = "TICKET_GRANTING_TICKET_DESTROYED", actionResolverName = "DESTROY_TICKET_GRANTING_TICKET_RESOLVER", resourceResolverName = "DESTROY_TICKET_GRANTING_TICKET_RESOURCE_RESOLVER") @Timed(name = "DESTROY_TICKET_GRANTING_TICKET_TIMER") @Metered(name = "DESTROY_TICKET_GRANTING_TICKET_METER") @Counted(name = "DESTROY_TICKET_GRANTING_TICKET_COUNTER", monotonic = true) @Override public List destroyTicketGrantingTicket(@NotNull final String ticketGrantingTicketId) { try { logger.debug("Removing ticket [{}] from registry...", ticketGrantingTicketId); final TicketGrantingTicket ticket = getTicket(ticketGrantingTicketId, TicketGrantingTicket.class); logger.debug("Ticket found. Processing logout requests and then deleting the ticket..."); final List logoutRequests = logoutManager.performLogout(ticket); this.ticketRegistry.deleteTicket(ticketGrantingTicketId); doPublishEvent(new CasTicketGrantingTicketDestroyedEvent(this, ticket)); return logoutRequests; } catch (final InvalidTicketException e) { logger.debug("TicketGrantingTicket [{}] cannot be found in the ticket registry.", ticketGrantingTicketId); } return Collections.emptyList(); } @Audit( action = "SERVICE_TICKET", actionResolverName = "GRANT_SERVICE_TICKET_RESOLVER", resourceResolverName = "GRANT_SERVICE_TICKET_RESOURCE_RESOLVER") @Timed(name = "GRANT_SERVICE_TICKET_TIMER") @Metered(name = "GRANT_SERVICE_TICKET_METER") @Counted(name = "GRANT_SERVICE_TICKET_COUNTER", monotonic = true) @Override public ServiceTicket grantServiceTicket( final String ticketGrantingTicketId, final Service service, final AuthenticationContext context) throws AuthenticationException, AbstractTicketException { logger.debug("Attempting to get ticket id {} to create service ticket", ticketGrantingTicketId); final TicketGrantingTicket ticketGrantingTicket = getTicket(ticketGrantingTicketId, TicketGrantingTicket.class); final RegisteredService registeredService = this.servicesManager.findServiceBy(service); verifyRegisteredServiceProperties(registeredService, service); evaluatePossibilityOfMixedPrincipals(context, ticketGrantingTicket); if (ticketGrantingTicket.getCountOfUses() > 0 && !registeredService.getAccessStrategy().isServiceAccessAllowedForSso()) { logger.warn("Service [{}] is not allowed to use SSO.", service.getId()); throw new UnauthorizedSsoServiceException(); } evaluateProxiedServiceIfNeeded(service, ticketGrantingTicket, registeredService); // Perform security policy check by getting the authentication that satisfies the configured policy // This throws if no suitable policy is found logger.debug("Checking for authentication policy satisfaction..."); getAuthenticationSatisfiedByPolicy(ticketGrantingTicket.getRoot(), new ServiceContext(service, registeredService)); final List authentications = ticketGrantingTicket.getChainedAuthentications(); final Principal principal = authentications.get(authentications.size() - 1).getPrincipal(); logger.debug("Located principal {} for service ticket creation", principal); final RegisteredServiceAttributeReleasePolicy releasePolicy = registeredService.getAttributeReleasePolicy(); final Map principalAttrs; if (releasePolicy != null) { principalAttrs = releasePolicy.getAttributes(principal); } else { principalAttrs = new HashMap<>(); } if (!registeredService.getAccessStrategy().doPrincipalAttributesAllowServiceAccess(principal.getId(), principalAttrs)) { logger.warn("Cannot grant service ticket because Service [{}] is not authorized for use by [{}].", service.getId(), principal); throw new UnauthorizedServiceForPrincipalException(); } final ServiceTicketFactory factory = this.ticketFactory.get(ServiceTicket.class); final ServiceTicket serviceTicket = factory.create(ticketGrantingTicket, service, context != null && context.isCredentialProvided()); logger.info("Granted ticket [{}] for service [{}] and principal [{}]", serviceTicket.getId(), service.getId(), principal.getId()); this.ticketRegistry.addTicket(serviceTicket); logger.debug("Added service ticket {} to ticket registry", serviceTicket.getId()); doPublishEvent(new CasServiceTicketGrantedEvent(this, ticketGrantingTicket, serviceTicket)); return serviceTicket; } /** * Always keep track of a single authentication object, * as opposed to keeping a history of all. This helps with * memory consumption. Note that supplemental authentications * are to be removed. * * @param context authentication context * @param ticketGrantingTicket the tgt * @return the processed authentication in the current context * @throws MixedPrincipalException in case there is a principal mismatch between TGT and the current authN. */ private Authentication evaluatePossibilityOfMixedPrincipals(final AuthenticationContext context, final TicketGrantingTicket ticketGrantingTicket) throws MixedPrincipalException { Authentication currentAuthentication = null; if (context != null) { currentAuthentication = context.getAuthentication(); if (currentAuthentication != null) { final Authentication original = ticketGrantingTicket.getAuthentication(); if (!currentAuthentication.getPrincipal().equals(original.getPrincipal())) { logger.debug("Principal associated with current authentication {} does not match " + " the principal {} associated with the original authentication", currentAuthentication.getPrincipal(), original.getPrincipal()); throw new MixedPrincipalException( currentAuthentication, currentAuthentication.getPrincipal(), original.getPrincipal()); } ticketGrantingTicket.getSupplementalAuthentications().clear(); ticketGrantingTicket.getSupplementalAuthentications().add(currentAuthentication); logger.debug("Added authentication to the collection of supplemental authentications"); } } return currentAuthentication; } @Audit( action = "PROXY_TICKET", actionResolverName = "GRANT_PROXY_TICKET_RESOLVER", resourceResolverName = "GRANT_PROXY_TICKET_RESOURCE_RESOLVER") @Timed(name = "GRANT_PROXY_TICKET_TIMER") @Metered(name = "GRANT_PROXY_TICKET_METER") @Counted(name = "GRANT_PROXY_TICKET_COUNTER", monotonic = true) @Override public ProxyTicket grantProxyTicket(final String proxyGrantingTicket, final Service service) throws AbstractTicketException { final ProxyGrantingTicket proxyGrantingTicketObject = getTicket(proxyGrantingTicket, ProxyGrantingTicket.class); final RegisteredService registeredService = this.servicesManager.findServiceBy(service); verifyRegisteredServiceProperties(registeredService, service); if (!registeredService.getAccessStrategy().isServiceAccessAllowedForSso()) { logger.warn("Service [{}] is not allowed to use SSO.", service.getId()); throw new UnauthorizedSsoServiceException(); } evaluateProxiedServiceIfNeeded(service, proxyGrantingTicketObject, registeredService); // Perform security policy check by getting the authentication that satisfies the configured policy // This throws if no suitable policy is found getAuthenticationSatisfiedByPolicy(proxyGrantingTicketObject.getRoot(), new ServiceContext(service, registeredService)); final List authentications = proxyGrantingTicketObject.getChainedAuthentications(); final Principal principal = authentications.get(authentications.size() - 1).getPrincipal(); final RegisteredServiceAttributeReleasePolicy releasePolicy = registeredService.getAttributeReleasePolicy(); final Map principalAttrs; if (releasePolicy != null) { principalAttrs = releasePolicy.getAttributes(principal); } else { principalAttrs = new HashMap<>(); } if (!registeredService.getAccessStrategy().doPrincipalAttributesAllowServiceAccess(principal.getId(), principalAttrs)) { logger.warn("Cannot grant proxy ticket because Service [{}] is not authorized for use by [{}].", service.getId(), principal); throw new UnauthorizedServiceForPrincipalException(); } final ProxyTicketFactory factory = this.ticketFactory.get(ProxyTicket.class); final ProxyTicket proxyTicket = factory.create(proxyGrantingTicketObject, service); this.ticketRegistry.addTicket(proxyTicket); logger.info("Granted ticket [{}] for service [{}] for user [{}]", proxyTicket.getId(), service.getId(), principal.getId()); doPublishEvent(new CasProxyTicketGrantedEvent(this, proxyGrantingTicketObject, proxyTicket)); return proxyTicket; } @Audit( action = "PROXY_GRANTING_TICKET", actionResolverName = "CREATE_PROXY_GRANTING_TICKET_RESOLVER", resourceResolverName = "CREATE_PROXY_GRANTING_TICKET_RESOURCE_RESOLVER") @Timed(name = "CREATE_PROXY_GRANTING_TICKET_TIMER") @Metered(name = "CREATE_PROXY_GRANTING_TICKET_METER") @Counted(name = "CREATE_PROXY_GRANTING_TICKET_COUNTER", monotonic = true) @Override public ProxyGrantingTicket createProxyGrantingTicket(final String serviceTicketId, final AuthenticationContext context) throws AuthenticationException, AbstractTicketException { final ServiceTicket serviceTicket = this.ticketRegistry.getTicket(serviceTicketId, ServiceTicket.class); if (serviceTicket == null || serviceTicket.isExpired()) { logger.debug("ServiceTicket [{}] has expired or cannot be found in the ticket registry", serviceTicketId); throw new InvalidTicketException(serviceTicketId); } final RegisteredService registeredService = this.servicesManager .findServiceBy(serviceTicket.getService()); verifyRegisteredServiceProperties(registeredService, serviceTicket.getService()); if (!registeredService.getProxyPolicy().isAllowedToProxy()) { logger.warn("ServiceManagement: Service [{}] attempted to proxy, but is not allowed.", serviceTicket.getService().getId()); throw new UnauthorizedProxyingException(); } final Authentication authentication = context.getAuthentication(); final ProxyGrantingTicketFactory factory = this.ticketFactory.get(ProxyGrantingTicket.class); final ProxyGrantingTicket proxyGrantingTicket = factory.create(serviceTicket, authentication); logger.debug("Generated proxy granting ticket [{}] based off of [{}]", proxyGrantingTicket, serviceTicketId); this.ticketRegistry.addTicket(proxyGrantingTicket); doPublishEvent(new CasProxyGrantingTicketCreatedEvent(this, proxyGrantingTicket)); return proxyGrantingTicket; } @Audit( action = "SERVICE_TICKET_VALIDATE", actionResolverName = "VALIDATE_SERVICE_TICKET_RESOLVER", resourceResolverName = "VALIDATE_SERVICE_TICKET_RESOURCE_RESOLVER") @Timed(name = "VALIDATE_SERVICE_TICKET_TIMER") @Metered(name = "VALIDATE_SERVICE_TICKET_METER") @Counted(name = "VALIDATE_SERVICE_TICKET_COUNTER", monotonic = true) @Override public Assertion validateServiceTicket(final String serviceTicketId, final Service service) throws AbstractTicketException { final RegisteredService registeredService = this.servicesManager.findServiceBy(service); verifyRegisteredServiceProperties(registeredService, service); final ServiceTicket serviceTicket = this.ticketRegistry.getTicket(serviceTicketId, ServiceTicket.class); if (serviceTicket == null) { logger.info("Service ticket [{}] does not exist.", serviceTicketId); throw new InvalidTicketException(serviceTicketId); } try { synchronized (serviceTicket) { if (serviceTicket.isExpired()) { logger.info("ServiceTicket [{}] has expired.", serviceTicketId); throw new InvalidTicketException(serviceTicketId); } if (!serviceTicket.isValidFor(service)) { logger.error("Service ticket [{}] with service [{}] does not match supplied service [{}]", serviceTicketId, serviceTicket.getService().getId(), service); throw new UnrecognizableServiceForServiceTicketValidationException(serviceTicket.getService()); } } final TicketGrantingTicket root = serviceTicket.getGrantingTicket().getRoot(); final Authentication authentication = getAuthenticationSatisfiedByPolicy( root, new ServiceContext(serviceTicket.getService(), registeredService)); final Principal principal = authentication.getPrincipal(); final RegisteredServiceAttributeReleasePolicy attributePolicy = registeredService.getAttributeReleasePolicy(); logger.debug("Attribute policy [{}] is associated with service [{}]", attributePolicy, registeredService); @SuppressWarnings("unchecked") final Map attributesToRelease = attributePolicy != null ? attributePolicy.getAttributes(principal) : Collections.EMPTY_MAP; final String principalId = registeredService.getUsernameAttributeProvider().resolveUsername(principal, service); final Principal modifiedPrincipal = this.principalFactory.createPrincipal(principalId, attributesToRelease); final AuthenticationBuilder builder = DefaultAuthenticationBuilder.newInstance(authentication); builder.setPrincipal(modifiedPrincipal); final Assertion assertion = new ImmutableAssertion( builder.build(), serviceTicket.getGrantingTicket().getChainedAuthentications(), serviceTicket.getService(), serviceTicket.isFromNewLogin()); doPublishEvent(new CasServiceTicketValidatedEvent(this, serviceTicket, assertion)); return assertion; } finally { if (serviceTicket.isExpired()) { this.ticketRegistry.deleteTicket(serviceTicketId); } } } @Audit( action = "TICKET_GRANTING_TICKET", actionResolverName = "CREATE_TICKET_GRANTING_TICKET_RESOLVER", resourceResolverName = "CREATE_TICKET_GRANTING_TICKET_RESOURCE_RESOLVER") @Timed(name = "CREATE_TICKET_GRANTING_TICKET_TIMER") @Metered(name = "CREATE_TICKET_GRANTING_TICKET_METER") @Counted(name = "CREATE_TICKET_GRANTING_TICKET_COUNTER", monotonic = true) @Override public TicketGrantingTicket createTicketGrantingTicket(final AuthenticationContext context) throws AuthenticationException, AbstractTicketException { final Authentication authentication = context.getAuthentication(); final TicketGrantingTicketFactory factory = this.ticketFactory.get(TicketGrantingTicket.class); final TicketGrantingTicket ticketGrantingTicket = factory.create(authentication); this.ticketRegistry.addTicket(ticketGrantingTicket); doPublishEvent(new CasTicketGrantingTicketCreatedEvent(this, ticketGrantingTicket)); return ticketGrantingTicket; } } ================================================ FILE: src/taoshop-sso/src/main/java/org/jasig/cas/adaptors/jdbc/AbstractJdbcUsernamePasswordAuthenticationHandler.java ================================================ package org.jasig.cas.adaptors.jdbc; import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; import javax.validation.constraints.NotNull; /** * Abstract class for database authentication handlers. * * @author Scott Battaglia * @since 3.0.0.3 */ public abstract class AbstractJdbcUsernamePasswordAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler { private JdbcTemplate jdbcTemplate; private DataSource dataSource; /** * Method to set the datasource and generate a JdbcTemplate. * * @param dataSource the datasource to use. */ public void setDataSource(@NotNull final DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); this.dataSource = dataSource; } /** * Method to return the jdbcTemplate. * * @return a fully created JdbcTemplate. */ protected final JdbcTemplate getJdbcTemplate() { return this.jdbcTemplate; } protected final DataSource getDataSource() { return this.dataSource; } } ================================================ FILE: src/taoshop-sso/src/main/java/org/jasig/cas/adaptors/jdbc/QueryDatabaseAuthenticationHandler.java ================================================ package org.jasig.cas.adaptors.jdbc; import org.apache.commons.lang3.StringUtils; import org.jasig.cas.authentication.HandlerResult; import org.jasig.cas.authentication.PreventedException; import org.jasig.cas.authentication.UsernamePasswordCredential; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.stereotype.Component; import javax.security.auth.login.AccountNotFoundException; import javax.security.auth.login.FailedLoginException; import javax.sql.DataSource; import javax.validation.constraints.NotNull; import java.security.GeneralSecurityException; /** * Class that if provided a query that returns a password (parameter of query * must be username) will compare that password to a translated version of the * password provided by the user. If they match, then authentication succeeds. * Default password translator is plaintext translator. * * @author Scott Battaglia * @author Dmitriy Kopylenko * @author Marvin S. Addison * * @since 3.0.0 */ @Component("queryDatabaseAuthenticationHandler") public class QueryDatabaseAuthenticationHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler { @NotNull private String sql; @Override protected final HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential credential) throws GeneralSecurityException, PreventedException { if (StringUtils.isBlank(this.sql) || getJdbcTemplate() == null) { throw new GeneralSecurityException("Authentication handler is not configured correctly"); } final String username = credential.getUsername(); final String encryptedPassword = this.getPasswordEncoder().encode(credential.getPassword()); try { final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username); if (!dbPassword.equals(encryptedPassword)) { throw new FailedLoginException("Password does not match value on record."); } } catch (final IncorrectResultSizeDataAccessException e) { if (e.getActualSize() == 0) { throw new AccountNotFoundException(username + " not found with SQL query"); } else { throw new FailedLoginException("Multiple records found for " + username); } } catch (final DataAccessException e) { throw new PreventedException("SQL exception while executing query for " + username, e); } return createHandlerResult(credential, this.principalFactory.createPrincipal(username), null); } /** * @param sql The sql to set. */ @Autowired public void setSql(@Value("${cas.jdbc.authn.query.sql:}") final String sql) { this.sql = sql; } @Override @Autowired(required = false) public void setDataSource(@Qualifier("queryDatabaseDataSource") final DataSource dataSource) { super.setDataSource(dataSource); } } ================================================ FILE: src/taoshop-sso/src/main/java/org/jasig/cas/authentication/UsernamePasswordCredential.java ================================================ package org.jasig.cas.authentication; import org.apache.commons.lang3.builder.HashCodeBuilder; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.io.Serializable; /** * Credential for authenticating with a username and password. * * @author Scott Battaglia * @author Marvin S. Addison * @since 3.0.0 */ public class UsernamePasswordCredential implements Credential, Serializable { /** Authentication attribute name for password. **/ public static final String AUTHENTICATION_ATTRIBUTE_PASSWORD = "credential"; private static final long serialVersionUID = -700605081472810939L; @NotNull @Size(min=1, message = "required.username") private String username; @NotNull @Size(min=1, message = "required.password") private String password; /** Default constructor. */ public UsernamePasswordCredential() {} /** * Creates a new instance with the given username and password. * * @param userName Non-null user name. * @param password Non-null password. */ public UsernamePasswordCredential(final String userName, final String password) { this.username = userName; this.password = password; } public final String getPassword() { return this.password; } public final void setPassword(final String password) { this.password = password; } public final String getUsername() { return this.username; } public final void setUsername(final String userName) { this.username = userName; } @Override public String getId() { return this.username; } @Override public String toString() { return this.username; } @Override public boolean equals(final Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } final UsernamePasswordCredential that = (UsernamePasswordCredential) o; if (password != null ? !password.equals(that.password) : that.password != null) { return false; } if (username != null ? !username.equals(that.username) : that.username != null) { return false; } return true; } @Override public int hashCode() { return new HashCodeBuilder() .append(username) .append(password) .toHashCode(); } } ================================================ FILE: src/taoshop-sso/src/main/java/org/jasig/cas/support/rest/TicketsResource.java ================================================ package org.jasig.cas.support.rest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.jasig.cas.CasProtocolConstants; import org.jasig.cas.CentralAuthenticationService; import org.jasig.cas.authentication.AuthenticationContext; import org.jasig.cas.authentication.AuthenticationContextBuilder; import org.jasig.cas.authentication.AuthenticationSystemSupport; import org.jasig.cas.authentication.AuthenticationException; import org.jasig.cas.authentication.AuthenticationTransaction; import org.jasig.cas.authentication.Credential; import org.jasig.cas.authentication.DefaultAuthenticationContextBuilder; import org.jasig.cas.authentication.DefaultAuthenticationSystemSupport; import org.jasig.cas.authentication.UsernamePasswordCredential; import org.jasig.cas.authentication.principal.Service; import org.jasig.cas.authentication.principal.ServiceFactory; import org.jasig.cas.ticket.InvalidTicketException; import org.jasig.cas.ticket.ServiceTicket; import org.jasig.cas.ticket.TicketGrantingTicket; import org.jasig.cas.ticket.registry.DefaultTicketRegistrySupport; import org.jasig.cas.ticket.registry.TicketRegistrySupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.MultiValueMap; 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.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.validation.constraints.NotNull; import java.net.URI; import java.util.Formatter; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * {@link RestController} implementation of CAS' REST API. * * This class implements main CAS RESTful resource for vending/deleting TGTs and vending STs: * *
          *
        • {@code POST /v1/tickets}
        • *
        • {@code POST /v1/tickets/{TGT-id}}
        • *
        • {@code DELETE /v1/tickets/{TGT-id}}
        • *
        * * @author Dmitriy Kopylenko * @since 4.1.0 */ @RestController("ticketResourceRestController") public class TicketsResource { private static final Logger LOGGER = LoggerFactory.getLogger(TicketsResource.class); @Autowired @Qualifier("centralAuthenticationService") private CentralAuthenticationService centralAuthenticationService; @NotNull @Autowired(required=false) @Qualifier("defaultAuthenticationSystemSupport") private AuthenticationSystemSupport authenticationSystemSupport = new DefaultAuthenticationSystemSupport(); @Autowired(required = false) private final CredentialFactory credentialFactory = new DefaultCredentialFactory(); @Autowired @Qualifier("webApplicationServiceFactory") private ServiceFactory webApplicationServiceFactory; @Autowired @Qualifier("defaultTicketRegistrySupport") private TicketRegistrySupport ticketRegistrySupport = new DefaultTicketRegistrySupport(); private final ObjectMapper jacksonObjectMapper = new ObjectMapper(); /** * Create new ticket granting ticket. * * @param requestBody username and password application/x-www-form-urlencoded values * @param request raw HttpServletRequest used to call this method * @return ResponseEntity representing RESTful response * @throws JsonProcessingException in case of JSON parsing failure */ @RequestMapping(value = "/v1/tickets", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public final ResponseEntity createTicketGrantingTicket(@RequestBody final MultiValueMap requestBody, final HttpServletRequest request) throws JsonProcessingException { try (Formatter fmt = new Formatter()) { final Credential credential = this.credentialFactory.fromRequestBody(requestBody); final AuthenticationContextBuilder builder = new DefaultAuthenticationContextBuilder( this.authenticationSystemSupport.getPrincipalElectionStrategy()); final AuthenticationTransaction transaction = AuthenticationTransaction.wrap(credential); this.authenticationSystemSupport.getAuthenticationTransactionManager().handle(transaction, builder); final AuthenticationContext authenticationContext = builder.build(); final TicketGrantingTicket tgtId = this.centralAuthenticationService.createTicketGrantingTicket(authenticationContext); final URI ticketReference = new URI(request.getRequestURL().toString() + '/' + tgtId.getId()); final HttpHeaders headers = new HttpHeaders(); headers.setLocation(ticketReference); headers.setContentType(MediaType.TEXT_HTML); fmt.format(""); fmt.format("%s %s", HttpStatus.CREATED, HttpStatus.CREATED.getReasonPhrase()) .format("

        TGT Created

        Service:") .format("
        "); return new ResponseEntity<>(fmt.toString(), headers, HttpStatus.CREATED); } catch(final AuthenticationException e) { final List authnExceptions = new LinkedList<>(); for (final Map.Entry> handlerErrorEntry: e.getHandlerErrors().entrySet()) { authnExceptions.add(handlerErrorEntry.getValue().getSimpleName()); } final Map> errorsMap = new HashMap<>(); errorsMap.put("authentication_exceptions", authnExceptions); LOGGER.error(e.getMessage(), e); LOGGER.error(String.format("Caused by: %s", authnExceptions)); return new ResponseEntity<>(this.jacksonObjectMapper .writer() .withDefaultPrettyPrinter() .writeValueAsString(errorsMap), HttpStatus.UNAUTHORIZED); } catch (final BadRequestException e) { LOGGER.error(e.getMessage(), e); return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST); } catch (final Throwable e) { LOGGER.error(e.getMessage(), e); return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } /** * Create new service ticket. * * @param requestBody service application/x-www-form-urlencoded value * @param tgtId ticket granting ticket id URI path param * @return {@link ResponseEntity} representing RESTful response */ @RequestMapping(value = "/v1/tickets/{tgtId:.+}", method = RequestMethod.POST, consumes = MediaType .APPLICATION_FORM_URLENCODED_VALUE) public final ResponseEntity createServiceTicket(@RequestBody final MultiValueMap requestBody, @PathVariable("tgtId") final String tgtId) { try { final String serviceId = requestBody.getFirst(CasProtocolConstants.PARAMETER_SERVICE); final AuthenticationContextBuilder builder = new DefaultAuthenticationContextBuilder( this.authenticationSystemSupport.getPrincipalElectionStrategy()); final Service service = this.webApplicationServiceFactory.createService(serviceId); final AuthenticationContext authenticationContext = builder.collect(this.ticketRegistrySupport.getAuthenticationFrom(tgtId)).build(service); final ServiceTicket serviceTicketId = this.centralAuthenticationService.grantServiceTicket(tgtId, service, authenticationContext); return new ResponseEntity<>(serviceTicketId.getId(), HttpStatus.OK); } catch (final InvalidTicketException e) { return new ResponseEntity<>("TicketGrantingTicket could not be found", HttpStatus.NOT_FOUND); } catch (final Exception e) { LOGGER.error(e.getMessage(), e); return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } /** * Destroy ticket granting ticket. * * @param tgtId ticket granting ticket id URI path param * @return {@link ResponseEntity} representing RESTful response. Signals * {@link HttpStatus#OK} when successful. */ @RequestMapping(value = "/v1/tickets/{tgtId:.+}", method = RequestMethod.DELETE) public final ResponseEntity deleteTicketGrantingTicket(@PathVariable("tgtId") final String tgtId) { this.centralAuthenticationService.destroyTicketGrantingTicket(tgtId); return new ResponseEntity<>(tgtId, HttpStatus.OK); } public void setAuthenticationSystemSupport(final AuthenticationSystemSupport authenticationSystemSupport) { this.authenticationSystemSupport = authenticationSystemSupport; } public void setWebApplicationServiceFactory(final ServiceFactory webApplicationServiceFactory) { this.webApplicationServiceFactory = webApplicationServiceFactory; } public void setTicketRegistrySupport(final TicketRegistrySupport ticketRegistrySupport) { this.ticketRegistrySupport = ticketRegistrySupport; } public void setCentralAuthenticationService(final CentralAuthenticationService centralAuthenticationService) { this.centralAuthenticationService = centralAuthenticationService; } public CentralAuthenticationService getCentralAuthenticationService() { return centralAuthenticationService; } public AuthenticationSystemSupport getAuthenticationSystemSupport() { return authenticationSystemSupport; } public CredentialFactory getCredentialFactory() { return credentialFactory; } public ServiceFactory getWebApplicationServiceFactory() { return webApplicationServiceFactory; } public TicketRegistrySupport getTicketRegistrySupport() { return ticketRegistrySupport; } /** * Default implementation of CredentialFactory. */ private static class DefaultCredentialFactory implements CredentialFactory { @Override public Credential fromRequestBody(@NotNull final MultiValueMap requestBody) { final String username = requestBody.getFirst("username"); final String password = requestBody.getFirst("password"); if(username == null || password == null) { throw new BadRequestException("Invalid payload. 'username' and 'password' form fields are required."); } return new UsernamePasswordCredential(requestBody.getFirst("username"), requestBody.getFirst("password")); } } /** * Exception to indicate bad payload. */ private static class BadRequestException extends IllegalArgumentException { private static final long serialVersionUID = 6852720596988243487L; /** * Ctor. * @param msg error message */ BadRequestException(final String msg) { super(msg); } } } ================================================ FILE: src/taoshop-sso/src/main/java/org/jasig/cas/web/flow/AuthenticationExceptionHandler.java ================================================ package org.jasig.cas.web.flow; import org.jasig.cas.authentication.AuthenticationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.binding.message.MessageBuilder; import org.springframework.binding.message.MessageContext; import org.springframework.stereotype.Component; import javax.validation.constraints.NotNull; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Performs two important error handling functions on an {@link AuthenticationException} raised from the authentication * layer: * *
          *
        1. Maps handler errors onto message bundle strings for display to user.
        2. *
        3. Determines the next webflow state by comparing handler errors against {@link #errors} * in list order. The first entry that matches determines the outcome state, which * is the simple class name of the exception.
        4. *
        * * @author Marvin S. Addison * @since 4.0.0 */ @Component("authenticationExceptionHandler") public class AuthenticationExceptionHandler { /** State name when no matching exception is found. */ public static final String UNKNOWN = "UNKNOWN"; /** Default message bundle prefix. */ private static final String DEFAULT_MESSAGE_BUNDLE_PREFIX = "authenticationFailure."; /** Default list of errors this class knows how to handle. */ private static final List> DEFAULT_ERROR_LIST = new ArrayList<>(); private final transient Logger logger = LoggerFactory.getLogger(this.getClass()); /** * Order is important here; We want the account policy exceptions to be handled * first before moving onto more generic errors. In the event that multiple handlers * are defined, where one failed due to account policy restriction and one fails * due to a bad password, we want the error associated with the account policy * to be processed first, rather than presenting a more generic error associated * with latter handlers. */ static { DEFAULT_ERROR_LIST.add(javax.security.auth.login.AccountLockedException.class); DEFAULT_ERROR_LIST.add(javax.security.auth.login.CredentialExpiredException.class); DEFAULT_ERROR_LIST.add(org.jasig.cas.authentication.AccountDisabledException.class); DEFAULT_ERROR_LIST.add(org.jasig.cas.authentication.InvalidLoginLocationException.class); DEFAULT_ERROR_LIST.add(org.jasig.cas.authentication.AccountPasswordMustChangeException.class); DEFAULT_ERROR_LIST.add(org.jasig.cas.authentication.InvalidLoginTimeException.class); DEFAULT_ERROR_LIST.add(javax.security.auth.login.AccountNotFoundException.class); DEFAULT_ERROR_LIST.add(javax.security.auth.login.FailedLoginException.class); } /** Ordered list of error classes that this class knows how to handle. */ @NotNull private List> errors = DEFAULT_ERROR_LIST; /** String appended to exception class name to create a message bundle key for that particular error. */ private String messageBundlePrefix = DEFAULT_MESSAGE_BUNDLE_PREFIX; /** * Sets the list of errors that this class knows how to handle. * * @param errors List of errors in order of descending precedence. */ public void setErrors(final List> errors) { this.errors = errors; } public final List> getErrors() { return Collections.unmodifiableList(this.errors); } /** * Sets the message bundle prefix appended to exception class names to create a message bundle key for that * particular error. * * @param prefix Prefix appended to exception names. */ public void setMessageBundlePrefix(final String prefix) { this.messageBundlePrefix = prefix; } /** * Maps an authentication exception onto a state name equal to the simple class name of the. * * @param e Authentication error to handle. * @param messageContext the spring message context * @return Name of next flow state to transition to or {@value #UNKNOWN} * {@link AuthenticationException#getHandlerErrors()} with highest precedence. * Also sets an ERROR severity message in the message context of the form * {@code [messageBundlePrefix][exceptionClassSimpleName]} for each handler error that is * configured. If not match is found, {@value #UNKNOWN} is returned. */ public String handle(final AuthenticationException e, final MessageContext messageContext) { if (e != null) { final MessageBuilder builder = new MessageBuilder(); for (final Class kind : this.errors) { for (final Class handlerError : e.getHandlerErrors().values()) { if (handlerError != null && handlerError.equals(kind)) { final String handlerErrorName = handlerError.getSimpleName(); final String messageCode = this.messageBundlePrefix + handlerErrorName; messageContext.addMessage(builder.error().code(messageCode).build()); return handlerErrorName; } } } } final String messageCode = this.messageBundlePrefix + UNKNOWN; logger.trace("Unable to translate handler errors of the authentication exception {}. Returning {} by default...", e, messageCode); messageContext.addMessage(new MessageBuilder().error().code(messageCode).build()); return UNKNOWN; } } ================================================ FILE: src/taoshop-sso/src/main/java/org/jasig/cas/web/flow/AuthenticationViaFormAction.java ================================================ package org.jasig.cas.web.flow; import org.apache.commons.lang3.StringUtils; import org.jasig.cas.CasProtocolConstants; import org.jasig.cas.CentralAuthenticationService; import org.jasig.cas.authentication.AuthenticationContext; import org.jasig.cas.authentication.AuthenticationContextBuilder; import org.jasig.cas.authentication.AuthenticationException; import org.jasig.cas.authentication.AuthenticationSystemSupport; import org.jasig.cas.authentication.AuthenticationTransaction; import org.jasig.cas.authentication.Credential; import org.jasig.cas.authentication.DefaultAuthenticationContextBuilder; import org.jasig.cas.authentication.DefaultAuthenticationSystemSupport; import org.jasig.cas.authentication.HandlerResult; import org.jasig.cas.authentication.MessageDescriptor; import org.jasig.cas.authentication.principal.Service; import org.jasig.cas.ticket.AbstractTicketException; import org.jasig.cas.ticket.ServiceTicket; import org.jasig.cas.ticket.TicketCreationException; import org.jasig.cas.ticket.TicketGrantingTicket; import org.jasig.cas.web.support.WebUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.binding.message.MessageBuilder; import org.springframework.binding.message.MessageContext; import org.springframework.stereotype.Component; import org.springframework.web.util.CookieGenerator; import org.springframework.webflow.core.collection.LocalAttributeMap; import org.springframework.webflow.execution.Event; import org.springframework.webflow.execution.RequestContext; import javax.validation.constraints.NotNull; import java.util.Map; /** * Action to authenticate credential and retrieve a TicketGrantingTicket for * those credential. If there is a request for renew, then it also generates * the Service Ticket required. * * @author Scott Battaglia * @since 3.0.0 */ @Component("authenticationViaFormAction") public class AuthenticationViaFormAction { /** Authentication succeeded with warnings from authn subsystem that should be displayed to user. */ public static final String SUCCESS_WITH_WARNINGS = "successWithWarnings"; /** Authentication failure result. */ public static final String AUTHENTICATION_FAILURE = "authenticationFailure"; /** Flow scope attribute that determines if authn is happening at a public workstation. */ public static final String PUBLIC_WORKSTATION_ATTRIBUTE = "publicWorkstation"; /** Logger instance. **/ protected final transient Logger logger = LoggerFactory.getLogger(getClass()); /** Core we delegate to for handling all ticket related tasks. */ @NotNull @Autowired @Qualifier("centralAuthenticationService") private CentralAuthenticationService centralAuthenticationService; @NotNull @Autowired @Qualifier("warnCookieGenerator") private CookieGenerator warnCookieGenerator; @NotNull @Autowired(required=false) @Qualifier("defaultAuthenticationSystemSupport") private AuthenticationSystemSupport authenticationSystemSupport = new DefaultAuthenticationSystemSupport(); /** * Handle the submission of credentials from the post. * * @param context the context * @param credential the credential * @param messageContext the message context * @return the event * @since 4.1.0 */ public final Event submit(final RequestContext context, final Credential credential, final MessageContext messageContext) { if (isRequestAskingForServiceTicket(context)) { return grantServiceTicket(context, credential); } return createTicketGrantingTicket(context, credential, messageContext); } /** * Is request asking for service ticket? * * @param context the context * @return true, if both service and tgt are found, and the request is not asking to renew. * @since 4.1.0 */ protected boolean isRequestAskingForServiceTicket(final RequestContext context) { final String ticketGrantingTicketId = WebUtils.getTicketGrantingTicketId(context); final Service service = WebUtils.getService(context); return (StringUtils.isNotBlank(context.getRequestParameters().get(CasProtocolConstants.PARAMETER_RENEW)) && ticketGrantingTicketId != null && service != null); } /** * Grant service ticket for the given credential based on the service and tgt * that are found in the request context. * * @param context the context * @param credential the credential * @return the resulting event. Warning, authentication failure or error. * @since 4.1.0 */ protected Event grantServiceTicket(final RequestContext context, final Credential credential) { final String ticketGrantingTicketId = WebUtils.getTicketGrantingTicketId(context); try { final Service service = WebUtils.getService(context); final AuthenticationContextBuilder builder = new DefaultAuthenticationContextBuilder( this.authenticationSystemSupport.getPrincipalElectionStrategy()); final AuthenticationTransaction transaction = AuthenticationTransaction.wrap(credential); this.authenticationSystemSupport.getAuthenticationTransactionManager().handle(transaction, builder); final AuthenticationContext authenticationContext = builder.build(service); final ServiceTicket serviceTicketId = this.centralAuthenticationService.grantServiceTicket( ticketGrantingTicketId, service, authenticationContext); WebUtils.putServiceTicketInRequestScope(context, serviceTicketId); WebUtils.putWarnCookieIfRequestParameterPresent(this.warnCookieGenerator, context); return newEvent(AbstractCasWebflowConfigurer.TRANSITION_ID_WARN); } catch (final AuthenticationException e) { return newEvent(AUTHENTICATION_FAILURE, e); } catch (final TicketCreationException e) { logger.warn("Invalid attempt to access service using renew=true with different credential. Ending SSO session."); this.centralAuthenticationService.destroyTicketGrantingTicket(ticketGrantingTicketId); } catch (final AbstractTicketException e) { return newEvent(AbstractCasWebflowConfigurer.TRANSITION_ID_ERROR, e); } return newEvent(AbstractCasWebflowConfigurer.TRANSITION_ID_ERROR); } /** * Create ticket granting ticket for the given credentials. * Adds all warnings into the message context. * * @param context the context * @param credential the credential * @param messageContext the message context * @return the resulting event. * @since 4.1.0 */ protected Event createTicketGrantingTicket(final RequestContext context, final Credential credential, final MessageContext messageContext) { try { final Service service = WebUtils.getService(context); final AuthenticationContextBuilder builder = new DefaultAuthenticationContextBuilder( this.authenticationSystemSupport.getPrincipalElectionStrategy()); final AuthenticationTransaction transaction = AuthenticationTransaction.wrap(credential); this.authenticationSystemSupport.getAuthenticationTransactionManager().handle(transaction, builder); final AuthenticationContext authenticationContext = builder.build(service); final TicketGrantingTicket tgt = this.centralAuthenticationService.createTicketGrantingTicket(authenticationContext); WebUtils.putTicketGrantingTicketInScopes(context, tgt); WebUtils.putWarnCookieIfRequestParameterPresent(this.warnCookieGenerator, context); putPublicWorkstationToFlowIfRequestParameterPresent(context); if (addWarningMessagesToMessageContextIfNeeded(tgt, messageContext)) { return newEvent(SUCCESS_WITH_WARNINGS); } return newEvent(AbstractCasWebflowConfigurer.TRANSITION_ID_SUCCESS); } catch (final AuthenticationException e) { logger.debug(e.getMessage(), e); return newEvent(AUTHENTICATION_FAILURE, e); } catch (final Exception e) { logger.debug(e.getMessage(), e); return newEvent(AbstractCasWebflowConfigurer.TRANSITION_ID_ERROR, e); } } /** * Add warning messages to message context if needed. * * @param tgtId the tgt id * @param messageContext the message context * @return true if warnings were found and added, false otherwise. * @since 4.1.0 */ protected boolean addWarningMessagesToMessageContextIfNeeded(final TicketGrantingTicket tgtId, final MessageContext messageContext) { boolean foundAndAddedWarnings = false; for (final Map.Entry entry : tgtId.getAuthentication().getSuccesses().entrySet()) { for (final MessageDescriptor message : entry.getValue().getWarnings()) { addWarningToContext(messageContext, message); foundAndAddedWarnings = true; } } return foundAndAddedWarnings; } /** * Put public workstation into the flow if request parameter present. * * @param context the context */ private static void putPublicWorkstationToFlowIfRequestParameterPresent(final RequestContext context) { if (StringUtils.isNotBlank(context.getExternalContext() .getRequestParameterMap().get(PUBLIC_WORKSTATION_ATTRIBUTE))) { context.getFlowScope().put(PUBLIC_WORKSTATION_ATTRIBUTE, Boolean.TRUE); } } /** * New event based on the given id. * * @param id the id * @return the event */ private Event newEvent(final String id) { return new Event(this, id); } /** * New event based on the id, which contains an error attribute referring to the exception occurred. * * @param id the id * @param error the error * @return the event */ private Event newEvent(final String id, final Exception error) { return new Event(this, id, new LocalAttributeMap("error", error)); } /** * Adds a warning message to the message context. * * @param context Message context. * @param warning Warning message. */ private static void addWarningToContext(final MessageContext context, final MessageDescriptor warning) { final MessageBuilder builder = new MessageBuilder() .warning() .code(warning.getCode()) .defaultText(warning.getDefaultMessage()) .args(warning.getParams()); context.addMessage(builder.build()); } public void setCentralAuthenticationService(final CentralAuthenticationService centralAuthenticationService) { this.centralAuthenticationService = centralAuthenticationService; } public void setWarnCookieGenerator(final CookieGenerator warnCookieGenerator) { this.warnCookieGenerator = warnCookieGenerator; } public void setAuthenticationSystemSupport(final AuthenticationSystemSupport authenticationSystemSupport) { this.authenticationSystemSupport = authenticationSystemSupport; } } ================================================ FILE: src/taoshop-sso/src/main/resources/application.properties ================================================ #CASַ cas.server.host.url=http://localhost:8082/ #CAS¼ַ cas.server.host.login_url=${cas.server.host.url}/login #CASdzַ cas.server.host.logout_url=${cas.server.host.url}/logout?service=${app.server.host.url} #Ӧ÷ʵַ app.server.host.url=http://localhost:8080 #Ӧõ¼ַ app.login.url=/login #Ӧõdzַ app.logout.url=/logout ================================================ FILE: src/taoshop-sso/src/main/resources/application.yml ================================================ server: port: 8082 spring: datasource: # 主数据源 shop: url: jdbc:mysql://127.0.0.1:3306/taoshop?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 连接池设置 druid: initial-size: 5 min-idle: 5 max-active: 20 # 配置获取连接等待超时的时间 max-wait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 time-between-eviction-runs-millis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 min-evictable-idle-time-millis: 300000 # Oracle请使用select 1 from dual validation-query: SELECT 'x' test-while-idle: true test-on-borrow: false test-on-return: false # 打开PSCache,并且指定每个连接上PSCache的大小 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多个DruidDataSource的监控数据 use-global-data-source-stat: true # jpa: # database: mysql # hibernate: # show_sql: true # format_sql: true # ddl-auto: none # naming: # physical-strategy: org.hibernate.boot.entity.naming.PhysicalNamingStrategyStandardImpl # mvc: # view: # prefix: /WEB-INF/jsp/ # suffix: .jsp #添加Thymeleaf配置 thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html mode: HTML5 encoding: UTF-8 content-type: text/html #Jedis配置 # jedis : # pool : # host : 127.0.0.1 # port : 6379 # password : redispassword # timeout : 0 # config : # maxTotal : 100 # maxIdle : 10 # maxWaitMillis : 100000 ================================================ FILE: src/taoshop-sso/src/main/resources/services/Apereo-10000002.json ================================================ { "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "^https://www.apereo.org", "name" : "Apereo", "theme" : "apereo", "id" : 10000002, "description" : "Apereo foundation sample service", "proxyPolicy" : { "@class" : "org.jasig.cas.services.RefuseRegisteredServiceProxyPolicy" }, "evaluationOrder" : 1, "usernameAttributeProvider" : { "@class" : "org.jasig.cas.services.DefaultRegisteredServiceUsernameProvider" }, "logoutType" : "BACK_CHANNEL", "attributeReleasePolicy" : { "@class" : "org.jasig.cas.services.ReturnAllowedAttributeReleasePolicy", "principalAttributesRepository" : { "@class" : "org.jasig.cas.authentication.principal.DefaultPrincipalAttributesRepository" }, "authorizedToReleaseCredentialPassword" : false, "authorizedToReleaseProxyGrantingTicket" : false }, "accessStrategy" : { "@class" : "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", "enabled" : true, "ssoEnabled" : true } } ================================================ FILE: src/taoshop-sso/src/main/resources/services/HTTPSandIMAPS-10000001.json ================================================ { "@class" : "org.jasig.cas.services.RegexRegisteredService", "serviceId" : "^(https|imaps|http)://.*", "name" : "HTTPS and IMAPS", "id" : 10000001, "description" : "This service definition authorized all application urls that support HTTPS and IMAPS protocols.", "proxyPolicy" : { "@class" : "org.jasig.cas.services.RefuseRegisteredServiceProxyPolicy" }, "evaluationOrder" : 10000, "usernameAttributeProvider" : { "@class" : "org.jasig.cas.services.DefaultRegisteredServiceUsernameProvider" }, "logoutType" : "BACK_CHANNEL", "attributeReleasePolicy" : { "@class" : "org.jasig.cas.services.ReturnAllowedAttributeReleasePolicy", "principalAttributesRepository" : { "@class" : "org.jasig.cas.authentication.principal.DefaultPrincipalAttributesRepository" }, "authorizedToReleaseCredentialPassword" : false, "authorizedToReleaseProxyGrantingTicket" : false }, "accessStrategy" : { "@class" : "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", "enabled" : true, "ssoEnabled" : true } } ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/cas_dev.properties ================================================ # # Licensed to Apereo under one or more contributor license # agreements. See the NOTICE file distributed with this work # for additional information regarding copyright ownership. # Apereo 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 the following location: # # 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. # server.name=http://localhost:8080 server.prefix=${server.name}/cas #是否校验验证码 need_authcode=0 # security configuration based on IP address to access the /status and /statistics pages cas.securityContext.adminpages.ip=127\.0\.0\.1 ##### mtds db config mtds.jdbc.jdbcUrl=jdbc:mysql://10.10.2.101:3306/mtds_platform mtds.jdbc.user=root mtds.jdbc.password=e0B+x/R0xkhr4YUcbvELRLyiQUOycZZyd1Fqw946h3tLFJq0wmpOnGz7Td4sz8q1zaWD6K+9gdGfIBFVwgoR5Q== mtds.jdbc.publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKgOsU2fDix9GJQaVZ1kBQQqjlh4LBAGTg3m5H3sjQWvXROwe+6ONYA/UWta+mw/RIkfWFIf8QynAVHACvMas6MCAwEAAQ== mtds.jdbc.initialSize=10 mtds.jdbc.minIdle=10 mtds.jdbc.maxActive=50 ##### oa db config oa.jdbc.jdbcUrl=jdbc:sqlserver://10.10.48.200:1433; DatabaseName=ocmap_hr oa.jdbc.user=sa oa.jdbc.password=do6xDeYncPx6wyr0I+ZAG1guTvZc03vpFXqrxXmXnr14e/wnqH47Q2tMmSdY23/vfEMd2ymb7lWPfyXmdo1bTQ== oa.jdbc.publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKZijIzzXp1dyksL1ZSejBmuVz1Y0vgiQVbcQ/13p4pwHRo8gU3pd6YaWutOlBTEWvHBbnGxIdnrhxnQZGwU1O0CAwEAAQ== oa.jdbc.initialSize=10 oa.jdbc.minIdle=10 oa.jdbc.maxActive=50 ## # Unique CAS node name # host.name is used to generate unique Service Ticket IDs and SAMLArtifacts. This is usually set to the specific # hostname of the machine running the CAS node, but it could be any label so long as it is unique in the cluster. host.name=ssodev.oppein.com ##redis registry config redis.hostName=127.0.0.1 redis.database=0 redis.password=2ImXkZHYsZkORpSbjAqcv redis.port=6379 ## # JPA Ticket Registry Database Configuration # # ticketreg.database.ddl.auto=create-drop # ticketreg.database.dialect=org.hibernate.dialect.OracleDialect|MySQLInnoDBDialect|HSQLDialect # ticketreg.database.batchSize=10 # ticketreg.database.driverClass=org.hsqldb.jdbcDriver # ticketreg.database.url=jdbc:hsqldb:mem:cas-ticket-registry # ticketreg.database.user=sa # ticketreg.database.password= # ticketreg.database.pool.minSize=6 # ticketreg.database.pool.maxSize=18 # ticketreg.database.pool.maxWait=10000 # ticketreg.database.pool.maxIdleTime=120 # ticketreg.database.pool.acquireIncrement=6 # ticketreg.database.pool.idleConnectionTestPeriod=30 # ticketreg.database.pool.connectionHealthQuery=select 1 # ticketreg.database.pool.acquireRetryAttempts=5 # ticketreg.database.pool.acquireRetryDelay=2000 # ticketreg.database.pool.connectionHealthQuery=select 1 ## # JPA Service Registry Database Configuration # # svcreg.database.ddl.auto=create-drop # svcreg.database.dialect=org.hibernate.dialect.OracleDialect|MySQLInnoDBDialect|HSQLDialect # svcreg.database.hibernate.batchSize=10 # svcreg.database.driverClass=org.hsqldb.jdbcDriver # svcreg.database.url=jdbc:hsqldb:mem:cas-ticket-registry # svcreg.database.user=sa # svcreg.database.password= # svcreg.database.pool.minSize=6 # svcreg.database.pool.maxSize=18 # svcreg.database.pool.maxWait=10000 # svcreg.database.pool.maxIdleTime=120 # svcreg.database.pool.acquireIncrement=6 # svcreg.database.pool.idleConnectionTestPeriod=30 # svcreg.database.pool.connectionHealthQuery=select 1 # svcreg.database.pool.acquireRetryAttempts=5 # svcreg.database.pool.acquireRetryDelay=2000 # svcreg.database.pool.connectionHealthQuery=select 1 ## # CAS SSO Cookie Generation & Security # See https://github.com/mitreid-connect/json-web-key-generator # # Do note that the following settings MUST be generated per deployment. # # The encryption secret key. By default, must be a octet string of size 256. tgc.encryption.key=DSi19FXiMznOlZvZRHsThtl-3FZzNKjQzbHt8QASI7Q # The signing secret key. By default, must be a octet string of size 512. tgc.signing.key=fOs-_ZjGNfcLsg8LWqkuHM6KccWlTsozxZZrwptqFMQAIvzqCD5lL9s4hvqDp5f-w1bpQM8IUAKEotw7jzhlvw # Decides whether SSO cookie should be created only under secure connections. # 标记是否只在https环境下生成tgc tgc.secure=false # The expiration value of the SSO cookie tgc.maxAge=-1 # The name of the SSO cookie tgc.name=TGC # The path to which the SSO cookie will be scoped tgc.path=/cas # The expiration value of the SSO cookie for long-term authentications tgc.remember.me.maxAge=1209600 # Decides whether SSO Warning cookie should be created only under secure connections. warn.cookie.secure=true # The expiration value of the SSO Warning cookie warn.cookie.maxAge=-1 # The name of the SSO Warning cookie warn.cookie.name=CASPRIVACY # The path to which the SSO Warning cookie will be scoped warn.cookie.path=/cas # Whether we should track the most recent session by keeping the latest service ticket tgt.onlyTrackMostRecentSession = true ## # CAS UI Theme Resolution # # cas.themeResolver.defaultThemeName=cas-theme-default # cas.themeResolver.pathprefix=/WEB-INF/view/jsp/ # cas.themeResolver.param.name=theme # Location of the Spring xml config file where views may be collected # cas.viewResolver.xmlFile=/META-INF/spring/views.xml ## # CAS Logout Behavior # WEB-INF/cas-servlet.xml # # Specify whether CAS should redirect to the specified service parameter on /logout requests # 目前配置的service的格式是必须是https cas.logout.followServiceRedirects=true ## # CAS Cached Attributes Timeouts # Controls the cached attribute expiration policy # # Notes the duration in which attributes will be kept alive # cas.attrs.timeToExpireInHours=2 ## # Single Sign-On Session # # Indicates whether an SSO session should be created for renewed authentication requests. create.sso.renewed.authn=true # # Indicates whether an SSO session can be created if no service is present. # create.sso.missing.service=true ## # CAS Authentication Policy # # cas.authn.policy.any.tryall=false # cas.authn.policy.req.tryall=false # cas.authn.policy.req.handlername=handlerName ## # CAS PersonDirectory Principal Resolution # # cas.principal.resolver.persondir.principal.attribute=cn # cas.principal.resolver.persondir.return.null=false ## # CAS Internationalization # locale.default=zh_CN locale.param.name=locale message.bundle.encoding=UTF-8 message.bundle.cacheseconds=180 message.bundle.fallback.systemlocale=false message.bundle.usecode.message=true message.bundle.basenames=WEB-INF/locale/messages ## # CAS Authentication Throttling # #cas.throttle.failure.threshold= #cas.throttle.failure.range.seconds= #cas.throttle.username.parameter= #cas.throttle.appcode= #cas.throttle.authn.failurecode= #cas.throttle.audit.query= ## # CAS Health Monitoring # # cas.monitor.st.warn.threshold=5000 # cas.monitor.tgt.warn.threshold=10000 # cas.monitor.free.mem.threshold=10 ## # CAS MongoDB Service Registry # # mongodb.host=mongodb database url # mongodb.port=mongodb database port # mongodb.userId=mongodb userid to bind # mongodb.userPassword=mongodb password to bind # cas.service.registry.mongo.db=Collection name to store service definitions # mongodb.timeout=5000 ## # Spring Webflow Web Application Session # Define the settings that are required to encrypt and persist the CAS web application session. # See the cas-servlet.xml file to understand how these properties are used. # # The encryption secret key. By default, must be a octet string of size 256. webflow.encryption.key=DsCqdpcudQPzsdHz # The signing secret key. By default, must be a octet string of size 512. webflow.signing.key=U2ImXkZHYsZkORpSbjAqcvW3_gzz9oOUg6q2SWMz3Sr4Sf6NIVoNfQ97rqdhmtSZH6elMl8YgaoZrdiRWiybGw ## # Remote User Authentication # # ip.address.range= ## # Apache Shiro Authentication # # shiro.authn.requiredRoles= # shiro.authn.requiredPermissions= # shiro.authn.config.file=classpath:shiro.ini ## # YubiKey Authentication # # yubikey.client.id= # yubikey.secret.key= ## # JDBC Authentication # # cas.jdbc.authn.query.encode.sql= # cas.jdbc.authn.query.encode.alg= # cas.jdbc.authn.query.encode.salt.static= # cas.jdbc.authn.query.encode.password= # cas.jdbc.authn.query.encode.salt= # cas.jdbc.authn.query.encode.iterations.field= # cas.jdbc.authn.query.encode.iterations= # cas.jdbc.authn.query.sql= # cas.jdbc.authn.search.password= # cas.jdbc.authn.search.user= # cas.jdbc.authn.search.table= ## # Duo security 2fa authentication provider # https://www.duosecurity.com/docs/duoweb#1.-generate-an-akey # # cas.duo.api.host= # cas.duo.integration.key= # cas.duo.secret.key= # cas.duo.application.key= ## # File Authentication # # file.authn.filename=classpath:people.txt # file.authn.separator=:: ## # General Authentication # # cas.principal.transform.upperCase=false # cas.authn.password.encoding.char=UTF-8 # cas.authn.password.encoding.alg=SHA-256 # cas.principal.transform.prefix= # cas.principal.transform.suffix= ## # X509 Authentication # # cas.x509.authn.crl.checkAll=false # cas.x509.authn.crl.throw.failure=true # cas.x509.authn.crl.refresh.interval= # cas.x509.authn.revocation.policy.threshold= # cas.x509.authn.trusted.issuer.dnpattern= # cas.x509.authn.max.path.length= # cas.x509.authn.max.path.length.unspecified= # cas.x509.authn.check.key.usage= # cas.x509.authn.require.key.usage= # cas.x509.authn.subject.dnpattern= # cas.x509.authn.principal.descriptor= # cas.x509.authn.principal.serial.no.prefix= # cas.x509.authn.principal.value.delim= ## # Accepted Users Authentication # #accept.authn.users=casuser::Mellon ## # Rejected Users Authentication # # reject.authn.users= ## # JAAS Authentication # # cas.authn.jaas.realm=CAS # cas.authn.jaas.kerb.realm= # cas.authn.jaas.kerb.kdc= ## # Single Sign-On Session TGT Timeouts # # Inactivity Timeout Policy tgt.timeout.maxTimeToLiveInSeconds=28800 # Hard Timeout Policy # tgt.timeout.hard.maxTimeToLiveInSeconds # # Throttled Timeout Policy # tgt.throttled.maxTimeToLiveInSeconds=28800 # tgt.throttled.timeInBetweenUsesInSeconds=5 # Default Expiration Policy tgt.maxTimeToLiveInSeconds=28800 tgt.timeToKillInSeconds=7200 ## # Service Ticket Timeout # st.timeToKillInSeconds=50 # st.numberOfUses=1 ## # Http Client Settings # # The http client read timeout in milliseconds # http.client.read.timeout=50000 # The http client connection timeout in milliseconds # http.client.connection.timeout=50000 # # The http client truststore file, in addition to the default's http.client.truststore.file=_.oppein.com.jks # # The http client truststore's password http.client.truststore.psw=OP20170103op2017 ## # Single Logout Out Callbacks # # To turn off all back channel SLO requests set this to true # slo.callbacks.disabled=false # # To send callbacks to endpoints synchronously, set this to false # slo.callbacks.asynchronous=true ## # CAS Protocol Security Filter # # Are multi-valued parameters accepted? # cas.http.allow.multivalue.params=false # Define the list of request parameters to examine for sanity # cas.http.check.params=ticket,service,renew,gateway,warn,target,SAMLart,pgtUrl,pgt,pgtId,pgtIou,targetService # Define the list of request parameters only allowed via POST # cas.http.allow.post.params=username,password ## # JSON Service Registry # # Directory location where JSON service files may be found. service.registry.config.location=WEB-INF/services ## # Service Registry Periodic Reloading Scheduler # Default sourced from WEB-INF/spring-configuration/applicationContext.xml # # Force a startup delay of 2 minutes. # service.registry.quartz.reloader.startDelay=120000 # # Reload services every 2 minutes # service.registry.quartz.reloader.repeatInterval=120000 ## # Background Scheduler # # Wait for scheduler to finish running before shutting down CAS. # scheduler.shutdown.wait=true # # Attempt to interrupt background jobs when shutting down CAS # scheduler.shutdown.interruptJobs=true ## # Audits # # Use single line format for audit blocks #cas.audit.singleline=true # Separator to use between each fields in a single audit event #cas.audit.singleline.separator=| # Application code for audits #cas.audit.appcode=oppein_sso # ## JDBC Audits # #cas.audit.max.agedays= #cas.audit.database.dialect= #cas.audit.database.batchSize= #cas.audit.database.ddl.auto= #cas.audit.database.gen.ddl= #cas.audit.database.show.sql= #cas.audit.database.driverClass= #cas.audit.database.url= #cas.audit.database.user= #cas.audit.database.password= #cas.audit.database.pool.minSize= #cas.audit.database.pool.minSize= #cas.audit.database.pool.maxSize= #cas.audit.database.pool.maxIdleTime= #cas.audit.database.pool.maxWait= #cas.audit.database.pool.acquireIncrement= #cas.audit.database.pool.acquireRetryAttempts= #cas.audit.database.pool.acquireRetryDelay= #cas.audit.database.pool.idleConnectionTestPeriod= #cas.audit.database.pool.connectionHealthQuery= ## # Metrics # Default sourced from WEB-INF/spring-configuration/metricsConfiguration.xml: # # Define how often should metric data be reported. Default is 30 seconds. # metrics.refresh.internal=30s ## # Encoding # # Set the encoding to use for requests. Default is UTF-8 # httprequest.web.encoding=UTF-8 # Default is true. Switch this to "false" to not enforce the specified encoding in any case, # applying it as default response encoding as well. # httprequest.web.encoding.force=true ## # Response Headers # # httpresponse.header.cache=false # httpresponse.header.hsts=false # httpresponse.header.xframe=false # httpresponse.header.xcontent=false # httpresponse.header.xss=false ## # SAML # # Indicates the SAML response issuer # cas.saml.response.issuer=localhost # # Indicates the skew allowance which controls the issue instant of the SAML response # cas.saml.response.skewAllowance=0 # # Indicates whether SAML ticket id generation should be saml2-compliant. # cas.saml.ticketid.saml2=false ## # Default Ticket Registry # # default.ticket.registry.initialcapacity=1000 # default.ticket.registry.loadfactor=1 # default.ticket.registry.concurrency=20 ## # Ticket Registry Cleaner # # Indicates how frequently the Ticket Registry cleaner should run. Configured in seconds. # startdelay设置为0就不会启动cleaner,因为需要使用redis默认的超时管理,所以不需要使用cas的cleaner ticket.registry.cleaner.startdelay=0 ticket.registry.cleaner.repeatinterval=0 ## # Ticket ID Generation # # lt.ticket.maxlength=20 # st.ticket.maxlength=20 # tgt.ticket.maxlength=50 # pgt.ticket.maxlength=50 ## # Google Apps public/private key # # cas.saml.googleapps.publickey.file=file:/etc/cas/public.key # cas.saml.googleapps.privatekey.file=file:/etc/cas/private.p8 # cas.saml.googleapps.key.alg=RSA ## # WS-FED # # The claim from ADFS that should be used as the user's identifier. # cas.wsfed.idp.idattribute=upn # # Federation Service identifier # cas.wsfed.idp.id=https://adfs.example.org/adfs/services/trust # # The ADFS login url. # cas.wsfed.idp.url=https://adfs.example.org/adfs/ls/ # # Identifies resource(s) that point to ADFS's signing certificates. # These are used verify the WS Federation token that is returned by ADFS. # Multiple certificates may be separated by comma. # cas.wsfed.idp.signingcerts=classpath:adfs-signing.crt # # Unique identifier that will be set in the ADFS configuration. # cas.wsfed.rp.id=urn:cas:localhost # # Slack dealing with time-drift between the ADFS Server and the CAS Server. # cas.wsfed.idp.tolerance=10000 # # Decides which bundle of attributes should be resolved during WS-FED authentication. # cas.wsfed.idp.attribute.resolver.enabled=true # cas.wsfed.idp.attribute.resolver.type=WSFED ## # LDAP User Details # # ldap.userdetails.service.user.attr= # ldap.userdetails.service.role.attr= ## # Password Policy # # Warn all users of expiration date regardless of warningDays value. # password.policy.warnAll=false # Threshold number of days to begin displaying password expiration warnings. # password.policy.warningDays=30 # URL to which the user will be redirected to change the password. # password.policy.url=https://password.example.edu/change # password.policy.warn.attribute.name=attributeName # password.policy.warn.attribute.value=attributeValue # password.policy.warn.display.matched=true ## # CAS REST API Services # # cas.rest.services.attributename= # cas.rest.services.attributevalue= ## # Ticket Registry # # Secret key to use when encrypting tickets in a distributed ticket registry. # ticket.encryption.secretkey=C@$W3bSecretKey! # Seed to use when encrypting tickets in a distributed ticket registry. # ticket.encryption.seed=S!ngl3$ign0n4W3b # Secret key to use when signing tickets in a distributed ticket registry. # By default, must be a octet string of size 512. # ticket.signing.secretkey=szxK-5_eJjs-aUj-64MpUZ-GPPzGLhYPLGl0wrYjYNVAGva2P0lLe6UGKGM7k8dWxsOVGutZWgvmY3l5oVPO3w # Secret key algorithm used # ticket.secretkey.alg=AES ## # Hazelcast Ticket Registry # # hz.config.location=file:/etc/cas/hazelcast.xml # hz.mapname=tickets # hz.cluster.logging.type=slf4j # hz.cluster.portAutoIncrement=true # hz.cluster.port=5701 # hz.cluster.multicast.enabled=false # hz.cluster.members=cas1.example.com,cas2.example.com # hz.cluster.tcpip.enabled=true # hz.cluster.multicast.enabled=false # hz.cluster.max.heapsize.percentage=85 # hz.cluster.max.heartbeat.seconds=5 # hz.cluster.eviction.percentage=10 # hz.cluster.eviction.policy=LRU # hz.cluster.instance.name=${host.name} ## # Ehcache Ticket Registry # # ehcache.config.file=classpath:ehcache-replicated.xml # ehcache.cachemanager.shared=false # ehcache.cachemanager.name=ticketRegistryCacheManager # ehcache.disk.expiry.interval.seconds=0 # ehcache.disk.persistent=false # ehcache.eternal=false # ehcache.max.elements.memory=10000 # ehcache.max.elements.disk=0 # ehcache.eviction.policy=LRU # ehcache.overflow.disk=false # ehcache.cache.st.name=org.jasig.cas.ticket.ServiceTicket # ehcache.cache.st.timeIdle=0 # ehcache.cache.st.timeAlive=300 # ehcache.cache.tgt.name=org.jasig.cas.ticket.TicketGrantingTicket # ehcache.cache.tgt.timeIdle=7201 # ehcache.cache.tgt.timeAlive=0 # ehcache.cache.loader.async=true # ehcache.cache.loader.chunksize=5000000 # ehcache.repl.async.interval=10000 # ehcache.repl.async.batch.size=100 # ehcache.repl.sync.puts=true # ehcache.repl.sync.putscopy=true # ehcache.repl.sync.updates=true # ehcache.repl.sync.updatesCopy=true # ehcache.repl.sync.removals=true ## # Ehcache Monitoring # # cache.monitor.warn.free.threshold=10 # cache.monitor.eviction.threshold=0 ## # Memcached Ticket Registry # # memcached.servers=localhost:11211 # memcached.hashAlgorithm=FNV1_64_HASH # memcached.protocol=BINARY # memcached.locatorType=ARRAY_MOD # memcached.failureMode=Redistribute ## # Memcached Monitoring # # cache.monitor.warn.free.threshold=10 # cache.monitor.eviction.threshold=0 ## # RADIUS Authentication Server # # cas.radius.client.inetaddr=localhost # cas.radius.client.port.acct= # cas.radius.client.socket.timeout=60 # cas.radius.client.port.authn= # cas.radius.client.sharedsecret=N0Sh@ar3d$ecReT # cas.radius.server.protocol=EAP_MSCHAPv2 # cas.radius.server.retries=3 # cas.radius.server.nasIdentifier=-1 # cas.radius.server.nasPort=-1 # cas.radius.server.nasPortId=-1 # cas.radius.server.nasRealPort=-1 # cas.radius.server.nasPortType=-1 # cas.radius.server.nasIpAddress= # cas.radius.server.nasIpv6Address= # cas.radius.failover.authn=false # cas.radius.failover.exception=false ## # SPNEGO Authentication # # cas.spnego.ldap.attribute=spnegoattribute # cas.spnego.ldap.filter=host={0} # cas.spnego.ldap.basedn= # cas.spnego.hostname.pattern=.+ # cas.spnego.ip.pattern= # cas.spnego.alt.remote.host.attribute # cas.spengo.use.principal.domain=false # cas.spnego.ntlm.allowed=true # cas.spnego.kerb.debug=false # cas.spnego.kerb.realm=EXAMPLE.COM # cas.spnego.kerb.kdc=172.10.1.10 # cas.spnego.login.conf.file=/path/to/login # cas.spnego.jcifs.domain= # cas.spnego.jcifs.domaincontroller= # cas.spnego.jcifs.netbios.cache.policy:600 # cas.spnego.jcifs.netbios.wins= # cas.spnego.jcifs.password= # cas.spnego.jcifs.service.password= # cas.spnego.jcifs.socket.timeout:300000 # cas.spnego.jcifs.username= # cas.spnego.kerb.conf= # cas.spnego.ntlm=false # cas.spnego.supportedBrowsers=MSIE,Trident,Firefox,AppleWebKit # cas.spnego.mixed.mode.authn=false # cas.spnego.send.401.authn.failure=false # cas.spnego.principal.resolver.transform=NONE # cas.spnego.service.principal=HTTP/cas.example.com@EXAMPLE.COM ## # NTLM Authentication # # ntlm.authn.domain.controller= # ntlm.authn.include.pattern= # ntlm.authn.load.balance=true ## # Authentication delegation using pac4j # # cas.pac4j.client.authn.typedidused=true # cas.pac4j.facebook.id= # cas.pac4j.facebook.secret= # cas.pac4j.facebook.scope= # cas.pac4j.facebook.fields= # cas.pac4j.twitter.id= # cas.pac4j.twitter.secret= # cas.pac4j.saml.keystorePassword= # cas.pac4j.saml.privateKeyPassword= # cas.pac4j.saml.keystorePath= # cas.pac4j.saml.identityProviderMetadataPath= # cas.pac4j.saml.maximumAuthenticationLifetime= # cas.pac4j.saml.serviceProviderEntityId= # cas.pac4j.saml.serviceProviderMetadataPath= # cas.pac4j.cas.loginUrl= # cas.pac4j.cas.protocol= # cas.pac4j.oidc.id= # cas.pac4j.oidc.secret= # cas.pac4j.oidc.discoveryUri= # cas.pac4j.oidc.useNonce= # cas.pac4j.oidc.preferredJwsAlgorithm= # cas.pac4j.oidc.maxClockSkew= # cas.pac4j.oidc.customParamKey1= # cas.pac4j.oidc.customParamValue1= # cas.pac4j.oidc.customParamKey2= # cas.pac4j.oidc.customParamValue2= ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/index.jsp ================================================

        Hello World!

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/spring-configuration/propertyFileConfigurer.xml ================================================ This file lets CAS know where you've stored the cas.properties file which details some of the configuration options that are specific to your environment. You can specify the location of the file here. You may wish to place the file outside of the Servlet context if you have options that are specific to a tier (i.e. test vs. production) so that the WAR file can be moved between tiers without modification. ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/authorizationFailure.jsp ================================================ <%@ page isErrorPage="true" %> <%@ page import="org.jasig.cas.web.support.WebUtils"%>

        ${pageContext.errorData.statusCode} -

        <% Object casAcessDeniedKey = request.getAttribute(WebUtils.CAS_ACCESS_DENIED_REASON); request.setAttribute("casAcessDeniedKey", casAcessDeniedKey); %>

        <%=request.getAttribute("javax.servlet.error.message")%>

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp ================================================

        Acceptable Usage Policy

        The purpose of this policy is to establish acceptable and unacceptable use of electronic devices and network resources in conjunction with the established culture of ethical and lawful behavior, openness, trust, and integrity.

        By using these resources, you agree to abide by the Acceptable Usage Policy.

        Click '' to continue. Otherwise, click ''.

        " type="submit" /> " type="button" onclick="location.href = location.href;" />
        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casConfirmView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp ================================================ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

        Authentication Succeeded with Warnings

        ${message.text}

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.jsp ================================================ <%-- 登录页面屏蔽CAS安全提示

        --%>

        ${fn:escapeXml(registeredServiceName)}

        ${fn:escapeXml(registeredServiceDescription)}

        " />
        <%-- NOTE: Certain browsers will offer the option of caching passwords for a user. There is a non-standard attribute, "autocomplete" that when set to "off" will tell certain browsers not to prompt to cache credentials. For more information, see the following web page: http://www.technofundo.com/tech/web/ie_autocomplete.html --%>
        " tabindex="6" type="submit" /> " tabindex="7" type="reset" />
        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp ================================================

        ================================================ FILE: src/taoshop-sso/src/main/webapp/WEB-INF/view/jsp/errors.jsp ================================================