[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ncustom: https://gitee.com/xuexiangjys/Resource/blob/master/doc/sponsor.md\n"
  },
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/LocalRepository\n/keystores\n/local.properties\n/.idea/caches\n/.idea/codeStyles\n/.idea/inspectionProfiles\n/.idea/libraries\n/.idea/dictionaries\n/.idea/markdown-navigator\n/.idea/*.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"xuexiang\">\n    <module2copyright>\n      <element module=\"Project Files\" copyright=\"xuexiang\" />\n    </module2copyright>\n  </settings>\n</component>"
  },
  {
    "path": ".idea/copyright/xuexiang.xml",
    "content": "<component name=\"CopyrightManager\">\n  <copyright>\n    <option name=\"notice\" value=\"Copyright (C) &amp;#36;today.year xuexiangjys(xuexiangjys@163.com)&#10;  &#10;Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&#10;you may not use this file except in compliance with the License.&#10;You may obtain a copy of the License at&#10;&#10;      http://www.apache.org/licenses/LICENSE-2.0&#10;&#10;Unless required by applicable law or agreed to in writing, software&#10;distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&#10;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#10;See the License for the specific language governing permissions and&#10;limitations under the License.&#10;\" />\n    <option name=\"myName\" value=\"xuexiang\" />\n  </copyright>\n</component>"
  },
  {
    "path": "JitPackUpload.gradle",
    "content": "apply plugin: 'com.github.dcendents.android-maven'\n\n// 指定group，com.github.<用户名>，这里我默认填写的是我的github账号，请换成你自己的。\ngroup='com.github.xuexiangjys'\n\n//---------------------------------------------\n\n\n// 指定编码\ntasks.withType(JavaCompile) {\n    options.encoding = \"UTF-8\"\n}\n\ntasks.withType(Javadoc) {\n    options.encoding = 'UTF-8'\n}\n\nif (project.hasProperty(\"android\")) { // Android libraries\n    task sourcesJar(type: Jar) {\n        classifier = 'sources'\n        from android.sourceSets.main.java.srcDirs\n    }\n\n    task javadoc(type: Javadoc) {\n        failOnError  false\n        source = android.sourceSets.main.java.srcDirs\n        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))\n    }\n} else { // Java libraries\n    task sourcesJar(type: Jar, dependsOn: classes) {\n        classifier = 'sources'\n        from sourceSets.main.allSource\n    }\n}\n\njavadoc {\n    options {\n        encoding \"UTF-8\"\n        charSet 'UTF-8'\n        author true\n        version true\n        links \"http://docs.oracle.com/javase/7/docs/api\"\n    }\n}\n\n// 制作文档(Javadoc)\ntask javadocJar(type: Jar, dependsOn: javadoc) {\n    classifier = 'javadoc'\n    from javadoc.destinationDir\n}\n\nartifacts {\n    archives javadocJar\n    archives sourcesJar\n}"
  },
  {
    "path": "LICENSE",
    "content": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"{}\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n   Copyright 2018 xuexiangjys\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "README.md",
    "content": "# XTask\n[![](https://jitpack.io/v/xuexiangjys/XTask.svg)](https://jitpack.io/#xuexiangjys/XTask)\n[![api](https://img.shields.io/badge/API-14+-brightgreen.svg)](https://android-arsenal.com/api?level=14)\n[![I](https://img.shields.io/github/issues/xuexiangjys/XTask.svg)](https://github.com/xuexiangjys/XTask/issues)\n[![Star](https://img.shields.io/github/stars/xuexiangjys/XTask.svg)](https://github.com/xuexiangjys/XTask)\n\n一个拓展性极强的Android任务执行框架。可自由定义和组合任务来实现你想要的功能，尤其适用于处理复杂的业务流程，可灵活添加前置任务或者调整执行顺序。例如：应用的启动初始化流程。\n\n在使用前，请一定要仔细阅读[使用说明文档](https://github.com/xuexiangjys/XTask/wiki),重要的事情说三遍！！！\n\n在使用前，请一定要仔细阅读[使用说明文档](https://github.com/xuexiangjys/XTask/wiki),重要的事情说三遍！！！\n\n在使用前，请一定要仔细阅读[使用说明文档](https://github.com/xuexiangjys/XTask/wiki),重要的事情说三遍！！！\n\n## 关于我\n\n| 公众号   | 掘金     |  知乎    |  CSDN   |   简书   |   思否  |   哔哩哔哩  |   今日头条\n|---------|---------|--------- |---------|---------|---------|---------|---------|\n| [我的Android开源之旅](https://t.1yb.co/Irse)  |  [点我](https://juejin.im/user/598feef55188257d592e56ed/posts)    |   [点我](https://www.zhihu.com/people/xuexiangjys/posts)       |   [点我](https://xuexiangjys.blog.csdn.net/)  |   [点我](https://www.jianshu.com/u/6bf605575337)  |   [点我](https://segmentfault.com/u/xuexiangjys)  |   [点我](https://space.bilibili.com/483850585)  |   [点我](https://img.rruu.net/image/5ff34ff7b02dd)\n\n## X系列库快速集成\n\n为了方便大家快速集成X系列框架库，我提供了一个空壳模版供大家参考使用: https://github.com/xuexiangjys/TemplateAppProject\n\n除此之外，我还特别制作了几期[X系列视频教程](https://space.bilibili.com/483850585/channel/detail?cid=104998)供大家学习参考.\n\n---\n\n## 特征\n\n* 支持6种线程类型方式执行任务。\n* 支持任务链中各任务的执行线程调度和控制。\n* 支持快捷任务创建，同时支持自定义任务。\n* 支持串行和并行等组任务。\n* 支持任务间数据共享。\n* 支持自由组合任务执行。\n* 支持任务链执行取消。\n* 支持取消所有任务链和指定名称的任务链。\n* 支持任务链调用顺序记录和查询。\n* 支持自定义任务执行的线程池。\n\n## 组成结构\n\n* 任务链`ITaskChainEngine`：任务链执行引擎，负责统筹调度各任务步骤。\n\n* 任务步骤`ITaskStep`：负责具体任务逻辑处理。\n\n* 数据存储仓库`IDataStore`：存放数据的仓库，主要用于保存任务参数中的数据。\n\n* 任务参数`ITaskParam`：负责任务路径记录以及任务产生的参数管理。\n\n* 任务执行结果`ITaskResult`：存放任务最终执行的结果以及产生的数据。\n\n* 任务组`IGroupTaskStep`：负责统筹调度各子任务步骤。\n\n[点击查看框架UML设计图](https://github.com/xuexiangjys/XTask/blob/master/art/xtask_uml.png)\n\n## 日志一览\n\n![task_log.png](https://s4.ax1x.com/2022/02/16/HWdTHJ.png)\n\n![task_log2.png](https://s4.ax1x.com/2022/02/16/HWwnbQ.png)\n\n---\n\n## 集成指南\n\n### 添加Gradle依赖\n\n1.先在项目根目录的 `build.gradle` 的 `repositories` 添加:\n\n```\nallprojects {\n     repositories {\n        ...\n        maven { url \"https://jitpack.io\" }\n    }\n}\n```\n\n2.然后在应用项目(一般是app)的 `build.gradle` 的 dependencies 添加:\n\n```\ndependencies {\n  ...\n  // XTask\n  implementation 'com.github.xuexiangjys.XTask:xtask-core:1.0.2'\n}\n```\n\n## 使用方法\n\n> [XTask](https://github.com/xuexiangjys/XTask/blob/master/xtask-core/src/main/java/com/xuexiang/xtask/XTask.java)作为对外统一的API入口，所有常用的方法都能从中找到。\n\n### 打开调试模式\n\n当需要定位问题，需要进行调试时，可打开调试模式，这样便可开启框架的日志。\n\n```\nXTask.debug(true);\n```\n\n### XTask的API介绍\n\n方法名\t| 描述\n|---|---\ndebug | 设置是否打开调试\nsetLogger | 自定义日志打印\nsetIsLogThreadName | 设置是否打印任务执行所在的线程名，默认false\ngetTaskChain | 获取任务链执行引擎\ngetTask | 获取简化的任务\ngetTaskBuilder | 获取简化任务的构建者\ngetConcurrentGroupTask | 获取并行任务组\ngetSerialGroupTask | 获取串行任务组\ncancelTaskChain | 取消指定任务链执行\ncancelAllTaskChain | 取消所有任务链执行\npostToMain | 执行任务到主线程\npostToMainDelay | 延迟执行任务到主线程\nsubmit | 执行普通异步任务\nemergentSubmit | 执行紧急异步任务\nbackgroundSubmit | 执行后台异步任务\nioSubmit | 执行io耗时的异步任务\ngroupSubmit | 执行分组异步任务\nschedule | 执行延期任务\nscheduleAtFixedRate | 执行周期任务（固定间期）\nscheduleWithFixedDelay | 执行周期任务（固定延期）\n\n### 如何执行一条任务链\n\n下面是一整个完整的例子：\n\n```\n// 1.创建一条任务链（必须）\nfinal TaskChainEngine engine = XTask.getTaskChain();\n// 2.设置任务链的初始化参数（可选）\nengine.setTaskParam(TaskParam.get(\"chainName\", engine.getName()));\nTaskParam taskParam = TaskParam.get(\"param1\", 100)\n        .put(\"param2\", true);\n// 3.创建多个任务，并向任务链中添加（必须）\nXTaskStep taskStep = XTask.getTask(new TaskCommand() {\n    @Override\n    public void run() {\n        ITaskParam param = getTaskParam();\n        Log.e(TAG, getName() + \"  start, param1:\" + param.get(\"param1\") + \", chainName:\" + param.get(\"chainName\"));\n        param.put(\"param1\", 200);\n        param.put(\"param3\", \"this is param3!\");\n    }\n}, taskParam);\nengine.addTask(taskStep)\n        .addTask(XTask.getTask(new TaskCommand() {\n            @Override\n            public void run() {\n                ITaskParam param = getTaskParam();\n                Log.e(TAG, getName() + \"  start, param1:\" + param.get(\"param1\") + \", param3:\" + param.get(\"param3\"));\n                param.put(\"param2\", false);\n            }\n        }));\n// 4.设置任务链执行回调（可选）\nICanceller canceller = engine.setTaskChainCallback(new TaskChainCallbackAdapter() {\n    @Override\n    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n        Log.e(TAG, \"task chain completed, thread:\" + Thread.currentThread().getName());\n        Map<String, Object> data = result.getDataStore().getData();\n        for (Map.Entry<String, Object> entry : data.entrySet()) {\n            Log.e(TAG, \"key:\" + entry.getKey() + \", value:\" + entry.getValue());\n        }\n    }\n// 5.任务链执行（必须）\n}).start();\n```\n\n1.创建一条任务链.（必须）\n\n```\nTaskChainEngine engine = XTask.getTaskChain();\n```\n\n2.设置任务链的初始化参数.（可选）\n\n```\nengine.setTaskParam(TaskParam.get(\"chainName\", engine.getName()));\n```\n\n3.创建多个任务，并向任务链中添加.（必须）\n\n```\n// 设置任务初始化参数\nTaskParam taskParam = TaskParam.get(\"param1\", 100)\n        .put(\"param2\", true);\nXTaskStep taskStep = XTask.getTask(new TaskCommand() {\n    @Override\n    public void run() {\n        // ...执行任务\n    }\n}, taskParam);\nengine.addTask(taskStep)\n        .addTask(XTask.getTask(new TaskCommand() {\n            @Override\n            public void run() {\n                // ...执行任务\n            }\n        }));\n```\n\n【注意】对于任务执行完成，需要注意以下两点：\n\n* 如果任务执行成功，就调用`notifyTaskSucceed`，任务执行失败，就调用`notifyTaskFailed`。这里任务无论成功还是失败，只要执行完成都需要调用`notifyTaskXXX`通知任务链该任务完成，否则任务将无法正常执行。\n* `TaskCommand`和`SimpleTaskStep`默认提供了自动通知执行结果的功能，但是AbstractTaskStep没有提供，需要手动通知。\n\n4.设置任务链执行回调.（可选）\n\n调用setTaskChainCallback设置任务链执行回调。\n\n```\nengine.setTaskChainCallback(new TaskChainCallbackAdapter() {\n\n    @Override\n    public boolean isCallBackOnMainThread() {\n        // 回调是否返回主线程, 默认是true\n        return false;\n    }\n    @Override\n    public void onTaskChainStart(@NonNull ITaskChainEngine engine) {\n        Log.e(TAG, \"task chain start\");\n    }\n    @Override\n    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n        Log.e(TAG, \"task chain completed, thread:\" + Thread.currentThread().getName());\n    }\n    @Override\n    public void onTaskChainError(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n        Log.e(TAG, \"task chain error\");\n    }\n})\n```\n\n5.任务链执行.（必须）\n\n调用start执行任务链。\n\n```\nICanceller canceller = engine.start();\n```\n\n## 任务创建\n\n创建任务有两种方式：\n\n* 通过XTask.getTask构建\n* 继承`SimpleTaskStep`/`AbstractTaskStep`实现任务的自定义\n\n### 通过XTask创建\n\n> 通过XTask.getTask, 传入对应的属性进行构建\n\n属性名\t| 描述\t| 默认值\n|---|---|---\nname | 任务步骤名称 | XTaskStep-N(N为自增数）\ncommand | 任务执行内容 | /\nthreadType | 线程执行类型  | ThreadType.ASYNC\ntaskParam | 任务参数 | new TaskParam()\ntaskHandler | 任务处理者 | null\nisAutoNotify | 是否自动通知任务执行结果 | true\n```\nXTaskStep taskStep = XTask.getTask(new TaskCommand() {\n    @Override\n    public void run() {\n        // todo\n    }\n}, ThreadType.ASYNC, taskParam);\n```\n\n### 通过继承创建\n\n> 通过继承`SimpleTaskStep`或者`AbstractTaskStep`实现具体功能。\n\n```\npublic class StepATask extends SimpleTaskStep {\n\n    @Override\n    public void doTask() throws Exception {\n        // todo\n        // 不需要手动通知任务链任务完成\n    }\n}\n\npublic class StepBTask extends AbstractTaskStep {\n\n    @Override\n    public void doTask() throws Exception {\n        // todo\n        // 需手动通知任务链任务完成\n        notifyTaskSucceed(TaskResult.succeed());\n    }\n\n    @Override\n    public String getName() {\n        return \"StepATask\";\n    }\n}\n```\n\n## 任务执行原则\n\n每一个任务都是依托于任务链进行流程控制。任何任务都需要遵循以下原则：\n\n* 任何任务无论失败还是成功，都需要调用`notifyTaskSucceed`或者`notifyTaskFailed`去通知任务链任务的完成情况。`TaskCommand`和`SimpleTaskStep`默认提供了自动通知执行结果的功能。\n* 一旦任务链中某个任务执行失败，整个链路都停止工作。\n\n任务类型\t| 任务执行说明\n|---|---\nTaskCommand | 自动通知执行结果。如需手动通知，只需设置`isAutoNotify`为false即可\nSimpleTaskStep | 自动通知执行结果。如需手动通知，只需重写`isAutoNotify`方法为false即可\nAbstractTaskStep | 需手动通知执行结果\n\n### TaskCommand手动通知执行结果\n\n在通过XTask.getTask传入TaskCommand构建Task的时候，设置`isAutoNotify`为false即可手动通知执行结果。\n\n```\nfinal TaskChainEngine engine = XTask.getTaskChain();\nfor (int i = 0; i < 5; i++) {\n    int finalI = i;\n    engine.addTask(XTask.getTask(new TaskCommand() {\n        @Override\n        public void run() {\n            try {\n                Thread.sleep(1000);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            if (finalI == 2) {\n                notifyTaskFailed(404, \"任务执行失败!\");\n            } else {\n                notifyTaskSucceed(TaskResult.succeed());\n            }\n        }\n    }, false)); // 设置手动通知执行结果\n}\nengine.start();\n```\n\n### SimpleTaskStep手动通知执行结果\n\n重写`SimpleTaskStep`的`isAutoNotify`方法为false即可手动通知执行结果。\n\n```\npublic class StepATask extends SimpleTaskStep {\n\n    @Override\n    public void doTask() throws Exception {\n        // todo\n        // 手动通知任务链任务完成\n        notifyTaskSucceed();\n    }\n\n    @Override\n    protected boolean isAutoNotify() {\n        return false;\n    }\n}\n```\n\n## 参数传递\n\n* 任何TaskStep我们都可以通过`getTaskParam`获取任务参数和任务执行结果`ITaskParam`。\n* 上一个TaskStep保存处理过的任务参数会自动带入到下一个TaskStep中去，因此最后一个TaskStep拥有之前所有任务的参数数据。\n\n```\nXTask.getTask(new TaskCommand() {\n    @Override\n    public void run() {\n        ITaskParam param = getTaskParam();\n        Log.e(TAG, getName() + \"  start, param1:\" + param.get(\"param1\") + \", param3:\" + param.get(\"param3\"));\n        param.put(\"param2\", false);\n    }\n})\n```\n\n## 线程控制\n\n设置任务的threadType类型，即可完成对任务运行线程的控制。目前支持6种线程处理方式。\n\n类型\t| 描述 | 线程池构成\n|---|---|---\nMAIN | 主线程（UI线程） | /\nASYNC | 异步线程（开子线程，普通线程池） | 核心线程数和最大线程为CPU数，0s keepTime，LinkedBlockingQueue（128），线程优先级5\nASYNC_IO | 异步线程（开子线程，io线程池） | 核心线程数和最大线程为(2*CPU数+1)，30s keepTime，LinkedBlockingQueue（128），线程优先级5\nASYNC_EMERGENT | 异步线程（开子线程，紧急线程池） | 核心线程数为2，最大线程为∞，60s keepTime，SynchronousQueue（不阻塞），线程优先级10\nASYNC_BACKGROUND | 异步线程（开子线程，优先级较低线程池） | 核心线程数和最大线程为2，0s keepTime，LinkedBlockingQueue（128），线程优先级1\nSYNC | 同步线程（直接执行） | /\n\n```\n// 1.构造时传入线程\nXTaskStep taskStep = XTask.getTask(new SimpleTaskCommand(1000), ThreadType.ASYNC_EMERGENT);\n// 2.设置线程的方法\ntaskStep.setThreadType(ThreadType.ASYNC_IO);\n```\n\n## 任务组\n\n目前共有串行任务组（SerialGroupTaskStep）和并行任务组（ConcurrentGroupTaskStep）\n\n### 串行任务组\n\n串行任务组是按顺序依次执行，和任务链的处理方式类似。使用XTask.getSerialGroupTask获取。\n\n```\nfinal TaskChainEngine engine = XTask.getTaskChain();\nSerialGroupTaskStep group1 = XTask.getSerialGroupTask(\"group1\");\nfor (int i = 0; i < 5; i++) {\n    group1.addTask(XTask.getTask(new SimpleTaskCommand(500)));\n}\nSerialGroupTaskStep group2 = XTask.getSerialGroupTask(\"group2\");\nfor (int i = 0; i < 5; i++) {\n    group2.addTask(XTask.getTask(new SimpleTaskCommand(1000)));\n}\nICanceller canceller = engine.addTask(group1)\n        .addTask(group2)\n        .setTaskChainCallback(new TaskChainCallbackAdapter() {\n            @Override\n            public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                Log.e(TAG, \"task chain completed, path:\" + result.getPath());\n            }\n        })\n        .start();\naddCanceller(canceller);\n```\n\n### 并行任务组\n\n并行任务组是组内所有任务同时执行，待所有任务都完成后才视为任务组完成。使用XTask.getConcurrentGroupTask获取。\n\n```\nfinal TaskChainEngine engine = XTask.getTaskChain();\nConcurrentGroupTaskStep group1 = XTask.getConcurrentGroupTask(\"group1\");\nfor (int i = 0; i < 5; i++) {\n    group1.addTask(XTask.getTask(new SimpleTaskCommand(100 * (i + 1))));\n}\nConcurrentGroupTaskStep group2 = XTask.getConcurrentGroupTask(\"group2\");\nfor (int i = 0; i < 5; i++) {\n    group2.addTask(XTask.getTask(new SimpleTaskCommand(200 * (i + 1))));\n}\nICanceller canceller = engine.addTask(group1)\n        .addTask(group2)\n        .setTaskChainCallback(new TaskChainCallbackAdapter() {\n            @Override\n            public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                Log.e(TAG, \"task chain completed, path:\" + result.getPath());\n            }\n        })\n        .start();\naddCanceller(canceller);\n```\n\n## 任务链取消\n\n> 通过调用`ICanceller`的`cancel`方法或者`XTask`的`cancelTaskChain`即可完成任务链的取消。\n\n### 单个任务链取消\n\n调用任务链`TaskChainEngine`的`start`方法之后，会返回一个任务取消者`ICanceller`，调用它的`cancel`方法即可完成任务取消。\n\n```\nICanceller canceller = engine.start();\n// 取消任务链的执行\ncanceller.cancel();\n```\n\n### 多个任务链取消\n\n任务链在执行的时候，会默认加入到一个任务取消池，调用`XTask`的`cancelTaskChain`方法，传入多个任务链的名称或者`ICanceller`的名称，即可完成多个任务链的取消。\n\n```\nSet<String> pool = new HashSet<>();\nICanceller canceller1 = engine1.start();\nICanceller canceller2 = engine2.start();\n// 使用ICanceller的名称\npool.add(canceller1.getName());\n// 使用任务链的名称\npool.add(engine2.getName());\n// 取消多个任务链的执行\nXTask.cancelTaskChain(pool);\n```\n\n### 全部任务链取消\n\n调用`XTask`的`cancelAllTaskChain`方法取消全部任务链的执行\n\n```\nXTask.cancelAllTaskChain();\n```\n\n---\n\n## 如果觉得项目还不错，可以考虑打赏一波\n\n> 你的打赏是我维护的动力，我将会列出所有打赏人员的清单在下方作为凭证，打赏前请留下打赏项目的备注！\n\n![pay.png](https://raw.githubusercontent.com/xuexiangjys/Resource/master/img/pay/pay.png)\n\n## 联系方式\n\n> 更多资讯内容，欢迎扫描关注我的个人微信公众号:【我的Android开源之旅】\n\n![](https://s1.ax1x.com/2022/04/27/LbGMJH.jpg)\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'img-optimizer'\n//打包时，记得设置true启用\nif (isNeedPackage.toBoolean() && isUseBooster.toBoolean()) {\n    apply plugin: 'com.didiglobal.booster'\n}\n\nandroid {\n    compileSdkVersion build_versions.target_sdk\n    buildToolsVersion build_versions.build_tools\n\n    defaultConfig {\n        applicationId \"com.xuexiang.xtaskdemo\"\n        minSdkVersion 17\n        targetSdkVersion build_versions.target_sdk\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n\n        multiDexEnabled true\n        vectorDrawables.useSupportLibrary = true\n\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments = [moduleName: project.getName()]\n            }\n        }\n    }\n\n    signingConfigs {\n        if (isNeedPackage.toBoolean()) {\n            release {\n                storeFile file(app_release.storeFile)\n                storePassword app_release.storePassword\n                keyAlias app_release.keyAlias\n                keyPassword app_release.keyPassword\n            }\n        }\n\n        debug {\n            storeFile file(\"./debug.jks\")\n            storePassword \"123456\"\n            keyAlias \"debug\"\n            keyPassword \"123456\"\n        }\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled true\n            shrinkResources true\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n            if (isNeedPackage.toBoolean()) {\n                signingConfig signingConfigs.release\n\n                Properties properties = new Properties()\n                properties.load(project.rootProject.file('local.properties').newDataInputStream())\n                def appID = properties.getProperty(\"APP_ID_UMENG\")\n                if (appID != null) {\n                    buildConfigField \"String\", \"APP_ID_UMENG\", appID\n                } else {\n                    buildConfigField \"String\", \"APP_ID_UMENG\", '\"\"'\n                }\n            } else {\n                signingConfig signingConfigs.debug\n                buildConfigField \"String\", \"APP_ID_UMENG\", '\"\"'\n            }\n        }\n\n        debug {\n            debuggable true\n            minifyEnabled false\n\n            signingConfig signingConfigs.debug\n            buildConfigField \"String\", \"APP_ID_UMENG\", '\"\"'\n        }\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    testImplementation deps.junit\n    androidTestImplementation deps.runner\n    androidTestImplementation deps.espresso.core\n\n    // 任务库\n    implementation project(':xtask-core')\n//    implementation 'com.github.xuexiangjys.XTask:xtask-core:1.0.2'\n\n    // rxjava3\n    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'\n    implementation 'io.reactivex.rxjava3:rxjava:3.1.3'\n    implementation deps.androidx.multidex\n    // 屏幕适配AutoSize\n    implementation 'me.jessyan:autosize:1.2.1'\n    // umeng统计\n    implementation 'com.umeng.umsdk:common:9.3.8'\n    implementation 'com.umeng.umsdk:asms:1.2.1'\n\n    // 美团多渠道打包\n    implementation 'com.meituan.android.walle:library:1.1.6'\n}\n\n// x-library依赖脚本\napply from: 'x-library-simple.gradle'\n// walle多渠道打包\napply from: 'multiple-channel.gradle'\n\n"
  },
  {
    "path": "app/channel",
    "content": "# 美团\nmeituan\n# 三星\nsamsungapps\n# 小米\nxiaomi\n# 91助手\n91com\n# 魅族\nmeizu\n# 豌豆荚\nwandou\n# Google Play\ngoogleplay\n# 百度\nbaidu\n# 360\n360cn\n# 应用宝\nmyapp\n# 华为\nhuawei\n# 蒲公英\npgyer\ngithub"
  },
  {
    "path": "app/multiple-channel.gradle",
    "content": "apply plugin: 'walle'\n\nwalle {\n    // 指定渠道包的输出路径\n    apkOutputFolder = new File(\"${project.buildDir}/outputs/channels\")\n    // 定制渠道包的APK的文件名称\n    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk'\n    // 渠道配置文件\n    channelFile = new File(\"${project.getProjectDir()}/channel\")\n}"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "#=========================================基础不变的混淆配置=========================================##\n#指定代码的压缩级别\n-optimizationpasses 5\n#包名不混合大小写\n-dontusemixedcaseclassnames\n#不去忽略非公共的库类\n-dontskipnonpubliclibraryclasses\n# 指定不去忽略非公共的库的类的成员\n-dontskipnonpubliclibraryclassmembers\n#优化  不优化输入的类文件\n-dontoptimize\n#预校验\n-dontpreverify\n#混淆时是否记录日志\n-verbose\n# 混淆时所采用的算法\n-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*\n#保护注解\n-keepattributes *Annotation*\n#忽略警告\n-ignorewarnings\n\n##记录生成的日志数据,gradle build时在本项目根目录输出##\n#apk 包内所有 class 的内部结构\n-dump class_files.txt\n#未混淆的类和成员\n-printseeds seeds.txt\n#列出从 apk 中删除的代码\n-printusage unused.txt\n#混淆前后的映射\n-printmapping mapping.txt\n# 并保留源文件名为\"Proguard\"字符串，而非原始的类名 并保留行号\n-keepattributes SourceFile,LineNumberTable\n########记录生成的日志数据，gradle build时 在本项目根目录输出-end#####\n\n#需要保留的东西\n# 保持哪些类不被混淆\n-keep public class * extends android.app.Fragment\n-keep public class * extends android.app.Activity\n-keep public class * extends android.app.Application\n-keep public class * extends android.app.Service\n-keep public class * extends android.content.BroadcastReceiver\n-keep public class * extends android.content.ContentProvider\n-keep public class * extends android.app.backup.BackupAgentHelper\n-keep public class * extends android.preference.Preference\n-keep public class * extends android.support.v4.**\n-keep public class com.android.vending.licensing.ILicensingService\n\n#如果有引用v4包可以添加下面这行\n-keep public class * extends android.support.v4.app.Fragment\n\n##########JS接口类不混淆，否则执行不了\n-dontwarn com.android.JsInterface.**\n-keep class com.android.JsInterface.** {*; }\n\n#极光推送和百度lbs android sdk一起使用proguard 混淆的问题#http的类被混淆后，导致apk定位失败，保持apache 的http类不被混淆就好了\n-dontwarn org.apache.**\n-keep class org.apache.**{ *; }\n\n-keep public class * extends android.view.View {\n  public <init>(android.content.Context);\n  public <init>(android.content.Context, android.util.AttributeSet);\n  public <init>(android.content.Context, android.util.AttributeSet, int);\n  public void set*(...);\n }\n\n#保持 native 方法不被混淆\n-keepclasseswithmembernames class * {\n  native <methods>;\n}\n\n#保持自定义控件类不被混淆\n-keepclasseswithmembers class * {\n  public <init>(android.content.Context, android.util.AttributeSet);\n}\n\n#保持自定义控件类不被混淆\n-keepclassmembers class * extends android.app.Activity {\n  public void *(android.view.View);\n}\n\n#保持 Parcelable 不被混淆\n-keep class * implements android.os.Parcelable {\n  public static final android.os.Parcelable$Creator *;\n}\n\n#保持 Serializable 不被混淆\n-keepnames class * implements java.io.Serializable\n\n#保持 Serializable 不被混淆并且enum 类也不被混淆\n-keepclassmembers class * implements java.io.Serializable {\n    static final long serialVersionUID;\n    private static final java.io.ObjectStreamField[] serialPersistentFields;\n    !static !transient <fields>;\n    !private <fields>;\n    !private <methods>;\n    private void writeObject(java.io.ObjectOutputStream);\n    private void readObject(java.io.ObjectInputStream);\n    java.lang.Object writeReplace();\n    java.lang.Object readResolve();\n}\n\n#保持枚举 enum 类不被混淆 如果混淆报错，建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可\n-keepclassmembers enum * {\n      public static **[] values();\n      public static ** valueOf(java.lang.String);\n}\n\n-keepclassmembers class * {\n      public void *ButtonClicked(android.view.View);\n}\n\n#不混淆资源类\n-keep class **.R$* {*;}\n\n#===================================混淆保护自己项目的部分代码以及引用的第三方jar包library=============================#######\n#如果引用了v4或者v7包\n-dontwarn android.support.**\n\n\n# AndroidX 防止混淆\n-dontwarn com.google.android.material.**\n-dontnote com.google.android.material.**\n-dontwarn androidx.**\n-keep class com.google.android.material.** {*;}\n-keep class androidx.** {*;}\n-keep public class * extends androidx.**\n-keep interface androidx.** {*;}\n-keepclassmembers class * {\n    @androidx.annotation.Keep *;\n}\n\n# zxing\n-dontwarn com.google.zxing.**\n-keep class com.google.zxing.**{*;}\n\n#SignalR推送\n-keep class microsoft.aspnet.signalr.** { *; }\n\n# 极光推送混淆\n-dontoptimize\n-dontpreverify\n-dontwarn cn.jpush.**\n-keep class cn.jpush.** { *; }\n-dontwarn cn.jiguang.**\n-keep class cn.jiguang.** { *; }\n\n# 数据库框架OrmLite\n-keepattributes *DatabaseField*\n-keepattributes *DatabaseTable*\n-keepattributes *SerializedName*\n-keep class com.j256.**\n-keepclassmembers class com.j256.** { *; }\n-keep enum com.j256.**\n-keepclassmembers enum com.j256.** { *; }\n-keep interface com.j256.**\n-keepclassmembers interface com.j256.** { *; }\n\n#XHttp2\n-keep class com.xuexiang.xhttp2.model.** { *; }\n-keep class com.xuexiang.xhttp2.cache.model.** { *; }\n-keep class com.xuexiang.xhttp2.cache.stategy.**{*;}\n-keep class com.xuexiang.xhttp2.annotation.** { *; }\n\n#okhttp\n-dontwarn com.squareup.okhttp3.**\n-keep class com.squareup.okhttp3.** { *;}\n-dontwarn okio.**\n-dontwarn javax.annotation.Nullable\n-dontwarn javax.annotation.ParametersAreNonnullByDefault\n-dontwarn javax.annotation.**\n\n#如果用到Gson解析包的，直接添加下面这几行就能成功混淆，不然会报错\n-keepattributes Signature\n-keep class com.google.gson.stream.** { *; }\n-keepattributes EnclosingMethod\n-keep class org.xz_sale.entity.**{*;}\n-keep class com.google.gson.** {*;}\n-keep class com.google.**{*;}\n-keep class sun.misc.Unsafe { *; }\n-keep class com.google.gson.stream.** { *; }\n-keep class com.google.gson.examples.android.model.** { *; }\n\n# Glide\n-keep public class * implements com.bumptech.glide.module.GlideModule\n-keep public class * extends com.bumptech.glide.module.AppGlideModule\n-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {\n  **[] $VALUES;\n  public *;\n}\n\n# Retrofit\n-dontwarn retrofit2.**\n-keep class retrofit2.** { *; }\n-keepattributes Exceptions\n\n# RxJava RxAndroid\n-dontwarn sun.misc.**\n-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {\n    long producerIndex;\n    long consumerIndex;\n}\n-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {\n    rx.internal.util.atomic.LinkedQueueNode producerNode;\n}\n-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {\n    rx.internal.util.atomic.LinkedQueueNode consumerNode;\n}\n\n-dontwarn okio.**\n-dontwarn javax.annotation.Nullable\n-dontwarn javax.annotation.ParametersAreNonnullByDefault\n-dontwarn javax.annotation.**\n\n# fastjson\n-dontwarn com.alibaba.fastjson.**\n-keep class com.alibaba.fastjson.** { *; }\n-keepattributes Signature\n\n# xpage\n-keep class com.xuexiang.xpage.annotation.** { *; }\n-keep class com.xuexiang.xpage.config.** { *; }\n\n# xaop\n-keep @com.xuexiang.xaop.annotation.* class * {*;}\n-keep @org.aspectj.lang.annotation.* class * {*;}\n-keep class * {\n    @com.xuexiang.xaop.annotation.* <fields>;\n    @org.aspectj.lang.annotation.* <fields>;\n}\n-keepclassmembers class * {\n    @com.xuexiang.xaop.annotation.* <methods>;\n    @org.aspectj.lang.annotation.* <methods>;\n}\n\n# xrouter\n-keep public class com.xuexiang.xrouter.routes.**{*;}\n-keep class * implements com.xuexiang.xrouter.facade.template.ISyringe{*;}\n# 如果使用了 byType 的方式获取 Service，需添加下面规则，保护接口\n-keep interface * implements com.xuexiang.xrouter.facade.template.IProvider\n# 如果使用了 单类注入，即不定义接口实现 IProvider，需添加下面规则，保护实现\n-keep class * implements com.xuexiang.xrouter.facade.template.IProvider\n\n# xupdate\n-keep class com.xuexiang.xupdate.entity.** { *; }\n\n# xvideo\n-keep class com.xuexiang.xvideo.jniinterface.** { *; }\n\n# xipc\n-keep @com.xuexiang.xipc.annotation.* class * {*;}\n-keep class * {\n    @com.xuexiang.xipc.annotation.* <fields>;\n}\n-keepclassmembers class * {\n    @com.xuexiang.xipc.annotation.* <methods>;\n}\n\n# umeng统计\n-keep class com.umeng.** {*;}\n-keepclassmembers class * {\n   public <init> (org.json.JSONObject);\n}\n-keepclassmembers enum * {\n    public static **[] values();\n    public static ** valueOf(java.lang.String);\n}\n\n# materialedittext\n-keep class com.xuexiang.xui.widget.edittext.materialedittext.** { *; }\n"
  },
  {
    "path": "app/src/androidTest/java/com/xuexiang/xtaskdemo/ExampleInstrumentedTest.java",
    "content": "package com.xuexiang.xtaskdemo;\n\nimport android.content.Context;\n\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.runner.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.assertEquals;\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n    @Test\n    public void useAppContext() {\n        // Context of the app under test.\n        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();\n\n        assertEquals(\"com.xuexiang.templateproject\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.xuexiang.xtaskdemo\">\n\n    <!--进程杀死-->\n    <uses-permission android:name=\"android.permission.KILL_BACKGROUND_PROCESSES\" />\n\n    <application\n        android:name=\"com.xuexiang.xtaskdemo.MyApp\"\n        android:allowBackup=\"false\"\n        android:configChanges=\"screenSize|keyboardHidden|orientation|keyboard\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\"\n        android:windowSoftInputMode=\"adjustPan|stateHidden\"\n        tools:ignore=\"LockedOrientationActivity\">\n\n        <activity\n            android:name=\"com.xuexiang.xtaskdemo.activity.MainActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation|keyboard\"\n            android:screenOrientation=\"portrait\"\n            android:windowSoftInputMode=\"adjustPan|stateHidden\">\n\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n\n        <!--fragment的页面容器-->\n        <activity\n            android:name=\"com.xuexiang.xtaskdemo.core.BaseActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation|keyboard\"\n            android:screenOrientation=\"portrait\"\n            android:windowSoftInputMode=\"adjustPan|stateHidden\" />\n\n        <!--屏幕自适应设计图-->\n        <meta-data\n            android:name=\"design_width_in_dp\"\n            android:value=\"360\" />\n        <meta-data\n            android:name=\"design_height_in_dp\"\n            android:value=\"640\" />\n\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/MyApp.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport androidx.multidex.MultiDex;\n\nimport com.xuexiang.xtask.XTask;\nimport com.xuexiang.xtaskdemo.utils.sdkinit.UMengInit;\nimport com.xuexiang.xtaskdemo.utils.sdkinit.XBasicLibInit;\n\n/**\n * @author xuexiang\n * @since 2018/11/7 下午1:12\n */\npublic class MyApp extends Application {\n\n    @Override\n    protected void attachBaseContext(Context base) {\n        super.attachBaseContext(base);\n        //解决4.x运行崩溃的问题\n        MultiDex.install(this);\n    }\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        initLibs();\n\n        // 设置XTask的调试模式\n        XTask.debug(isDebug());\n//        // 设置是否打印任务执行所在的线程名\n//        XTask.setIsLogThreadName(true);\n    }\n\n    /**\n     * 初始化基础库\n     */\n    private void initLibs() {\n        XBasicLibInit.init(this);\n        UMengInit.init(this);\n    }\n\n\n    /**\n     * @return 当前app是否是调试开发模式\n     */\n    public static boolean isDebug() {\n        return BuildConfig.DEBUG;\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/activity/MainActivity.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.activity;\n\nimport android.os.Bundle;\n\nimport com.xuexiang.xtaskdemo.core.BaseActivity;\nimport com.xuexiang.xtaskdemo.fragment.MainFragment;\n\n/**\n * 程序入口，空壳容器\n *\n * @author xuexiang\n * @since 2019-07-07 23:53\n */\npublic class MainActivity extends BaseActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        openPage(MainFragment.class);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/core/BaseActivity.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.core;\n\nimport android.content.Context;\nimport android.os.Bundle;\n\nimport com.xuexiang.xpage.base.XPageActivity;\nimport com.xuexiang.xpage.base.XPageFragment;\nimport com.xuexiang.xpage.core.CoreSwitchBean;\nimport com.xuexiang.xrouter.facade.service.SerializationService;\nimport com.xuexiang.xrouter.launcher.XRouter;\n\nimport butterknife.ButterKnife;\nimport butterknife.Unbinder;\nimport io.github.inflationx.viewpump.ViewPumpContextWrapper;\n\n/**\n * 基础容器Activity\n *\n * @author XUE\n * @since 2019/3/22 11:21\n */\npublic class BaseActivity extends XPageActivity {\n\n    Unbinder mUnbinder;\n\n    @Override\n    protected void attachBaseContext(Context newBase) {\n        //注入字体\n        super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        initStatusBarStyle();\n        super.onCreate(savedInstanceState);\n        mUnbinder = ButterKnife.bind(this);\n    }\n\n    /**\n     * 初始化状态栏的样式\n     */\n    protected void initStatusBarStyle() {\n\n    }\n\n    /**\n     * 打开fragment\n     *\n     * @param clazz          页面类\n     * @param addToBackStack 是否添加到栈中\n     * @return 打开的fragment对象\n     */\n    public <T extends XPageFragment> T openPage(Class<T> clazz, boolean addToBackStack) {\n        CoreSwitchBean page = new CoreSwitchBean(clazz)\n                .setAddToBackStack(addToBackStack);\n        return (T) openPage(page);\n    }\n\n    /**\n     * 打开fragment\n     *\n     * @return 打开的fragment对象\n     */\n    public <T extends XPageFragment> T openNewPage(Class<T> clazz) {\n        CoreSwitchBean page = new CoreSwitchBean(clazz)\n                .setNewActivity(true);\n        return (T) openPage(page);\n    }\n\n    /**\n     * 切换fragment\n     *\n     * @param clazz 页面类\n     * @return 打开的fragment对象\n     */\n    public <T extends XPageFragment> T switchPage(Class<T> clazz) {\n        return openPage(clazz, false);\n    }\n\n    /**\n     * 序列化对象\n     *\n     * @param object\n     * @return\n     */\n    public String serializeObject(Object object) {\n        return XRouter.getInstance().navigation(SerializationService.class).object2Json(object);\n    }\n\n    @Override\n    protected void onRelease() {\n        mUnbinder.unbind();\n        super.onRelease();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/core/BaseContainerFragment.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.core;\n\nimport android.content.res.Configuration;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView;\n\nimport com.umeng.analytics.MobclickAgent;\nimport com.xuexiang.xaop.annotation.SingleClick;\nimport com.xuexiang.xpage.base.XPageContainerListFragment;\nimport com.xuexiang.xui.widget.actionbar.TitleBar;\nimport com.xuexiang.xui.widget.actionbar.TitleUtils;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport static com.xuexiang.xtaskdemo.core.SimpleListAdapter.KEY_SUB_TITLE;\nimport static com.xuexiang.xtaskdemo.core.SimpleListAdapter.KEY_TITLE;\n\n/**\n * 修改列表样式为主副标题显示\n *\n * @author xuexiang\n * @since 2018/11/22 上午11:26\n */\npublic abstract class BaseContainerFragment extends XPageContainerListFragment {\n\n    @Override\n    protected void initPage() {\n        initTitle();\n        initViews();\n        initListeners();\n    }\n\n    protected TitleBar initTitle() {\n        return TitleUtils.addTitleBarDynamic((ViewGroup) getRootView(), getPageTitle(), new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                popToBack();\n            }\n        });\n    }\n\n    @Override\n    protected void initData() {\n        mSimpleData = initSimpleData(mSimpleData);\n\n        List<Map<String, String>> data = new ArrayList<>();\n        for (String content : mSimpleData) {\n            Map<String, String> item = new HashMap<>();\n            int index = content.indexOf(\"\\n\");\n            if (index > 0) {\n                item.put(KEY_TITLE, String.valueOf(content.subSequence(0, index)));\n                item.put(KEY_SUB_TITLE, String.valueOf(content.subSequence(index + 1, content.length())));\n            } else {\n                item.put(KEY_TITLE, content);\n                item.put(KEY_SUB_TITLE, \"\");\n            }\n            data.add(item);\n        }\n\n        getListView().setAdapter(new SimpleListAdapter(getContext(), data));\n        initSimply();\n    }\n\n    @Override\n    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {\n        onItemClick(view, position);\n    }\n\n    @SingleClick\n    private void onItemClick(View view, int position) {\n        onItemClick(position);\n    }\n\n    @Override\n    public void onDestroyView() {\n        getListView().setOnItemClickListener(null);\n        super.onDestroyView();\n    }\n\n    @Override\n    public void onConfigurationChanged(Configuration newConfig) {\n        //屏幕旋转时刷新一下title\n        super.onConfigurationChanged(newConfig);\n        ViewGroup root = (ViewGroup) getRootView();\n        if (root.getChildAt(0) instanceof TitleBar) {\n            root.removeViewAt(0);\n            initTitle();\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        MobclickAgent.onPageStart(getPageName());\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        MobclickAgent.onPageEnd(getPageName());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/core/BaseFragment.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.core;\n\nimport android.content.res.Configuration;\nimport android.os.Parcelable;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\n\nimport com.umeng.analytics.MobclickAgent;\nimport com.xuexiang.xpage.base.XPageActivity;\nimport com.xuexiang.xpage.base.XPageFragment;\nimport com.xuexiang.xpage.core.PageOption;\nimport com.xuexiang.xpage.enums.CoreAnim;\nimport com.xuexiang.xpage.utils.Utils;\nimport com.xuexiang.xrouter.facade.service.SerializationService;\nimport com.xuexiang.xrouter.launcher.XRouter;\nimport com.xuexiang.xui.utils.WidgetUtils;\nimport com.xuexiang.xui.widget.actionbar.TitleBar;\nimport com.xuexiang.xui.widget.actionbar.TitleUtils;\nimport com.xuexiang.xui.widget.progress.loading.IMessageLoader;\n\nimport java.io.Serializable;\nimport java.lang.reflect.Type;\n\n/**\n * 基础fragment\n *\n * @author xuexiang\n * @since 2018/5/25 下午3:44\n */\npublic abstract class BaseFragment extends XPageFragment {\n\n    private IMessageLoader mIMessageLoader;\n\n    @Override\n    protected void initPage() {\n        initTitle();\n        initViews();\n        initListeners();\n    }\n\n    protected TitleBar initTitle() {\n        return TitleUtils.addTitleBarDynamic((ViewGroup) getRootView(), getPageTitle(), v -> popToBack());\n    }\n\n    @Override\n    protected void initListeners() {\n\n    }\n\n    public IMessageLoader getMessageLoader() {\n        if (mIMessageLoader == null) {\n            mIMessageLoader = WidgetUtils.getMiniLoadingDialog(getContext());\n        }\n        return mIMessageLoader;\n    }\n\n    public IMessageLoader getMessageLoader(String message) {\n        if (mIMessageLoader == null) {\n            mIMessageLoader = WidgetUtils.getMiniLoadingDialog(getContext(), message);\n        } else {\n            mIMessageLoader.updateMessage(message);\n        }\n        return mIMessageLoader;\n    }\n\n    @Override\n    public void onConfigurationChanged(Configuration newConfig) {\n        //屏幕旋转时刷新一下title\n        super.onConfigurationChanged(newConfig);\n        ViewGroup root = (ViewGroup) getRootView();\n        if (root.getChildAt(0) instanceof TitleBar) {\n            root.removeViewAt(0);\n            initTitle();\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        MobclickAgent.onPageStart(getPageName());\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        MobclickAgent.onPageEnd(getPageName());\n    }\n\n\n    //==============================页面跳转api===================================//\n\n    /**\n     * 打开一个新的页面【建议只在主tab页使用】\n     *\n     * @param clazz 页面的类\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openNewPage(Class<T> clazz) {\n        return new PageOption(clazz)\n                .setNewActivity(true)\n                .open(this);\n    }\n\n    /**\n     * 打开一个新的页面【建议只在主tab页使用】\n     *\n     * @param pageName 页面名\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openNewPage(String pageName) {\n        return new PageOption(pageName)\n                .setAnim(CoreAnim.slide)\n                .setNewActivity(true)\n                .open(this);\n    }\n\n\n    /**\n     * 打开一个新的页面【建议只在主tab页使用】\n     *\n     * @param clazz                页面的类\n     * @param containActivityClazz 页面容器\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openNewPage(Class<T> clazz, @NonNull Class<? extends XPageActivity> containActivityClazz) {\n        return new PageOption(clazz)\n                .setNewActivity(true)\n                .setContainActivityClazz(containActivityClazz)\n                .open(this);\n    }\n\n    /**\n     * 打开一个新的页面【建议只在主tab页使用】\n     *\n     * @param clazz 页面的类\n     * @param key   入参的键\n     * @param value 入参的值\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openNewPage(Class<T> clazz, String key, Object value) {\n        PageOption option = new PageOption(clazz).setNewActivity(true);\n        return openPage(option, key, value);\n    }\n\n    public Fragment openPage(PageOption option, String key, Object value) {\n        if (value instanceof Integer) {\n            option.putInt(key, (Integer) value);\n        } else if (value instanceof Float) {\n            option.putFloat(key, (Float) value);\n        } else if (value instanceof String) {\n            option.putString(key, (String) value);\n        } else if (value instanceof Boolean) {\n            option.putBoolean(key, (Boolean) value);\n        } else if (value instanceof Long) {\n            option.putLong(key, (Long) value);\n        } else if (value instanceof Double) {\n            option.putDouble(key, (Double) value);\n        } else if (value instanceof Parcelable) {\n            option.putParcelable(key, (Parcelable) value);\n        } else if (value instanceof Serializable) {\n            option.putSerializable(key, (Serializable) value);\n        } else {\n            option.putString(key, serializeObject(value));\n        }\n        return option.open(this);\n    }\n\n    /**\n     * 打开页面\n     *\n     * @param clazz          页面的类\n     * @param addToBackStack 是否加入回退栈\n     * @param key            入参的键\n     * @param value          入参的值\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPage(Class<T> clazz, boolean addToBackStack, String key, String value) {\n        return new PageOption(clazz)\n                .setAddToBackStack(addToBackStack)\n                .putString(key, value)\n                .open(this);\n    }\n\n    /**\n     * 打开页面\n     *\n     * @param clazz 页面的类\n     * @param key   入参的键\n     * @param value 入参的值\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPage(Class<T> clazz, String key, Object value) {\n        return openPage(clazz, true, key, value);\n    }\n\n    /**\n     * 打开页面\n     *\n     * @param clazz          页面的类\n     * @param addToBackStack 是否加入回退栈\n     * @param key            入参的键\n     * @param value          入参的值\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPage(Class<T> clazz, boolean addToBackStack, String key, Object value) {\n        PageOption option = new PageOption(clazz).setAddToBackStack(addToBackStack);\n        return openPage(option, key, value);\n    }\n\n    /**\n     * 打开页面\n     *\n     * @param clazz 页面的类\n     * @param key   入参的键\n     * @param value 入参的值\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPage(Class<T> clazz, String key, String value) {\n        return new PageOption(clazz)\n                .putString(key, value)\n                .open(this);\n    }\n\n    /**\n     * 打开页面,需要结果返回\n     *\n     * @param clazz       页面的类\n     * @param key         入参的键\n     * @param value       入参的值\n     * @param requestCode 请求码\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPageForResult(Class<T> clazz, String key, Object value, int requestCode) {\n        PageOption option = new PageOption(clazz).setRequestCode(requestCode);\n        return openPage(option, key, value);\n    }\n\n    /**\n     * 打开页面,需要结果返回\n     *\n     * @param clazz       页面的类\n     * @param key         入参的键\n     * @param value       入参的值\n     * @param requestCode 请求码\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPageForResult(Class<T> clazz, String key, String value, int requestCode) {\n        return new PageOption(clazz)\n                .setRequestCode(requestCode)\n                .putString(key, value)\n                .open(this);\n    }\n\n    /**\n     * 打开页面,需要结果返回\n     *\n     * @param clazz       页面的类\n     * @param requestCode 请求码\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPageForResult(Class<T> clazz, int requestCode) {\n        return new PageOption(clazz)\n                .setRequestCode(requestCode)\n                .open(this);\n    }\n\n    /**\n     * 序列化对象\n     *\n     * @param object 需要序列化的对象\n     * @return 序列化结果\n     */\n    public String serializeObject(Object object) {\n        return XRouter.getInstance().navigation(SerializationService.class).object2Json(object);\n    }\n\n    /**\n     * 反序列化对象\n     *\n     * @param input 反序列化的内容\n     * @param clazz 类型\n     * @return 反序列化结果\n     */\n    public <T> T deserializeObject(String input, Type clazz) {\n        return XRouter.getInstance().navigation(SerializationService.class).parseObject(input, clazz);\n    }\n\n    @Override\n    protected void hideCurrentPageSoftInput() {\n        if (getActivity() == null) {\n            return;\n        }\n        // 记住，要在xml的父布局加上android:focusable=\"true\" 和 android:focusableInTouchMode=\"true\"\n        Utils.hideSoftInputClearFocus(getActivity().getCurrentFocus());\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/core/BaseSimpleListFragment.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.core;\n\nimport android.content.res.Configuration;\nimport android.os.Parcelable;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\n\nimport com.umeng.analytics.MobclickAgent;\nimport com.xuexiang.xpage.base.XPageActivity;\nimport com.xuexiang.xpage.base.XPageFragment;\nimport com.xuexiang.xpage.base.XPageSimpleListFragment;\nimport com.xuexiang.xpage.core.PageOption;\nimport com.xuexiang.xpage.enums.CoreAnim;\nimport com.xuexiang.xrouter.facade.service.SerializationService;\nimport com.xuexiang.xrouter.launcher.XRouter;\nimport com.xuexiang.xui.widget.actionbar.TitleBar;\nimport com.xuexiang.xui.widget.actionbar.TitleUtils;\n\nimport java.io.Serializable;\n\n/**\n * @author xuexiang\n * @since 2018/12/29 下午12:41\n */\npublic abstract class BaseSimpleListFragment extends XPageSimpleListFragment {\n\n    @Override\n    protected void initPage() {\n        initTitle();\n        initViews();\n        initListeners();\n    }\n\n    protected TitleBar initTitle() {\n        return TitleUtils.addTitleBarDynamic((ViewGroup) getRootView(), getPageTitle(), new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                popToBack();\n            }\n        });\n    }\n\n    @Override\n    public void onConfigurationChanged(Configuration newConfig) {\n        //屏幕旋转时刷新一下title\n        super.onConfigurationChanged(newConfig);\n        ViewGroup root = (ViewGroup) getRootView();\n        if (root.getChildAt(0) instanceof TitleBar) {\n            root.removeViewAt(0);\n            initTitle();\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        MobclickAgent.onPageStart(getPageName());\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        MobclickAgent.onPageEnd(getPageName());\n    }\n\n    //==============================页面跳转api===================================//\n\n    /**\n     * 打开一个新的页面【建议只在主tab页使用】\n     *\n     * @param clazz 页面的类\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openNewPage(Class<T> clazz) {\n        return new PageOption(clazz)\n                .setNewActivity(true)\n                .open(this);\n    }\n\n    /**\n     * 打开一个新的页面【建议只在主tab页使用】\n     *\n     * @param pageName 页面名\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openNewPage(String pageName) {\n        return new PageOption(pageName)\n                .setAnim(CoreAnim.slide)\n                .setNewActivity(true)\n                .open(this);\n    }\n\n\n    /**\n     * 打开一个新的页面【建议只在主tab页使用】\n     *\n     * @param clazz                页面的类\n     * @param containActivityClazz 页面容器\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openNewPage(Class<T> clazz, @NonNull Class<? extends XPageActivity> containActivityClazz) {\n        return new PageOption(clazz)\n                .setNewActivity(true)\n                .setContainActivityClazz(containActivityClazz)\n                .open(this);\n    }\n\n    /**\n     * 打开一个新的页面【建议只在主tab页使用】\n     *\n     * @param clazz 页面的类\n     * @param key   入参的键\n     * @param value 入参的值\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openNewPage(Class<T> clazz, String key, Object value) {\n        PageOption option = new PageOption(clazz).setNewActivity(true);\n        return openPage(option, key, value);\n    }\n\n    public Fragment openPage(PageOption option, String key, Object value) {\n        if (value instanceof Integer) {\n            option.putInt(key, (Integer) value);\n        } else if (value instanceof Float) {\n            option.putFloat(key, (Float) value);\n        } else if (value instanceof String) {\n            option.putString(key, (String) value);\n        } else if (value instanceof Boolean) {\n            option.putBoolean(key, (Boolean) value);\n        } else if (value instanceof Long) {\n            option.putLong(key, (Long) value);\n        } else if (value instanceof Double) {\n            option.putDouble(key, (Double) value);\n        } else if (value instanceof Parcelable) {\n            option.putParcelable(key, (Parcelable) value);\n        } else if (value instanceof Serializable) {\n            option.putSerializable(key, (Serializable) value);\n        } else {\n            option.putString(key, serializeObject(value));\n        }\n        return option.open(this);\n    }\n\n    /**\n     * 打开页面\n     *\n     * @param clazz          页面的类\n     * @param addToBackStack 是否加入回退栈\n     * @param key            入参的键\n     * @param value          入参的值\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPage(Class<T> clazz, boolean addToBackStack, String key, String value) {\n        return new PageOption(clazz)\n                .setAddToBackStack(addToBackStack)\n                .putString(key, value)\n                .open(this);\n    }\n\n    /**\n     * 打开页面\n     *\n     * @param clazz 页面的类\n     * @param key   入参的键\n     * @param value 入参的值\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPage(Class<T> clazz, String key, Object value) {\n        return openPage(clazz, true, key, value);\n    }\n\n    /**\n     * 打开页面\n     *\n     * @param clazz          页面的类\n     * @param addToBackStack 是否加入回退栈\n     * @param key            入参的键\n     * @param value          入参的值\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPage(Class<T> clazz, boolean addToBackStack, String key, Object value) {\n        PageOption option = new PageOption(clazz).setAddToBackStack(addToBackStack);\n        return openPage(option, key, value);\n    }\n\n    /**\n     * 打开页面\n     *\n     * @param clazz 页面的类\n     * @param key   入参的键\n     * @param value 入参的值\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPage(Class<T> clazz, String key, String value) {\n        return new PageOption(clazz)\n                .putString(key, value)\n                .open(this);\n    }\n\n    /**\n     * 打开页面,需要结果返回\n     *\n     * @param clazz       页面的类\n     * @param key         入参的键\n     * @param value       入参的值\n     * @param requestCode 请求码\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPageForResult(Class<T> clazz, String key, Object value, int requestCode) {\n        PageOption option = new PageOption(clazz).setRequestCode(requestCode);\n        return openPage(option, key, value);\n    }\n\n    /**\n     * 打开页面,需要结果返回\n     *\n     * @param clazz       页面的类\n     * @param key         入参的键\n     * @param value       入参的值\n     * @param requestCode 请求码\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPageForResult(Class<T> clazz, String key, String value, int requestCode) {\n        return new PageOption(clazz)\n                .setRequestCode(requestCode)\n                .putString(key, value)\n                .open(this);\n    }\n\n    /**\n     * 打开页面,需要结果返回\n     *\n     * @param clazz       页面的类\n     * @param requestCode 请求码\n     * @param <T>\n     * @return\n     */\n    public <T extends XPageFragment> Fragment openPageForResult(Class<T> clazz, int requestCode) {\n        return new PageOption(clazz)\n                .setRequestCode(requestCode)\n                .open(this);\n    }\n\n    /**\n     * 序列化对象\n     *\n     * @param object 需要序列化的对象\n     * @return 序列化结果\n     */\n    public String serializeObject(Object object) {\n        return XRouter.getInstance().navigation(SerializationService.class).object2Json(object);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/core/SimpleListAdapter.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.core;\n\nimport android.content.Context;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.xuexiang.xtaskdemo.R;\nimport com.xuexiang.xui.adapter.listview.BaseListAdapter;\nimport com.xuexiang.xutil.common.StringUtils;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 主副标题显示适配器\n *\n * @author xuexiang\n * @since 2018/12/19 上午12:19\n */\npublic class SimpleListAdapter extends BaseListAdapter<Map<String, String>, SimpleListAdapter.ViewHolder> {\n\n    public static final String KEY_TITLE = \"title\";\n    public static final String KEY_SUB_TITLE = \"sub_title\";\n\n    public SimpleListAdapter(Context context, List<Map<String, String>> data) {\n        super(context, data);\n    }\n\n    @Override\n    protected ViewHolder newViewHolder(View convertView) {\n        ViewHolder holder = new ViewHolder();\n        holder.mTvTitle = convertView.findViewById(R.id.tv_title);\n        holder.mTvSubTitle = convertView.findViewById(R.id.tv_sub_title);\n        return holder;\n    }\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.adapter_item_simple_list_2;\n    }\n\n    @Override\n    protected void convert(ViewHolder holder, Map<String, String> item, int position) {\n        holder.mTvTitle.setText(item.get(KEY_TITLE));\n        if (!StringUtils.isEmpty(item.get(KEY_SUB_TITLE))) {\n            holder.mTvSubTitle.setText(item.get(KEY_SUB_TITLE));\n            holder.mTvSubTitle.setVisibility(View.VISIBLE);\n        } else {\n            holder.mTvSubTitle.setVisibility(View.GONE);\n        }\n    }\n\n    public static class ViewHolder {\n        /**\n         * 标题\n         */\n        public TextView mTvTitle;\n        /**\n         * 副标题\n         */\n        public TextView mTvSubTitle;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/CustomTaskFragment.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xpage.annotation.Page;\nimport com.xuexiang.xtask.XTask;\nimport com.xuexiang.xtask.api.TaskChainEngine;\nimport com.xuexiang.xtask.api.step.SimpleTaskStep;\nimport com.xuexiang.xtask.core.ITaskChainEngine;\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.param.impl.TaskParam;\nimport com.xuexiang.xtask.core.step.impl.TaskChainCallbackAdapter;\nimport com.xuexiang.xtask.thread.pool.cancel.ICanceller;\nimport com.xuexiang.xtaskdemo.core.BaseSimpleListFragment;\nimport com.xuexiang.xtaskdemo.fragment.task.Job;\nimport com.xuexiang.xtaskdemo.fragment.task.JobTask;\nimport com.xuexiang.xtaskdemo.fragment.task.StepATask;\nimport com.xuexiang.xtaskdemo.fragment.task.StepBTask;\nimport com.xuexiang.xutil.common.ObjectUtils;\n\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * @author xuexiang\n * @since 2/1/22 11:07 PM\n */\n@Page(name = \"自定义任务使用\\n通过继承SimpleTaskStep/AbstractTaskStep实现\")\npublic class CustomTaskFragment extends BaseSimpleListFragment {\n\n    public static final String TAG = \"CustomTaskFragment\";\n\n    private Set<String> mPool = new HashSet<>();\n\n    @Override\n    protected List<String> initSimpleData(List<String> lists) {\n        lists.add(\"简单继承SimpleTaskStep使用\");\n        lists.add(\"简单继承AbstractTaskStep使用\");\n        lists.add(\"复杂任务使用\");\n        return lists;\n    }\n\n    @Override\n    protected void onItemClick(int position) {\n        switch (position) {\n            case 0:\n                doSimpleTaskStep();\n                break;\n            case 1:\n                doSimpleAbstractTaskStep();\n                break;\n            case 2:\n                doComplexTaskStep();\n                break;\n            default:\n                break;\n        }\n    }\n\n    /**\n     * 简单继承SimpleTaskStep使用\n     */\n    private void doSimpleTaskStep() {\n        final TaskChainEngine engine = XTask.getTaskChain();\n        ICanceller canceller = engine\n                .addTask(new SimpleTaskStep(\"TaskStep1\", ThreadType.ASYNC_IO) {\n                    @Override\n                    public void doTask() throws Exception {\n                        Log.e(CustomTaskFragment.TAG, \"doing TaskStep1...., thread:\" + Thread.currentThread().getName());\n                        // 模拟耗时\n                        try {\n                            Thread.sleep(2000);\n                        } catch (InterruptedException e) {\n                            e.printStackTrace();\n                        }\n                        getTaskParam().put(StepATask.KEY_TOTAL, 123);\n                    }\n                })\n                .addTask(new SimpleTaskStep(\"TaskStep2\", ThreadType.SYNC) {\n                    @Override\n                    public void doTask() throws Exception {\n                        Log.e(CustomTaskFragment.TAG, \"doing TaskStep2...., thread:\" + Thread.currentThread().getName());\n                        // 模拟耗时\n                        try {\n                            Thread.sleep(1000);\n                        } catch (InterruptedException e) {\n                            e.printStackTrace();\n                        }\n                        ITaskParam param = getTaskParam();\n                        param.put(StepATask.KEY_TOTAL, param.getInt(StepATask.KEY_TOTAL) + 321);\n                        notifyTaskSucceed();\n                    }\n\n                    @Override\n                    protected boolean isAutoNotify() {\n                        // 设置手动通知执行结果\n                        return false;\n                    }\n                })\n                .setTaskChainCallback(new TaskChainCallbackAdapter() {\n                    @Override\n                    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                        Log.e(TAG, \"task chain completed, thread:\" + Thread.currentThread().getName() + \", result:\" + result.getDataStore().getInt(StepATask.KEY_TOTAL));\n                    }\n                })\n                .start();\n        addCanceller(canceller);\n    }\n\n    /**\n     * 简单继承AbstractTaskStep使用\n     */\n    private void doSimpleAbstractTaskStep() {\n        final TaskChainEngine engine = XTask.getTaskChain();\n        ICanceller canceller = engine.addTask(new StepATask())\n                .addTask(new StepBTask())\n                .setTaskChainCallback(new TaskChainCallbackAdapter() {\n                    @Override\n                    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                        Log.e(TAG, \"task chain completed, result:\" + result.getDataStore().getInt(StepATask.KEY_TOTAL));\n                    }\n                })\n                .start();\n        addCanceller(canceller);\n    }\n\n    /**\n     * 复杂任务使用\n     */\n    private void doComplexTaskStep() {\n        final TaskChainEngine engine = XTask.getTaskChain();\n        TaskParam taskParam = TaskParam.get(Job.KEY_JOB_TARGET, 100);\n        engine.setTaskParam(taskParam);\n        for (int i = 0; i < 5; i++) {\n            engine.addTask(new JobTask());\n        }\n        ICanceller canceller = engine.setTaskChainCallback(new TaskChainCallbackAdapter() {\n            @Override\n            public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                Log.e(TAG, \"task chain completed, result:\" + result.getDataStore().getInt(Job.KEY_JOB_TARGET));\n            }\n        }).start();\n        addCanceller(canceller);\n    }\n\n    private void addCanceller(ICanceller canceller) {\n        if (canceller != null) {\n            mPool.add(canceller.getName());\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        if (!ObjectUtils.isEmpty(mPool)) {\n            XTask.cancelTaskChain(mPool);\n        }\n        super.onDestroyView();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/MainFragment.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment;\n\nimport android.view.KeyEvent;\n\nimport com.xuexiang.xtaskdemo.core.BaseContainerFragment;\nimport com.xuexiang.xtaskdemo.utils.XToastUtils;\nimport com.xuexiang.xpage.annotation.Page;\nimport com.xuexiang.xpage.enums.CoreAnim;\nimport com.xuexiang.xui.widget.actionbar.TitleBar;\nimport com.xuexiang.xutil.XUtil;\nimport com.xuexiang.xutil.common.ClickUtils;\n\n/**\n * 主页面\n *\n * @author xuexiang\n * @since 2018/11/7 下午1:16\n */\n@Page(name = \"XTask\", anim = CoreAnim.none)\npublic class MainFragment extends BaseContainerFragment implements ClickUtils.OnClick2ExitListener {\n\n    @Override\n    protected Class[] getPagesClasses() {\n        return new Class[]{\n                //此处填写fragment\n                XTaskStepFragment.class,\n                CustomTaskFragment.class,\n                UseCaseFragment.class,\n                XTaskThreadFragment.class,\n                TestThreadPoolFragment.class\n        };\n    }\n\n    @Override\n    protected TitleBar initTitle() {\n        return super.initTitle().setLeftClickListener(view -> ClickUtils.exitBy2Click(2000, this));\n    }\n\n\n    /**\n     * 菜单、返回键响应\n     */\n    @Override\n    public boolean onKeyDown(int keyCode, KeyEvent event) {\n        if (keyCode == KeyEvent.KEYCODE_BACK) {\n            ClickUtils.exitBy2Click(2000, this);\n        }\n        return true;\n    }\n\n    @Override\n    public void onRetry() {\n        XToastUtils.toast(\"再按一次退出程序\");\n    }\n\n    @Override\n    public void onExit() {\n        XUtil.exitApp();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/TestThreadPoolFragment.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment;\n\nimport android.util.Log;\n\nimport com.xuexiang.xpage.annotation.Page;\nimport com.xuexiang.xtask.thread.priority.IPriority;\nimport com.xuexiang.xtask.thread.pool.PriorityThreadPoolExecutor;\nimport com.xuexiang.xtaskdemo.core.BaseSimpleListFragment;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.ArrayBlockingQueue;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * 线程池测试页面\n *\n * @author xuexiang\n * @since 2019-07-08 00:52\n */\n@Page(name = \"线程池测试页面\")\npublic class TestThreadPoolFragment extends BaseSimpleListFragment {\n\n    private static final String TAG = \"TestFragment\";\n\n    @Override\n    protected List<String> initSimpleData(List<String> lists) {\n        lists.add(\"优先级线程池测试Runnable的优先级执行\");\n        lists.add(\"普通线程池测试Runnable的执行\");\n        lists.add(\"测试线程池利用率\");\n        lists.add(\"线程优先级\");\n        return lists;\n    }\n\n    @Override\n    protected void onItemClick(int position) {\n        final Runnable r1 = getRunnable(\"r1\");\n        final Runnable r2 = getRunnable(\"r2\");\n        final Runnable r3 = getRunnable(\"r3\");\n        final Runnable r4 = getRunnable(\"r4\");\n        final Runnable r5 = getRunnable(\"r5\");\n\n        switch (position) {\n            case 0:\n                PriorityThreadPoolExecutor executor = PriorityThreadPoolExecutor.newBuilder(1).build();\n                // 优先级大的优先执行\n                executor.execute(r5, 1);\n                Log.d(TAG, \"==== add r5 ====\");\n                executor.execute(r4, 2);\n                Log.d(TAG, \"==== add r4 ====\");\n                executor.execute(r3, 3);\n                Log.d(TAG, \"==== add r3 ====\");\n                executor.execute(r2, 4);\n                Log.d(TAG, \"==== add r2 ====\");\n                executor.execute(r1, 5);\n                Log.d(TAG, \"==== add r1 ====\");\n                break;\n            case 1:\n                ExecutorService executorService = Executors.newSingleThreadExecutor();\n                executorService.execute(r5);\n                Log.d(TAG, \"==== add r5 ====\");\n                executorService.execute(r4);\n                Log.d(TAG, \"==== add r4 ====\");\n                executorService.execute(r3);\n                Log.d(TAG, \"==== add r3 ====\");\n                executorService.execute(r2);\n                Log.d(TAG, \"==== add r2 ====\");\n                executorService.execute(r1);\n                Log.d(TAG, \"==== add r1 ====\");\n                break;\n            case 2:\n                Log.d(TAG, \"cpu count:\" + Runtime.getRuntime().availableProcessors());\n                // 任务的最大数量 = maximumPoolSize + BlockingQueue.size, 这里length>30就会报错\n                int length = 30;\n                ExecutorService fixedThreadPool = new ThreadPoolExecutor(5, 20,\n                        30L, TimeUnit.SECONDS,\n                        new ArrayBlockingQueue<>(10));\n                List<Runnable> list = new ArrayList<>(length);\n                for (int i = 0; i < length; i++) {\n                    list.add(getRunnable(\"r\" + i));\n                }\n                for (int i = 0; i < list.size(); i++) {\n                    fixedThreadPool.execute(list.get(i));\n                }\n                break;\n            case 3:\n                Thread thread1 = new Thread(() -> {\n                    Log.e(TAG, \"MIN_PRIORITY start...\");\n                });\n                thread1.setPriority(Thread.MIN_PRIORITY);\n\n                Thread thread2 = new Thread(() -> {\n                    Log.e(TAG, \"NORM_PRIORITY start...\");\n                });\n                thread2.setPriority(Thread.NORM_PRIORITY);\n\n                Thread thread3 = new Thread(() -> {\n                    Log.e(TAG, \"MAX_PRIORITY start...\");\n                });\n                thread3.setPriority(Thread.MAX_PRIORITY);\n\n                thread1.start();\n                thread2.start();\n                thread3.start();\n\n                break;\n            default:\n                break;\n        }\n    }\n\n    private static Runnable getRunnable(final String name) {\n\n        return new Runnable() {\n            @Override\n            public void run() {\n                Integer priority = getPriority(this);\n                if (priority != null) {\n                    Log.d(TAG, \"==[execute start]== \" + name + \", priority=\" + priority);\n                } else {\n                    Log.d(TAG, \"==[execute start]== \" + name);\n                }\n                // 模拟复杂处理任务\n                // Simulate processing tasks\n                int a = 0;\n                for (int i = 0; i < 100000000; i++) {\n                    a += 1;\n                }\n                if (priority != null) {\n                    Log.d(TAG, \"execute end \" + name + \", priority=\" + priority);\n                } else {\n                    Log.d(TAG, \"execute end \" + name);\n                }\n\n            }\n        };\n    }\n\n    private static Integer getPriority(Object o) {\n        if (o instanceof IPriority) {\n            return ((IPriority) o).priority();\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/UseCaseFragment.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment;\n\nimport com.xuexiang.xpage.annotation.Page;\nimport com.xuexiang.xtaskdemo.core.BaseContainerFragment;\nimport com.xuexiang.xtaskdemo.fragment.usecase.AppStartFragment;\nimport com.xuexiang.xtaskdemo.fragment.usecase.ComplexBusinessFragment;\nimport com.xuexiang.xtaskdemo.fragment.usecase.ConcurrentProcessFragment;\n\n/**\n * @author xuexiang\n * @since 2/23/22 12:21 AM\n */\n@Page(name = \"应用场景\\n列举常用的使用案例\")\npublic class UseCaseFragment extends BaseContainerFragment {\n\n    @Override\n    protected Class[] getPagesClasses() {\n        return new Class[]{\n                AppStartFragment.class,\n                ComplexBusinessFragment.class,\n                ConcurrentProcessFragment.class\n        };\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/XTaskStepFragment.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xpage.annotation.Page;\nimport com.xuexiang.xtask.XTask;\nimport com.xuexiang.xtask.api.TaskChainEngine;\nimport com.xuexiang.xtask.api.step.ConcurrentGroupTaskStep;\nimport com.xuexiang.xtask.api.step.SerialGroupTaskStep;\nimport com.xuexiang.xtask.api.step.XTaskStep;\nimport com.xuexiang.xtask.core.ITaskChainEngine;\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.param.impl.TaskParam;\nimport com.xuexiang.xtask.core.param.impl.TaskResult;\nimport com.xuexiang.xtask.core.step.impl.TaskChainCallbackAdapter;\nimport com.xuexiang.xtask.core.step.impl.TaskCommand;\nimport com.xuexiang.xtask.thread.pool.cancel.ICanceller;\nimport com.xuexiang.xtaskdemo.core.BaseSimpleListFragment;\nimport com.xuexiang.xutil.common.ObjectUtils;\n\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * 使用XTaskStep可以让你使用起来更方便\n *\n * @author xuexiang\n * @since 1/20/22 12:24 AM\n */\n@Page(name = \"XTaskStep任务使用\\n通过XTaskStep进行简化使用\")\npublic class XTaskStepFragment extends BaseSimpleListFragment {\n\n    private static final String TAG = \"TaskFragment\";\n\n    private Set<String> mPool = new HashSet<>();\n\n    @Override\n    protected List<String> initSimpleData(List<String> lists) {\n        lists.add(\"简单任务链使用\");\n        lists.add(\"任务链参数传递\");\n        lists.add(\"任务线程控制\");\n        lists.add(\"简单的串行任务组使用\");\n        lists.add(\"简单的并行任务组使用\");\n        lists.add(\"任务执行失败\");\n        lists.add(\"任务执行发生异常\");\n        return lists;\n    }\n\n    @Override\n    protected void onItemClick(int position) {\n        switch (position) {\n            case 0:\n                doSimpleTaskChain();\n                break;\n            case 1:\n                doParamTaskChain();\n                break;\n            case 2:\n                doThreadTypeTaskChain();\n                break;\n            case 3:\n                doSerialGroupTaskChain();\n                break;\n            case 4:\n                doConcurrentGroupTaskChain();\n                break;\n            case 5:\n                doTaskFailed();\n                break;\n            case 6:\n                doTaskException();\n                break;\n            default:\n                break;\n        }\n\n    }\n\n    /**\n     * 简单任务链的使用\n     */\n    private void doSimpleTaskChain() {\n        final TaskChainEngine engine = XTask.getTaskChain();\n        for (int i = 0; i < 5; i++) {\n            engine.addTask(XTask.getTask(new SimpleTaskCommand(1000 * i)));\n        }\n        ICanceller canceller = engine.setTaskChainCallback(new TaskChainCallbackAdapter() {\n\n            @Override\n            public boolean isCallBackOnMainThread() {\n                return false;\n            }\n\n            @Override\n            public void onTaskChainStart(@NonNull ITaskChainEngine engine) {\n                Log.e(TAG, \"task chain start\");\n            }\n\n            @Override\n            public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                Log.e(TAG, \"task chain completed, thread:\" + Thread.currentThread().getName());\n                engine.destroy();\n            }\n\n            @Override\n            public void onTaskChainError(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                Log.e(TAG, \"task chain error\");\n            }\n        }).start();\n        addCanceller(canceller);\n    }\n\n    /**\n     * 任务链参数传递，上一个任务的参数可传递至下一个任务\n     */\n    private void doParamTaskChain() {\n        final TaskChainEngine engine = XTask.getTaskChain();\n        engine.setTaskParam(TaskParam.get(\"chainName\", engine.getName()));\n        TaskParam taskParam = TaskParam.get(\"param1\", 100)\n                .put(\"param2\", true);\n        XTaskStep taskStep = XTask.getTask(new TaskCommand() {\n            @Override\n            public void run() {\n                ITaskParam param = getTaskParam();\n                Log.e(TAG, getName() + \"  start, param1:\" + param.get(\"param1\") + \", chainName:\" + param.get(\"chainName\"));\n                param.put(\"param1\", 200);\n                param.put(\"param3\", \"this is param3!\");\n            }\n        }, taskParam);\n        engine.addTask(taskStep)\n                .addTask(XTask.getTask(new TaskCommand() {\n                    @Override\n                    public void run() {\n                        ITaskParam param = getTaskParam();\n                        Log.e(TAG, getName() + \"  start, param1:\" + param.get(\"param1\") + \", param3:\" + param.get(\"param3\"));\n                        param.put(\"param2\", false);\n                    }\n                }));\n        ICanceller canceller = engine.setTaskChainCallback(new TaskChainCallbackAdapter() {\n            @Override\n            public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                Log.e(TAG, \"task chain completed, thread:\" + Thread.currentThread().getName());\n                Map<String, Object> data = result.getDataStore().getData();\n                for (Map.Entry<String, Object> entry : data.entrySet()) {\n                    Log.e(TAG, \"key:\" + entry.getKey() + \", value:\" + entry.getValue());\n                }\n            }\n        }).start();\n        addCanceller(canceller);\n    }\n\n    /**\n     * 任务线程控制\n     */\n    private void doThreadTypeTaskChain() {\n        final TaskChainEngine engine = XTask.getTaskChain();\n        ICanceller canceller = engine.addTask(XTask.getTask(new SimpleTaskCommand(1000), ThreadType.ASYNC))\n                .addTask(XTask.getTask(new SimpleTaskCommand(1000), ThreadType.ASYNC_EMERGENT))\n                .addTask(XTask.getTask(new SimpleTaskCommand(200), ThreadType.MAIN))\n                .addTask(XTask.getTask(new SimpleTaskCommand(1000), ThreadType.ASYNC_IO))\n                .addTask(XTask.getTask(new SimpleTaskCommand(1000), ThreadType.SYNC))\n                .addTask(XTask.getTask(new SimpleTaskCommand(1000), ThreadType.ASYNC_BACKGROUND))\n                .setTaskChainCallback(new TaskChainCallbackAdapter() {\n                    @Override\n                    public void onTaskChainStart(@NonNull ITaskChainEngine engine) {\n                        Log.e(TAG, \"task chain start, thread:\" + Thread.currentThread().getName());\n                    }\n\n                    @Override\n                    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                        Log.e(TAG, \"task chain completed, thread:\" + Thread.currentThread().getName());\n                    }\n                }).start();\n        addCanceller(canceller);\n    }\n\n    /**\n     * 简单的串行任务组使用\n     */\n    private void doSerialGroupTaskChain() {\n        final TaskChainEngine engine = XTask.getTaskChain();\n        SerialGroupTaskStep group1 = XTask.getSerialGroupTask(\"group1\");\n        for (int i = 0; i < 5; i++) {\n            group1.addTask(XTask.getTask(new SimpleTaskCommand(500)));\n        }\n        SerialGroupTaskStep group2 = XTask.getSerialGroupTask(\"group2\");\n        for (int i = 0; i < 5; i++) {\n            group2.addTask(XTask.getTask(new SimpleTaskCommand(1000)));\n        }\n        ICanceller canceller = engine.addTask(group1)\n                .addTask(group2)\n                .setTaskChainCallback(new TaskChainCallbackAdapter() {\n                    @Override\n                    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                        Log.e(TAG, \"task chain completed, path:\" + result.getPath());\n                    }\n                })\n                .start();\n        addCanceller(canceller);\n    }\n\n    /**\n     * 简单的并行任务组使用\n     */\n    private void doConcurrentGroupTaskChain() {\n        final TaskChainEngine engine = XTask.getTaskChain();\n        ConcurrentGroupTaskStep group1 = XTask.getConcurrentGroupTask(\"group1\");\n        for (int i = 0; i < 5; i++) {\n            group1.addTask(XTask.getTask(new SimpleTaskCommand(100 * (i + 1))));\n        }\n        ConcurrentGroupTaskStep group2 = XTask.getConcurrentGroupTask(\"group2\");\n        for (int i = 0; i < 5; i++) {\n            group2.addTask(XTask.getTask(new SimpleTaskCommand(200 * (i + 1))));\n        }\n        ICanceller canceller = engine.addTask(group1)\n                .addTask(group2)\n                .setTaskChainCallback(new TaskChainCallbackAdapter() {\n                    @Override\n                    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                        Log.e(TAG, \"task chain completed, path:\" + result.getPath());\n                    }\n                })\n                .start();\n        addCanceller(canceller);\n    }\n\n\n    /**\n     * 任务执行失败，整个链路都停止工作\n     */\n    private void doTaskFailed() {\n        final TaskChainEngine engine = XTask.getTaskChain();\n        for (int i = 0; i < 5; i++) {\n            int finalI = i;\n            engine.addTask(XTask.getTask(new TaskCommand() {\n                @Override\n                public void run() {\n                    try {\n                        Thread.sleep(1000);\n                    } catch (InterruptedException e) {\n                        e.printStackTrace();\n                    }\n                    if (finalI == 2) {\n                        notifyTaskFailed(404, \"任务执行失败!\");\n                    } else {\n                        notifyTaskSucceed(TaskResult.succeed());\n                    }\n                }\n            }, false));\n        }\n        ICanceller canceller = engine.setTaskChainCallback(new TaskChainCallbackAdapter() {\n            @Override\n            public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                Log.e(TAG, \"task chain completed, thread:\" + Thread.currentThread().getName());\n            }\n\n            @Override\n            public void onTaskChainError(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                Log.e(TAG, \"task chain error, \" + result.getDetailMessage());\n            }\n        }).start();\n        addCanceller(canceller);\n    }\n\n    private void doTaskException() {\n        final TaskChainEngine engine = XTask.getTaskChain();\n        for (int i = 0; i < 5; i++) {\n            int finalI = i;\n            engine.addTask(XTask.getTask(new TaskCommand() {\n                @Override\n                public void run() throws Exception {\n                    try {\n                        Thread.sleep(1000);\n                    } catch (InterruptedException e) {\n                        e.printStackTrace();\n                    }\n                    if (finalI == 2) {\n                        throw new Exception(\"执行出现异常!\");\n                    }\n                }\n            }));\n        }\n        ICanceller canceller = engine.setTaskChainCallback(new TaskChainCallbackAdapter() {\n            @Override\n            public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                Log.e(TAG, \"task chain completed, thread:\" + Thread.currentThread().getName());\n            }\n\n            @Override\n            public void onTaskChainError(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                Log.e(TAG, \"task chain error, \" + result.getDetailMessage());\n            }\n        }).start();\n        addCanceller(canceller);\n    }\n\n    private void addCanceller(ICanceller canceller) {\n        if (canceller != null) {\n            mPool.add(canceller.getName());\n        }\n    }\n\n    private static class SimpleTaskCommand extends TaskCommand {\n\n        private long mDuring;\n\n        private SimpleTaskCommand(long during) {\n            mDuring = during;\n        }\n\n        @Override\n        public void run() {\n            Log.e(TAG, getName() + \"  start...thread:\" + Thread.currentThread().getName());\n            try {\n                Thread.sleep(mDuring);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            Log.e(TAG, getName() + \"  end...\");\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        if (!ObjectUtils.isEmpty(mPool)) {\n            XTask.cancelTaskChain(mPool);\n        }\n        super.onDestroyView();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/XTaskThreadFragment.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment;\n\nimport android.util.Log;\n\nimport com.xuexiang.xpage.annotation.Page;\nimport com.xuexiang.xtask.XTask;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\nimport com.xuexiang.xtask.thread.utils.CancelUtils;\nimport com.xuexiang.xtaskdemo.core.BaseSimpleListFragment;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * 使用XTask进行线程池操作\n *\n * @author xuexiang\n * @since 3/20/22 2:22 AM\n */\n@Page(name = \"XTask线程池使用\\nXTask拥有丰富的线程调度方法\")\npublic class XTaskThreadFragment extends BaseSimpleListFragment {\n\n    private static final String TAG = \"XTaskThreadFragment\";\n\n    private List<ICancelable> mCancelableList = new ArrayList<>();\n\n    @Override\n    protected List<String> initSimpleData(List<String> lists) {\n        lists.add(\"普通异步执行\");\n        lists.add(\"紧急异步执行\");\n        lists.add(\"后台异步执行\");\n        lists.add(\"优先级异步执行\");\n        lists.add(\"主线程延迟执行\");\n        lists.add(\"子线程延迟执行\");\n        lists.add(\"周期执行(固定间期)\");\n        lists.add(\"周期执行(固定延期)\");\n        return lists;\n    }\n\n    @Override\n    protected void onItemClick(int position) {\n        switch (position) {\n            case 0:\n                doNormalAsync();\n                break;\n            case 1:\n                doEmergentAsync();\n                break;\n            case 2:\n                doBackgroundAsync();\n                break;\n            case 3:\n                doPriorityAsync();\n                break;\n            case 4:\n                doDelayOnMainThread();\n                break;\n            case 5:\n                doDelay();\n                break;\n            case 6:\n                doPollingFixedRate();\n                break;\n            case 7:\n                doPollingFixedDelay();\n                break;\n            default:\n                break;\n        }\n    }\n\n    private void doNormalAsync() {\n        Log.e(TAG, \"doNormalAsync start...\");\n        ICancelable cancelable = XTask.submit(() -> {\n            Log.e(TAG, \"Async task start, thread:\" + Thread.currentThread().getName());\n            mockProcess(2000);\n        });\n        mCancelableList.add(cancelable);\n    }\n\n    private void doEmergentAsync() {\n        Log.e(TAG, \"doEmergentAsync start...\");\n        ICancelable cancelable = XTask.emergentSubmit(() -> {\n            Log.e(TAG, \"Emergent task start, thread:\" + Thread.currentThread().getName());\n            mockProcess(2000);\n        });\n        mCancelableList.add(cancelable);\n    }\n\n    private void doBackgroundAsync() {\n        Log.e(TAG, \"doBackgroundAsync start...\");\n        ICancelable cancelable = XTask.backgroundSubmit(() -> {\n            Log.e(TAG, \"Background task start, thread:\" + Thread.currentThread().getName());\n            mockProcess(2000);\n        });\n        mCancelableList.add(cancelable);\n    }\n\n    private void doPriorityAsync() {\n        Log.e(TAG, \"doPriorityAsync start...\");\n        ICancelable cancelable = XTask.submit(() -> {\n            Log.e(TAG, \"Priority task start, thread:\" + Thread.currentThread().getName());\n            mockProcess(2000);\n        }, 10);\n        mCancelableList.add(cancelable);\n    }\n\n    private void doDelayOnMainThread() {\n        Log.e(TAG, \"doDelayOnMainThread start...\");\n        ICancelable cancelable = XTask.postToMainDelay(() -> {\n            Log.e(TAG, \"Delay task start, thread:\" + Thread.currentThread().getName());\n        }, 2000);\n        mCancelableList.add(cancelable);\n    }\n\n    private void doDelay() {\n        Log.e(TAG, \"doDelay start...\");\n        ICancelable cancelable = XTask.schedule(() -> {\n            Log.e(TAG, \"Delay task start, thread:\" + Thread.currentThread().getName());\n            mockProcess(2000);\n        }, 2, TimeUnit.SECONDS);\n        mCancelableList.add(cancelable);\n    }\n\n    private void doPollingFixedRate() {\n        Log.e(TAG, \"doPollingFixedRate start...\");\n        ICancelable cancelable = XTask.scheduleAtFixedRate(() -> {\n            Log.e(TAG, \"FixedRate task start, thread:\" + Thread.currentThread().getName());\n            mockProcess(2000);\n        }, 0, 2, TimeUnit.SECONDS);\n        mCancelableList.add(cancelable);\n    }\n\n    private void doPollingFixedDelay() {\n        Log.e(TAG, \"doPollingFixedDelay start...\");\n        ICancelable cancelable = XTask.scheduleWithFixedDelay(() -> {\n            Log.e(TAG, \"FixedDelay task start, thread:\" + Thread.currentThread().getName());\n            mockProcess(2000);\n        }, 0, 2, TimeUnit.SECONDS);\n        mCancelableList.add(cancelable);\n    }\n\n    /**\n     * 模拟执行\n     *\n     * @param time 模拟执行所需要的时间\n     */\n    public void mockProcess(long time) {\n        try {\n            Thread.sleep(time);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        CancelUtils.cancel(mCancelableList);\n        super.onDestroyView();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/task/Job.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.task;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.impl.TaskResult;\nimport com.xuexiang.xtask.core.step.ITaskStepController;\nimport com.xuexiang.xtaskdemo.fragment.CustomTaskFragment;\n\n/**\n * 模拟复杂的任务\n *\n * @author xuexiang\n * @since 2/9/22 11:22 PM\n */\npublic class Job implements Runnable {\n\n    public static final String KEY_JOB_TARGET = \"key_job_target\";\n\n    private ITaskStepController mController;\n\n    public Job(@NonNull ITaskStepController controller) {\n        mController = controller;\n    }\n\n    @Override\n    public void run() {\n        ITaskParam taskParam = mController.getTaskParam();\n        int target = taskParam.getInt(KEY_JOB_TARGET);\n        Log.e(CustomTaskFragment.TAG, \"Job is running..., target:\" + target);\n        // 模拟耗时\n        try {\n            Thread.sleep(2000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n        taskParam.put(KEY_JOB_TARGET, target + 10);\n        mController.notifyTaskSucceed(TaskResult.succeed());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/task/JobTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.task;\n\nimport com.xuexiang.xtask.api.step.SimpleTaskStep;\n\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * 模拟复杂任务\n *\n * @author xuexiang\n * @since 2/9/22 11:22 PM\n */\npublic class JobTask extends SimpleTaskStep {\n\n    private static final AtomicInteger TASK_NUMBER = new AtomicInteger(1);\n\n    /**\n     * 构造方法\n     */\n    public JobTask() {\n        super(\"CallBackTask-\" + TASK_NUMBER.getAndIncrement());\n    }\n\n\n    @Override\n    public void doTask() throws Exception {\n        new Job(this).run();\n    }\n\n    @Override\n    protected boolean isAutoNotify() {\n        return false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/task/StepATask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.task;\n\nimport android.util.Log;\n\nimport com.xuexiang.xtask.core.param.impl.TaskResult;\nimport com.xuexiang.xtask.core.step.impl.AbstractTaskStep;\nimport com.xuexiang.xtaskdemo.fragment.CustomTaskFragment;\n\n/**\n * 步骤A任务\n *\n * @author xuexiang\n * @since 2/9/22 1:37 AM\n */\npublic class StepATask extends AbstractTaskStep {\n\n    public static final String KEY_TOTAL = \"total\";\n\n    @Override\n    public void doTask() throws Exception {\n        Log.e(CustomTaskFragment.TAG, \"doing StepA task!\");\n        // 增加参数\n        getTaskParam().put(KEY_TOTAL, 10);\n        // 通知任务链任务完成\n        notifyTaskSucceed(TaskResult.succeed());\n    }\n\n    @Override\n    public String getName() {\n        return \"StepATask\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/task/StepBTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.task;\n\nimport android.util.Log;\n\nimport com.xuexiang.xtask.core.param.impl.TaskResult;\nimport com.xuexiang.xtask.core.step.impl.AbstractTaskStep;\nimport com.xuexiang.xtaskdemo.fragment.CustomTaskFragment;\n\n/**\n * 步骤B任务\n *\n * @author xuexiang\n * @since 2/9/22 1:42 AM\n */\npublic class StepBTask extends AbstractTaskStep {\n\n    @Override\n    public void doTask() throws Exception {\n        Log.e(CustomTaskFragment.TAG, \"doing StepB task!\");\n        // 获取参数进行处理\n        int total = getTaskParam().getInt(StepATask.KEY_TOTAL) + 20;\n        Log.e(CustomTaskFragment.TAG, \"total:\" + total);\n        // 更新结果\n        getTaskParam().put(StepATask.KEY_TOTAL, total);\n        notifyTaskSucceed(TaskResult.succeed());\n    }\n\n    @Override\n    public String getName() {\n        return \"StepBTask\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/AppStartFragment.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase;\n\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xaop.annotation.SingleClick;\nimport com.xuexiang.xpage.annotation.Page;\nimport com.xuexiang.xtask.XTask;\nimport com.xuexiang.xtask.api.step.ConcurrentGroupTaskStep;\nimport com.xuexiang.xtask.core.ITaskChainEngine;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.step.impl.TaskChainCallbackAdapter;\nimport com.xuexiang.xtask.core.step.impl.TaskCommand;\nimport com.xuexiang.xtaskdemo.R;\nimport com.xuexiang.xtaskdemo.core.BaseFragment;\nimport com.xuexiang.xtaskdemo.fragment.usecase.appstart.job.LongTimeJob;\nimport com.xuexiang.xtaskdemo.fragment.usecase.appstart.job.SingleJob;\nimport com.xuexiang.xtaskdemo.fragment.usecase.appstart.job.TopPriorityJob;\nimport com.xuexiang.xtaskdemo.fragment.usecase.appstart.task.AsyncInitTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.appstart.task.MainInitTask;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\nimport butterknife.BindView;\nimport butterknife.OnClick;\n\n/**\n * 应用冷启动优化\n * <p>\n * 所谓的应用冷启动优化，最主要的就是减少应用在初始化应用在主线程中所占用的时间。\n * 针对一些耗时的操作，我们常用的优化策略是：\n * 1.同步主线程执行 -> 异步子线程执行\n * 2.串行操作 -> 并行操作\n * 3.预加载 -> 懒加载\n * 4.业务流程优化（按业务的优先级调整执行顺序）\n * 5.数据结构优化（减少加载时间）\n *\n * @author xuexiang\n * @since 2/23/22 12:26 AM\n */\n@Page(name = \"应用冷启动优化\")\npublic class AppStartFragment extends BaseFragment {\n\n    @BindView(R.id.logger)\n    LoggerTextView logger;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.fragment_usecase_template;\n    }\n\n    @Override\n    protected void initViews() {\n\n\n    }\n\n    @SingleClick\n    @OnClick({R.id.btn_before_improve, R.id.btn_after_improve})\n    public void onViewClicked(View view) {\n        clearLog();\n        log(\"开始执行任务...\");\n        final long startTime = System.currentTimeMillis();\n        switch (view.getId()) {\n            case R.id.btn_before_improve:\n                doJobBeforeImprove(startTime);\n                break;\n            case R.id.btn_after_improve:\n                doJobAfterImprove(startTime);\n                break;\n            default:\n                break;\n        }\n    }\n\n\n    /**\n     * 优化前的写法, 这里仅是演示模拟，实际的可能更复杂\n     */\n    private void doJobBeforeImprove(long startTime) {\n        new TopPriorityJob(logger).doJob();\n        for (int i = 0; i < 4; i++) {\n            new SingleJob((i + 1), logger).doJob();\n        }\n        new LongTimeJob(logger).doJob();\n        log(\"任务执行完毕，总共耗时:\" + (System.currentTimeMillis() - startTime) + \"ms\");\n    }\n\n    /**\n     * 优化后的写法, 这里仅是演示模拟，实际的可能更复杂\n     */\n    private void doJobAfterImprove(final long startTime) {\n        ConcurrentGroupTaskStep groupTaskStep = XTask.getConcurrentGroupTask();\n        for (int i = 0; i < 4; i++) {\n            int finalI = i;\n            groupTaskStep.addTask(XTask.getTask(new TaskCommand() {\n                @Override\n                public void run() throws Exception {\n                    new SingleJob((finalI + 1), logger).doJob();\n                }\n            }));\n        }\n        XTask.getTaskChain()\n                .addTask(new MainInitTask(logger))\n                .addTask(groupTaskStep)\n                .addTask(new AsyncInitTask(logger))\n                .setTaskChainCallback(new TaskChainCallbackAdapter() {\n                    @Override\n                    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                        log(\"任务完全执行完毕，总共耗时:\" + (System.currentTimeMillis() - startTime) + \"ms\");\n                    }\n                }).start();\n        log(\"主线程任务执行完毕，总共耗时:\" + (System.currentTimeMillis() - startTime) + \"ms\");\n    }\n\n    public void log(String logContent) {\n        if (logger != null) {\n            logger.logSuccess(logContent);\n        }\n    }\n\n    public void clearLog() {\n        if (logger != null) {\n            logger.clearLog();\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        XTask.cancelAllTaskChain();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/ComplexBusinessFragment.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase;\n\nimport android.util.Pair;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xaop.annotation.SingleClick;\nimport com.xuexiang.xpage.annotation.Page;\nimport com.xuexiang.xtask.XTask;\nimport com.xuexiang.xtask.core.ITaskChainEngine;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.param.impl.TaskParam;\nimport com.xuexiang.xtask.core.step.impl.TaskChainCallbackAdapter;\nimport com.xuexiang.xtaskdemo.R;\nimport com.xuexiang.xtaskdemo.core.BaseFragment;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.ProductFactory;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.ProductInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.GetProductInfoProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.GivePriceProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.PublicProductProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.SearchFactoryProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.GetProductInfoTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.GivePriceTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.ProductTaskConstants;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.PublicProductTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.SearchFactoryTask;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\nimport com.xuexiang.xutil.system.AppExecutors;\n\nimport butterknife.BindView;\nimport butterknife.OnClick;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n/**\n * 复杂业务流程处理\n *\n * 案例[高仿网红产品]的流程如下：\n * 1.获取产品信息 -> 2.查询可生产的工厂 -> 3.联系工厂生产产品 -> 4.送去市场部门评估售价 -> 5.产品上市\n *\n * @author xuexiang\n * @since 3/18/22 11:28 PM\n */\n@Page(name = \"复杂业务流程处理\")\npublic class ComplexBusinessFragment extends BaseFragment {\n\n    @BindView(R.id.logger)\n    LoggerTextView logger;\n\n    private String productId = \"123456\";\n\n    private Disposable disposable;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.fragment_usecase_compare;\n    }\n\n    @Override\n    protected void initViews() {\n\n    }\n\n    @SingleClick\n    @OnClick({R.id.btn_normal, R.id.btn_rxjava, R.id.btn_xtask})\n    public void onViewClicked(View view) {\n        clearLog();\n        log(\"开始仿冒生产网红产品...\");\n        final long startTime = System.currentTimeMillis();\n        switch (view.getId()) {\n            case R.id.btn_normal:\n                doBusinessNormal(startTime);\n                break;\n            case R.id.btn_rxjava:\n                doBusinessRxJava(startTime);\n                break;\n            case R.id.btn_xtask:\n                doBusinessXTask(startTime);\n                break;\n            default:\n                break;\n        }\n    }\n\n    /**\n     * 普通的接口回调写法, 这里仅是演示模拟，实际的可能更复杂\n     * 流程如下：\n     * 1.获取产品信息 -> 2.查询可生产的工厂 -> 3.联系工厂生产产品 -> 4.送去市场部门评估售价 -> 5.产品上市\n     */\n    private void doBusinessNormal(final long startTime) {\n        AppExecutors.get().singleIO().execute(() -> {\n            // 1.获取产品信息\n            new GetProductInfoProcessor(logger, productId).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter<ProductInfo>() {\n                @Override\n                public void onSuccess(final ProductInfo productInfo) {\n                    // 2.查询可生产的工厂\n                    new SearchFactoryProcessor(logger, productInfo).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter<ProductFactory>() {\n                        @Override\n                        public void onSuccess(final ProductFactory factory) {\n                            // 3.联系工厂生产产品\n                            log(\"开始生产产品...\");\n                            Product product = factory.produce(productInfo);\n                            // 4.送去市场部门评估售价\n                            new GivePriceProcessor(logger, product).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter<Product>() {\n                                @Override\n                                public void onSuccess(Product product) {\n                                    // 5.产品上市\n                                    PublicProductProcessor publicProductProcessor = new PublicProductProcessor(logger, product);\n                                    publicProductProcessor.setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter<Product>() {\n                                        @Override\n                                        public void onSuccess(Product product) {\n                                            log(\"总共耗时:\" + (System.currentTimeMillis() - startTime) + \"ms\");\n                                            log(\"仿冒生产网红产品完成, \" + product);\n                                        }\n                                    }).process();\n                                }\n                            }).process();\n                        }\n                    }).process();\n                }\n            }).process();\n        });\n    }\n\n\n    /**\n     * RxJava写法, 这里仅是演示模拟，实际的可能更复杂\n     * 流程如下：\n     * 1.获取产品信息 -> 2.查询可生产的工厂 -> 3.联系工厂生产产品 -> 4.送去市场部门评估售价 -> 5.产品上市\n     */\n    private void doBusinessRxJava(final long startTime) {\n        disposable = Observable.just(productId)\n                // 1.获取产品信息\n                .map(id -> new GetProductInfoProcessor(logger, id).process())\n                // 2.查询可生产的工厂\n                .map(productInfo -> new Pair<>(new SearchFactoryProcessor(logger, productInfo).process(), productInfo))\n                .map(productPair -> {\n                    // 3.联系工厂生产产品\n                    log(\"开始生产产品...\");\n                    Product product = productPair.first.produce(productPair.second);\n                    // 4.送去市场部门评估售价\n                    return new GivePriceProcessor(logger, product).process();\n                })\n                // 5.产品上市\n                .map(product -> new PublicProductProcessor(logger, product).process())\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(product -> {\n                    log(\"总共耗时:\" + (System.currentTimeMillis() - startTime) + \"ms\");\n                    log(\"仿冒生产网红产品完成, \" + product);\n                });\n    }\n\n\n    /**\n     * XTask写法, 这里仅是演示模拟，实际的可能更复杂\n     * 流程如下：\n     * 1.获取产品信息 -> 2.查询可生产的工厂 -> 3.联系工厂生产产品 -> 4.送去市场部门评估售价 -> 5.产品上市\n     */\n    private void doBusinessXTask(final long startTime) {\n        XTask.getTaskChain()\n                .setTaskParam(TaskParam.get(ProductTaskConstants.KEY_PRODUCT_ID, productId))\n                // 1.获取产品信息\n                .addTask(new GetProductInfoTask(logger))\n                // 2.查询可生产的工厂, 3.联系工厂生产产品\n                .addTask(new SearchFactoryTask(logger))\n                // 4.送去市场部门评估售价\n                .addTask(new GivePriceTask(logger))\n                // 5.产品上市\n                .addTask(new PublicProductTask(logger))\n                .setTaskChainCallback(new TaskChainCallbackAdapter() {\n                    @Override\n                    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                        log(\"总共耗时:\" + (System.currentTimeMillis() - startTime) + \"ms\");\n                        Product product = result.getDataStore().getObject(ProductTaskConstants.KEY_PRODUCT, Product.class);\n                        log(\"仿冒生产网红产品完成, \" + product);\n                    }\n                }).start();\n    }\n\n\n    public void log(String logContent) {\n        if (logger != null) {\n            logger.logSuccess(logContent);\n        }\n    }\n\n    public void clearLog() {\n        if (logger != null) {\n            logger.clearLog();\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        if (disposable != null && !disposable.isDisposed()) {\n            disposable.dispose();\n        }\n        XTask.cancelAllTaskChain();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/ConcurrentProcessFragment.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase;\n\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xaop.annotation.SingleClick;\nimport com.xuexiang.xpage.annotation.Page;\nimport com.xuexiang.xtask.XTask;\nimport com.xuexiang.xtask.core.ITaskChainEngine;\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.param.impl.TaskParam;\nimport com.xuexiang.xtask.core.step.impl.TaskChainCallbackAdapter;\nimport com.xuexiang.xtaskdemo.R;\nimport com.xuexiang.xtaskdemo.core.BaseFragment;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.ProductTaskConstants;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.BriefInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.FactoryInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.PriceInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.PromotionInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.RichInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor.GetBriefInfoProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor.GetFactoryInfoProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor.GetPriceInfoProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor.GetPromotionInfoProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor.GetRichInfoProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.task.GetBriefInfoTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.task.GetFactoryInfoTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.task.GetPriceInfoTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.task.GetPromotionInfoTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.task.GetRichInfoTask;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\nimport com.xuexiang.xutil.system.AppExecutors;\n\nimport java.util.concurrent.CountDownLatch;\n\nimport butterknife.BindView;\nimport butterknife.OnClick;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n/**\n * 复杂并发任务处理\n * <p>\n * 案例[展示商品详细信息]的流程如下：\n * <p>\n * 1.根据商品的唯一号ID获取商品简要信息\n * 2.获取商品的详细信息：\n * 2.1 获取商品的生产信息\n * 2.2 获取商品的价格信息\n * 2.3 获取商品的促销信息\n * 2.4 获取商品的富文本信息\n * 3.进行商品信息的展示\n *\n * @author xuexiang\n * @since 3/21/22 10:57 PM\n */\n@Page(name = \"复杂并发任务处理\")\npublic class ConcurrentProcessFragment extends BaseFragment {\n\n    @BindView(R.id.logger)\n    LoggerTextView logger;\n\n    private String productId = \"123456\";\n\n    private Disposable disposable;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.fragment_usecase_compare;\n    }\n\n\n    @Override\n    protected void initViews() {\n\n    }\n\n    @SingleClick\n    @OnClick({R.id.btn_normal, R.id.btn_rxjava, R.id.btn_xtask})\n    public void onViewClicked(View view) {\n        clearLog();\n        log(\"开始查询商品信息...\");\n        final long startTime = System.currentTimeMillis();\n        switch (view.getId()) {\n            case R.id.btn_normal:\n                queryInfoNormal(startTime, productId);\n                break;\n            case R.id.btn_rxjava:\n                queryInfoRxJava(startTime, productId);\n                break;\n            case R.id.btn_xtask:\n                queryInfoXTask(startTime, productId);\n                break;\n            default:\n                break;\n        }\n    }\n\n\n    /**\n     * 普通的接口回调写法, 这里仅是演示模拟，实际的可能更复杂\n     */\n    private void queryInfoNormal(final long startTime, String productId) {\n        AppExecutors.get().singleIO().execute(() -> {\n            new GetBriefInfoProcessor(logger, productId).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter<BriefInfo>() {\n                @Override\n                public void onSuccess(BriefInfo briefInfo) {\n                    final Product product = new Product(briefInfo);\n                    CountDownLatch latch = new CountDownLatch(4);\n\n                    // 2.1 获取商品的生产信息\n                    AppExecutors.get().networkIO().execute(() -> {\n                        new GetFactoryInfoProcessor(logger, product.getFactoryId()).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter<FactoryInfo>() {\n                            @Override\n                            public void onSuccess(FactoryInfo result) {\n                                product.setFactory(result);\n                                latch.countDown();\n                            }\n                        }).process();\n                    });\n                    // 2.2 获取商品的价格信息\n                    AppExecutors.get().networkIO().execute(() -> {\n                        new GetPriceInfoProcessor(logger, product.getPriceId()).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter<PriceInfo>() {\n                            @Override\n                            public void onSuccess(PriceInfo result) {\n                                product.setPrice(result);\n                                latch.countDown();\n                            }\n                        }).process();\n                    });\n                    // 2.3 获取商品的促销信息\n                    AppExecutors.get().networkIO().execute(() -> {\n                        new GetPromotionInfoProcessor(logger, product.getPromotionId()).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter<PromotionInfo>() {\n                            @Override\n                            public void onSuccess(PromotionInfo result) {\n                                product.setPromotion(result);\n                                latch.countDown();\n                            }\n                        }).process();\n                    });\n                    // 2.4 获取商品的富文本信息\n                    AppExecutors.get().networkIO().execute(() -> {\n                        new GetRichInfoProcessor(logger, product.getRichId()).setProcessorCallback(new AbstractProcessor.ProcessorCallbackAdapter<RichInfo>() {\n                            @Override\n                            public void onSuccess(RichInfo result) {\n                                product.setRich(result);\n                                latch.countDown();\n                            }\n                        }).process();\n                    });\n                    try {\n                        latch.await();\n                        log(\"总共耗时:\" + (System.currentTimeMillis() - startTime) + \"ms\");\n                        log(\"查询商品信息完成, \" + product);\n                    } catch (InterruptedException e) {\n                        e.printStackTrace();\n                    }\n                }\n            }).process();\n        });\n    }\n\n    /**\n     * RxJava写法, 这里仅是演示模拟，实际的可能更复杂\n     */\n    private void queryInfoRxJava(final long startTime, String productId) {\n        disposable = Observable.just(productId)\n                // 1.获取商品简要信息\n                .map(id -> new GetBriefInfoProcessor(logger, id).process())\n                .map(Product::new)\n                .flatMap(product ->\n                        Observable.zip(\n                                // 2.1 获取商品的生产信息\n                                Observable.fromCallable(() -> new GetFactoryInfoProcessor(logger, product.getFactoryId()).process()).subscribeOn(Schedulers.io()),\n                                // 2.2 获取商品的价格信息\n                                Observable.fromCallable(() -> new GetPriceInfoProcessor(logger, product.getPriceId()).process()).subscribeOn(Schedulers.io()),\n                                // 2.3 获取商品的促销信息\n                                Observable.fromCallable(() -> new GetPromotionInfoProcessor(logger, product.getPromotionId()).process()).subscribeOn(Schedulers.io()),\n                                // 2.4 获取商品的富文本信息\n                                Observable.fromCallable(() -> new GetRichInfoProcessor(logger, product.getRichId()).process()).subscribeOn(Schedulers.io()), (factoryInfo, priceInfo, promotionInfo, richInfo) -> product.setFactory(factoryInfo)\n                                        .setPrice(priceInfo)\n                                        .setPromotion(promotionInfo)\n                                        .setRich(richInfo)\n                        )\n                )\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(product -> {\n                    log(\"总共耗时:\" + (System.currentTimeMillis() - startTime) + \"ms\");\n                    log(\"查询商品信息完成, \" + product);\n                });\n    }\n\n    /**\n     * XTask写法, 这里仅是演示模拟，实际的可能更复杂\n     */\n    private void queryInfoXTask(final long startTime, String productId) {\n        XTask.getTaskChain()\n                .setTaskParam(TaskParam.get(ProductTaskConstants.KEY_PRODUCT_ID, productId))\n                // 1.获取商品简要信息\n                .addTask(new GetBriefInfoTask(logger))\n                .addTask(XTask.getConcurrentGroupTask(ThreadType.SYNC)\n                        // 2.1 获取商品的生产信息\n                        .addTask(new GetFactoryInfoTask(logger))\n                        // 2.2 获取商品的价格信息\n                        .addTask(new GetPriceInfoTask(logger))\n                        // 2.3 获取商品的促销信息\n                        .addTask(new GetPromotionInfoTask(logger))\n                        // 2.4 获取商品的富文本信息\n                        .addTask(new GetRichInfoTask(logger)))\n                .setTaskChainCallback(new TaskChainCallbackAdapter() {\n                    @Override\n                    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n                        log(\"总共耗时:\" + (System.currentTimeMillis() - startTime) + \"ms\");\n                        Product product = result.getDataStore().getObject(ProductTaskConstants.KEY_PRODUCT, Product.class);\n                        log(\"查询商品信息完成, \" + product);\n                    }\n                }).start();\n    }\n\n\n    public void log(String logContent) {\n        if (logger != null) {\n            logger.logSuccess(logContent);\n        }\n    }\n\n    public void clearLog() {\n        if (logger != null) {\n            logger.clearLog();\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        if (disposable != null && !disposable.isDisposed()) {\n            disposable.dispose();\n        }\n        XTask.cancelAllTaskChain();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/appstart/job/AbstractMockJob.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.appstart.job;\n\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 模拟任务\n *\n * @author xuexiang\n * @since 2/23/22 12:47 AM\n */\npublic abstract class AbstractMockJob {\n\n    private LoggerTextView mLogger;\n\n    public AbstractMockJob(LoggerTextView logger) {\n        mLogger = logger;\n    }\n\n    /**\n     * 模拟执行任务\n     */\n    public abstract void doJob();\n\n    public void log(String logContent) {\n        if (mLogger != null) {\n            mLogger.logNormal(logContent);\n        }\n    }\n\n\n    /**\n     * 模拟执行\n     *\n     * @param time 模拟执行所需要的时间\n     */\n    public void mockProcess(long time) {\n        try {\n            Thread.sleep(time);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/appstart/job/LongTimeJob.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.appstart.job;\n\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 耗时任务，比如第三方依赖库的初始化、大数据的预加载、磁盘读写操作等\n *\n * @author xuexiang\n * @since 2/23/22 1:02 AM\n */\npublic class LongTimeJob extends AbstractMockJob {\n\n    public LongTimeJob(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doJob() {\n        log(\"[耗时任务]开始执行...\");\n        mockProcess(1000);\n        log(\"[耗时任务]执行完毕!\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/appstart/job/SingleJob.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.appstart.job;\n\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 单独的任务，没有执行上的先后顺序. 例如：非核心数据的加载。\n *\n * @author xuexiang\n * @since 2/23/22 1:16 AM\n */\npublic class SingleJob extends AbstractMockJob {\n\n    private int mIndex;\n\n    public SingleJob(int index, LoggerTextView logger) {\n        super(logger);\n        mIndex = index;\n    }\n\n    @Override\n    public void doJob() {\n        log(\"[单独的任务\" + mIndex + \"]开始执行...\");\n        mockProcess(200);\n        log(\"[单独的任务\" + mIndex + \"]执行完毕!\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/appstart/job/TopPriorityJob.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.appstart.job;\n\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 最高优先级的事务，比如核心框架的初始化，关键数据的初始化等\n *\n * @author xuexiang\n * @since 2/23/22 12:51 AM\n */\npublic class TopPriorityJob extends AbstractMockJob {\n\n    public TopPriorityJob(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doJob() {\n        log(\"[最高优先级的任务]开始执行...\");\n        mockProcess(50);\n        log(\"[最高优先级的任务]执行完毕!\");\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/appstart/task/AsyncInitTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.appstart.task;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.api.step.SimpleTaskStep;\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtaskdemo.fragment.usecase.appstart.job.LongTimeJob;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 异步初始化任务\n * 放一些优先级不是很高的、耗时的初始化任务\n *\n * @author xuexiang\n * @since 2/23/22 1:42 AM\n */\npublic class AsyncInitTask extends SimpleTaskStep {\n\n    private LoggerTextView mLogger;\n\n    public AsyncInitTask(LoggerTextView logger) {\n        mLogger = logger;\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        // 执行耗时任务\n        new LongTimeJob(mLogger).doJob();\n    }\n\n    @Override\n    public String getName() {\n        return \"AsyncInitTask\";\n    }\n\n    @NonNull\n    @Override\n    public ThreadType getThreadType() {\n        // 任务的优先级不高，使用异步子线程执行\n        return ThreadType.ASYNC;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/appstart/task/MainInitTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.appstart.task;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.api.step.SimpleTaskStep;\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtaskdemo.fragment.usecase.appstart.job.TopPriorityJob;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 主要初始化任务，放在第一位执行, 执行最高优先级的事务\n *\n * @author xuexiang\n * @since 2/23/22 1:34 AM\n */\npublic class MainInitTask extends SimpleTaskStep {\n\n    private LoggerTextView mLogger;\n\n    public MainInitTask(LoggerTextView logger) {\n        mLogger = logger;\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        // 执行最高优先级的事务\n        new TopPriorityJob(mLogger).doJob();\n    }\n\n\n    @Override\n    public String getName() {\n        return \"MainInitTask\";\n    }\n\n    @NonNull\n    @Override\n    public ThreadType getThreadType() {\n        // 任务优先级较高，执行有前后依赖，因此将任务放在第一位使用同步主线程执行\n        return ThreadType.SYNC;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/entity/Product.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.entity;\n\n/**\n * 产品\n *\n * @author xuexiang\n * @since 2/25/22 1:17 AM\n */\npublic class Product {\n\n    private ProductInfo info;\n\n    private String address;\n\n    private String price;\n\n    private String publicTime;\n\n    public Product(ProductInfo info, String address) {\n        this.info = info;\n        this.address = address;\n    }\n\n    public ProductInfo getInfo() {\n        return info;\n    }\n\n    public Product setInfo(ProductInfo info) {\n        this.info = info;\n        return this;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public Product setAddress(String address) {\n        this.address = address;\n        return this;\n    }\n\n    public String getPrice() {\n        return price;\n    }\n\n    public Product setPrice(String price) {\n        this.price = price;\n        return this;\n    }\n\n    public String getPublicTime() {\n        return publicTime;\n    }\n\n\n    public Product setPublicTime(String publicTime) {\n        this.publicTime = publicTime;\n        return this;\n    }\n\n    @Override\n    public String toString() {\n        return \"产品信息:\" + info + \", 产地:\" + address + \", 价格:\" + price + \", 上市日前:\" + publicTime;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/entity/ProductFactory.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.entity;\n\n/**\n * 产品工厂\n *\n * @author xuexiang\n * @since 2/25/22 1:15 AM\n */\npublic class ProductFactory {\n\n    private String id;\n\n    private String address;\n\n    public ProductFactory(String id, String address) {\n        this.id = id;\n        this.address = address;\n    }\n\n    public Product produce(ProductInfo info) {\n        return new Product(info, address);\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public ProductFactory setId(String id) {\n        this.id = id;\n        return this;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public ProductFactory setAddress(String address) {\n        this.address = address;\n        return this;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/entity/ProductInfo.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.entity;\n\n/**\n * 产品信息\n *\n * @author xuexiang\n * @since 2/25/22 12:40 AM\n */\npublic class ProductInfo {\n    /**\n     * 编号\n     */\n    private String id;\n    /**\n     * 品牌\n     */\n    private String brand;\n    /**\n     * 质量\n     */\n    private String quality;\n\n    public ProductInfo(String id) {\n        this.id = id;\n    }\n\n    public ProductInfo(String id, String brand, String quality) {\n        this.id = id;\n        this.brand = brand;\n        this.quality = quality;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public ProductInfo setId(String id) {\n        this.id = id;\n        return this;\n    }\n\n    public String getBrand() {\n        return brand;\n    }\n\n    public ProductInfo setBrand(String brand) {\n        this.brand = brand;\n        return this;\n    }\n\n    public String getQuality() {\n        return quality;\n    }\n\n    public ProductInfo setQuality(String quality) {\n        this.quality = quality;\n        return this;\n    }\n\n    @Override\n    public String toString() {\n        return \"id:\" + id + \", 品牌:\" + brand + \", 品质:\" + quality;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/processor/AbstractProcessor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.processor;\n\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 抽象处理器\n *\n * @author xuexiang\n * @since 2/25/22 12:28 AM\n */\npublic abstract class AbstractProcessor<T> {\n\n    private LoggerTextView mLogger;\n\n    private IProcessorCallback<T> mCallback;\n\n\n    public AbstractProcessor(LoggerTextView logger) {\n        mLogger = logger;\n    }\n\n    public AbstractProcessor setProcessorCallback(IProcessorCallback<T> callback) {\n        mCallback = callback;\n        return this;\n    }\n\n    /**\n     * 处理任务\n     *\n     * @return 返回的结果\n     */\n    public abstract T process();\n\n    public void log(String logContent) {\n        if (mLogger != null) {\n            mLogger.logNormal(logContent);\n        }\n    }\n\n    public void onProcessSuccess(T t) {\n        if (mCallback != null) {\n            mCallback.onSuccess(t);\n        }\n    }\n\n    public void onProcessFailed(String error) {\n        if (mCallback != null) {\n            mCallback.onFailed(error);\n        }\n    }\n\n    /**\n     * 模拟执行\n     *\n     * @param time 模拟执行所需要的时间\n     */\n    public void mockProcess(long time) {\n        try {\n            Thread.sleep(time);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n    public abstract static class ProcessorCallbackAdapter<T> implements IProcessorCallback<T> {\n        @Override\n        public void onFailed(String error) {\n\n        }\n    }\n\n    public interface IProcessorCallback<T> {\n        /**\n         * 处理成功\n         *\n         * @param result 结果\n         */\n        void onSuccess(T result);\n\n        /**\n         * 处理失败\n         *\n         * @param error 错误信息\n         */\n        void onFailed(String error);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/processor/GetProductInfoProcessor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.processor;\n\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.ProductInfo;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 1.获取产品信息\n *\n * @author xuexiang\n * @since 2/25/22 12:34 AM\n */\npublic class GetProductInfoProcessor extends AbstractProcessor<ProductInfo> {\n\n    private String id;\n\n    public GetProductInfoProcessor(LoggerTextView logger, String id) {\n        super(logger);\n        this.id = id;\n    }\n\n    @Override\n    public ProductInfo process() {\n        log(\"[获取产品信息]开始执行...\");\n        ProductInfo info = getProductInfoById(id);\n        log(\"[获取产品信息]执行完毕!\");\n        onProcessSuccess(info);\n        return info;\n    }\n\n    private ProductInfo getProductInfoById(String id) {\n        // 模拟耗费的时间\n        mockProcess(500);\n        return new ProductInfo(id, \"品牌A\", \"高品质\");\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/processor/GivePriceProcessor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.processor;\n\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.Product;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 3.评估产品，给出价格\n * @author xuexiang\n * @since 2/25/22 1:36 AM\n */\npublic class GivePriceProcessor extends AbstractProcessor<Product> {\n\n    private Product product;\n\n    public GivePriceProcessor(LoggerTextView logger, Product product) {\n        super(logger);\n        this.product = product;\n    }\n\n    @Override\n    public Product process() {\n        log(\"[评估产品价格]开始执行...\");\n        String price = givePrice(product);\n        product.setPrice(price);\n        log(\"[评估产品价格]执行完毕!\");\n        onProcessSuccess(product);\n        return product;\n    }\n\n    private String givePrice(Product product) {\n        // 模拟耗费的时间\n        mockProcess(100);\n        return \"45¥\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/processor/PublicProductProcessor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.processor;\n\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.ProductFactory;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 4.产品发布\n *\n * @author xuexiang\n * @since 2/25/22 1:50 AM\n */\npublic class PublicProductProcessor extends AbstractProcessor<Product> {\n\n    private Product product;\n\n    public PublicProductProcessor(LoggerTextView logger, Product product) {\n        super(logger);\n        this.product = product;\n    }\n\n    public PublicProductProcessor(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public Product process() {\n        log(\"[产品发布]开始执行...\");\n        String time = getPublicPlan(product);\n        product.setPublicTime(time);\n        log(\"[产品发布]执行完毕!\");\n        onProcessSuccess(product);\n        return product;\n    }\n\n    private String getPublicPlan(Product product) {\n        // 模拟耗费的时间\n        mockProcess(400);\n        return \"2022年2月22日22时22分22秒\";\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/processor/SearchFactoryProcessor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.processor;\n\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.ProductFactory;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.ProductInfo;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 2.查找相关的工厂\n *\n * @author xuexiang\n * @since 2/25/22 1:13 AM\n */\npublic class SearchFactoryProcessor extends AbstractProcessor<ProductFactory> {\n\n    private ProductInfo info;\n\n    public SearchFactoryProcessor(LoggerTextView logger, ProductInfo info) {\n        super(logger);\n        this.info = info;\n    }\n\n    @Override\n    public ProductFactory process() {\n        log(\"[查找相关工厂]开始执行...\");\n        ProductFactory factory = searchFactoryByBrand(info.getBrand());\n        log(\"[查找相关工厂]执行完毕!\");\n        onProcessSuccess(factory);\n        return factory;\n    }\n\n    private ProductFactory searchFactoryByBrand(String brand) {\n        // 模拟耗费的时间\n        mockProcess(300);\n        return new ProductFactory(brand, \"南京市江宁区秣陵街道xxx街区\");\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/task/AbstractTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.task;\n\nimport com.xuexiang.xtask.api.step.SimpleTaskStep;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 基础抽象任务\n *\n * @author xuexiang\n * @since 2/25/22 2:18 AM\n */\npublic abstract class AbstractTask extends SimpleTaskStep {\n\n    protected LoggerTextView mLogger;\n\n    public AbstractTask(LoggerTextView logger) {\n        mLogger = logger;\n    }\n\n    public void log(String logContent) {\n        if (mLogger != null) {\n            mLogger.logSuccess(logContent);\n        }\n    }\n\n    @Override\n    protected boolean isAutoNotify() {\n        // 这里进行手动控制\n        return false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/task/GetProductInfoTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.task;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.ProductInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.GetProductInfoProcessor;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 1.获取产品信息\n *\n * @author xuexiang\n * @since 2/25/22 2:07 AM\n */\npublic class GetProductInfoTask extends AbstractTask {\n\n    public GetProductInfoTask(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        String productId = getTaskParam().getString(ProductTaskConstants.KEY_PRODUCT_ID);\n        new GetProductInfoProcessor(mLogger, productId)\n                .setProcessorCallback(new AbstractProcessor.IProcessorCallback<ProductInfo>() {\n                    @Override\n                    public void onSuccess(ProductInfo info) {\n                        getTaskParam().put(ProductTaskConstants.KEY_PRODUCT_INFO, info);\n                        notifyTaskSucceed();\n                    }\n\n                    @Override\n                    public void onFailed(String error) {\n                        notifyTaskFailed(ITaskResult.ERROR, error);\n                    }\n                })\n                .process();\n    }\n\n    @Override\n    public String getName() {\n        return \"1.获取产品信息\";\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/task/GivePriceTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.task;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.GivePriceProcessor;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 3.评估产品，给出价格\n *\n * @author xuexiang\n * @since 2/25/22 2:27 AM\n */\npublic class GivePriceTask extends AbstractTask {\n\n    public GivePriceTask(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        Product product = getTaskParam().getObject(ProductTaskConstants.KEY_PRODUCT, Product.class);\n        new GivePriceProcessor(mLogger, product).setProcessorCallback(new AbstractProcessor.IProcessorCallback<Product>() {\n            @Override\n            public void onSuccess(Product result) {\n                getTaskParam().put(ProductTaskConstants.KEY_PRODUCT, result);\n                notifyTaskSucceed();\n            }\n\n            @Override\n            public void onFailed(String error) {\n                notifyTaskFailed(ITaskResult.ERROR, error);\n            }\n        }).process();\n    }\n\n    @Override\n    public String getName() {\n        return \"3.评估产品，给出价格\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/task/ProductTaskConstants.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.task;\n\n/**\n * @author xuexiang\n * @since 2/25/22 2:14 AM\n */\npublic final class ProductTaskConstants {\n\n    public static final String KEY_PRODUCT_ID = \"key_product_id\";\n\n    public static final String KEY_PRODUCT_INFO = \"key_product_info\";\n\n    public static final String KEY_PRODUCT = \"key_product\";\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/task/PublicProductTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.task;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.PublicProductProcessor;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 4.产品发布\n *\n * @author xuexiang\n * @since 2/25/22 2:31 AM\n */\npublic class PublicProductTask extends AbstractTask {\n\n    public PublicProductTask(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        Product product = getTaskParam().getObject(ProductTaskConstants.KEY_PRODUCT, Product.class);\n        new PublicProductProcessor(mLogger, product).setProcessorCallback(new AbstractProcessor.IProcessorCallback<Product>() {\n            @Override\n            public void onSuccess(Product result) {\n                getTaskParam().put(ProductTaskConstants.KEY_PRODUCT, result);\n                notifyTaskSucceed();\n            }\n\n            @Override\n            public void onFailed(String error) {\n                notifyTaskFailed(ITaskResult.ERROR, error);\n            }\n        }).process();\n    }\n\n    @Override\n    public String getName() {\n        return \"4.产品发布\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/business/task/SearchFactoryTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.business.task;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.ProductFactory;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.entity.ProductInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.SearchFactoryProcessor;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 2.查找相关的工厂并生产\n *\n * @author xuexiang\n * @since 2/25/22 2:17 AM\n */\npublic class SearchFactoryTask extends AbstractTask {\n\n    public SearchFactoryTask(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        ProductInfo productInfo = getTaskParam().getObject(ProductTaskConstants.KEY_PRODUCT_INFO, ProductInfo.class);\n        new SearchFactoryProcessor(mLogger, productInfo)\n                .setProcessorCallback(new AbstractProcessor.IProcessorCallback<ProductFactory>() {\n                    @Override\n                    public void onSuccess(ProductFactory factory) {\n                        log(\"开始生产产品...\");\n                        Product product = factory.produce(productInfo);\n                        getTaskParam().put(ProductTaskConstants.KEY_PRODUCT, product);\n                        notifyTaskSucceed();\n                    }\n\n                    @Override\n                    public void onFailed(String error) {\n                        notifyTaskFailed(ITaskResult.ERROR, error);\n                    }\n                })\n                .process();\n    }\n\n    @Override\n    public String getName() {\n        return \"2.查找相关的工厂并生产\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/entity/BriefInfo.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity;\n\nimport androidx.annotation.NonNull;\n\n/**\n * 产品简要信息\n *\n * @author xuexiang\n * @since 3/22/22 1:08 AM\n */\npublic class BriefInfo {\n\n    private String id;\n\n    protected String name;\n\n    private String factoryId;\n\n    private String priceId;\n\n    private String promotionId;\n\n    private String richId;\n\n    public BriefInfo(String id) {\n        this.id = id;\n    }\n\n    public BriefInfo(@NonNull BriefInfo briefInfo) {\n        this(briefInfo.id, briefInfo.name, briefInfo.factoryId, briefInfo.priceId, briefInfo.promotionId, briefInfo.richId);\n    }\n\n    public BriefInfo(String id, String name, String factoryId, String priceId, String promotionId, String richId) {\n        this.id = id;\n        this.name = name;\n        this.factoryId = factoryId;\n        this.priceId = priceId;\n        this.promotionId = promotionId;\n        this.richId = richId;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public BriefInfo setId(String id) {\n        this.id = id;\n        return this;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public BriefInfo setName(String name) {\n        this.name = name;\n        return this;\n    }\n\n    public String getFactoryId() {\n        return factoryId;\n    }\n\n    public BriefInfo setFactoryId(String factoryId) {\n        this.factoryId = factoryId;\n        return this;\n    }\n\n    public String getPriceId() {\n        return priceId;\n    }\n\n    public BriefInfo setPriceId(String priceId) {\n        this.priceId = priceId;\n        return this;\n    }\n\n    public String getPromotionId() {\n        return promotionId;\n    }\n\n    public BriefInfo setPromotionId(String promotionId) {\n        this.promotionId = promotionId;\n        return this;\n    }\n\n    public String getRichId() {\n        return richId;\n    }\n\n    public BriefInfo setRichId(String richId) {\n        this.richId = richId;\n        return this;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/entity/FactoryInfo.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity;\n\nimport androidx.annotation.NonNull;\n\n/**\n * 工厂生产信息\n *\n * @author xuexiang\n * @since 3/22/22 1:11 AM\n */\npublic class FactoryInfo {\n\n    private String id;\n\n    /**\n     * 生产地址\n     */\n    private String address;\n\n    /**\n     * 生产日期\n     */\n    private String productDate;\n\n    /**\n     * 过期日期\n     */\n    private String expirationDate;\n\n    public FactoryInfo(String id) {\n        this.id = id;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public FactoryInfo setId(String id) {\n        this.id = id;\n        return this;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public FactoryInfo setAddress(String address) {\n        this.address = address;\n        return this;\n    }\n\n    public String getProductDate() {\n        return productDate;\n    }\n\n    public FactoryInfo setProductDate(String productDate) {\n        this.productDate = productDate;\n        return this;\n    }\n\n    public String getExpirationDate() {\n        return expirationDate;\n    }\n\n    public FactoryInfo setExpirationDate(String expirationDate) {\n        this.expirationDate = expirationDate;\n        return this;\n    }\n\n    @NonNull\n    @Override\n    public String toString() {\n        return \"生产编号:\" + id\n                + \", 生产地址:\" + address\n                + \", 生产日期:\" + productDate\n                + \", 过期日期:\" + expirationDate;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/entity/PriceInfo.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity;\n\nimport androidx.annotation.NonNull;\n\n/**\n * 价格信息\n *\n * @author xuexiang\n * @since 3/22/22 1:10 AM\n */\npublic class PriceInfo {\n\n    private String id;\n\n    /**\n     * 出厂价\n     */\n    private float factoryPrice;\n\n    /**\n     * 批发价\n     */\n    private float wholesalePrice;\n\n    /**\n     * 零售价\n     */\n    private float retailPrice;\n\n    public PriceInfo(String id) {\n        this.id = id;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public PriceInfo setId(String id) {\n        this.id = id;\n        return this;\n    }\n\n    public float getFactoryPrice() {\n        return factoryPrice;\n    }\n\n    public PriceInfo setFactoryPrice(float factoryPrice) {\n        this.factoryPrice = factoryPrice;\n        return this;\n    }\n\n    public float getWholesalePrice() {\n        return wholesalePrice;\n    }\n\n    public PriceInfo setWholesalePrice(float wholesalePrice) {\n        this.wholesalePrice = wholesalePrice;\n        return this;\n    }\n\n    public float getRetailPrice() {\n        return retailPrice;\n    }\n\n    public PriceInfo setRetailPrice(float retailPrice) {\n        this.retailPrice = retailPrice;\n        return this;\n    }\n\n    @NonNull\n    @Override\n    public String toString() {\n        return \"价格编号:\" + id\n                + \", 出厂价:\" + factoryPrice\n                + \", 批发价:\" + wholesalePrice\n                + \", 零售价:\" + retailPrice;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/entity/Product.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity;\n\nimport androidx.annotation.NonNull;\n\n/**\n * 产品\n *\n * @author xuexiang\n * @since 3/22/22 1:07 AM\n */\npublic class Product extends BriefInfo {\n\n    /**\n     * 生产信息\n     */\n    private FactoryInfo factory;\n\n    /**\n     * 价格信息\n     */\n    private PriceInfo price;\n\n    /**\n     * 促销信息\n     */\n    private PromotionInfo promotion;\n\n    /**\n     * 富文本信息\n     */\n    private RichInfo rich;\n\n    public Product(@NonNull BriefInfo briefInfo) {\n        super(briefInfo);\n    }\n\n    public FactoryInfo getFactory() {\n        return factory;\n    }\n\n    public Product setFactory(FactoryInfo factory) {\n        this.factory = factory;\n        return this;\n    }\n\n    public PriceInfo getPrice() {\n        return price;\n    }\n\n    public Product setPrice(PriceInfo price) {\n        this.price = price;\n        return this;\n    }\n\n    public PromotionInfo getPromotion() {\n        return promotion;\n    }\n\n    public Product setPromotion(PromotionInfo promotion) {\n        this.promotion = promotion;\n        return this;\n    }\n\n    public RichInfo getRich() {\n        return rich;\n    }\n\n    public Product setRich(RichInfo rich) {\n        this.rich = rich;\n        return this;\n    }\n\n    @NonNull\n    @Override\n    public String toString() {\n        return \"产品信息: \" + name\n                + \"\\n产地信息: \" + factory\n                + \"\\n价格信息: \" + price\n                + \"\\n促销信息: \" + promotion\n                + \"\\n富文本信息: \" + rich;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/entity/PromotionInfo.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity;\n\nimport androidx.annotation.NonNull;\n\n/**\n * 产品促销信息\n *\n * @author xuexiang\n * @since 3/22/22 1:12 AM\n */\npublic class PromotionInfo {\n\n    private String id;\n\n    /**\n     * 促销类型\n     */\n    private int type;\n\n    /**\n     * 促销内容\n     */\n    private String content;\n\n    /**\n     * 生效日期\n     */\n    private String effectiveDate;\n\n    /**\n     * 失效日期\n     */\n    private String expirationDate;\n\n    public PromotionInfo(String id) {\n        this.id = id;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public PromotionInfo setId(String id) {\n        this.id = id;\n        return this;\n    }\n\n    public int getType() {\n        return type;\n    }\n\n    public PromotionInfo setType(int type) {\n        this.type = type;\n        return this;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public PromotionInfo setContent(String content) {\n        this.content = content;\n        return this;\n    }\n\n    public String getEffectiveDate() {\n        return effectiveDate;\n    }\n\n    public PromotionInfo setEffectiveDate(String effectiveDate) {\n        this.effectiveDate = effectiveDate;\n        return this;\n    }\n\n    public String getExpirationDate() {\n        return expirationDate;\n    }\n\n    public PromotionInfo setExpirationDate(String expirationDate) {\n        this.expirationDate = expirationDate;\n        return this;\n    }\n\n    @NonNull\n    @Override\n    public String toString() {\n        return \"促销编号:\" + id\n                + \", 促销类型:\" + type\n                + \", 促销内容:\" + content\n                + \", 生效日期:\" + effectiveDate\n                + \", 失效日期:\" + expirationDate;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/entity/RichInfo.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity;\n\nimport androidx.annotation.NonNull;\n\n/**\n * 富文本信息\n *\n * @author xuexiang\n * @since 3/22/22 1:13 AM\n */\npublic class RichInfo {\n\n    private String id;\n\n    /**\n     * 描述信息\n     */\n    private String description;\n\n    /**\n     * 图片链接\n     */\n    private String imgUrl;\n\n    /**\n     * 视频链接\n     */\n    private String videoUrl;\n\n    public RichInfo(String id) {\n        this.id = id;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public RichInfo setId(String id) {\n        this.id = id;\n        return this;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public RichInfo setDescription(String description) {\n        this.description = description;\n        return this;\n    }\n\n    public String getImgUrl() {\n        return imgUrl;\n    }\n\n    public RichInfo setImgUrl(String imgUrl) {\n        this.imgUrl = imgUrl;\n        return this;\n    }\n\n    public String getVideoUrl() {\n        return videoUrl;\n    }\n\n    public RichInfo setVideoUrl(String videoUrl) {\n        this.videoUrl = videoUrl;\n        return this;\n    }\n\n    @NonNull\n    @Override\n    public String toString() {\n        return \"富文本编号:\" + id\n                + \", 描述信息:\" + description\n                + \", 图片链接:\" + imgUrl\n                + \", 视频链接:\" + videoUrl;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/processor/GetBriefInfoProcessor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor;\n\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.BriefInfo;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 1 获取商品简要信息\n *\n * @author xuexiang\n * @since 3/22/22 1:18 AM\n */\npublic class GetBriefInfoProcessor extends AbstractProcessor<BriefInfo> {\n\n    private String productId;\n\n    public GetBriefInfoProcessor(LoggerTextView logger, String productId) {\n        super(logger);\n        this.productId = productId;\n    }\n\n    @Override\n    public BriefInfo process() {\n        log(\"[简要信息查询]开始执行...\");\n        BriefInfo info = getBriefInfoById(productId);\n        log(\"[简要信息查询]执行完毕!\");\n        onProcessSuccess(info);\n        return info;\n    }\n\n    private BriefInfo getBriefInfoById(String id) {\n        // 模拟耗费的时间\n        mockProcess(500);\n        return new BriefInfo(id)\n                .setName(\"统一老坛酸菜牛肉面\")\n                .setFactoryId(\"fa234632-1234-4567\")\n                .setPriceId(\"pr432359-3745-9426\")\n                .setPromotionId(\"pt235123-9654-2942\")\n                .setRichId(\"ri735294-2346-1048\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/processor/GetFactoryInfoProcessor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor;\n\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.FactoryInfo;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 2.1 获取商品的生产信息\n *\n * @author xuexiang\n * @since 3/22/22 1:22 AM\n */\npublic class GetFactoryInfoProcessor extends AbstractProcessor<FactoryInfo> {\n\n    private String factoryId;\n\n    public GetFactoryInfoProcessor(LoggerTextView logger, String factoryId) {\n        super(logger);\n        this.factoryId = factoryId;\n    }\n\n    @Override\n    public FactoryInfo process() {\n        log(\"[生产信息查询]开始执行...\");\n        FactoryInfo info = getFactoryInfoById(factoryId);\n        log(\"[生产信息查询]执行完毕!\");\n        onProcessSuccess(info);\n        return info;\n    }\n\n    private FactoryInfo getFactoryInfoById(String id) {\n        // 模拟耗费的时间\n        mockProcess(200);\n        return new FactoryInfo(id)\n                .setAddress(\"长沙市开福区金霞经济开发区中青路1301号长沙统一企业有限公司\")\n                .setProductDate(\"2022年3月15日\")\n                .setExpirationDate(\"2030年3月15日\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/processor/GetPriceInfoProcessor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor;\n\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.PriceInfo;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 2.2 获取商品的价格信息\n *\n * @author xuexiang\n * @since 3/22/22 1:20 AM\n */\npublic class GetPriceInfoProcessor extends AbstractProcessor<PriceInfo> {\n\n    private String priceId;\n\n    public GetPriceInfoProcessor(LoggerTextView logger, String priceId) {\n        super(logger);\n        this.priceId = priceId;\n    }\n\n    @Override\n    public PriceInfo process() {\n        log(\"[价格信息查询]开始执行...\");\n        PriceInfo info = getPriceInfoById(priceId);\n        log(\"[价格信息查询]执行完毕!\");\n        onProcessSuccess(info);\n        return info;\n    }\n\n    private PriceInfo getPriceInfoById(String id) {\n        // 模拟耗费的时间\n        mockProcess(300);\n        return new PriceInfo(id)\n                .setFactoryPrice(1.5F)\n                .setWholesalePrice(2.5F)\n                .setRetailPrice(4.5F);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/processor/GetPromotionInfoProcessor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor;\n\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.PromotionInfo;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 2.3 获取商品的促销信息\n *\n * @author xuexiang\n * @since 3/22/22 1:23 AM\n */\npublic class GetPromotionInfoProcessor extends AbstractProcessor<PromotionInfo> {\n\n    private String promotionId;\n\n    public GetPromotionInfoProcessor(LoggerTextView logger, String promotionId) {\n        super(logger);\n        this.promotionId = promotionId;\n    }\n\n    @Override\n    public PromotionInfo process() {\n        log(\"[促销信息查询]开始执行...\");\n        PromotionInfo info = getPromotionInfoById(promotionId);\n        log(\"[促销信息查询]执行完毕!\");\n        onProcessSuccess(info);\n        return info;\n    }\n\n    private PromotionInfo getPromotionInfoById(String id) {\n        // 模拟耗费的时间\n        mockProcess(150);\n        return new PromotionInfo(id)\n                .setType(5)\n                .setContent(\"买一送一\")\n                .setEffectiveDate(\"2022年3月15日\")\n                .setExpirationDate(\"2022年4月15日\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/processor/GetRichInfoProcessor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor;\n\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.RichInfo;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 2.4 获取商品的富文本信息\n *\n * @author xuexiang\n * @since 3/22/22 1:21 AM\n */\npublic class GetRichInfoProcessor extends AbstractProcessor<RichInfo> {\n    private String richId;\n\n    public GetRichInfoProcessor(LoggerTextView logger, String richId) {\n        super(logger);\n        this.richId = richId;\n    }\n\n    @Override\n    public RichInfo process() {\n        log(\"[富文本信息查询]开始执行...\");\n        RichInfo info = getRichInfoById(richId);\n        log(\"[富文本信息查询]执行完毕!\");\n        onProcessSuccess(info);\n        return info;\n    }\n\n    private RichInfo getRichInfoById(String id) {\n        // 模拟耗费的时间\n        mockProcess(380);\n        return new RichInfo(id)\n                .setDescription(\"精选湖南插旗菜业古法土坑腌制，取上乘泡脚酸菜，让你尽享人间美味！\")\n                .setImgUrl(\"http://inews.gtimg.com/newsapp_bt/0/14650183855/641\")\n                .setVideoUrl(\"https://haokan.baidu.com/v?pd=wisenatural&vid=8687875510146074163\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/task/GetBriefInfoTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.task;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.AbstractTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.ProductTaskConstants;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.BriefInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor.GetBriefInfoProcessor;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\n\n/**\n * 获取商品简要信息\n *\n * @author xuexiang\n * @since 3/22/22 11:52 PM\n */\npublic class GetBriefInfoTask extends AbstractTask {\n\n    public GetBriefInfoTask(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        String productId = getTaskParam().getString(ProductTaskConstants.KEY_PRODUCT_ID);\n        new GetBriefInfoProcessor(mLogger, productId)\n                .setProcessorCallback(new AbstractProcessor.IProcessorCallback<BriefInfo>() {\n                    @Override\n                    public void onSuccess(BriefInfo briefInfo) {\n                        Product product = new Product(briefInfo);\n                        getTaskParam().put(ProductTaskConstants.KEY_PRODUCT, product);\n                        notifyTaskSucceed();\n                    }\n\n                    @Override\n                    public void onFailed(String error) {\n                        notifyTaskFailed(ITaskResult.ERROR, error);\n                    }\n                })\n                .process();\n    }\n\n    @Override\n    public String getName() {\n        return \"1.获取商品简要信息\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/task/GetFactoryInfoTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.task;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.AbstractTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.ProductTaskConstants;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.FactoryInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor.GetFactoryInfoProcessor;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\nimport com.xuexiang.xutil.common.StringUtils;\n\n/**\n * 2.1 获取商品的生产信息\n *\n * @author xuexiang\n * @since 3/23/22 12:18 AM\n */\npublic class GetFactoryInfoTask extends AbstractTask {\n\n    public GetFactoryInfoTask(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        final Product product = getTaskParam().getObject(ProductTaskConstants.KEY_PRODUCT, Product.class);\n        if (product == null || StringUtils.isEmpty(product.getFactoryId())) {\n            notifyTaskFailed(ITaskResult.ERROR, \"product is null or factoryId is empty!\");\n            return;\n        }\n        new GetFactoryInfoProcessor(mLogger, product.getFactoryId())\n                .setProcessorCallback(new AbstractProcessor.IProcessorCallback<FactoryInfo>() {\n                    @Override\n                    public void onSuccess(FactoryInfo factoryInfo) {\n                        getTaskParam().put(ProductTaskConstants.KEY_PRODUCT, product.setFactory(factoryInfo));\n                        notifyTaskSucceed();\n                    }\n\n                    @Override\n                    public void onFailed(String error) {\n                        notifyTaskFailed(ITaskResult.ERROR, error);\n                    }\n                })\n                .process();\n    }\n\n\n    @Override\n    public String getName() {\n        return \"2.1 获取商品的生产信息\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/task/GetPriceInfoTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.task;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.AbstractTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.ProductTaskConstants;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.PriceInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor.GetPriceInfoProcessor;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\nimport com.xuexiang.xutil.common.StringUtils;\n\n/**\n * 2.2 获取商品的价格信息\n *\n * @author xuexiang\n * @since 3/23/22 12:18 AM\n */\npublic class GetPriceInfoTask extends AbstractTask {\n\n    public GetPriceInfoTask(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        final Product product = getTaskParam().getObject(ProductTaskConstants.KEY_PRODUCT, Product.class);\n        if (product == null || StringUtils.isEmpty(product.getPriceId())) {\n            notifyTaskFailed(ITaskResult.ERROR, \"product is null or priceId is empty!\");\n            return;\n        }\n        new GetPriceInfoProcessor(mLogger, product.getPriceId())\n                .setProcessorCallback(new AbstractProcessor.IProcessorCallback<PriceInfo>() {\n                    @Override\n                    public void onSuccess(PriceInfo priceInfo) {\n                        getTaskParam().put(ProductTaskConstants.KEY_PRODUCT, product.setPrice(priceInfo));\n                        notifyTaskSucceed();\n                    }\n\n                    @Override\n                    public void onFailed(String error) {\n                        notifyTaskFailed(ITaskResult.ERROR, error);\n                    }\n                })\n                .process();\n    }\n\n\n    @Override\n    public String getName() {\n        return \"2.2 获取商品的价格信息\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/task/GetPromotionInfoTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.task;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.AbstractTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.ProductTaskConstants;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.PromotionInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor.GetPromotionInfoProcessor;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\nimport com.xuexiang.xutil.common.StringUtils;\n\n/**\n * 2.3 获取商品的促销信息\n *\n * @author xuexiang\n * @since 3/23/22 12:18 AM\n */\npublic class GetPromotionInfoTask extends AbstractTask {\n\n    public GetPromotionInfoTask(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        final Product product = getTaskParam().getObject(ProductTaskConstants.KEY_PRODUCT, Product.class);\n        if (product == null || StringUtils.isEmpty(product.getPromotionId())) {\n            notifyTaskFailed(ITaskResult.ERROR, \"product is null or promotionId is empty!\");\n            return;\n        }\n        new GetPromotionInfoProcessor(mLogger, product.getPromotionId())\n                .setProcessorCallback(new AbstractProcessor.IProcessorCallback<PromotionInfo>() {\n                    @Override\n                    public void onSuccess(PromotionInfo promotionInfo) {\n                        getTaskParam().put(ProductTaskConstants.KEY_PRODUCT, product.setPromotion(promotionInfo));\n                        notifyTaskSucceed();\n                    }\n\n                    @Override\n                    public void onFailed(String error) {\n                        notifyTaskFailed(ITaskResult.ERROR, error);\n                    }\n                })\n                .process();\n    }\n\n\n    @Override\n    public String getName() {\n        return \"2.3 获取商品的促销信息\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/fragment/usecase/concurrent/task/GetRichInfoTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.fragment.usecase.concurrent.task;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.processor.AbstractProcessor;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.AbstractTask;\nimport com.xuexiang.xtaskdemo.fragment.usecase.business.task.ProductTaskConstants;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.Product;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.entity.RichInfo;\nimport com.xuexiang.xtaskdemo.fragment.usecase.concurrent.processor.GetRichInfoProcessor;\nimport com.xuexiang.xui.widget.textview.LoggerTextView;\nimport com.xuexiang.xutil.common.StringUtils;\n\n/**\n * 2.4 获取商品的富文本信息\n *\n * @author xuexiang\n * @since 3/23/22 12:18 AM\n */\npublic class GetRichInfoTask extends AbstractTask {\n\n    public GetRichInfoTask(LoggerTextView logger) {\n        super(logger);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        final Product product = getTaskParam().getObject(ProductTaskConstants.KEY_PRODUCT, Product.class);\n        if (product == null || StringUtils.isEmpty(product.getRichId())) {\n            notifyTaskFailed(ITaskResult.ERROR, \"product is null or richId is empty!\");\n            return;\n        }\n        new GetRichInfoProcessor(mLogger, product.getRichId())\n                .setProcessorCallback(new AbstractProcessor.IProcessorCallback<RichInfo>() {\n                    @Override\n                    public void onSuccess(RichInfo richInfo) {\n                        getTaskParam().put(ProductTaskConstants.KEY_PRODUCT, product.setRich(richInfo));\n                        notifyTaskSucceed();\n                    }\n\n                    @Override\n                    public void onFailed(String error) {\n                        notifyTaskFailed(ITaskResult.ERROR, error);\n                    }\n                })\n                .process();\n    }\n\n\n    @Override\n    public String getName() {\n        return \"2.4 获取商品的富文本信息\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/utils/XToastUtils.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.utils;\n\nimport androidx.annotation.MainThread;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.StringRes;\n\nimport com.xuexiang.xui.XUI;\nimport com.xuexiang.xui.widget.toast.XToast;\n\n/**\n * xtoast 工具类\n *\n * @author xuexiang\n * @since 2019-06-30 19:04\n */\npublic final class XToastUtils {\n\n\n    private XToastUtils() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    static {\n        XToast.Config.get()\n                .setAlpha(200)\n                .allowQueue(false);\n    }\n\n    //======普通土司=======//\n\n    @MainThread\n    public static void toast(@NonNull CharSequence message) {\n        XToast.normal(XUI.getContext(), message).show();\n    }\n\n    @MainThread\n    public static void toast(@StringRes int message) {\n        XToast.normal(XUI.getContext(), message).show();\n    }\n\n    @MainThread\n    public static void toast(@NonNull CharSequence message, int duration) {\n        XToast.normal(XUI.getContext(), message, duration).show();\n    }\n\n    @MainThread\n    public static void toast(@StringRes int message, int duration) {\n        XToast.normal(XUI.getContext(), message, duration).show();\n    }\n\n    //======错误【红色】=======//\n\n    @MainThread\n    public static void error(@NonNull CharSequence message) {\n        XToast.error(XUI.getContext(), message).show();\n    }\n\n    @MainThread\n    public static void error(@StringRes int message) {\n        XToast.error(XUI.getContext(), message).show();\n    }\n\n    @MainThread\n    public static void error(@NonNull CharSequence message, int duration) {\n        XToast.error(XUI.getContext(), message, duration).show();\n    }\n\n    @MainThread\n    public static void error(@StringRes int message, int duration) {\n        XToast.error(XUI.getContext(), message, duration).show();\n    }\n\n    //======成功【绿色】=======//\n\n    @MainThread\n    public static void success(@NonNull CharSequence message) {\n        XToast.success(XUI.getContext(), message).show();\n    }\n\n    @MainThread\n    public static void success(@StringRes int message) {\n        XToast.success(XUI.getContext(), message).show();\n    }\n\n    @MainThread\n    public static void success(@NonNull CharSequence message, int duration) {\n        XToast.success(XUI.getContext(), message, duration).show();\n    }\n\n    @MainThread\n    public static void success(@StringRes int message, int duration) {\n        XToast.success(XUI.getContext(), message, duration).show();\n    }\n\n    //======信息【蓝色】=======//\n\n    @MainThread\n    public static void info(@NonNull CharSequence message) {\n        XToast.info(XUI.getContext(), message).show();\n    }\n\n    @MainThread\n    public static void info(@StringRes int message) {\n        XToast.info(XUI.getContext(), message).show();\n    }\n\n    @MainThread\n    public static void info(@NonNull CharSequence message, int duration) {\n        XToast.info(XUI.getContext(), message, duration).show();\n    }\n\n    @MainThread\n    public static void info(@StringRes int message, int duration) {\n        XToast.info(XUI.getContext(), message, duration).show();\n    }\n\n    //=======警告【黄色】======//\n\n    @MainThread\n    public static void warning(@NonNull CharSequence message) {\n        XToast.warning(XUI.getContext(), message).show();\n    }\n\n    @MainThread\n    public static void warning(@StringRes int message) {\n        XToast.warning(XUI.getContext(), message).show();\n    }\n\n    @MainThread\n    public static void warning(@NonNull CharSequence message, int duration) {\n        XToast.warning(XUI.getContext(), message, duration).show();\n    }\n\n    @MainThread\n    public static void warning(@StringRes int message, int duration) {\n        XToast.warning(XUI.getContext(), message, duration).show();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/utils/sdkinit/UMengInit.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.utils.sdkinit;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\n\nimport com.meituan.android.walle.WalleChannelReader;\nimport com.umeng.analytics.MobclickAgent;\nimport com.umeng.commonsdk.UMConfigure;\nimport com.xuexiang.xtaskdemo.BuildConfig;\nimport com.xuexiang.xtaskdemo.MyApp;\n\n/**\n * UMeng 统计 SDK初始化\n *\n * @author xuexiang\n * @since 2019-06-18 15:49\n */\npublic final class UMengInit {\n\n    private UMengInit() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    private static String DEFAULT_CHANNEL_ID = \"github\";\n\n    /**\n     * 初始化SDK,合规指南【先进行预初始化，如果用户隐私同意后可以初始化UmengSDK进行信息上报】\n     */\n    public static void init(@NonNull Context context) {\n        Context appContext = context.getApplicationContext();\n        if (appContext instanceof Application) {\n            init((Application) appContext);\n        }\n    }\n\n    /**\n     * 初始化SDK,合规指南【先进行预初始化，如果用户隐私同意后可以初始化UmengSDK进行信息上报】\n     */\n    public static void init(Application application) {\n        // 运营统计数据调试运行时不初始化\n        if (MyApp.isDebug()) {\n            return;\n        }\n        UMConfigure.setLogEnabled(false);\n        UMConfigure.preInit(application, BuildConfig.APP_ID_UMENG, getChannel(application));\n        // 用户同意了隐私协议\n        if (isAgreePrivacy()) {\n            realInit(application);\n        }\n    }\n\n    /**\n     * @return 用户是否同意了隐私协议\n     */\n    private static boolean isAgreePrivacy() {\n        // TODO: 2021/5/11 隐私协议设置\n        return true;\n    }\n\n    /**\n     * 真实的初始化UmengSDK【进行设备信息的统计上报，必须在获得用户隐私同意后方可调用】\n     */\n    private static void realInit(Application application) {\n        // 运营统计数据调试运行时不初始化\n        if (MyApp.isDebug()) {\n            return;\n        }\n        //初始化组件化基础库, 注意: 即使您已经在AndroidManifest.xml中配置过appkey和channel值，也需要在App代码中调用初始化接口（如需要使用AndroidManifest.xml中配置好的appkey和channel值，UMConfigure.init调用中appkey和channel参数请置为null）。\n        //第二个参数是appkey，最后一个参数是pushSecret\n        //这里BuildConfig.APP_ID_UMENG是根据local.properties中定义的APP_ID_UMENG生成的，只是运行看效果的话，可以不初始化该SDK\n        UMConfigure.init(application, BuildConfig.APP_ID_UMENG, getChannel(application), UMConfigure.DEVICE_TYPE_PHONE, \"\");\n        //统计SDK是否支持采集在子进程中打点的自定义事件，默认不支持\n        //支持多进程打点\n        UMConfigure.setProcessEvent(true);\n        MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);\n    }\n\n    /**\n     * 获取渠道信息\n     */\n    private static String getChannel(final Context context) {\n        return WalleChannelReader.getChannel(context, DEFAULT_CHANNEL_ID);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/utils/sdkinit/XBasicLibInit.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.utils.sdkinit;\n\nimport android.app.Application;\n\nimport com.xuexiang.xtaskdemo.MyApp;\nimport com.xuexiang.xtaskdemo.core.BaseActivity;\nimport com.xuexiang.xtaskdemo.utils.XToastUtils;\nimport com.xuexiang.xaop.XAOP;\nimport com.xuexiang.xpage.PageConfig;\nimport com.xuexiang.xrouter.launcher.XRouter;\nimport com.xuexiang.xui.XUI;\nimport com.xuexiang.xutil.XUtil;\nimport com.xuexiang.xutil.common.StringUtils;\n\n/**\n * X系列基础库初始化\n *\n * @author xuexiang\n * @since 2019-06-30 23:54\n */\npublic final class XBasicLibInit {\n\n    private XBasicLibInit() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    /**\n     * 初始化基础库SDK\n     */\n    public static void init(Application application) {\n        //工具类\n        initXUtil(application);\n\n        //页面框架\n        initXPage(application);\n\n        //切片框架\n        initXAOP(application);\n\n        //UI框架\n        initXUI(application);\n\n        //路由框架\n        initRouter(application);\n    }\n\n    /**\n     * 初始化XUtil工具类\n     */\n    private static void initXUtil(Application application) {\n        XUtil.init(application);\n        XUtil.debug(MyApp.isDebug());\n    }\n\n    /**\n     * 初始化XPage页面框架\n     */\n    private static void initXPage(Application application) {\n        PageConfig.getInstance()\n                .debug(MyApp.isDebug() ? \"PageLog\" : null)\n                .setContainActivityClazz(BaseActivity.class)\n                .init(application);\n    }\n\n    /**\n     * 初始化XAOP\n     */\n    private static void initXAOP(Application application) {\n        XAOP.init(application);\n        XAOP.debug(MyApp.isDebug());\n        //设置动态申请权限切片 申请权限被拒绝的事件响应监听\n        XAOP.setOnPermissionDeniedListener(permissionsDenied -> XToastUtils.error(\"权限申请被拒绝:\" + StringUtils.listToString(permissionsDenied, \",\")));\n    }\n\n    /**\n     * 初始化XUI框架\n     */\n    private static void initXUI(Application application) {\n        XUI.init(application);\n        XUI.debug(MyApp.isDebug());\n    }\n\n    /**\n     * 初始化路由框架\n     */\n    private static void initRouter(Application application) {\n        // 这两行必须写在init之前，否则这些配置在init过程中将无效\n        if (MyApp.isDebug()) {\n            XRouter.openLog();     // 打印日志\n            XRouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)\n        }\n        XRouter.init(application);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/xuexiang/xtaskdemo/utils/service/JsonSerializationService.java",
    "content": "/*\n * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtaskdemo.utils.service;\n\nimport android.content.Context;\n\nimport com.xuexiang.xrouter.annotation.Router;\nimport com.xuexiang.xrouter.facade.service.SerializationService;\nimport com.xuexiang.xutil.net.JsonUtil;\n\nimport java.lang.reflect.Type;\n\n/**\n * @author XUE\n * @since 2019/3/27 16:39\n */\n@Router(path = \"/service/json\")\npublic class JsonSerializationService implements SerializationService {\n    /**\n     * 对象序列化为json\n     *\n     * @param instance obj\n     * @return json string\n     */\n    @Override\n    public String object2Json(Object instance) {\n        return JsonUtil.toJson(instance);\n    }\n\n    /**\n     * json反序列化为对象\n     *\n     * @param input json string\n     * @param clazz object type\n     * @return instance of object\n     */\n    @Override\n    public <T> T parseObject(String input, Type clazz) {\n        return JsonUtil.fromJson(input, clazz);\n    }\n\n    /**\n     * 进程初始化的方法\n     *\n     * @param context 上下文\n     */\n    @Override\n    public void init(Context context) {\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#008577\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"78.5885\"\n                android:endY=\"90.9159\"\n                android:startX=\"48.7653\"\n                android:startY=\"61.0927\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/layout/adapter_item_simple_list_2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~       http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  ~\n  -->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center_vertical\"\n    android:minHeight=\"?attr/listPreferredItemHeight\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"?attr/xui_config_content_spacing_horizontal\"\n    android:paddingEnd=\"?attr/xui_config_content_spacing_horizontal\">\n\n    <TextView\n        android:id=\"@+id/tv_title\"\n        style=\"@style/TextStyle.Title\"\n        tools:text=\"主标题\" />\n\n    <TextView\n        android:id=\"@+id/tv_sub_title\"\n        style=\"@style/TextStyle.Explain\"\n        android:layout_marginTop=\"4dp\"\n        tools:text=\"副标题\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_usecase_compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~       http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  ~\n  -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginVertical=\"12dp\"\n        android:layout_marginHorizontal=\"16dp\"\n        android:orientation=\"horizontal\">\n\n        <Button\n            android:id=\"@+id/btn_normal\"\n            style=\"@style/Button.Blue.wrap\"\n            android:layout_weight=\"1\"\n            android:text=\"普通处理\" />\n\n        <Button\n            android:id=\"@+id/btn_rxjava\"\n            style=\"@style/Button.Blue.wrap\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_weight=\"1\"\n            android:text=\"RxJava处理\" />\n\n        <Button\n            android:id=\"@+id/btn_xtask\"\n            style=\"@style/Button.Blue.wrap\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_weight=\"1\"\n            android:text=\"XTask处理\" />\n\n    </LinearLayout>\n\n    <com.xuexiang.xui.widget.textview.LoggerTextView\n        android:id=\"@+id/logger\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_usecase_template.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~       http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  ~\n  -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginVertical=\"12dp\"\n        android:layout_marginHorizontal=\"16dp\"\n        android:orientation=\"horizontal\">\n\n        <Button\n            android:id=\"@+id/btn_before_improve\"\n            style=\"@style/Button.Blue.wrap\"\n            android:layout_weight=\"1\"\n            android:text=\"模拟优化前\" />\n\n        <Button\n            android:id=\"@+id/btn_after_improve\"\n            style=\"@style/Button.Blue.wrap\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_weight=\"1\"\n            android:text=\"模拟优化后\" />\n\n    </LinearLayout>\n\n    <com.xuexiang.xui.widget.textview.LoggerTextView\n        android:id=\"@+id/logger\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <color name=\"colorPrimary\">#299EE3</color>\n    <color name=\"colorPrimaryDark\">#299EE3</color>\n    <color name=\"colorAccent\">#299EE3</color>\n\n\n    <!--Toast，可自定义喜欢的颜色-->\n    <color name=\"toast_default_text_color\" tools:ignore=\"PrivateResource\">@color/xui_config_color_white</color>\n    <color name=\"toast_error_color\" tools:ignore=\"PrivateResource\">@color/xui_config_color_red</color>\n    <color name=\"toast_info_color\" tools:ignore=\"PrivateResource\">@color/colorAccent</color>\n    <color name=\"toast_success_color\" tools:ignore=\"PrivateResource\">#388E3C</color>\n    <color name=\"toast_warning_color\" tools:ignore=\"PrivateResource\">@color/xui_config_color_waring</color>\n    <color name=\"toast_normal_tint_color\" tools:ignore=\"PrivateResource\">#353A3E</color>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">XTaskDemo</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- 拓展主题 theme. -->\n    <style name=\"XUITheme\" parent=\"XUIBaseTheme\">\n        <!--设置默认窗口的动画样式-->\n        <item name=\"android:windowAnimationStyle\">@style/WindowAnimStyle</item>\n    </style>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"XUITheme.Phone\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n    <!--DialogTheme，用于将Activity作为Dialog的主题-->\n    <style name=\"DialogTheme\" parent=\"XUITheme.Phone\">\n        <!--设置dialog的背景，此处为系统给定的透明值-->\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <!--Dialog的windowFrame框为无-->\n        <item name=\"android:windowFrame\">@null</item>\n        <!--无标题-->\n        <item name=\"android:windowNoTitle\">true</item>　　　　　\n        <!--是否浮现在activity之上-->\n        <item name=\"android:windowIsFloating\">true</item>\n        <!--是否半透明-->\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <!--是否有覆盖-->\n        <item name=\"android:windowContentOverlay\">@null</item>\n        <!--设置Activity出现方式-->\n        <item name=\"android:windowAnimationStyle\">@android:style/Animation.Dialog</item>\n        <!--背景是否模糊显示-->\n        <item name=\"android:backgroundDimEnabled\">true</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles_widget.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~       http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  ~\n  -->\n\n<resources>\n\n    <!--放一些组件的样式-->\n    <style name=\"WindowAnimStyle\" parent=\"@android:style/Animation\">\n        <item name=\"android:activityOpenEnterAnimation\">@anim/xpage_slide_in_right</item>\n        <item name=\"android:activityOpenExitAnimation\">@anim/xpage_slide_out_left</item>\n        <item name=\"android:activityCloseEnterAnimation\">@anim/xpage_slide_in_left</item>\n        <item name=\"android:activityCloseExitAnimation\">@anim/xpage_slide_out_right</item>\n    </style>\n\n</resources>"
  },
  {
    "path": "app/src/test/java/com/xuexiang/xtaskdemo/ExampleUnitTest.java",
    "content": "package com.xuexiang.xtaskdemo;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() {\n        assertEquals(4, 2 + 2);\n    }\n\n}"
  },
  {
    "path": "app/x-library-simple.gradle",
    "content": "//引用XAOP插件\napply plugin: 'com.xuexiang.xaop'\n//引用XRouter-plugin插件实现自动注册\napply plugin: 'com.xuexiang.xrouter'\n//引用aspectjx插件\napply plugin: 'android-aspectjx'\n\n//自动添加依赖\nproject.configurations.each { configuration ->\n    def dependencies = getProject().dependencies\n    if (configuration.name == \"implementation\") {\n        //为Project加入X-Library依赖\n        //XUI框架\n        configuration.dependencies.add(dependencies.create(deps.xlibrary.xui))\n        configuration.dependencies.add(dependencies.create(deps.androidx.appcompat))\n        configuration.dependencies.add(dependencies.create(deps.androidx.recyclerview))\n        configuration.dependencies.add(dependencies.create(deps.androidx.design))\n        configuration.dependencies.add(dependencies.create(deps.glide))\n        //XUtil工具类\n        configuration.dependencies.add(dependencies.create(deps.xlibrary.xutil_core))\n        //XAOP切片\n        configuration.dependencies.add(dependencies.create(deps.xlibrary.xaop_runtime))\n        //XPage\n        configuration.dependencies.add(dependencies.create(deps.xlibrary.xpage_lib))\n        configuration.dependencies.add(dependencies.create(deps.butterknife.runtime))\n        //XRouter\n        configuration.dependencies.add(dependencies.create(deps.xlibrary.xrouter_runtime))\n    }\n\n    if (configuration.name == \"annotationProcessor\") {\n        //XPage\n        configuration.dependencies.add(dependencies.create(deps.xlibrary.xpage_compiler))\n        configuration.dependencies.add(dependencies.create(deps.butterknife.compiler))\n        //页面路由\n        configuration.dependencies.add(dependencies.create(deps.xlibrary.xrouter_compiler))\n    }\n\n    if (configuration.name == \"debugImplementation\") {\n        //内存泄漏监测leak\n        configuration.dependencies.add(dependencies.create(deps.leakcanary))\n    }\n}\n\naspectjx {\n    include 'com.xuexiang.xtaskdemo'\n}"
  },
  {
    "path": "art/xtask.mdj",
    "content": "{\n\t\"_type\": \"Project\",\n\t\"_id\": \"AAAAAAFF+h6SjaM2Hec=\",\n\t\"name\": \"Untitled\",\n\t\"ownedElements\": [\n\t\t{\n\t\t\t\"_type\": \"UMLModel\",\n\t\t\t\"_id\": \"AAAAAAFF+qBWK6M3Z8Y=\",\n\t\t\t\"_parent\": {\n\t\t\t\t\"$ref\": \"AAAAAAFF+h6SjaM2Hec=\"\n\t\t\t},\n\t\t\t\"name\": \"Model\",\n\t\t\t\"ownedElements\": [\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClassDiagram\",\n\t\t\t\t\t\"_id\": \"AAAAAAFF+qBtyKM79qY=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"Main\",\n\t\t\t\t\t\"defaultDiagram\": true,\n\t\t\t\t\t\"ownedViews\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+v237OY=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+/2436k=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+v237OY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+/25mFE=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/2436k=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 128,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 16,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+/26qTc=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/2436k=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 213,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 423,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 111.72509765625,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"TaskChainEngine\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+/27ttU=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/2436k=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 128,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 16,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+/28A9A=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/2436k=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 128,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 16,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 208,\n\t\t\t\t\t\t\t\t\t\"top\": 416,\n\t\t\t\t\t\t\t\t\t\"width\": 121.72509765625,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/25mFE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/26qTc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/27ttU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/28A9A=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+/293p0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+v237OY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 208,\n\t\t\t\t\t\t\t\t\t\"top\": 441,\n\t\t\t\t\t\t\t\t\t\"width\": 121.72509765625,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+/2+/10=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+v237OY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 208,\n\t\t\t\t\t\t\t\t\t\"top\": 451,\n\t\t\t\t\t\t\t\t\t\"width\": 121.72509765625,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+/2/nPA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+v237OY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 64,\n\t\t\t\t\t\t\t\t\t\"top\": 8,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+/3AZuo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+v237OY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 64,\n\t\t\t\t\t\t\t\t\t\"top\": 8,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 208,\n\t\t\t\t\t\t\t\"top\": 416,\n\t\t\t\t\t\t\t\"width\": 121.72509765625,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/2436k=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/293p0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/2+/10=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/2/nPA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+/3AZuo=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxP3jEnk=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxP3kV6w=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3jEnk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxP3lX10=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3kV6w=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -128,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -336,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxf3md0M=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3kV6w=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 213,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 342,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 111.72509765625,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ITaskChainEngine\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxf3ncKk=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3kV6w=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -128,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -336,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxf3oR5g=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3kV6w=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -128,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -336,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 208,\n\t\t\t\t\t\t\t\t\t\"top\": 335,\n\t\t\t\t\t\t\t\t\t\"width\": 121.72509765625,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3lX10=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxf3md0M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxf3ncKk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxf3oR5g=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxf3pgEU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3jEnk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -64,\n\t\t\t\t\t\t\t\t\t\"top\": -168,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxf3qlZQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3jEnk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -64,\n\t\t\t\t\t\t\t\t\t\"top\": -168,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxf3rOcM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3jEnk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -64,\n\t\t\t\t\t\t\t\t\t\"top\": -168,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxf3sbgc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3jEnk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -64,\n\t\t\t\t\t\t\t\t\t\"top\": -168,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 208,\n\t\t\t\t\t\t\t\"top\": 312,\n\t\t\t\t\t\t\t\"width\": 121.72509765625,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3kV6w=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxf3pgEU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxf3qlZQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxf3rOcM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxf3sbgc=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4P5Ko=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4Q9jY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4P5Ko=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4Rcb8=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4Q9jY=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -240,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -736,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4S4Jw=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4Q9jY=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 37,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 198,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 116.09228515625,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ITaskStepLifecycle\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4TTvo=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4Q9jY=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -240,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -736,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4Uv2o=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4Q9jY=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -240,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -736,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 32,\n\t\t\t\t\t\t\t\t\t\"top\": 191,\n\t\t\t\t\t\t\t\t\t\"width\": 126.09228515625,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4Rcb8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4S4Jw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4TTvo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4Uv2o=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4VgnY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4P5Ko=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -120,\n\t\t\t\t\t\t\t\t\t\"top\": -368,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4WViE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4P5Ko=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -120,\n\t\t\t\t\t\t\t\t\t\"top\": -368,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4Xwx4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4P5Ko=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -120,\n\t\t\t\t\t\t\t\t\t\"top\": -368,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4YpRw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4P5Ko=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -120,\n\t\t\t\t\t\t\t\t\t\"top\": -368,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 32,\n\t\t\t\t\t\t\t\"top\": 168,\n\t\t\t\t\t\t\t\"width\": 126.09228515625,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4Q9jY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4VgnY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4WViE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4Xwx4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4YpRw=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZv45QQE=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZv46lfA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv45QQE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZv47z7I=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv46lfA=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -496,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -864,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZv48dXA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv46lfA=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 221,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 174,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 99.4423828125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"IGroupTaskStep\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZv49tL8=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv46lfA=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -496,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -864,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZv4+arw=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv46lfA=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -496,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -864,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 216,\n\t\t\t\t\t\t\t\t\t\"top\": 167,\n\t\t\t\t\t\t\t\t\t\"width\": 109.4423828125,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv47z7I=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv48dXA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv49tL8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv4+arw=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZv4/0lw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv45QQE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -248,\n\t\t\t\t\t\t\t\t\t\"top\": -432,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZv5ACvQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv45QQE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -248,\n\t\t\t\t\t\t\t\t\t\"top\": -432,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZv5BKZA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv45QQE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -248,\n\t\t\t\t\t\t\t\t\t\"top\": -432,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZv5CjKc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv45QQE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -248,\n\t\t\t\t\t\t\t\t\t\"top\": -432,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 216,\n\t\t\t\t\t\t\t\"top\": 144,\n\t\t\t\t\t\t\t\"width\": 109.4423828125,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv46lfA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv4/0lw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv5ACvQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv5BKZA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv5CjKc=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5jM5A=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5hqIo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5kDeg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5jM5A=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5hqIo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5lotA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5kDeg=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 176,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -848,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5mPtk=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5kDeg=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 413,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 206,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 62.1435546875,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ICanceller\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5nAew=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5kDeg=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 176,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -848,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5ojqM=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5kDeg=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 176,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -848,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 408,\n\t\t\t\t\t\t\t\t\t\"top\": 199,\n\t\t\t\t\t\t\t\t\t\"width\": 72.1435546875,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5lotA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5mPtk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5nAew=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5ojqM=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5pTzQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5jM5A=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5hqIo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 88,\n\t\t\t\t\t\t\t\t\t\"top\": -424,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5qoZk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5jM5A=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5hqIo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 88,\n\t\t\t\t\t\t\t\t\t\"top\": -424,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5rRNw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5jM5A=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5hqIo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 88,\n\t\t\t\t\t\t\t\t\t\"top\": -424,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5sX1A=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5jM5A=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5hqIo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 88,\n\t\t\t\t\t\t\t\t\t\"top\": -424,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 408,\n\t\t\t\t\t\t\t\"top\": 176,\n\t\t\t\t\t\t\t\"width\": 72.1435546875,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5kDeg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5pTzQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5qoZk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5rRNw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5sX1A=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oIYZv6Y+i8=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZf6W7vU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oIYZ/6ZwPo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZv6Y+i8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZf6W7vU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 171,\n\t\t\t\t\t\t\t\t\t\"top\": 269,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZv6Y+i8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oIYZ/6a/q8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZv6Y+i8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZf6W7vU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 161,\n\t\t\t\t\t\t\t\t\t\"top\": 281,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZv6Y+i8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oIYZ/6btmc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZv6Y+i8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZf6W7vU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 190,\n\t\t\t\t\t\t\t\t\t\"top\": 246,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZv6Y+i8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4P5Ko=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3jEnk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"238:311;124:217\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZ/6ZwPo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZ/6a/q8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIYZ/6btmc=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oIuff6py/M=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6ny+c=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oIuff6qeqM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6py/M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6ny+c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 254,\n\t\t\t\t\t\t\t\t\t\"top\": 245,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6py/M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oIuff6rBjM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6py/M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6ny+c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 239,\n\t\t\t\t\t\t\t\t\t\"top\": 245,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6py/M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oIuff6svG8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6py/M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6ny+c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 283,\n\t\t\t\t\t\t\t\t\t\"top\": 246,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6py/M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZv45QQE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3jEnk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"268:311;270:193\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6qeqM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6rBjM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oIuff6svG8=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oJAIf66bOw=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf64xJQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oJAIf67sGQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf66bOw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf64xJQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 345,\n\t\t\t\t\t\t\t\t\t\"top\": 250,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf66bOw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oJAIf68e+M=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf66bOw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf64xJQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 336,\n\t\t\t\t\t\t\t\t\t\"top\": 238,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf66bOw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oJAIf695Jk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf66bOw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf64xJQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 364,\n\t\t\t\t\t\t\t\t\t\"top\": 273,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf66bOw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5jM5A=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3jEnk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"300:311;411:225\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf67sGQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf68e+M=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oJAIf695Jk=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oKdTP7Qy2M=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7PY/4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oKdTP7RVbE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7Qy2M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7PY/4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 253,\n\t\t\t\t\t\t\t\t\t\"top\": 368,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7Qy2M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oKdTP7ShG4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7Qy2M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7PY/4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 238,\n\t\t\t\t\t\t\t\t\t\"top\": 368,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7Qy2M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oKdTP7TOVA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7Qy2M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7PY/4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 282,\n\t\t\t\t\t\t\t\t\t\"top\": 369,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7Qy2M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3jEnk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+v237OY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"268:415;268:335\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7RVbE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7ShG4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oKdTP7TOVA=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbv7mDqg=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbv7nb64=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbv7oytA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7nb64=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 752,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -432,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbv7pHRg=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7nb64=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 629,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 342,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 61.419921875,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ITaskStep\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbv7qtPE=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7nb64=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 752,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -432,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbv7ri60=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7nb64=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 752,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -432,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 624,\n\t\t\t\t\t\t\t\t\t\"top\": 335,\n\t\t\t\t\t\t\t\t\t\"width\": 71.419921875,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7oytA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7pHRg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7qtPE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7ri60=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbv7sXjY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 376,\n\t\t\t\t\t\t\t\t\t\"top\": -216,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbv7tVVM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 376,\n\t\t\t\t\t\t\t\t\t\"top\": -216,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbv7uN74=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 376,\n\t\t\t\t\t\t\t\t\t\"top\": -216,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbv7vMAk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 376,\n\t\t\t\t\t\t\t\t\t\"top\": -216,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 624,\n\t\t\t\t\t\t\t\"top\": 312,\n\t\t\t\t\t\t\t\"width\": 71.419921875,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7nb64=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7sXjY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7tVVM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7uN74=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7vMAk=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48v8Qo+U=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8O7tk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48v8RdDE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8Qo+U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8O7tk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48v8Srzk=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8RdDE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -288,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48v8THqs=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8RdDE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 469,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 102,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 72.25537109375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ICancelable\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48v8UzP0=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8RdDE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -288,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48v8VRCk=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8RdDE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -288,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 464,\n\t\t\t\t\t\t\t\t\t\"top\": 95,\n\t\t\t\t\t\t\t\t\t\"width\": 82.25537109375,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8Srzk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8THqs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8UzP0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8VRCk=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48v8WqcM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8Qo+U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8O7tk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -144,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48/8X8FU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8Qo+U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8O7tk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -144,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48/8Yhis=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8Qo+U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8O7tk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -144,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48/8ZxBY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8Qo+U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8O7tk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -144,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 464,\n\t\t\t\t\t\t\t\"top\": 72,\n\t\t\t\t\t\t\t\"width\": 82.25537109375,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8RdDE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8WqcM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48/8X8FU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48/8Yhis=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48/8ZxBY=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oOe/P87GbQ=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe+/85LIw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oOe/f88fgY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe/P87GbQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe+/85LIw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 460,\n\t\t\t\t\t\t\t\t\t\"top\": 134,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe/P87GbQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oOe/f89lPI=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe/P87GbQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe+/85LIw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 447,\n\t\t\t\t\t\t\t\t\t\"top\": 126,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe/P87GbQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oOe/f8+wgA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe/P87GbQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe+/85LIw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 485,\n\t\t\t\t\t\t\t\t\t\"top\": 149,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe/P87GbQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8Qo+U=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5jM5A=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"458:175;489:121\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe/f88fgY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe/f89lPI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oOe/f8+wgA=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQKQ/9PN2k=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9NvDs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQKQ/9Qk4s=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9PN2k=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9NvDs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 568,\n\t\t\t\t\t\t\t\t\t\"top\": 218,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9PN2k=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQKQ/9RxXg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9PN2k=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9NvDs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 555,\n\t\t\t\t\t\t\t\t\t\"top\": 226,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9PN2k=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQKQ/9S9u4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9PN2k=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9NvDs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 593,\n\t\t\t\t\t\t\t\t\t\"top\": 201,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9PN2k=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8Qo+U=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"643:311;520:121\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9Qk4s=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9RxXg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQKQ/9S9u4=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9gcdI=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9h1Ug=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9gcdI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9iy2A=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9h1Ug=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -400,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 112,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9jJxs=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9h1Ug=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 605,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 166,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 122.560546875,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ITaskStepController\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9kWek=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9h1Ug=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -400,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 112,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9la2g=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9h1Ug=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -400,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 112,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 600,\n\t\t\t\t\t\t\t\t\t\"top\": 159,\n\t\t\t\t\t\t\t\t\t\"width\": 132.560546875,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9iy2A=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9jJxs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9kWek=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9la2g=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9m5JU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9gcdI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -200,\n\t\t\t\t\t\t\t\t\t\"top\": 56,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9npHY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9gcdI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -200,\n\t\t\t\t\t\t\t\t\t\"top\": 56,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9oHm4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9gcdI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -200,\n\t\t\t\t\t\t\t\t\t\"top\": 56,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9p5Cc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9gcdI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -200,\n\t\t\t\t\t\t\t\t\t\"top\": 56,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 600,\n\t\t\t\t\t\t\t\"top\": 136,\n\t\t\t\t\t\t\t\"width\": 132.560546875,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9h1Ug=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9m5JU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9npHY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9oHm4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9p5Cc=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oRXKv+K4yc=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+Ij8g=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oRXKv+LD5M=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+K4yc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+Ij8g=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 647,\n\t\t\t\t\t\t\t\t\t\"top\": 241,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+K4yc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oRXKv+MJCw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+K4yc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+Ij8g=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 632,\n\t\t\t\t\t\t\t\t\t\"top\": 241,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+K4yc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oRXKv+ND5M=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+K4yc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+Ij8g=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 676,\n\t\t\t\t\t\t\t\t\t\"top\": 242,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+K4yc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9gcdI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"660:311;664:185\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+LD5M=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+MJCw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oRXKv+ND5M=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+dGTE=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+e0Rc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+dGTE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+fGD8=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+e0Rc=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -336,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 144,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+gHaI=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+e0Rc=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 765,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 174,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 61.419921875,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"Runnable\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+hXNE=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+e0Rc=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -336,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 144,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+iZ8E=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+e0Rc=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -336,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 144,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 760,\n\t\t\t\t\t\t\t\t\t\"top\": 167,\n\t\t\t\t\t\t\t\t\t\"width\": 71.419921875,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+fGD8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+gHaI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+hXNE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+iZ8E=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+j17A=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+dGTE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -168,\n\t\t\t\t\t\t\t\t\t\"top\": 72,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+k+VU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+dGTE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -168,\n\t\t\t\t\t\t\t\t\t\"top\": 72,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+lz4k=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+dGTE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -168,\n\t\t\t\t\t\t\t\t\t\"top\": 72,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+mw8k=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+dGTE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -168,\n\t\t\t\t\t\t\t\t\t\"top\": 72,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 760,\n\t\t\t\t\t\t\t\"top\": 144,\n\t\t\t\t\t\t\t\"width\": 71.419921875,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+e0Rc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+j17A=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+k+VU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+lz4k=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+mw8k=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oT/Ff/I3EI=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/FP/Gwcg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oT/Ff/JQuY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/Ff/I3EI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/FP/Gwcg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 715,\n\t\t\t\t\t\t\t\t\t\"top\": 236,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/Ff/I3EI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oT/Ff/KaZo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/Ff/I3EI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/FP/Gwcg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 703,\n\t\t\t\t\t\t\t\t\t\"top\": 227,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/Ff/I3EI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oT/Ff/LUGw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/Ff/I3EI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/FP/Gwcg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 738,\n\t\t\t\t\t\t\t\t\t\"top\": 255,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/Ff/I3EI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+dGTE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"679:311;775:193\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/Ff/JQuY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/Ff/KaZo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oT/Ff/LUGw=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/bUgI=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/c+MQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/dQHE=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/c+MQ=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 48,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/eH6w=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/c+MQ=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 605,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 471,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 109.5732421875,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"AbstractTaskStep\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/fBds=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/c+MQ=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 48,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/gJVg=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/c+MQ=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 48,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 600,\n\t\t\t\t\t\t\t\t\t\"top\": 464,\n\t\t\t\t\t\t\t\t\t\"width\": 119.5732421875,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/dQHE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/eH6w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/fBds=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/gJVg=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/hHrY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 600,\n\t\t\t\t\t\t\t\t\t\"top\": 489,\n\t\t\t\t\t\t\t\t\t\"width\": 119.5732421875,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/iFiQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 600,\n\t\t\t\t\t\t\t\t\t\"top\": 499,\n\t\t\t\t\t\t\t\t\t\"width\": 119.5732421875,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/jaUM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"top\": 24,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/kILc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"top\": 24,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 600,\n\t\t\t\t\t\t\t\"top\": 464,\n\t\t\t\t\t\t\t\"width\": 119.5732421875,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/c+MQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/hHrY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/iFiQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/jaUM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/kILc=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVy3wAFTrw=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAER5E=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVy3wAG9c8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAFTrw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAER5E=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 644,\n\t\t\t\t\t\t\t\t\t\"top\": 392,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAFTrw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVy3wAHRJU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAFTrw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAER5E=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 629,\n\t\t\t\t\t\t\t\t\t\"top\": 392,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAFTrw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVy3wAIz+0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAFTrw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAER5E=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 673,\n\t\t\t\t\t\t\t\t\t\"top\": 393,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAFTrw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"659:463;659:335\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAG9c8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAHRJU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVy3wAIz+0=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAY5hk=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAWQmM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAZrQw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAY5hk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAWQmM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAaV1E=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAZrQw=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 288,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 224,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAbNfc=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAZrQw=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 709,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 623,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 99.46142578125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"SimpleTaskStep\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAclbU=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAZrQw=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 288,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 224,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAdEQU=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAZrQw=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 288,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 224,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 704,\n\t\t\t\t\t\t\t\t\t\"top\": 616,\n\t\t\t\t\t\t\t\t\t\"width\": 109.46142578125,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAaV1E=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAbNfc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAclbU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAdEQU=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAeq0Q=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAY5hk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAWQmM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 704,\n\t\t\t\t\t\t\t\t\t\"top\": 641,\n\t\t\t\t\t\t\t\t\t\"width\": 109.46142578125,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAffno=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAY5hk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAWQmM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 704,\n\t\t\t\t\t\t\t\t\t\"top\": 651,\n\t\t\t\t\t\t\t\t\t\"width\": 109.46142578125,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAgHVA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAY5hk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAWQmM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 144,\n\t\t\t\t\t\t\t\t\t\"top\": 112,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAhS08=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAY5hk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAWQmM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 144,\n\t\t\t\t\t\t\t\t\t\"top\": 112,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 704,\n\t\t\t\t\t\t\t\"top\": 616,\n\t\t\t\t\t\t\t\"width\": 109.46142578125,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAZrQw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAeq0Q=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAffno=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAgHVA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAhS08=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK4wBDOcU=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBBo88=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK4wBEb+Q=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBDOcU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBBo88=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK4wBFYc4=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBEb+Q=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -256,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 240,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK4wBGZQo=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBEb+Q=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 589,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 623,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 65.5078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"XTaskStep\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK4wBHsFA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBEb+Q=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -256,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 240,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK4wBIZ+Y=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBEb+Q=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -256,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 240,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 584,\n\t\t\t\t\t\t\t\t\t\"top\": 616,\n\t\t\t\t\t\t\t\t\t\"width\": 75.5078125,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBFYc4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBGZQo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBHsFA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBIZ+Y=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK4wBJ65o=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBDOcU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBBo88=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 584,\n\t\t\t\t\t\t\t\t\t\"top\": 641,\n\t\t\t\t\t\t\t\t\t\"width\": 75.5078125,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK4wBKVkw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBDOcU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBBo88=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 584,\n\t\t\t\t\t\t\t\t\t\"top\": 651,\n\t\t\t\t\t\t\t\t\t\"width\": 75.5078125,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK4wBLunc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBDOcU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBBo88=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -128,\n\t\t\t\t\t\t\t\t\t\"top\": 120,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK5ABM3jQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBDOcU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBBo88=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -128,\n\t\t\t\t\t\t\t\t\t\"top\": 120,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 584,\n\t\t\t\t\t\t\t\"top\": 616,\n\t\t\t\t\t\t\t\"width\": 75.5078125,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBEb+Q=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBJ65o=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBKVkw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBLunc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK5ABM3jQ=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oY38QBxcIk=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBvDLM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oY38QBy+KQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBxcIk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBvDLM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 625,\n\t\t\t\t\t\t\t\t\t\"top\": 552,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBxcIk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oY38gBzhIE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBxcIk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBvDLM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 610,\n\t\t\t\t\t\t\t\t\t\"top\": 548,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBxcIk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oY38gB0htU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBxcIk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBvDLM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 654,\n\t\t\t\t\t\t\t\t\t\"top\": 559,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBxcIk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBDOcU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"627:615;653:509\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38QBy+KQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38gBzhIE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oY38gB0htU=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oZEGACCCzk=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACAn0w=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oZEGACDv+I=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACCCzk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACAn0w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 695,\n\t\t\t\t\t\t\t\t\t\"top\": 564,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACCCzk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oZEGACELsA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACCCzk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACAn0w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 682,\n\t\t\t\t\t\t\t\t\t\"top\": 572,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACCCzk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oZEGACFCnQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACCCzk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACAn0w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 720,\n\t\t\t\t\t\t\t\t\t\"top\": 547,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACCCzk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAY5hk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"743:615;674:509\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACDv+I=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACELsA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oZEGACFCnQ=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCKwCVu1U=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKgCR2Jk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACWSEs=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKgCR2Jk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 441,\n\t\t\t\t\t\t\t\t\t\"top\": 307,\n\t\t\t\t\t\t\t\t\t\"width\": 14.82177734375,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1,\n\t\t\t\t\t\t\t\t\t\"text\": \"+n\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACXkZ0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKgCR2Jk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 449,\n\t\t\t\t\t\t\t\t\t\"top\": 292,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACYaow=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKgCR2Jk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 447,\n\t\t\t\t\t\t\t\t\t\"top\": 336,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACZQPY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCSX2E=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 320,\n\t\t\t\t\t\t\t\t\t\"top\": 382,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACavIo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCSX2E=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 315,\n\t\t\t\t\t\t\t\t\t\"top\": 370,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACbAfE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCSX2E=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 330,\n\t\t\t\t\t\t\t\t\t\"top\": 408,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACcDfA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCTC3k=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 597,\n\t\t\t\t\t\t\t\t\t\"top\": 312,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACdsyw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCTC3k=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 595,\n\t\t\t\t\t\t\t\t\t\"top\": 299,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACegVc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCTC3k=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 600,\n\t\t\t\t\t\t\t\t\t\"top\": 340,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACf6xk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCSX2E=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCLACgyTI=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCVu1U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKwCTC3k=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+v237OY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"306:415;448:328;623:335\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACWSEs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACXkZ0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACYaow=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACZQPY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACavIo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACbAfE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACcDfA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACdsyw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACegVc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACf6xk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCLACgyTI=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oejFwDmxXI=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDkL34=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oejFwDnjsk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDmxXI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDkL34=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oejFwDojFA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDnjsk=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 112,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -256,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oejFwDpLvs=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDnjsk=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 381,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 526,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 65.01904296875,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"IDataStore\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oejFwDqviU=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDnjsk=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 112,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -256,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oejGADrg/w=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDnjsk=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 112,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -256,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 376,\n\t\t\t\t\t\t\t\t\t\"top\": 519,\n\t\t\t\t\t\t\t\t\t\"width\": 75.01904296875,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDojFA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDpLvs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDqviU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejGADrg/w=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oejGADsTs0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDmxXI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDkL34=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 56,\n\t\t\t\t\t\t\t\t\t\"top\": -128,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oejGADts/g=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDmxXI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDkL34=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 56,\n\t\t\t\t\t\t\t\t\t\"top\": -128,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oejGADu4N0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDmxXI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDkL34=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 56,\n\t\t\t\t\t\t\t\t\t\"top\": -128,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oejGADv4nU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDmxXI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDkL34=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 56,\n\t\t\t\t\t\t\t\t\t\"top\": -128,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 376,\n\t\t\t\t\t\t\t\"top\": 496,\n\t\t\t\t\t\t\t\"width\": 75.01904296875,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDnjsk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejGADsTs0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejGADts/g=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejGADu4N0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejGADv4nU=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwElJVk=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEjPSY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwEm+g4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwElJVk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEjPSY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwEn0HA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEm+g4=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 32,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -224,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwEoA6o=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEm+g4=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 373,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 646,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 72.02685546875,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ITaskParam\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwEpL30=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEm+g4=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 32,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -224,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwEqSQA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEm+g4=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 32,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -224,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 368,\n\t\t\t\t\t\t\t\t\t\"top\": 639,\n\t\t\t\t\t\t\t\t\t\"width\": 82.02685546875,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEn0HA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEoA6o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEpL30=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEqSQA=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwErdO4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwElJVk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEjPSY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 16,\n\t\t\t\t\t\t\t\t\t\"top\": -112,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwEs0Pg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwElJVk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEjPSY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 16,\n\t\t\t\t\t\t\t\t\t\"top\": -112,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwEtvqo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwElJVk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEjPSY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 16,\n\t\t\t\t\t\t\t\t\t\"top\": -112,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwEu2C0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwElJVk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEjPSY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 16,\n\t\t\t\t\t\t\t\t\t\"top\": -112,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 368,\n\t\t\t\t\t\t\t\"top\": 616,\n\t\t\t\t\t\t\t\"width\": 82.02685546875,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEm+g4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwErdO4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEs0Pg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEtvqo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEu2C0=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/of2wAFux2o=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFsd14=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/of2wAFvWWo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFux2o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFsd14=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 395,\n\t\t\t\t\t\t\t\t\t\"top\": 573,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFux2o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/of2wAFwUeE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFux2o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFsd14=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 380,\n\t\t\t\t\t\t\t\t\t\"top\": 572,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFux2o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/of2wAFxA6c=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFux2o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFsd14=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 424,\n\t\t\t\t\t\t\t\t\t\"top\": 574,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFux2o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDmxXI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwElJVk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"409:615;412:545\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFvWWo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFwUeE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/of2wAFxA6c=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1AGIzZI=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGGwlc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1AGJSOI=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGIzZI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGGwlc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1AGKyJw=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGJSOI=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 96,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -192,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1AGLfhA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGJSOI=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 373,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 735,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 68.4150390625,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"TaskParam\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1AGMuus=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGJSOI=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 96,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -192,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1AGNW0U=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGJSOI=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 96,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -192,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 368,\n\t\t\t\t\t\t\t\t\t\"top\": 728,\n\t\t\t\t\t\t\t\t\t\"width\": 78.4150390625,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGKyJw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGLfhA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGMuus=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGNW0U=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1AGOZ4E=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGIzZI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGGwlc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 368,\n\t\t\t\t\t\t\t\t\t\"top\": 753,\n\t\t\t\t\t\t\t\t\t\"width\": 78.4150390625,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1AGPKYw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGIzZI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGGwlc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 368,\n\t\t\t\t\t\t\t\t\t\"top\": 763,\n\t\t\t\t\t\t\t\t\t\"width\": 78.4150390625,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1QGQHFE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGIzZI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGGwlc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 48,\n\t\t\t\t\t\t\t\t\t\"top\": -96,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1QGRJCQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGIzZI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGGwlc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 48,\n\t\t\t\t\t\t\t\t\t\"top\": -96,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 368,\n\t\t\t\t\t\t\t\"top\": 728,\n\t\t\t\t\t\t\t\"width\": 78.4150390625,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGJSOI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGOZ4E=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGPKYw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1QGQHFE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1QGRJCQ=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ohUsAHQ0vA=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsAHPXn8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ohUsQHRAlk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsAHQ0vA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsAHPXn8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 392,\n\t\t\t\t\t\t\t\t\t\"top\": 676,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsAHQ0vA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ohUsQHSJIg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsAHQ0vA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsAHPXn8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 377,\n\t\t\t\t\t\t\t\t\t\"top\": 676,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsAHQ0vA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ohUsQHTQSs=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsAHQ0vA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsAHPXn8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 421,\n\t\t\t\t\t\t\t\t\t\"top\": 677,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsAHQ0vA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwElJVk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGIzZI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"406:727;408:639\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsQHRAlk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsQHSJIg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ohUsQHTQSs=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/gH+hsU=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH8TJg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/gH/gy0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH+hsU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH8TJg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/gIAQa0=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH/gy0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -272,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -208,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/gIB+LM=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH/gy0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 317,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 831,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 68.39599609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"TaskResult\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/gIC0Kg=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH/gy0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -272,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -208,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/gIDXTQ=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH/gy0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -272,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -208,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 312,\n\t\t\t\t\t\t\t\t\t\"top\": 824,\n\t\t\t\t\t\t\t\t\t\"width\": 78.39599609375,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gIAQa0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gIB+LM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gIC0Kg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gIDXTQ=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/gIEMgs=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH+hsU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH8TJg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 312,\n\t\t\t\t\t\t\t\t\t\"top\": 849,\n\t\t\t\t\t\t\t\t\t\"width\": 78.39599609375,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/wIFnxE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH+hsU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH8TJg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 312,\n\t\t\t\t\t\t\t\t\t\"top\": 859,\n\t\t\t\t\t\t\t\t\t\"width\": 78.39599609375,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/wIGSwE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH+hsU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH8TJg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -136,\n\t\t\t\t\t\t\t\t\t\"top\": -104,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/wIHbiM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH+hsU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH8TJg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -136,\n\t\t\t\t\t\t\t\t\t\"top\": -104,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 312,\n\t\t\t\t\t\t\t\"top\": 824,\n\t\t\t\t\t\t\t\"width\": 78.39599609375,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH/gy0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gIEMgs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/wIFnxE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/wIGSwE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/wIHbiM=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oifbQJAE14=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbQI+idY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oifbgJBPQQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbQJAE14=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbQI+idY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 365,\n\t\t\t\t\t\t\t\t\t\"top\": 784,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbQJAE14=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oifbgJCGBM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbQJAE14=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbQI+idY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 352,\n\t\t\t\t\t\t\t\t\t\"top\": 776,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbQJAE14=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oifbgJDOU0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbQJAE14=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbQI+idY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 390,\n\t\t\t\t\t\t\t\t\t\"top\": 799,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbQJAE14=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGIzZI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH+hsU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"363:823;393:773\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbgJBPQQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbgJCGBM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oifbgJDOU0=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oixvAJgiuk=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixuwJenZM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oixvAJhWBE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJgiuk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixuwJenZM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oixvAJiWPo=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJhWBE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -608,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -192,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oixvAJjIfo=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJhWBE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 229,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 758,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 72.0078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ITaskResult\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oixvAJk6xo=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJhWBE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -608,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -192,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oixvAJlFU0=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJhWBE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -608,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -192,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 224,\n\t\t\t\t\t\t\t\t\t\"top\": 751,\n\t\t\t\t\t\t\t\t\t\"width\": 82.0078125,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJiWPo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJjIfo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJk6xo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJlFU0=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oixvAJmej0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJgiuk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixuwJenZM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -304,\n\t\t\t\t\t\t\t\t\t\"top\": -96,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oixvAJnpqQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJgiuk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixuwJenZM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -304,\n\t\t\t\t\t\t\t\t\t\"top\": -96,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oixvAJontY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJgiuk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixuwJenZM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -304,\n\t\t\t\t\t\t\t\t\t\"top\": -96,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oixvQJpeQY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJgiuk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixuwJenZM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -304,\n\t\t\t\t\t\t\t\t\t\"top\": -96,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 224,\n\t\t\t\t\t\t\t\"top\": 728,\n\t\t\t\t\t\t\t\"width\": 82.0078125,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJhWBE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJmej0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJnpqQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJontY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvQJpeQY=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ojnTwKbVPM=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKa348=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ojnTwKcXyE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKbVPM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKa348=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 288,\n\t\t\t\t\t\t\t\t\t\"top\": 790,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKbVPM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ojnTwKd0GA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKbVPM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKa348=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 276,\n\t\t\t\t\t\t\t\t\t\"top\": 799,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKbVPM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ojnTwKe1X0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKbVPM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKa348=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 311,\n\t\t\t\t\t\t\t\t\t\"top\": 771,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKbVPM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJgiuk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH+hsU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"329:823;271.2631578947368:751\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKcXyE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKd0GA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ojnTwKe1X0=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPk0AI=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnrwPgaSQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPlgvA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnrwPgaSQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 273,\n\t\t\t\t\t\t\t\t\t\"top\": 588,\n\t\t\t\t\t\t\t\t\t\"width\": 14.82177734375,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1,\n\t\t\t\t\t\t\t\t\t\"text\": \"+1\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPmaGY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnrwPgaSQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 295,\n\t\t\t\t\t\t\t\t\t\"top\": 588,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPn39Y=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnrwPgaSQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 251,\n\t\t\t\t\t\t\t\t\t\"top\": 587,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPosNE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnrwPhtDg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 282,\n\t\t\t\t\t\t\t\t\t\"top\": 481,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPpkI4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnrwPhtDg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 295,\n\t\t\t\t\t\t\t\t\t\"top\": 483,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPqxqU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnrwPhtDg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 255,\n\t\t\t\t\t\t\t\t\t\"top\": 476,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPrEOs=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPiR/4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 279,\n\t\t\t\t\t\t\t\t\t\"top\": 695,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPs8R8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPiR/4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 292,\n\t\t\t\t\t\t\t\t\t\"top\": 693,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPtY94=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPiR/4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 251,\n\t\t\t\t\t\t\t\t\t\"top\": 699,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPuqss=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnrwPhtDg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPvb5w=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPk0AI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPiR/4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixvAJgiuk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+v237OY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"268:461;264:727\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPlgvA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPmaGY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPn39Y=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPosNE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPpkI4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPqxqU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPrEOs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPs8R8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPtY94=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPuqss=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnsAPvb5w=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1ARuIJ4=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRqA8w=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1ARv8h8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRqA8w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 535,\n\t\t\t\t\t\t\t\t\t\"top\": 568,\n\t\t\t\t\t\t\t\t\t\"width\": 14.82177734375,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1,\n\t\t\t\t\t\t\t\t\t\"text\": \"+1\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1ARwubs=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRqA8w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 550,\n\t\t\t\t\t\t\t\t\t\"top\": 581,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1ARxVrg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRqA8w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 527,\n\t\t\t\t\t\t\t\t\t\"top\": 543,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1ARydW0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRr2tM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 607,\n\t\t\t\t\t\t\t\t\t\"top\": 529,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1ARzp6U=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRr2tM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 612,\n\t\t\t\t\t\t\t\t\t\"top\": 541,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1AR0x84=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRr2tM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 597,\n\t\t\t\t\t\t\t\t\t\"top\": 503,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1AR1Dz8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRssuw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 478,\n\t\t\t\t\t\t\t\t\t\"top\": 608,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1AR2/wM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRssuw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 487,\n\t\t\t\t\t\t\t\t\t\"top\": 618,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1AR3BHU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRssuw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 460,\n\t\t\t\t\t\t\t\t\t\"top\": 587,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1AR4ocw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRr2tM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh1AR5c+I=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARuIJ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRssuw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwElJVk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"622:509;449:615\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARv8h8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARwubs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARxVrg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARydW0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1ARzp6U=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1AR0x84=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1AR1Dz8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1AR2/wM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1AR3BHU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1AR4ocw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh1AR5c+I=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/osTOwbHp3s=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbFpp8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/osTOwbIwu0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbHp3s=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbFpp8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/osTOwbJsZI=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbIwu0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -16,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/osTOwbK91w=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbIwu0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 453,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 439,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 87.4072265625,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"MapDataStore\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/osTOwbLwpk=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbIwu0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -16,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/osTOwbMYic=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbIwu0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -16,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 448,\n\t\t\t\t\t\t\t\t\t\"top\": 432,\n\t\t\t\t\t\t\t\t\t\"width\": 97.4072265625,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbJsZI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbK91w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbLwpk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbMYic=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/osTOwbNLLs=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbHp3s=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbFpp8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 448,\n\t\t\t\t\t\t\t\t\t\"top\": 457,\n\t\t\t\t\t\t\t\t\t\"width\": 97.4072265625,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/osTPAbOk1w=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbHp3s=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbFpp8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 448,\n\t\t\t\t\t\t\t\t\t\"top\": 467,\n\t\t\t\t\t\t\t\t\t\"width\": 97.4072265625,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/osTPAbPctc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbHp3s=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbFpp8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"top\": -8,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/osTPAbQwxM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbHp3s=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbFpp8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"top\": -8,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 448,\n\t\t\t\t\t\t\t\"top\": 432,\n\t\t\t\t\t\t\t\"width\": 97.4072265625,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbIwu0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbNLLs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTPAbOk1w=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTPAbPctc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTPAbQwxM=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/otLdgdLI8c=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdKMcA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/otLdgdMgew=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdLI8c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdKMcA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 453,\n\t\t\t\t\t\t\t\t\t\"top\": 495,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdLI8c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/otLdgdNRAU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdLI8c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdKMcA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 461,\n\t\t\t\t\t\t\t\t\t\"top\": 508,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdLI8c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/otLdgdObK0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdLI8c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdKMcA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 436,\n\t\t\t\t\t\t\t\t\t\"top\": 470,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdLI8c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDmxXI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbHp3s=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"467:477;424.509521484375:502.5447013608871\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdMgew=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdNRAU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/otLdgdObK0=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgK9Oc=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgLg8M=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgMBn8=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgLg8M=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 96,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -64,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgN/vY=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgLg8M=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 909,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 471,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 148.56689453125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"AbstractGroupTaskStep\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgOotk=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgLg8M=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 96,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -64,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgPbno=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgLg8M=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 96,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -64,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 904,\n\t\t\t\t\t\t\t\t\t\"top\": 464,\n\t\t\t\t\t\t\t\t\t\"width\": 158.56689453125,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgMBn8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgN/vY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgOotk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgPbno=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgQ0Fc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 904,\n\t\t\t\t\t\t\t\t\t\"top\": 489,\n\t\t\t\t\t\t\t\t\t\"width\": 158.56689453125,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgR5vs=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 904,\n\t\t\t\t\t\t\t\t\t\"top\": 499,\n\t\t\t\t\t\t\t\t\t\"width\": 158.56689453125,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgSzjA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 48,\n\t\t\t\t\t\t\t\t\t\"top\": -32,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgTBI8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 48,\n\t\t\t\t\t\t\t\t\t\"top\": -32,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 904,\n\t\t\t\t\t\t\t\"top\": 464,\n\t\t\t\t\t\t\t\"width\": 158.56689453125,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgLg8M=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgQ0Fc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgR5vs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgSzjA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgTBI8=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/owCvQhqKbI=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQholDw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/owCvQhrLPs=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQhqKbI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQholDw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 810,\n\t\t\t\t\t\t\t\t\t\"top\": 495,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQhqKbI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/owCvQhsrOs=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQhqKbI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQholDw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 810,\n\t\t\t\t\t\t\t\t\t\"top\": 510,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQhqKbI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/owCvQhtfJg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQhqKbI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQholDw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 811,\n\t\t\t\t\t\t\t\t\t\"top\": 465,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQhqKbI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"903:486;720:486\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQhrLPs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQhsrOs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/owCvQhtfJg=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o4/zwrhcRw=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o4/zwriyQA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrhcRw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o4/zwrj31E=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwriyQA=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 664,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -697,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o4/zwrk9BA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwriyQA=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 893,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 334,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 116.09228515625,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ITaskStepLifecycle\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o4/zwrlgyM=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwriyQA=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 664,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -697,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o4/zwrmzCY=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwriyQA=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 664,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -697,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 888,\n\t\t\t\t\t\t\t\t\t\"top\": 327,\n\t\t\t\t\t\t\t\t\t\"width\": 126.09228515625,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrj31E=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrk9BA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrlgyM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrmzCY=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o4/zwrnZ+0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrhcRw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 736,\n\t\t\t\t\t\t\t\t\t\"top\": -232,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o4/zwroZwQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrhcRw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 736,\n\t\t\t\t\t\t\t\t\t\"top\": -232,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o4/zwrpyI4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrhcRw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 736,\n\t\t\t\t\t\t\t\t\t\"top\": -232,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o4/zwrqGyE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrhcRw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 736,\n\t\t\t\t\t\t\t\t\t\"top\": -232,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 888,\n\t\t\t\t\t\t\t\"top\": 304,\n\t\t\t\t\t\t\t\"width\": 126.09228515625,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwriyQA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrnZ+0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwroZwQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrpyI4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrqGyE=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o5UWQtsemA=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o5UWQttdC0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQtsemA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o5UWgtuMro=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQttdC0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 485,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -769,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o5UWgtv9H0=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQttdC0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 989,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 350,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 99.4423828125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"IGroupTaskStep\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o5UWgtwDv0=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQttdC0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 485,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -769,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o5UWgtxFqQ=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQttdC0=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 485,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -769,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 984,\n\t\t\t\t\t\t\t\t\t\"top\": 343,\n\t\t\t\t\t\t\t\t\t\"width\": 109.4423828125,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWgtuMro=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWgtv9H0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWgtwDv0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWgtxFqQ=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o5UWgtyCAw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQtsemA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 520,\n\t\t\t\t\t\t\t\t\t\"top\": -256,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o5UWgtzqbw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQtsemA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 520,\n\t\t\t\t\t\t\t\t\t\"top\": -256,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o5UWgt0amQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQtsemA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 520,\n\t\t\t\t\t\t\t\t\t\"top\": -256,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o5UWgt1wqg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQtsemA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 520,\n\t\t\t\t\t\t\t\t\t\"top\": -256,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 984,\n\t\t\t\t\t\t\t\"top\": 320,\n\t\t\t\t\t\t\t\"width\": 109.4423828125,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQttdC0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWgtyCAw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWgtzqbw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWgt0amQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWgt1wqg=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o6Ykwu96Uc=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu8maw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o6Ykwu+Iys=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu96Uc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu8maw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 997,\n\t\t\t\t\t\t\t\t\t\"top\": 391,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu96Uc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o6Ykwu//aU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu96Uc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu8maw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 983,\n\t\t\t\t\t\t\t\t\t\"top\": 386,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu96Uc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o6YkwvAtHQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu96Uc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu8maw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 1026,\n\t\t\t\t\t\t\t\t\t\"top\": 402,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu96Uc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o5UWQtsemA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"991:463;1034.842105263158:343\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu+Iys=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6Ykwu//aU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6YkwvAtHQ=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o6nTQvpgzs=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvoIC4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o6nTQvqKb0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvpgzs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvoIC4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 949,\n\t\t\t\t\t\t\t\t\t\"top\": 391,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvpgzs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o6nTQvr5g0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvpgzs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvoIC4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 934,\n\t\t\t\t\t\t\t\t\t\"top\": 394,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvpgzs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o6nTQvsx6s=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvpgzs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvoIC4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 978,\n\t\t\t\t\t\t\t\t\t\"top\": 386,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvpgzs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o4/zwrhcRw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"977:463;951.578947368421:327\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvqKb0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvr5g0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o6nTQvsx6s=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxNC+g=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxLijE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxOHNE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxNC+g=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxLijE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxPRgk=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxOHNE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 224,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 48,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxQuaE=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxOHNE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 1061,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 615,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 165.8896484375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ConcurrentGroupTaskStep\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxRt/I=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxOHNE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 224,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 48,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxSMfI=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxOHNE=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 224,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 48,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 1056,\n\t\t\t\t\t\t\t\t\t\"top\": 608,\n\t\t\t\t\t\t\t\t\t\"width\": 175.8896484375,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxPRgk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxQuaE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxRt/I=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxSMfI=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxTjwc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxNC+g=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxLijE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 1056,\n\t\t\t\t\t\t\t\t\t\"top\": 633,\n\t\t\t\t\t\t\t\t\t\"width\": 175.8896484375,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxUoq8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxNC+g=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxLijE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 1056,\n\t\t\t\t\t\t\t\t\t\"top\": 643,\n\t\t\t\t\t\t\t\t\t\"width\": 175.8896484375,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxVe3A=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxNC+g=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxLijE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 112,\n\t\t\t\t\t\t\t\t\t\"top\": 24,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxWQ1g=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxNC+g=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxLijE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 112,\n\t\t\t\t\t\t\t\t\t\"top\": 24,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 1056,\n\t\t\t\t\t\t\t\"top\": 608,\n\t\t\t\t\t\t\t\"width\": 175.8896484375,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxOHNE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxTjwc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxUoq8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxVe3A=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxWQ1g=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7qpQytXQ0=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpQyr9Lw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7qpgyuVwo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpQytXQ0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpQyr9Lw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 1051,\n\t\t\t\t\t\t\t\t\t\"top\": 563,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpQytXQ0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7qpgyvEx8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpQytXQ0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpQyr9Lw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 1041,\n\t\t\t\t\t\t\t\t\t\"top\": 574,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpQytXQ0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7qpgywI2k=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpQytXQ0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpQyr9Lw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 1072,\n\t\t\t\t\t\t\t\t\t\"top\": 540,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpQytXQ0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxNC+g=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"1117:607;1008:509\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpgyuVwo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpgyvEx8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7qpgywI2k=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9g0QghE=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0OMEg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9g0RT/k=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0QghE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0OMEg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9w0SMpo=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0RT/k=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -576,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -48,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9w0Tq40=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0RT/k=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 869,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 615,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 131.244140625,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"SerialGroupTaskStep\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9w0Uy4E=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0RT/k=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -576,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -48,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9w0VKjs=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0RT/k=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -576,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -48,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 864,\n\t\t\t\t\t\t\t\t\t\"top\": 608,\n\t\t\t\t\t\t\t\t\t\"width\": 141.244140625,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9w0SMpo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9w0Tq40=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9w0Uy4E=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9w0VKjs=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9w0WwuU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0QghE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0OMEg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 864,\n\t\t\t\t\t\t\t\t\t\"top\": 633,\n\t\t\t\t\t\t\t\t\t\"width\": 141.244140625,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9w0Xu1Q=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0QghE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0OMEg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 864,\n\t\t\t\t\t\t\t\t\t\"top\": 643,\n\t\t\t\t\t\t\t\t\t\"width\": 141.244140625,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9w0YdOM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0QghE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0OMEg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -288,\n\t\t\t\t\t\t\t\t\t\"top\": -24,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9w0Z4C8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0QghE=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0OMEg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -288,\n\t\t\t\t\t\t\t\t\t\"top\": -24,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 864,\n\t\t\t\t\t\t\t\"top\": 608,\n\t\t\t\t\t\t\t\"width\": 141.244140625,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0RT/k=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9w0WwuU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9w0Xu1Q=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9w0YdOM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9w0Z4C8=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o9+Jw6qyhU=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6o42Q=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o9+Jw6rmuc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6qyhU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6o42Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 943,\n\t\t\t\t\t\t\t\t\t\"top\": 547,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6qyhU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o9+Jw6sC4E=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6qyhU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6o42Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 929,\n\t\t\t\t\t\t\t\t\t\"top\": 542,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6qyhU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o9+Jw6tryI=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6qyhU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6o42Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 972,\n\t\t\t\t\t\t\t\t\t\"top\": 556,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6qyhU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0QghE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"942:607;974:509\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6rmuc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6sC4E=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o9+Jw6tryI=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+g7oUTw=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7mg4c=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+g7py1s=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7oUTw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7mg4c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+g7qxd8=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7py1s=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -544,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 80,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+w7rCKk=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7py1s=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 493,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 367,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 72.71875,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ThreadType\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+w7sYYU=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7py1s=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -544,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 80,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+w7tcsc=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7py1s=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -544,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 80,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 488,\n\t\t\t\t\t\t\t\t\t\"top\": 360,\n\t\t\t\t\t\t\t\t\t\"width\": 82.71875,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7qxd8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+w7rCKk=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+w7sYYU=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+w7tcsc=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+w7uHgA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7oUTw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7mg4c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 488,\n\t\t\t\t\t\t\t\t\t\"top\": 385,\n\t\t\t\t\t\t\t\t\t\"width\": 82.71875,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+w7vxVY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7oUTw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7mg4c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 488,\n\t\t\t\t\t\t\t\t\t\"top\": 395,\n\t\t\t\t\t\t\t\t\t\"width\": 82.71875,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+w7whHk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7oUTw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7mg4c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -272,\n\t\t\t\t\t\t\t\t\t\"top\": 40,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+w7xU1s=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7oUTw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7mg4c=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -272,\n\t\t\t\t\t\t\t\t\t\"top\": 40,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 488,\n\t\t\t\t\t\t\t\"top\": 360,\n\t\t\t\t\t\t\t\"width\": 82.71875,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7py1s=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+w7uHgA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+w7vxVY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+w7whHk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+w7xU1s=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAqzw+mGA4=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+iYqM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAqzw+naqM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+iYqM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 576,\n\t\t\t\t\t\t\t\t\t\"top\": 439,\n\t\t\t\t\t\t\t\t\t\"width\": 14.82177734375,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1,\n\t\t\t\t\t\t\t\t\t\"text\": \"+1\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAq0A+oq/E=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+iYqM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 574,\n\t\t\t\t\t\t\t\t\t\"top\": 451,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAq0A+p/Sw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+iYqM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 602,\n\t\t\t\t\t\t\t\t\t\"top\": 416,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAq0A+qj0g=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+jasg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 600,\n\t\t\t\t\t\t\t\t\t\"top\": 452,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAq0A+rqhQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+jasg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 590,\n\t\t\t\t\t\t\t\t\t\"top\": 461,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAq0A+sGfQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+jasg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 620,\n\t\t\t\t\t\t\t\t\t\"top\": 433,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAq0A+tHeo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+kIaI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 568,\n\t\t\t\t\t\t\t\t\t\"top\": 426,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAq0A+uleM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+kIaI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 561,\n\t\t\t\t\t\t\t\t\t\"top\": 438,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAq0A+vpmE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+kIaI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 581,\n\t\t\t\t\t\t\t\t\t\"top\": 402,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAq0A+wvJw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+jasg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAq0A+xA80=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+mGA4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+kIaI=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7oUTw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"630:463;557:405\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+naqM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAq0A+oq/E=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAq0A+p/Sw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAq0A+qj0g=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAq0A+rqhQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAq0A+sGfQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAq0A+tHeo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAq0A+uleM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAq0A+vpmE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAq0A+wvJw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAq0A+xA80=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLClassView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBEWe0=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBFMek=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBEWe0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBGxco=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBFMek=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -112,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -112,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBHMlg=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBFMek=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 573,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 735,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 92.22509765625,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"TaskCommand\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBIlzw=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBFMek=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -112,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -112,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBJ1KE=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBFMek=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -112,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -112,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 568,\n\t\t\t\t\t\t\t\t\t\"top\": 728,\n\t\t\t\t\t\t\t\t\t\"width\": 102.22509765625,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBGxco=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBHMlg=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBIlzw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBJ1KE=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBKQac=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBEWe0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 568,\n\t\t\t\t\t\t\t\t\t\"top\": 753,\n\t\t\t\t\t\t\t\t\t\"width\": 102.22509765625,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBLX6U=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBEWe0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 568,\n\t\t\t\t\t\t\t\t\t\"top\": 763,\n\t\t\t\t\t\t\t\t\t\"width\": 102.22509765625,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBM25E=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBEWe0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -56,\n\t\t\t\t\t\t\t\t\t\"top\": -56,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBNLOw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBEWe0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -56,\n\t\t\t\t\t\t\t\t\t\"top\": -56,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 568,\n\t\t\t\t\t\t\t\"top\": 728,\n\t\t\t\t\t\t\t\"width\": 102.22509765625,\n\t\t\t\t\t\t\t\"height\": 45,\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBFMek=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBKQac=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBLX6U=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBM25E=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBNLOw=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pI9SxI7C0Q=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pI9SxI8Grc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI7C0Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pI9SxI92k4=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI8Grc=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -609,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 992,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pI9SxI+A44=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI8Grc=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 517,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 870,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 122.560546875,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ITaskStepController\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pI9SxI/t/M=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI8Grc=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -609,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 992,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pI9SxJApCA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI8Grc=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -609,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 992,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 512,\n\t\t\t\t\t\t\t\t\t\"top\": 863,\n\t\t\t\t\t\t\t\t\t\"width\": 132.560546875,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI92k4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI+A44=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI/t/M=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxJApCA=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pI9SxJBDXA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI7C0Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -288,\n\t\t\t\t\t\t\t\t\t\"top\": 760,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pI9SxJC5q8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI7C0Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -288,\n\t\t\t\t\t\t\t\t\t\"top\": 760,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pI9SxJD3FE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI7C0Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -288,\n\t\t\t\t\t\t\t\t\t\"top\": 760,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pI9SxJEKfk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI7C0Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -288,\n\t\t\t\t\t\t\t\t\t\"top\": 760,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 512,\n\t\t\t\t\t\t\t\"top\": 840,\n\t\t\t\t\t\t\t\"width\": 132.560546875,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI8Grc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxJBDXA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxJC5q8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxJD3FE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxJEKfk=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pJcFxKbGgQ=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKaHaA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pJcFxKcKec=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKbGgQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKaHaA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 611,\n\t\t\t\t\t\t\t\t\t\"top\": 804,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKbGgQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pJcFxKdRq4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKbGgQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKaHaA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 625,\n\t\t\t\t\t\t\t\t\t\"top\": 809,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKbGgQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pJcFxKeQGA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKbGgQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKaHaA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 582,\n\t\t\t\t\t\t\t\t\t\"top\": 795,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKbGgQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pI9SxI7C0Q=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBEWe0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"610:773;585.25:840\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKcKec=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKdRq4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pJcFxKeQGA=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKIDRMuTmA=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKIDRMvLMo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMuTmA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKIDRMwZ9U=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMvLMo=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -447,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 719,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKIDRMxjQ4=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMvLMo=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 661,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 862,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 61.419921875,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"Runnable\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKIDRMynTY=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMvLMo=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -447,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 719,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKIDRMzSqY=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMvLMo=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": -447,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 719,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 656,\n\t\t\t\t\t\t\t\t\t\"top\": 855,\n\t\t\t\t\t\t\t\t\t\"width\": 71.419921875,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMwZ9U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMxjQ4=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMynTY=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMzSqY=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKIDRM0wt8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMuTmA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -272,\n\t\t\t\t\t\t\t\t\t\"top\": 760,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKIDRM1RGE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMuTmA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -272,\n\t\t\t\t\t\t\t\t\t\"top\": 760,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKIDRM2ua8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMuTmA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -272,\n\t\t\t\t\t\t\t\t\t\"top\": 760,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKIDRM33VI=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMuTmA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": -272,\n\t\t\t\t\t\t\t\t\t\"top\": 760,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 656,\n\t\t\t\t\t\t\t\"top\": 832,\n\t\t\t\t\t\t\t\"width\": 71.419921875,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMvLMo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRM0wt8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRM1RGE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRM2ua8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRM33VI=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealizationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKyUhOOsOc=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhON0V8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKyUhOP4WE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhOOsOc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhON0V8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 667,\n\t\t\t\t\t\t\t\t\t\"top\": 788,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhOOsOc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKyUhOQLrY=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhOOsOc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhON0V8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 679,\n\t\t\t\t\t\t\t\t\t\"top\": 779,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhOOsOc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKyUhORW7M=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhOOsOc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhON0V8=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 644,\n\t\t\t\t\t\t\t\t\t\"top\": 807,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhOOsOc=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKIDRMuTmA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBEWe0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"634:773;679.7099609375:835.0305606617648\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhOP4WE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhOQLrY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pKyUhORW7M=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPe6eM=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPaK9w=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPfCAA=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPaK9w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 626,\n\t\t\t\t\t\t\t\t\t\"top\": 687,\n\t\t\t\t\t\t\t\t\t\"width\": 14.82177734375,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1,\n\t\t\t\t\t\t\t\t\t\"text\": \"+1\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPgsAs=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPaK9w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 648,\n\t\t\t\t\t\t\t\t\t\"top\": 687,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPhcZc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPaK9w=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 604,\n\t\t\t\t\t\t\t\t\t\"top\": 688,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPioYk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPbvO0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 634,\n\t\t\t\t\t\t\t\t\t\"top\": 681,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPjMAE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPbvO0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 647,\n\t\t\t\t\t\t\t\t\t\"top\": 683,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPkpOo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPbvO0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 607,\n\t\t\t\t\t\t\t\t\t\"top\": 676,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPlFtU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPc6fM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 634,\n\t\t\t\t\t\t\t\t\t\"top\": 695,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPm/gg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPc6fM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 647,\n\t\t\t\t\t\t\t\t\t\"top\": 693,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPn/X0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPc6fM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 606,\n\t\t\t\t\t\t\t\t\t\"top\": 699,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPoWtk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPbvO0=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+hPpDQ0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPe6eM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPc6fM=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBEWe0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBDOcU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"620:661;619:727\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPfCAA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPgsAs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPhcZc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPioYk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPjMAE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPkpOo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPlFtU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPm/gg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPn/X0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPoWtk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+hPpDQ0=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhb+Ang=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb6+Zs=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhb/u9U=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb6+Zs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 811,\n\t\t\t\t\t\t\t\t\t\"top\": 336,\n\t\t\t\t\t\t\t\t\t\"width\": 14.82177734375,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1,\n\t\t\t\t\t\t\t\t\t\"text\": \"+n\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhcAZs0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb6+Zs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 819,\n\t\t\t\t\t\t\t\t\t\"top\": 351,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhcBlWk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb6+Zs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 817,\n\t\t\t\t\t\t\t\t\t\"top\": 307,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhcCOwk=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb7cpA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 928,\n\t\t\t\t\t\t\t\t\t\"top\": 449,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhcDV1A=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb7cpA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 918,\n\t\t\t\t\t\t\t\t\t\"top\": 457,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhcELwM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb7cpA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 951,\n\t\t\t\t\t\t\t\t\t\"top\": 432,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhcFg5E=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb8i/o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 721,\n\t\t\t\t\t\t\t\t\t\"top\": 341,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhcGQ7s=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb8i/o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 724,\n\t\t\t\t\t\t\t\t\t\"top\": 354,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhcHWDo=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb8i/o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 716,\n\t\t\t\t\t\t\t\t\t\"top\": 314,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhcIZo4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb7cpA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrhcJVBQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb+Ang=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb8i/o=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbv7mDqg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgK9Oc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"958:463;818:328;695:334\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhb/u9U=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhcAZs0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhcBlWk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhcCOwk=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhcDV1A=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhcELwM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhcFg5E=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhcGQ7s=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhcHWDo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhcIZo4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrhcJVBQ=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBwZ9SA=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwXB0Q=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLNameCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBwaXH8=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwZ9SA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwXB0Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBwbmEs=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwaXH8=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -80,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 64.32080078125,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"«interface»\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBwc+uA=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwaXH8=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;1\",\n\t\t\t\t\t\t\t\t\t\t\t\"left\": 733,\n\t\t\t\t\t\t\t\t\t\t\t\"top\": 398,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 108.849609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"ITaskStepHandler\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBwdVFw=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwaXH8=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -80,\n\t\t\t\t\t\t\t\t\t\t\t\"width\": 73.67724609375,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"text\": \"(from Model)\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"_type\": \"LabelView\",\n\t\t\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBweDKk=\",\n\t\t\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwaXH8=\"\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\t\t\"top\": -80,\n\t\t\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\t\t\"horizontalAlignment\": 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 728,\n\t\t\t\t\t\t\t\t\t\"top\": 391,\n\t\t\t\t\t\t\t\t\t\"width\": 118.849609375,\n\t\t\t\t\t\t\t\t\t\"height\": 25,\n\t\t\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwbmEs=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwc+uA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"namespaceLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwdVFw=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBweDKk=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLAttributeCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBwfkZU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwZ9SA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwXB0Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"top\": -40,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLOperationCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBwgGj4=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwZ9SA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwXB0Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"top\": -40,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLReceptionCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBwh+tc=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwZ9SA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwXB0Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"top\": -40,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLTemplateParameterCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBwi+pg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwZ9SA=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwXB0Q=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"top\": -40,\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"containerChangeable\": true,\n\t\t\t\t\t\t\t\"left\": 728,\n\t\t\t\t\t\t\t\"top\": 368,\n\t\t\t\t\t\t\t\"width\": 118.849609375,\n\t\t\t\t\t\t\t\"height\": 49,\n\t\t\t\t\t\t\t\"stereotypeDisplay\": \"icon\",\n\t\t\t\t\t\t\t\"nameCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwaXH8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"suppressAttributes\": true,\n\t\t\t\t\t\t\t\"suppressOperations\": true,\n\t\t\t\t\t\t\t\"attributeCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwfkZU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"operationCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwgGj4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"receptionCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwh+tc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"templateParameterCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwi+pg=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociationView\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTbx0euyo=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBtyKM79qY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0a+7U=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"subViews\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTbx0ffrM=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0a+7U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 705,\n\t\t\t\t\t\t\t\t\t\"top\": 421,\n\t\t\t\t\t\t\t\t\t\"width\": 14.82177734375,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1,\n\t\t\t\t\t\t\t\t\t\"text\": \"+1\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTbx0gh5E=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0a+7U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": null,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 703,\n\t\t\t\t\t\t\t\t\t\"top\": 409,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTbx0hHJg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0a+7U=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 729,\n\t\t\t\t\t\t\t\t\t\"top\": 446,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -1.5707963267948966,\n\t\t\t\t\t\t\t\t\t\"distance\": 15,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 1\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTbx0ijlg=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0b59I=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 701,\n\t\t\t\t\t\t\t\t\t\"top\": 429,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTbx0jxeI=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0b59I=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 695,\n\t\t\t\t\t\t\t\t\t\"top\": 417,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTbx0k4QQ=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0b59I=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 714,\n\t\t\t\t\t\t\t\t\t\"top\": 454,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"edgePosition\": 2\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTch0lDOw=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0coXQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 722,\n\t\t\t\t\t\t\t\t\t\"top\": 414,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 30,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTch0m9lU=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0coXQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 712,\n\t\t\t\t\t\t\t\t\t\"top\": 405,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": -0.7853981633974483,\n\t\t\t\t\t\t\t\t\t\"distance\": 40,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"EdgeLabelView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTch0niJ0=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0coXQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"left\": 742,\n\t\t\t\t\t\t\t\t\t\"top\": 433,\n\t\t\t\t\t\t\t\t\t\"height\": 13,\n\t\t\t\t\t\t\t\t\t\"alpha\": 0.5235987755982988,\n\t\t\t\t\t\t\t\t\t\"distance\": 25,\n\t\t\t\t\t\t\t\t\t\"hostEdge\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTch0oqeE=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0b59I=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"_type\": \"UMLQualifierCompartmentView\",\n\t\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTcx0p9OI=\",\n\t\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0euyo=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"model\": {\n\t\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0coXQ=\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"visible\": false,\n\t\t\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\t\t\"width\": 10,\n\t\t\t\t\t\t\t\t\t\"height\": 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"font\": \"Arial;13;0\",\n\t\t\t\t\t\t\t\"head\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwZ9SA=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tail\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/bUgI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"lineStyle\": 1,\n\t\t\t\t\t\t\t\"points\": \"690:463;752:417\",\n\t\t\t\t\t\t\t\"showVisibility\": true,\n\t\t\t\t\t\t\t\"nameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0ffrM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"stereotypeLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0gh5E=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"propertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0hHJg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0ijlg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0jxeI=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0k4QQ=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headRoleNameLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTch0lDOw=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headPropertyLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTch0m9lU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headMultiplicityLabel\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTch0niJ0=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"tailQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTch0oqeE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"headQualifiersCompartment\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTcx0p9OI=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oB4+f21Hdo=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"TaskChainEngine\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oKdTP7PY/4=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociation\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCKgCR2Jk=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"name\": \"n\",\n\t\t\t\t\t\t\t\"end1\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCKwCSX2E=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKgCR2Jk=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"end2\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/obCKwCTC3k=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/obCKgCR2Jk=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aggregation\": \"shared\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociation\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnrwPgaSQ=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"name\": \"1\",\n\t\t\t\t\t\t\t\"end1\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnrwPhtDg=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnrwPgaSQ=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oB4+f21Hdo=\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"end2\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/onnsAPiR/4=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/onnrwPgaSQ=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixuwJenZM=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aggregation\": \"shared\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oDrxP3hASY=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ITaskChainEngine\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oIYZf6W7vU=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oIuff6ny+c=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oJAIf64xJQ=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oDrxP3hASY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5hqIo=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oEl+P4NGEs=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ITaskStepLifecycle\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oFcZf43uUM=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"IGroupTaskStep\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oF4Mv5hqIo=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ICanceller\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oOe+/85LIw=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5hqIo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oF4Mv5hqIo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8O7tk=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oMJbf7k7SE=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ITaskStep\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oQKQ/9NvDs=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oN48v8O7tk=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oRXKv+Ij8g=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oT/FP/Gwcg=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oN48v8O7tk=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ICancelable\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oQybv9etN0=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ITaskStepController\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oSvGv+bods=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"Runnable\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oVQfv/ZEC4=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"AbstractTaskStep\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oVy3wAER5E=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociation\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh0wRqA8w=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"name\": \"1\",\n\t\t\t\t\t\t\t\"end1\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh0wRr2tM=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRqA8w=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"end2\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ooh0wRssuw=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ooh0wRqA8w=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEjPSY=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aggregation\": \"shared\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociation\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAqzw+iYqM=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"name\": \"1\",\n\t\t\t\t\t\t\t\"end1\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAqzw+jasg=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+iYqM=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"end2\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pAqzw+kIaI=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pAqzw+iYqM=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o/u+g7mg4c=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aggregation\": \"shared\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociation\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTbx0a+7U=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"name\": \"1\",\n\t\t\t\t\t\t\t\"end1\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTbx0b59I=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0a+7U=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"end2\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pXTbx0coXQ=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pXTbx0a+7U=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pWxQBwXB0Q=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aggregation\": \"shared\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oXK5AAWQmM=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"SimpleTaskStep\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oZEGACAn0w=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAWQmM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oXK5AAWQmM=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oYK4wBBo88=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"XTaskStep\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oY38QBvDLM=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBBo88=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBBo88=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociation\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPaK9w=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBBo88=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"name\": \"1\",\n\t\t\t\t\t\t\t\"end1\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPbvO0=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPaK9w=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oYK4wBBo88=\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"end2\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pLJ+RPc6fM=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pLJ+RPaK9w=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aggregation\": \"shared\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oejFwDkL34=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"IDataStore\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/ofZUwEjPSY=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ITaskParam\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/of2wAFsd14=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEjPSY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEjPSY=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDkL34=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/ogt1AGGwlc=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"TaskParam\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ohUsAHPXn8=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGGwlc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGGwlc=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ofZUwEjPSY=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oiH/gH8TJg=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"TaskResult\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/oifbQI+idY=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH8TJg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH8TJg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ogt1AGGwlc=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/ojnTwKa348=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH8TJg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oiH/gH8TJg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oixuwJenZM=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/oixuwJenZM=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ITaskResult\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/osTOwbFpp8=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"MapDataStore\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/otLdgdKMcA=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbFpp8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/osTOwbFpp8=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oejFwDkL34=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/ovrcwgIMQU=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"AbstractGroupTaskStep\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/owCvQholDw=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oVQfv/ZEC4=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o6Ykwu8maw=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oFcZf43uUM=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o6nTQvoIC4=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oEl+P4NGEs=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLAssociation\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrRb6+Zs=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"name\": \"n\",\n\t\t\t\t\t\t\t\"end1\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrRb7cpA=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb6+Zs=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"end2\": {\n\t\t\t\t\t\t\t\t\"_type\": \"UMLAssociationEnd\",\n\t\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pPGrRb8i/o=\",\n\t\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pPGrRb6+Zs=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"reference\": {\n\t\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oMJbf7k7SE=\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aggregation\": \"shared\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/o7UzwxLijE=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ConcurrentGroupTaskStep\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o7qpQyr9Lw=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxLijE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o7UzwxLijE=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/o8e9g0OMEg=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"SerialGroupTaskStep\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLGeneralization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/o9+Jw6o42Q=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0OMEg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/o8e9g0OMEg=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/ovrcwgIMQU=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/o/u+g7mg4c=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ThreadType\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLClass\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/pFMLxBCPvo=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"TaskCommand\",\n\t\t\t\t\t\"ownedElements\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pJcFxKaHaA=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oQybv9etN0=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"_type\": \"UMLInterfaceRealization\",\n\t\t\t\t\t\t\t\"_id\": \"AAAAAAF+/pKyUhON0V8=\",\n\t\t\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"source\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/pFMLxBCPvo=\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"target\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"AAAAAAF+/oSvGv+bods=\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"_type\": \"UMLInterface\",\n\t\t\t\t\t\"_id\": \"AAAAAAF+/pWxQBwXB0Q=\",\n\t\t\t\t\t\"_parent\": {\n\t\t\t\t\t\t\"$ref\": \"AAAAAAFF+qBWK6M3Z8Y=\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": \"ITaskStepHandler\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    apply from: './versions.gradle'\n    addRepos(repositories) //增加代码仓库\n    dependencies {\n        classpath deps.android_gradle_plugin\n        classpath deps.android_maven_gradle_plugin\n\n        classpath 'com.chenenyu:img-optimizer:1.2.0' // 图片压缩\n        //美团多渠道打包\n        classpath 'com.meituan.android.walle:plugin:1.1.6'\n        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'\n        //滴滴的质量优化框架\n        if (isNeedPackage.toBoolean() && isUseBooster.toBoolean()) {\n            classpath deps.booster.gradle_plugin\n            classpath deps.booster.task_processed_res\n            classpath deps.booster.task_resource_deredundancy\n        }\n    }\n}\n\nallprojects {\n    addRepos(repositories)\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Jun 28 16:23:16 CST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.6.4-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\n# 是否打包APK，打正式包时请设置为true,使用正式的签名\nisNeedPackage=false\n# 是否使用booster优化APK，这里需要注意gradle的版本，对于最新的gradle版本可能存在兼容问题\nisUseBooster=false\nandroid.precompileDependenciesResources=false\n\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n\nandroid.enableD8=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windows variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\ninclude ':xtask-thread'\ninclude ':xtask-core'\n"
  },
  {
    "path": "versions.gradle",
    "content": "import java.util.regex.Matcher\nimport java.util.regex.Pattern\n\next.deps = [:]\ndef versions = [:]\n\nversions.android_gradle_plugin = \"3.6.1\"\nversions.android_maven_gradle_plugin = \"2.0\"\nversions.gradle_bintray_plugin = \"1.8.0\"\nversions.booster = \"3.1.0\"\nversions.booster_all = \"1.1.1\"\nversions.support = \"28.0.0\"\nversions.androidx = \"1.1.0\"\nversions.junit = \"4.12\"\nversions.espresso = \"3.2.0\"\nversions.constraint_layout = \"1.1.3\"\nversions.glide = \"4.11.0\"\nversions.rxjava2 = \"2.2.20\"\nversions.rxandroid = \"2.1.1\"\nversions.rxbinding = \"2.2.0\"\nversions.butterknife = \"10.1.0\"\nversions.runner = \"1.2.0\"\nversions.gson = \"2.8.5\"\nversions.leakcanary = \"2.6\"\n\n//========xlibrary start========//\n\nversions.xui = \"1.1.8\"\nversions.xupdate = \"2.1.0\"\nversions.xaop = \"1.1.0\"\nversions.xutil = \"2.0.0\"\nversions.xhttp2 = \"2.0.4\"\nversions.xpage = \"3.2.0\"\nversions.xrouter = \"1.0.1\"\n\n//========xlibrary end========//\n\ndef deps = [:]\n\ndef support = [:]\nsupport.annotations = \"com.android.support:support-annotations:$versions.support\"\nsupport.app_compat = \"com.android.support:appcompat-v7:$versions.support\"\nsupport.recyclerview = \"com.android.support:recyclerview-v7:$versions.support\"\nsupport.cardview = \"com.android.support:cardview-v7:$versions.support\"\nsupport.design = \"com.android.support:design:$versions.support\"\nsupport.v4 = \"com.android.support:support-v4:$versions.support\"\nsupport.core_utils = \"com.android.support:support-core-utils:$versions.support\"\ndeps.support = support\n\ndef androidx = [:]\nandroidx.annotations = \"androidx.annotation:annotation:$versions.androidx\"\nandroidx.appcompat = \"androidx.appcompat:appcompat:$versions.androidx\"\nandroidx.recyclerview = \"androidx.recyclerview:recyclerview:$versions.androidx\"\nandroidx.design = \"com.google.android.material:material:$versions.androidx\"\nandroidx.multidex = 'androidx.multidex:multidex:2.0.1'\ndeps.androidx = androidx\n\ndef booster = [:]\nbooster.gradle_plugin = \"com.didiglobal.booster:booster-gradle-plugin:$versions.booster\"\nbooster.task_all = \"com.didiglobal.booster:booster-task-all:$versions.booster_all\"\nbooster.transform_all = \"com.didiglobal.booster:booster-transform-all:$versions.booster_all\"\n//采用 cwebp 对资源进行压缩\nbooster.task_compression_cwebp = \"com.didiglobal.booster:booster-task-compression-cwebp:$versions.booster\"\n//采用 pngquant 对资源进行压缩\nbooster.task_compression_pngquant = \"com.didiglobal.booster:booster-task-compression-pngquant:$versions.booster\"\n//ap_ 文件压缩\nbooster.task_processed_res = \"com.didiglobal.booster:booster-task-compression-processed-res:$versions.booster\"\n//去冗余资源\nbooster.task_resource_deredundancy = \"com.didiglobal.booster:booster-task-resource-deredundancy:$versions.booster\"\n//检查 SNAPSHOT 版本\nbooster.task_check_snapshot = \"com.didiglobal.booster:booster-task-check-snapshot:$versions.booster\"\n//性能瓶颈检测\nbooster.transform_lint = \"com.didiglobal.booster:booster-transform-lint:$versions.booster\"\n//多线程优化\nbooster.transform_thread = \"com.didiglobal.booster:booster-transform-thread:$versions.booster\"\n//资源索引内联\nbooster.transform_r_inline = \"com.didiglobal.booster:booster-transform-r-inline:$versions.booster\"\n//WebView 预加载\nbooster.transform_webview = \"com.didiglobal.booster:booster-transform-webview:$versions.booster\"\n//SharedPreferences 优化\nbooster.transform_shared_preferences = \"com.didiglobal.booster:booster-transform-shared-preferences:$versions.booster\"\n//检查覆盖安装导致的 Resources 和 Assets 未加载的 Bug\nbooster.transform_res_check = \"com.didiglobal.booster:booster-transform-res-check:$versions.booster\"\n//修复 Toast 在 Android 7.1 上的 Bug\nbooster.transform_toast = \"com.didiglobal.booster:booster-transform-toast:$versions.booster\"\n//处理系统 Crash\nbooster.transform_activity_thread = \"com.didiglobal.booster:booster-transform-activity-thread:$versions.booster\"\ndeps.booster = booster\n\ndef butterknife = [:]\nbutterknife.runtime = \"com.jakewharton:butterknife:$versions.butterknife\"\nbutterknife.compiler = \"com.jakewharton:butterknife-compiler:$versions.butterknife\"\n\ndeps.butterknife = butterknife\n\ndef espresso = [:]\nespresso.core = \"androidx.test.espresso:espresso-core:$versions.espresso\"\nespresso.contrib = \"androidx.test.espresso:espresso-contrib:$versions.espresso\"\nespresso.intents = \"androidx.test.espresso:espresso-intents:$versions.espresso\"\ndeps.espresso = espresso\n\ndeps.android_gradle_plugin = \"com.android.tools.build:gradle:$versions.android_gradle_plugin\"\ndeps.android_maven_gradle_plugin = \"com.github.dcendents:android-maven-gradle-plugin:$versions.android_maven_gradle_plugin\"\ndeps.gradle_bintray_plugin = \"com.jfrog.bintray.gradle:gradle-bintray-plugin:$versions.gradle_bintray_plugin\"\ndeps.glide = \"com.github.bumptech.glide:glide:$versions.glide\"\ndeps.constraint_layout = \"androidx.constraint:constraint-layout:$versions.constraint_layout\"\ndeps.junit = \"junit:junit:$versions.junit\"\ndeps.runner = \"androidx.test:runner:$versions.runner\"\ndeps.rxjava2 = \"io.reactivex.rxjava2:rxjava:$versions.rxjava2\"\ndeps.rxandroid = \"io.reactivex.rxjava2:rxandroid:$versions.rxandroid\"\ndeps.rxbinding = \"com.jakewharton.rxbinding2:rxbinding:$versions.rxbinding\"\ndeps.gson = \"com.google.code.gson:gson:$versions.gson\"\ndeps.leakcanary = \"com.squareup.leakcanary:leakcanary-android:$versions.leakcanary\"\n\n//========xlibrary start=================//\n\ndef xlibrary = [:]\n\nxlibrary.xui = \"com.github.xuexiangjys:XUI:$versions.xui\"\nxlibrary.xupdate = \"com.github.xuexiangjys:XUpdate:$versions.xupdate\"\nxlibrary.xaop_runtime = \"com.github.xuexiangjys.XAOP:xaop-runtime:$versions.xaop\"\nxlibrary.xaop_plugin = \"com.github.xuexiangjys.XAOP:xaop-plugin:$versions.xaop\"\nxlibrary.xutil_core = \"com.github.xuexiangjys.XUtil:xutil-core:$versions.xutil\"\nxlibrary.xhttp2 = \"com.github.xuexiangjys:XHttp2:$versions.xhttp2\"\nxlibrary.xpage_lib = \"com.github.xuexiangjys.XPage:xpage-lib:$versions.xpage\"\nxlibrary.xpage_compiler = \"com.github.xuexiangjys.XPage:xpage-compiler:$versions.xpage\"\nxlibrary.xrouter_runtime = \"com.github.xuexiangjys.XRouter:xrouter-runtime:$versions.xrouter\"\nxlibrary.xrouter_compiler = \"com.github.xuexiangjys.XRouter:xrouter-compiler:$versions.xrouter\"\nxlibrary.xrouter_plugin = \"com.github.xuexiangjys.XRouter:xrouter-plugin:$versions.xrouter\"\n\ndeps.xlibrary = xlibrary\n\n//========xlibrary end=================//\n\next.deps = deps\n\ndef build_versions = [:]\nbuild_versions.min_sdk = 19\nbuild_versions.target_sdk = 28\nbuild_versions.build_tools = \"28.0.3\"\next.build_versions = build_versions\n\ndef app_release = [:]\napp_release.storeFile = \"../keystores/android.keystore\"\napp_release.storePassword = \"xuexiang\"\napp_release.keyAlias = \"android.keystore\"\napp_release.keyPassword = \"xuexiang\"\n\next.app_release = app_release\n\n/**\n * @return 是否为release\n */\ndef isRelease() {\n    Gradle gradle = getGradle()\n    String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()\n\n    Pattern pattern\n    if (tskReqStr.contains(\"assemble\")) {\n        println tskReqStr\n        pattern = Pattern.compile(\"assemble(\\\\w*)(Release|Debug)\")\n    } else {\n        pattern = Pattern.compile(\"generate(\\\\w*)(Release|Debug)\")\n    }\n    Matcher matcher = pattern.matcher(tskReqStr)\n\n    if (matcher.find()) {\n        String task = matcher.group(0).toLowerCase()\n        println(\"[BuildType] Current task: \" + task)\n        return task.contains(\"release\")\n    } else {\n        println \"[BuildType] NO MATCH FOUND\"\n        return true\n    }\n}\n\next.isRelease = this.&isRelease\n\n//默认添加代码仓库路径\nstatic def addRepos(RepositoryHandler handler) {\n    handler.mavenLocal()\n    handler.google { url 'https://maven.aliyun.com/repository/google' }\n    handler.jcenter { url 'https://maven.aliyun.com/repository/jcenter' }\n    handler.mavenCentral { url 'https://maven.aliyun.com/repository/central' }\n    handler.maven { url \"https://jitpack.io\" }\n    handler.maven { url 'https://maven.aliyun.com/repository/public' }\n    handler.maven { url \"https://repo1.maven.org/maven2/\" }\n    handler.maven { url 'https://oss.sonatype.org/content/repositories/public' }\n    //Add the Local repository\n    handler.maven { url 'LocalRepository' }\n}\n\next.addRepos = this.&addRepos\n\n\n//自动添加XAOP和XRouter插件\nproject.buildscript.configurations.each { configuration ->\n    def dependencies = getProject().dependencies\n    if (configuration.name == \"classpath\") {\n        //XAOP插件\n        configuration.dependencies.add(dependencies.create(deps.xlibrary.xaop_plugin))\n        //XRouter插件\n        configuration.dependencies.add(dependencies.create(deps.xlibrary.xrouter_plugin))\n    }\n}"
  },
  {
    "path": "xtask-core/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "xtask-core/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion build_versions.target_sdk\n    buildToolsVersion build_versions.build_tools\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion build_versions.target_sdk\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n}\n\ndependencies {\n    compileOnly deps.androidx.appcompat\n    api project(':xtask-thread')\n\n}\n\n\napply from: '../JitPackUpload.gradle'\n\n"
  },
  {
    "path": "xtask-core/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "xtask-core/src/main/AndroidManifest.xml",
    "content": "<!--\n  ~ Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~       http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  ~\n  -->\n\n<manifest package=\"com.xuexiang.xtask\" />\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/XTask.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.api.TaskChainEngine;\nimport com.xuexiang.xtask.api.step.ConcurrentGroupTaskStep;\nimport com.xuexiang.xtask.api.step.SerialGroupTaskStep;\nimport com.xuexiang.xtask.api.step.XTaskStep;\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.step.impl.TaskCommand;\nimport com.xuexiang.xtask.logger.ILogger;\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.thread.XTaskExecutor;\nimport com.xuexiang.xtask.thread.executor.ICategoryExecutorCore;\nimport com.xuexiang.xtask.thread.executor.IPriorityExecutorCore;\nimport com.xuexiang.xtask.thread.executor.IScheduledExecutorCore;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancellerPool;\nimport com.xuexiang.xtask.utils.CancellerPoolUtils;\n\nimport java.util.Collection;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * XTask对外统一API入口\n *\n * @author xuexiang\n * @since 2/7/22 1:14 PM\n */\npublic final class XTask {\n\n    //========================TaskLogger===============================//\n\n    /**\n     * 设置是否打开调试\n     *\n     * @param isDebug 是否是调试模式\n     */\n    public static void debug(boolean isDebug) {\n        TaskLogger.debug(isDebug);\n    }\n\n    /**\n     * 设置调试模式\n     *\n     * @param tag tag,如果不为空是调试模式\n     */\n    public static void debug(String tag) {\n        TaskLogger.debug(tag);\n    }\n\n    /**\n     * 设置日志记录接口\n     *\n     * @param logger 日志记录接口\n     */\n    public static void setLogger(@NonNull ILogger logger) {\n        TaskLogger.setLogger(logger);\n    }\n\n    /**\n     * 设置是否打印任务执行所在的线程名\n     *\n     * @param isLogThreadName 是否打印任务执行所在的线程名\n     */\n    public static void setIsLogThreadName(boolean isLogThreadName) {\n        TaskLogger.setIsLogThreadName(isLogThreadName);\n    }\n\n    //========================TaskChainEngine===============================//\n\n    /**\n     * 获取任务链执行引擎\n     *\n     * @return 任务链执行引擎\n     */\n    public static TaskChainEngine getTaskChain() {\n        return new TaskChainEngine();\n    }\n\n    /**\n     * 获取任务链执行引擎\n     *\n     * @param name 任务链名称\n     * @return 任务链执行引擎\n     */\n    public static TaskChainEngine getTaskChain(String name) {\n        return new TaskChainEngine(name);\n    }\n\n    //========================XTaskStep===============================//\n\n    /**\n     * 获取简化的任务\n     *\n     * @param command 任务执行内容\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep getTask(@NonNull TaskCommand command) {\n        return XTaskStep.getTask(command);\n    }\n\n    /**\n     * 获取简化的任务\n     *\n     * @param command      任务执行内容\n     * @param isAutoNotify 是否自动通知任务成功或者失败\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep getTask(@NonNull TaskCommand command, boolean isAutoNotify) {\n        return XTaskStep.getTask(command, isAutoNotify);\n    }\n\n    /**\n     * 获取简化的任务\n     *\n     * @param command    任务执行内容\n     * @param threadType 线程类型\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep getTask(@NonNull TaskCommand command, ThreadType threadType) {\n        return XTaskStep.getTask(command, threadType);\n    }\n\n    /**\n     * 获取简化的任务\n     *\n     * @param command   任务执行内容\n     * @param taskParam 任务参数\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep getTask(@NonNull TaskCommand command, @NonNull ITaskParam taskParam) {\n        return XTaskStep.getTask(command, taskParam);\n    }\n\n    /**\n     * 获取简化的任务\n     *\n     * @param command    任务执行内容\n     * @param threadType 线程类型\n     * @param taskParam  任务参数\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep getTask(@NonNull TaskCommand command, ThreadType threadType, @NonNull ITaskParam taskParam) {\n        return XTaskStep.getTask(command, threadType, taskParam);\n    }\n\n    /**\n     * 获取简化任务的构建者\n     *\n     * @param command 任务执行内容\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep.Builder getTaskBuilder(@NonNull TaskCommand command) {\n        return XTaskStep.newBuilder(command);\n    }\n\n    //========================ConcurrentGroupTaskStep===============================//\n\n    /**\n     * 获取并行任务组\n     *\n     * @return 并行任务组\n     */\n    public static ConcurrentGroupTaskStep getConcurrentGroupTask() {\n        return ConcurrentGroupTaskStep.get();\n    }\n\n    /**\n     * 获取并行任务组\n     *\n     * @param name 任务组名称\n     * @return 并行任务组\n     */\n    public static ConcurrentGroupTaskStep getConcurrentGroupTask(@NonNull String name) {\n        return ConcurrentGroupTaskStep.get(name);\n    }\n\n    /**\n     * 获取并行任务组\n     *\n     * @param threadType 线程类型\n     * @return 并行任务组\n     */\n    public static ConcurrentGroupTaskStep getConcurrentGroupTask(@NonNull ThreadType threadType) {\n        return ConcurrentGroupTaskStep.get(threadType);\n    }\n\n    //========================SerialGroupTaskStep===============================//\n\n    /**\n     * 获取串行任务组\n     *\n     * @return 串行任务组\n     */\n    public static SerialGroupTaskStep getSerialGroupTask() {\n        return SerialGroupTaskStep.get();\n    }\n\n    /**\n     * 获取串行任务组\n     *\n     * @param name 任务组名称\n     * @return 串行任务组\n     */\n    public static SerialGroupTaskStep getSerialGroupTask(@NonNull String name) {\n        return SerialGroupTaskStep.get(name);\n    }\n\n    /**\n     * 获取串行任务组\n     *\n     * @param threadType 任务组名称\n     * @return 串行任务组\n     */\n    public static SerialGroupTaskStep getSerialGroupTask(@NonNull ThreadType threadType) {\n        return SerialGroupTaskStep.get(threadType);\n    }\n\n    //========================CancellerPoolUtils===============================//\n\n    /**\n     * 设置自定义的取消者订阅池\n     *\n     * @param cancellerPool 取消者订阅池\n     */\n    public static void setCancellerPool(ICancellerPool cancellerPool) {\n        CancellerPoolUtils.setCancellerPool(cancellerPool);\n    }\n\n    /**\n     * 取消指定任务链\n     *\n     * @param name 任务链名称\n     * @return 是否执行成功\n     */\n    public static boolean cancelTaskChain(String name) {\n        return CancellerPoolUtils.cancel(name);\n    }\n\n    /**\n     * 取消指定任务链集合\n     *\n     * @param names 任务链名称集合\n     */\n    public static void cancelTaskChain(String... names) {\n        CancellerPoolUtils.cancel(names);\n    }\n\n\n    /**\n     * 取消指定任务链集合\n     *\n     * @param names 任务链名称集合\n     */\n    public static void cancelTaskChain(Collection<String> names) {\n        CancellerPoolUtils.cancel(names);\n    }\n\n    /**\n     * 取消所有任务链\n     */\n    public static void cancelAllTaskChain() {\n        CancellerPoolUtils.cancelAll();\n    }\n\n    /**\n     * 清除所有任务链\n     *\n     * @param ifNeedCancel 是否在清除前取消任务链\n     */\n    public static void clearTaskChain(boolean ifNeedCancel) {\n        CancellerPoolUtils.clear(ifNeedCancel);\n    }\n\n    //========================XTaskExecutor===============================//\n\n    /**\n     * 设置优先级控制的执行内核实现接口\n     *\n     * @param priorityExecutorCore 优先级控制的执行内核实现接口\n     */\n    public static void setPriorityExecutorCore(@NonNull IPriorityExecutorCore priorityExecutorCore) {\n        XTaskExecutor.get().setPriorityExecutorCore(priorityExecutorCore);\n    }\n\n    /**\n     * 设置类别执行内核实现接口\n     *\n     * @param categoryExecutorCore 类别执行内核实现接口\n     */\n    public static void setCategoryExecutorCore(@NonNull ICategoryExecutorCore categoryExecutorCore) {\n        XTaskExecutor.get().setCategoryExecutorCore(categoryExecutorCore);\n    }\n\n    /**\n     * 设置周期执行内核的实现接口\n     *\n     * @param scheduledExecutorCore 周期执行内核的实现接口\n     */\n    public static void setScheduledExecutorCore(@NonNull IScheduledExecutorCore scheduledExecutorCore) {\n        XTaskExecutor.get().setScheduledExecutorCore(scheduledExecutorCore);\n    }\n\n    /**\n     * 停止工作\n     */\n    public static void shutdown() {\n        XTaskExecutor.get().shutdown();\n    }\n\n    //================PriorityExecutorCore==================//\n\n    /**\n     * 按优先级执行异步任务\n     *\n     * @param task     任务\n     * @param priority 优先级\n     * @return 取消接口\n     */\n    public static ICancelable submit(Runnable task, int priority) {\n        return XTaskExecutor.get().submit(task, priority);\n    }\n\n    /**\n     * 分组按优先级执行异步任务\n     *\n     * @param groupName 任务组名\n     * @param task      任务\n     * @param priority  优先级\n     * @return 取消接口\n     */\n    public static ICancelable submit(String groupName, Runnable task, int priority) {\n        return XTaskExecutor.get().submit(groupName, task, priority);\n    }\n\n    //================CategoryExecutorCore==================//\n\n    /**\n     * 执行任务到主线程\n     *\n     * @param task 任务\n     * @return 是否执行成功\n     */\n    public static boolean postToMain(Runnable task) {\n        return XTaskExecutor.get().postToMain(task);\n    }\n\n    /**\n     * 延迟执行任务到主线程\n     *\n     * @param task        任务\n     * @param delayMillis 延迟时间\n     * @return 是否执行成功\n     */\n    public static ICancelable postToMainDelay(Runnable task, long delayMillis) {\n        return XTaskExecutor.get().postToMainDelay(task, delayMillis);\n    }\n\n    /**\n     * 执行紧急异步任务【线程的优先级默认是10】\n     *\n     * @param task 任务\n     * @return 取消接口\n     */\n    public static ICancelable emergentSubmit(Runnable task) {\n        return XTaskExecutor.get().emergentSubmit(task);\n    }\n\n    /**\n     * 执行普通异步任务【线程的优先级是5】\n     *\n     * @param task 任务\n     * @return 取消接口\n     */\n    public static ICancelable submit(Runnable task) {\n        return XTaskExecutor.get().submit(task);\n    }\n\n    /**\n     * 执行后台异步任务【线程的优先级是1】\n     *\n     * @param task 任务\n     * @return 取消接口\n     */\n    public static ICancelable backgroundSubmit(Runnable task) {\n        return XTaskExecutor.get().backgroundSubmit(task);\n    }\n\n    /**\n     * 执行io耗时的异步任务【线程的优先级是5】\n     *\n     * @param task 任务\n     * @return 取消接口\n     */\n    public static ICancelable ioSubmit(Runnable task) {\n        return XTaskExecutor.get().ioSubmit(task);\n    }\n\n    /**\n     * 执行分组异步任务【线程的优先级是5】\n     *\n     * @param groupName 任务组名\n     * @param task      任务\n     * @return 取消接口\n     */\n    public static ICancelable groupSubmit(String groupName, Runnable task) {\n        return XTaskExecutor.get().groupSubmit(groupName, task);\n    }\n\n    //================ScheduledExecutorCore==================//\n\n    /**\n     * 执行延期任务\n     *\n     * @param task  任务\n     * @param delay 延迟时长\n     * @param unit  时间单位\n     * @return 取消接口\n     */\n    public static ICancelable schedule(Runnable task, long delay, TimeUnit unit) {\n        return XTaskExecutor.get().schedule(task, delay, unit);\n    }\n\n    /**\n     * 执行周期任务（以固定频率执行的任务）\n     *\n     * @param task         任务\n     * @param initialDelay 初始延迟时长\n     * @param period       间隔时长\n     * @param unit         时间单位\n     * @return 取消接口\n     */\n    public static ICancelable scheduleAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit unit) {\n        return XTaskExecutor.get().scheduleAtFixedRate(task, initialDelay, period, unit);\n    }\n\n    /**\n     * 执行周期任务（以固定延时执行的任务，延时是相对当前任务结束为起点计算开始时间）\n     *\n     * @param task         任务\n     * @param initialDelay 初始延迟时长\n     * @param period       间隔时长\n     * @param unit         时间单位\n     * @return 取消接口\n     */\n    public static ICancelable scheduleWithFixedDelay(Runnable task, long initialDelay, long period, TimeUnit unit) {\n        return XTaskExecutor.get().scheduleWithFixedDelay(task, initialDelay, period, unit);\n    }\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/api/TaskChainEngine.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.api;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.ITaskChainCallback;\nimport com.xuexiang.xtask.core.ITaskChainEngine;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.param.impl.TaskResult;\nimport com.xuexiang.xtask.core.step.ITaskStep;\nimport com.xuexiang.xtask.core.step.impl.AutoDestroyTaskChainCallback;\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\nimport com.xuexiang.xtask.thread.pool.cancel.ICanceller;\nimport com.xuexiang.xtask.utils.CancellerPoolUtils;\nimport com.xuexiang.xtask.utils.CommonUtils;\nimport com.xuexiang.xtask.utils.TaskUtils;\n\nimport java.util.List;\nimport java.util.UUID;\nimport java.util.concurrent.CopyOnWriteArrayList;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\n/**\n * 默认实现的任务链执行引擎\n *\n * @author xuexiang\n * @since 2021/11/2 1:46 AM\n */\npublic class TaskChainEngine implements ITaskChainEngine {\n\n    private static final String TAG = TaskLogger.getLogTag(\"TaskChainEngine\");\n\n    /**\n     * 任务链名前缀\n     */\n    private static final String TASK_CHAIN_NAME_PREFIX = \"TaskChain-\";\n\n    /**\n     * 是否取消\n     */\n    private AtomicBoolean mIsCancelled = new AtomicBoolean(false);\n\n    /**\n     * 任务链名称\n     */\n    private String mName;\n\n    /**\n     * 任务结果\n     */\n    private TaskResult mResult = new TaskResult();\n\n    /**\n     * 执行任务集合\n     */\n    private List<ITaskStep> mTasks = new CopyOnWriteArrayList<>();\n\n    /**\n     * 任务链执行回调, 默认回调处理是自动销毁任务链\n     */\n    private ITaskChainCallback mTaskChainCallback = new AutoDestroyTaskChainCallback();\n\n    /**\n     * 执行的时候，是否把取消者加入到缓存池中去\n     */\n    private boolean mIsAddCancellerPool;\n\n    /**\n     * 获取任务链执行引擎\n     *\n     * @return 任务链执行引擎\n     */\n    public static TaskChainEngine get() {\n        return new TaskChainEngine();\n    }\n\n    /**\n     * 获取任务链执行引擎\n     *\n     * @param name 任务链名称\n     * @return 任务链执行引擎\n     */\n    public static TaskChainEngine get(String name) {\n        return new TaskChainEngine(name);\n    }\n\n    /**\n     * 构造方法\n     */\n    public TaskChainEngine() {\n        this(TASK_CHAIN_NAME_PREFIX + UUID.randomUUID().toString());\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param name 任务链名称\n     */\n    public TaskChainEngine(String name) {\n        mName = name;\n    }\n\n    @Override\n    public String getName() {\n        return mName;\n    }\n\n    @Override\n    public TaskChainEngine setTaskParam(@NonNull ITaskParam taskParam) {\n        mResult.updateParam(taskParam);\n        return this;\n    }\n\n    @Override\n    public TaskChainEngine setTaskChainCallback(ITaskChainCallback iTaskChainCallback) {\n        if (isDestroy()) {\n            TaskLogger.eTag(TAG, getTaskChainName() + \" setTaskChainCallback failed, task chain has destroyed!\");\n            return this;\n        }\n        mTaskChainCallback = iTaskChainCallback;\n        return this;\n    }\n\n    @Override\n    public TaskChainEngine addTask(ITaskStep taskStep) {\n        if (isDestroy()) {\n            TaskLogger.eTag(TAG, getTaskChainName() + \" addTask failed, task chain has destroyed!\");\n            return this;\n        }\n        if (taskStep != null) {\n            taskStep.setTaskStepLifecycle(this);\n            mTasks.add(taskStep);\n        }\n        return this;\n    }\n\n    @Override\n    public TaskChainEngine addTasks(List<ITaskStep> taskStepList) {\n        if (isDestroy()) {\n            TaskLogger.eTag(TAG, getTaskChainName() + \" addTasks failed, task chain has destroyed!\");\n            return this;\n        }\n        if (!CommonUtils.isEmpty(taskStepList)) {\n            for (ITaskStep taskStep : taskStepList) {\n                addTask(taskStep);\n            }\n        }\n        return this;\n    }\n\n    @Override\n    public void clearTask() {\n        if (isDestroy()) {\n            return;\n        }\n        if (CommonUtils.isEmpty(mTasks)) {\n            return;\n        }\n        for (ITaskStep taskStep : mTasks) {\n            taskStep.recycle();\n        }\n        mTasks.clear();\n    }\n\n    @Override\n    public ICanceller start() {\n        return start(true);\n    }\n\n    @Override\n    public ICanceller start(boolean isAddPool) {\n        if (isDestroy()) {\n            TaskLogger.eTag(TAG, getTaskChainName() + \" start failed, task chain has destroyed!\");\n            return null;\n        }\n        mIsAddCancellerPool = isAddPool;\n        onTaskChainStart();\n        ITaskStep firstTaskStep = TaskUtils.findNextTaskStep(mTasks, null);\n        if (firstTaskStep != null) {\n            firstTaskStep.prepareTask(mResult);\n            ICancelable cancelable = TaskUtils.executeTask(firstTaskStep);\n            firstTaskStep.setCancelable(cancelable);\n        } else {\n            onTaskChainCompleted(mResult);\n        }\n        if (isAddPool) {\n            CancellerPoolUtils.add(getName(), this);\n        }\n        return this;\n    }\n\n    @Override\n    public void reset() {\n        if (isDestroy()) {\n            TaskLogger.eTag(TAG, getTaskChainName() + \" reset failed, task chain has destroyed!\");\n            return;\n        }\n        mIsCancelled.set(false);\n        mResult.clear();\n        clearTask();\n        CancellerPoolUtils.remove(getName());\n    }\n\n    @Override\n    public void destroy() {\n        if (isDestroy()) {\n            return;\n        }\n        TaskLogger.dTag(TAG, getTaskChainName() + \" destroy...\");\n        reset();\n        mTaskChainCallback = null;\n        mResult = null;\n        mTasks = null;\n    }\n\n    /**\n     * 是否已经销毁\n     *\n     * @return 是否已经销毁\n     */\n    private boolean isDestroy() {\n        return mResult == null || mTasks == null;\n    }\n\n    @Override\n    public void cancel() {\n        if (isDestroy()) {\n            TaskLogger.eTag(TAG, getTaskChainName() + \" cancel failed, task chain has destroyed!\");\n            return;\n        }\n        if (isCancelled()) {\n            return;\n        }\n        for (ITaskStep taskStep : mTasks) {\n            taskStep.cancel();\n        }\n        mIsCancelled.set(true);\n        onTaskChainCancelled();\n    }\n\n    @Override\n    public boolean isCancelled() {\n        return mIsCancelled.get();\n    }\n\n    @Override\n    public void onTaskStepCompleted(@NonNull ITaskStep step, @NonNull ITaskResult result) {\n        if (isDestroy()) {\n            TaskLogger.eTag(TAG, getTaskChainName() + \" onTaskStepCompleted failed, task chain has destroyed!\");\n            return;\n        }\n        mResult.saveResult(result);\n        ITaskStep nextTaskStep = TaskUtils.findNextTaskStep(mTasks, step);\n        if (nextTaskStep != null) {\n            // 更新数据，将上一个task的结果更新到下一个task\n            nextTaskStep.prepareTask(mResult);\n            ICancelable cancelable = TaskUtils.executeTask(nextTaskStep);\n            nextTaskStep.setCancelable(cancelable);\n        } else {\n            onTaskChainCompleted(result);\n        }\n    }\n\n    @Override\n    public void onTaskStepError(@NonNull ITaskStep step, @NonNull ITaskResult result) {\n        if (isDestroy()) {\n            TaskLogger.eTag(TAG, getTaskChainName() + \" onTaskStepError failed, task chain has destroyed!\");\n            return;\n        }\n        onTaskChainError(result);\n    }\n\n    private boolean isNeedChangeToMainThread() {\n        return mTaskChainCallback.isCallBackOnMainThread() && !TaskUtils.isMainThread();\n    }\n\n    private void onTaskChainStart() {\n        TaskLogger.dTag(TAG, getTaskChainName() + \"(size=\" + CommonUtils.getSize(mTasks) + \") start...\");\n        if (mTaskChainCallback == null) {\n            return;\n        }\n        if (isNeedChangeToMainThread()) {\n            TaskUtils.runOnMainThread(new Runnable() {\n                @Override\n                public void run() {\n                    mTaskChainCallback.onTaskChainStart(TaskChainEngine.this);\n                }\n            });\n        } else {\n            mTaskChainCallback.onTaskChainStart(this);\n        }\n    }\n\n\n    private void onTaskChainCancelled() {\n        TaskLogger.dTag(TAG, getTaskChainName() + \" cancelled!\");\n        if (mIsAddCancellerPool) {\n            CancellerPoolUtils.remove(getName());\n        }\n        if (mTaskChainCallback == null) {\n            return;\n        }\n        if (isNeedChangeToMainThread()) {\n            TaskUtils.runOnMainThread(new Runnable() {\n                @Override\n                public void run() {\n                    mTaskChainCallback.onTaskChainCancelled(TaskChainEngine.this);\n                }\n            });\n        } else {\n            mTaskChainCallback.onTaskChainCancelled(this);\n        }\n    }\n\n    private void onTaskChainCompleted(final ITaskResult result) {\n        TaskLogger.dTag(TAG, getTaskChainName() + \" completed!\");\n        if (mIsAddCancellerPool) {\n            CancellerPoolUtils.remove(getName());\n        }\n        if (mTaskChainCallback == null) {\n            return;\n        }\n        if (isNeedChangeToMainThread()) {\n            TaskUtils.runOnMainThread(new Runnable() {\n                @Override\n                public void run() {\n                    mTaskChainCallback.onTaskChainCompleted(TaskChainEngine.this, result);\n                }\n            });\n        } else {\n            mTaskChainCallback.onTaskChainCompleted(this, result);\n        }\n    }\n\n    private void onTaskChainError(final ITaskResult result) {\n        TaskLogger.dTag(TAG, getTaskChainName() + \" error!\");\n        if (mIsAddCancellerPool) {\n            CancellerPoolUtils.remove(getName());\n        }\n        if (mTaskChainCallback == null) {\n            return;\n        }\n        if (isNeedChangeToMainThread()) {\n            TaskUtils.runOnMainThread(new Runnable() {\n                @Override\n                public void run() {\n                    mTaskChainCallback.onTaskChainError(TaskChainEngine.this, result);\n                }\n            });\n        } else {\n            mTaskChainCallback.onTaskChainError(this, result);\n        }\n    }\n\n    /**\n     * 获取任务链的名称\n     *\n     * @return 任务链的名称\n     */\n    protected String getTaskChainName() {\n        return \"Task chain [\" + getName() + \"]\";\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/api/step/ConcurrentGroupTaskStep.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.api.step;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.step.ITaskStep;\nimport com.xuexiang.xtask.core.step.impl.AbstractGroupTaskStep;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\nimport com.xuexiang.xtask.utils.TaskUtils;\n\n/**\n * 并行任务组(不进行具体的任务）\n *\n * @author xuexiang\n * @since 2021/11/8 2:04 AM\n */\npublic class ConcurrentGroupTaskStep extends AbstractGroupTaskStep {\n\n    /**\n     * 获取并行任务组\n     *\n     * @return 并行任务组\n     */\n    public static ConcurrentGroupTaskStep get() {\n        return new ConcurrentGroupTaskStep();\n    }\n\n    /**\n     * 获取并行任务组\n     *\n     * @param name 任务组名称\n     * @return 并行任务组\n     */\n    public static ConcurrentGroupTaskStep get(@NonNull String name) {\n        return new ConcurrentGroupTaskStep(name);\n    }\n\n    /**\n     * 获取并行任务组\n     *\n     * @param threadType 线程类型\n     * @return 并行任务组\n     */\n    public static ConcurrentGroupTaskStep get(@NonNull ThreadType threadType) {\n        return new ConcurrentGroupTaskStep(threadType);\n    }\n\n    public ConcurrentGroupTaskStep() {\n        super();\n    }\n\n    public ConcurrentGroupTaskStep(@NonNull String name) {\n        super(name);\n    }\n\n    public ConcurrentGroupTaskStep(@NonNull ThreadType threadType) {\n        super(threadType);\n    }\n\n    public ConcurrentGroupTaskStep(@NonNull String name, @NonNull ITaskParam taskParam) {\n        super(name, taskParam);\n    }\n\n    public ConcurrentGroupTaskStep(@NonNull String name, @NonNull ThreadType threadType) {\n        super(name, threadType);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        initGroupTask();\n        if (mTaskTotalSize > 0) {\n            for (ITaskStep taskStep : getTasks()) {\n                if (taskStep != null && taskStep.accept()) {\n                    taskStep.prepareTask(getResult());\n                    ICancelable cancelable = TaskUtils.executeTask(taskStep);\n                    taskStep.setCancelable(cancelable);\n                }\n            }\n        } else {\n            notifyTaskSucceed(getResult());\n        }\n    }\n\n    @Override\n    public void onTaskStepCompleted(@NonNull ITaskStep step, @NonNull ITaskResult result) {\n        getResult().saveResultNotPath(result);\n        getResult().addGroupPath(step.getName(), mTaskIndex.getAndIncrement(), mTaskTotalSize);\n        if (mTaskIndex.get() == mTaskTotalSize) {\n            notifyTaskSucceed(result);\n        }\n    }\n\n    @Override\n    public void onTaskStepError(@NonNull ITaskStep step, @NonNull ITaskResult result) {\n        if (mTaskIndex.get() != -1) {\n            // 并行任务，只通知一次失败\n            notifyTaskFailed(result);\n            mTaskIndex.set(-1);\n        }\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/api/step/SerialGroupTaskStep.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.api.step;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.step.ITaskStep;\nimport com.xuexiang.xtask.core.step.impl.AbstractGroupTaskStep;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\nimport com.xuexiang.xtask.utils.TaskUtils;\n\n/**\n * 串行任务组(不进行具体的任务）\n *\n * @author xuexiang\n * @since 2021/11/8 2:02 AM\n */\npublic class SerialGroupTaskStep extends AbstractGroupTaskStep {\n\n    /**\n     * 获取串行任务组\n     *\n     * @return 串行任务组\n     */\n    public static SerialGroupTaskStep get() {\n        return new SerialGroupTaskStep();\n    }\n\n    /**\n     * 获取串行任务组\n     *\n     * @param name 任务组名称\n     * @return 串行任务组\n     */\n    public static SerialGroupTaskStep get(@NonNull String name) {\n        return new SerialGroupTaskStep(name);\n    }\n\n    /**\n     * 获取串行任务组\n     *\n     * @param threadType 线程类型\n     * @return 串行任务组\n     */\n    public static SerialGroupTaskStep get(@NonNull ThreadType threadType) {\n        return new SerialGroupTaskStep(threadType);\n    }\n\n    public SerialGroupTaskStep() {\n        super();\n    }\n\n    public SerialGroupTaskStep(@NonNull String name) {\n        super(name);\n    }\n\n    public SerialGroupTaskStep(@NonNull ThreadType threadType) {\n        super(threadType);\n    }\n\n    public SerialGroupTaskStep(@NonNull String name, @NonNull ITaskParam taskParam) {\n        super(name, taskParam);\n    }\n\n    public SerialGroupTaskStep(@NonNull String name, @NonNull ThreadType threadType) {\n        super(name, threadType);\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        ITaskStep firstTaskStep = TaskUtils.findNextTaskStep(getTasks(), null);\n        if (firstTaskStep != null) {\n            initGroupTask();\n            firstTaskStep.prepareTask(getResult());\n            ICancelable cancelable = TaskUtils.executeTask(firstTaskStep);\n            firstTaskStep.setCancelable(cancelable);\n        } else {\n            notifyTaskSucceed(getResult());\n        }\n    }\n\n    @Override\n    public void onTaskStepCompleted(@NonNull ITaskStep step, @NonNull ITaskResult result) {\n        getResult().saveResultNotPath(result);\n        getResult().addGroupPath(step.getName(), mTaskIndex.getAndIncrement(), mTaskTotalSize);\n        ITaskStep nextTaskStep = TaskUtils.findNextTaskStep(getTasks(), step);\n        if (nextTaskStep != null) {\n            // 更新数据，将上一个task的结果更新到下一个task\n            nextTaskStep.prepareTask(getResult());\n            ICancelable cancelable = TaskUtils.executeTask(nextTaskStep);\n            nextTaskStep.setCancelable(cancelable);\n        } else {\n            notifyTaskSucceed(result);\n        }\n    }\n\n    @Override\n    public void onTaskStepError(@NonNull ITaskStep step, @NonNull ITaskResult result) {\n        notifyTaskFailed(result);\n    }\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/api/step/SimpleTaskStep.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.api.step;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.step.impl.AbstractTaskStep;\nimport com.xuexiang.xtask.core.step.impl.AutoNotifyTaskStepHandler;\n\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * 简单的任务执行步骤\n *\n * @author xuexiang\n * @since 2/1/22 11:11 PM\n */\npublic abstract class SimpleTaskStep extends AbstractTaskStep {\n\n    private static final AtomicInteger TASK_NUMBER = new AtomicInteger(1);\n\n    /**\n     * 任务名称\n     */\n    private String mName;\n\n    /**\n     * 构造方法\n     */\n    public SimpleTaskStep() {\n        this(\"SimpleTaskStep-\" + TASK_NUMBER.getAndIncrement());\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param name 任务名称\n     */\n    public SimpleTaskStep(String name) {\n        initTaskStep(name);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param name       任务名称\n     * @param threadType 线程类型\n     */\n    public SimpleTaskStep(String name, ThreadType threadType) {\n        super(threadType);\n        initTaskStep(name);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param name      任务名称\n     * @param taskParam 任务参数\n     */\n    public SimpleTaskStep(String name, @NonNull ITaskParam taskParam) {\n        super(taskParam);\n        initTaskStep(name);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param name       任务名称\n     * @param threadType 线程类型\n     * @param taskParam  任务参数\n     */\n    public SimpleTaskStep(String name, ThreadType threadType, @NonNull ITaskParam taskParam) {\n        super(threadType, taskParam);\n        initTaskStep(name);\n    }\n\n    /**\n     * 初始化任务步骤\n     *\n     * @param name 任务步骤名\n     */\n    protected void initTaskStep(String name) {\n        mName = name;\n        if (isAutoNotify()) {\n            setTaskStepHandler(new AutoNotifyTaskStepHandler());\n        }\n    }\n\n\n    @Override\n    public String getName() {\n        return mName;\n    }\n\n    /**\n     * 是否自动通知执行结果【需要手动控制的请设置false】\n     *\n     * @return 是否自动通知执行结果\n     */\n    protected boolean isAutoNotify() {\n        return true;\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/api/step/XTaskStep.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.api.step;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.param.impl.TaskParam;\nimport com.xuexiang.xtask.core.step.ITaskStepHandler;\nimport com.xuexiang.xtask.core.step.impl.AbstractTaskStep;\nimport com.xuexiang.xtask.core.step.impl.TaskCommand;\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.utils.CommonUtils;\n\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * 简化任务步骤的使用\n *\n * @author xuexiang\n * @since 1/30/22 5:08 PM\n */\npublic class XTaskStep extends AbstractTaskStep {\n\n    private static final String TAG = TaskLogger.getLogTag(\"XTaskStep\");\n\n    /**\n     * 任务的编号【静态全局】\n     */\n    private static final AtomicInteger TASK_NUMBER = new AtomicInteger(1);\n\n    /**\n     * 获取简化的任务\n     *\n     * @param command 任务执行内容\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep getTask(@NonNull TaskCommand command) {\n        return new Builder(command).build();\n    }\n\n    /**\n     * 获取简化的任务\n     *\n     * @param command      任务执行内容\n     * @param isAutoNotify 是否自动通知任务成功或者失败\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep getTask(@NonNull TaskCommand command, boolean isAutoNotify) {\n        return new Builder(command).setIsAutoNotify(isAutoNotify).build();\n    }\n\n    /**\n     * 获取简化的任务\n     *\n     * @param command    任务执行内容\n     * @param threadType 线程类型\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep getTask(@NonNull TaskCommand command, ThreadType threadType) {\n        return new Builder(command)\n                .setThreadType(threadType)\n                .build();\n    }\n\n    /**\n     * 获取简化的任务\n     *\n     * @param command   任务执行内容\n     * @param taskParam 任务参数\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep getTask(@NonNull TaskCommand command, @NonNull ITaskParam taskParam) {\n        return new Builder(command)\n                .setTaskParam(taskParam)\n                .build();\n    }\n\n    /**\n     * 获取简化的任务\n     *\n     * @param command    任务执行内容\n     * @param threadType 线程类型\n     * @param taskParam  任务参数\n     * @return 简化任务的构建者\n     */\n    public static XTaskStep getTask(@NonNull TaskCommand command, ThreadType threadType, @NonNull ITaskParam taskParam) {\n        return new Builder(command)\n                .setThreadType(threadType)\n                .setTaskParam(taskParam)\n                .build();\n    }\n\n    /**\n     * 获取简化任务的构建者\n     *\n     * @param command 任务执行内容\n     * @return 简化任务的构建者\n     */\n    public static Builder newBuilder(@NonNull TaskCommand command) {\n        return new Builder(command);\n    }\n\n    /**\n     * 任务名称\n     */\n    private String mName;\n\n    /**\n     * 任务执行内容\n     */\n    private TaskCommand mTaskCommand;\n\n    /**\n     * 是否自动通知任务成功或者失败\n     */\n    private boolean mIsAutoNotify;\n\n    /**\n     * 构造方法\n     *\n     * @param name         任务步骤名称\n     * @param command      任务执行内容\n     * @param threadType   线程类型\n     * @param taskParam    任务参数\n     * @param taskHandler  任务处理者\n     * @param isAutoNotify 是否自动通知任务成功或者失败\n     */\n    private XTaskStep(@NonNull String name, @NonNull TaskCommand command, ThreadType threadType, @NonNull ITaskParam taskParam, ITaskStepHandler taskHandler, boolean isAutoNotify) {\n        super(threadType, taskParam);\n        mName = name;\n        mTaskCommand = command;\n        mTaskCommand.setTaskStepResultController(this);\n        mIsAutoNotify = isAutoNotify;\n        setTaskStepHandler(taskHandler);\n    }\n\n    @Override\n    public String getName() {\n        return mName;\n    }\n\n    @Override\n    public void doTask() throws Exception {\n        if (mIsAutoNotify) {\n            try {\n                mTaskCommand.run();\n            } catch (Exception e) {\n                TaskLogger.eTag(TAG, getTaskLogName() + \" has error！\", e);\n                notifyTaskFailed(ITaskResult.PROCESS_TASK_THROW_EXCEPTION, e.getMessage());\n                return;\n            }\n            mTaskCommand.notifyTaskSucceed();\n        } else {\n            mTaskCommand.run();\n        }\n    }\n\n    /**\n     * 简化任务构建者\n     *\n     * @author xuexiang\n     * @since 1/30/22 5:22 PM\n     */\n    public static final class Builder {\n        /**\n         * 任务步骤名称\n         */\n        String name;\n        /**\n         * 任务执行内容\n         */\n        TaskCommand command;\n        /**\n         * 线程执行类型\n         */\n        ThreadType threadType = ThreadType.ASYNC;\n        /**\n         * 任务参数\n         */\n        ITaskParam taskParam;\n        /**\n         * 任务处理者\n         */\n        ITaskStepHandler taskHandler;\n        /**\n         * 是否自动通知任务成功或者失败\n         */\n        boolean isAutoNotify = true;\n\n        /**\n         * 构造方法\n         *\n         * @param command 执行内容\n         */\n        private Builder(@NonNull TaskCommand command) {\n            this.command = command;\n        }\n\n        public Builder setName(String name) {\n            this.name = name;\n            return this;\n        }\n\n        public Builder setCommand(TaskCommand command) {\n            this.command = command;\n            return this;\n        }\n\n        public Builder setThreadType(ThreadType threadType) {\n            this.threadType = threadType;\n            return this;\n        }\n\n        public Builder setTaskParam(ITaskParam taskParam) {\n            this.taskParam = taskParam;\n            return this;\n        }\n\n        public Builder setTaskHandler(ITaskStepHandler taskHandler) {\n            this.taskHandler = taskHandler;\n            return this;\n        }\n\n        public Builder setIsAutoNotify(boolean isAutoNotify) {\n            this.isAutoNotify = isAutoNotify;\n            return this;\n        }\n\n        public XTaskStep build() {\n            CommonUtils.requireNonNull(this.command, \"XTaskStep.Builder command can not be null!\");\n\n            if (CommonUtils.isEmpty(name)) {\n                name = \"XTaskStep-\" + TASK_NUMBER.getAndIncrement();\n            }\n            if (taskParam == null) {\n                taskParam = new TaskParam();\n            }\n            return new XTaskStep(name, command, threadType, taskParam, taskHandler, isAutoNotify);\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/ITaskChainCallback.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\n\n/**\n * 任务链执行回调\n *\n * @author xuexiang\n * @since 2021/10/18 10:32 PM\n */\npublic interface ITaskChainCallback {\n\n    /**\n     * 回调是否返回主线程\n     *\n     * @return 是否返回主线程\n     */\n    boolean isCallBackOnMainThread();\n\n    /**\n     * 任务步骤开始执行\n     *\n     * @param engine 任务链\n     */\n    void onTaskChainStart(@NonNull ITaskChainEngine engine);\n\n    /**\n     * 任务步骤执行完毕\n     *\n     * @param engine 任务链\n     * @param result 任务执行结果\n     */\n    void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result);\n\n    /**\n     * 任务步骤执行发生异常\n     *\n     * @param engine 任务链\n     * @param result 任务执行结果\n     */\n    void onTaskChainError(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result);\n\n    /**\n     * 任务步骤执行被取消\n     *\n     * @param engine 任务链\n     */\n    void onTaskChainCancelled(@NonNull ITaskChainEngine engine);\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/ITaskChainEngine.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.step.IGroupTaskStep;\nimport com.xuexiang.xtask.core.step.ITaskStepLifecycle;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\nimport com.xuexiang.xtask.thread.pool.cancel.ICanceller;\n\n/**\n * 任务链执行引擎实现接口\n *\n * @author xuexiang\n * @since 2021/10/19 1:43 AM\n */\npublic interface ITaskChainEngine extends ITaskStepLifecycle, IGroupTaskStep, ICanceller {\n\n    /**\n     * 获取任务链的名称\n     *\n     * @return 任务链的名称\n     */\n    @Override\n    String getName();\n\n    /**\n     * 初始化任务参数\n     *\n     * @param taskParam 任务参数\n     * @return 任务链执行引擎\n     */\n    ITaskChainEngine setTaskParam(@NonNull ITaskParam taskParam);\n\n    /**\n     * 设置任务链执行回调\n     *\n     * @param iTaskChainCallback 任务链执行回调\n     * @return 任务链执行引擎\n     */\n    ITaskChainEngine setTaskChainCallback(ITaskChainCallback iTaskChainCallback);\n\n    /**\n     * 开始任务\n     *\n     * @return 取消的接口\n     */\n    ICancelable start();\n\n    /**\n     * 开始任务\n     *\n     * @param isAddPool 是否增加到取消者订阅池里\n     * @return 取消的接口\n     */\n    ICancelable start(boolean isAddPool);\n\n    /**\n     * 重置任务链（可继续使用)\n     */\n    void reset();\n\n    /**\n     * 销毁任务链（不可使用)\n     */\n    void destroy();\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/ThreadType.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core;\n\n/**\n * 线程执行类型\n *\n * @author xuexiang\n * @since 2021/10/27 2:01 AM\n */\npublic enum ThreadType {\n\n    /**\n     * 主线程（UI线程）\n     */\n    MAIN,\n\n    /**\n     * 异步线程（开子线程，普通线程池）\n     */\n    ASYNC,\n\n    /**\n     * 异步线程（开子线程，io线程池）\n     */\n    ASYNC_IO,\n\n    /**\n     * 异步线程（开子线程，紧急线程池）\n     */\n    ASYNC_EMERGENT,\n\n    /**\n     * 异步线程（开子线程，优先级较低线程池）\n     */\n    ASYNC_BACKGROUND,\n\n    /**\n     * 同步线程（直接执行）\n     */\n    SYNC\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/param/IDataStore.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.param;\n\nimport java.util.Map;\n\n/**\n * 数据存储仓库接口\n *\n * @author xuexiang\n * @since 2021/11/13 4:08 PM\n */\npublic interface IDataStore {\n\n    /**\n     * String的默认值\n     */\n    String DEFAULT_STRING = \"\";\n    /**\n     * Integer的默认值\n     */\n    int DEFAULT_INTEGER = -1;\n    /**\n     * Boolean的默认值\n     */\n    boolean DEFAULT_BOOLEAN = false;\n\n    /**\n     * 获取数据\n     *\n     * @param key 键\n     * @return 值\n     */\n    Object get(String key);\n\n    /**\n     * 存储数据\n     *\n     * @param key   键\n     * @param value 值\n     * @return 数据存储仓库\n     */\n    IDataStore put(String key, Object value);\n\n    /**\n     * 获取目标数据\n     *\n     * @param key   键\n     * @param clazz 目标数据类型\n     * @return 值\n     */\n    <T> T getObject(String key, Class<T> clazz);\n\n    /**\n     * 获取目标数据\n     *\n     * @param key          键\n     * @param defaultValue 默认值\n     * @return 值\n     */\n    <T> T getObject(String key, T defaultValue);\n\n    /**\n     * 获取String类型数据\n     *\n     * @param key 键\n     * @return 值\n     */\n    String getString(String key);\n\n    /**\n     * 获取String类型数据\n     *\n     * @param key          键\n     * @param defaultValue 默认值\n     * @return 值\n     */\n    String getString(String key, String defaultValue);\n\n    /**\n     * 获取Boolean类型数据\n     *\n     * @param key 键\n     * @return 值\n     */\n    boolean getBoolean(String key);\n\n    /**\n     * 获取boolean类型数据\n     *\n     * @param key          键\n     * @param defaultValue 默认值\n     * @return 值\n     */\n    boolean getBoolean(String key, boolean defaultValue);\n\n    /**\n     * 获取Integer类型数据\n     *\n     * @param key 键\n     * @return 值\n     */\n    int getInt(String key);\n\n    /**\n     * 获取int类型数据\n     *\n     * @param key          键\n     * @param defaultValue 默认值\n     * @return 值\n     */\n    int getInt(String key, int defaultValue);\n\n    /**\n     * 获取存储的所以信息\n     *\n     * @return 存储信息\n     */\n    Map<String, Object> getData();\n\n    /**\n     * 清除数据\n     */\n    void clear();\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/param/ITaskParam.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.param;\n\n/**\n * 任务参数信息实现接口\n *\n * @author xuexiang\n * @since 2021/10/19 1:44 AM\n */\npublic interface ITaskParam extends IDataStore {\n\n    /**\n     * 增加任务路径\n     *\n     * @param path 任务路径\n     */\n    void addPath(String path);\n\n    /**\n     * 增加组任务路径\n     *\n     * @param path  任务路径\n     * @param index 任务索引\n     * @param total 总任务数\n     */\n    void addGroupPath(String path, int index, int total);\n\n    /**\n     * 获取当前任务执行的全路径\n     *\n     * @return 当前任务执行的全路径\n     */\n    String getPath();\n\n    /**\n     * 更新路径\n     *\n     * @param path 任务全路径\n     */\n    void updatePath(String path);\n\n    /**\n     * 获取数据存储仓库\n     *\n     * @return 数据存储仓库\n     */\n    IDataStore getDataStore();\n\n    /**\n     * 更新数据\n     *\n     * @param iDataStore 数据存储仓库\n     */\n    void updateData(IDataStore iDataStore);\n\n    /**\n     * 更新参数\n     *\n     * @param path       任务全路径\n     * @param iDataStore 数据存储仓库\n     */\n    void updateParam(String path, IDataStore iDataStore);\n\n    /**\n     * 更新参数\n     *\n     * @param taskParam 任务参数\n     */\n    void updateParam(ITaskParam taskParam);\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/param/ITaskResult.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.param;\n\n/**\n * 任务执行结果\n *\n * @author xuexiang\n * @since 2021/10/27 2:10 AM\n */\npublic interface ITaskResult {\n\n    /**\n     * 任务成功\n     */\n    int SUCCESS = 0;\n\n    /**\n     * 任务失败\n     */\n    int ERROR = -1;\n\n    /**\n     * 任务执行过程中发生异常\n     */\n    int PROCESS_TASK_THROW_EXCEPTION = -2;\n\n    /**\n     * 获取任务结果码\n     *\n     * @return 任务结果码\n     */\n    int getCode();\n\n    /**\n     * 获取任务执行信息\n     *\n     * @return 任务执行信息\n     */\n    String getMessage();\n\n    /**\n     * 设置结果信息\n     *\n     * @param code    任务结果码\n     * @param message 任务执行信息\n     */\n    void setResult(int code, String message);\n\n    /**\n     * 保存执行结果\n     *\n     * @param taskResult 执行结果\n     */\n    void saveResult(ITaskResult taskResult);\n\n    /**\n     * 保存执行结果，但是不保存执行路径\n     *\n     * @param taskResult 执行结果\n     */\n    void saveResultNotPath(ITaskResult taskResult);\n\n    /**\n     * 更新参数\n     *\n     * @param taskParam 任务参数\n     */\n    void updateParam(ITaskParam taskParam);\n\n    /**\n     * 获取数据存储仓库\n     *\n     * @return 数据存储仓库\n     */\n    IDataStore getDataStore();\n\n    /**\n     * 获取当前任务执行的全路径\n     *\n     * @return 当前任务执行的全路径\n     */\n    String getPath();\n\n    /**\n     * 获取详细信息\n     *\n     * @return 详细信息\n     */\n    String getDetailMessage();\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/param/impl/MapDataStore.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.param.impl;\n\nimport com.xuexiang.xtask.core.param.IDataStore;\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.utils.CommonUtils;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * 默认数据存储仓库， 使用ConcurrentHashMap实现\n *\n * @author xuexiang\n * @since 2021/11/13 4:09 PM\n */\npublic class MapDataStore implements IDataStore {\n\n    private static final String TAG = TaskLogger.getLogTag(\"MapDataStore\");\n\n    /**\n     * 数据存储\n     */\n    private Map<String, Object> mData = new ConcurrentHashMap<>();\n\n    @Override\n    public Object get(String key) {\n        if (key == null) {\n            return null;\n        }\n        return mData.get(key);\n    }\n\n    @Override\n    public <T> T getObject(String key, Class<T> clazz) {\n        return CommonUtils.cast(get(key), clazz);\n    }\n\n    @Override\n    public <T> T getObject(String key, T defaultValue) {\n        return CommonUtils.cast(get(key), defaultValue);\n    }\n\n    @Override\n    public String getString(String key) {\n        return getString(key, DEFAULT_STRING);\n    }\n\n    @Override\n    public String getString(String key, String defaultValue) {\n        String value = getObject(key, String.class);\n        return value != null ? value : defaultValue;\n    }\n\n    @Override\n    public boolean getBoolean(String key) {\n        return getBoolean(key, DEFAULT_BOOLEAN);\n    }\n\n    @Override\n    public boolean getBoolean(String key, boolean defaultValue) {\n        Boolean value = getObject(key, Boolean.class);\n        return value != null ? value : defaultValue;\n    }\n\n    @Override\n    public int getInt(String key) {\n        return getInt(key, DEFAULT_INTEGER);\n    }\n\n    @Override\n    public int getInt(String key, int defaultValue) {\n        Integer value = getObject(key, Integer.class);\n        return value != null ? value : defaultValue;\n    }\n\n    @Override\n    public Map<String, Object> getData() {\n        return mData;\n    }\n\n    @Override\n    public void clear() {\n        mData.clear();\n    }\n\n    @Override\n    public MapDataStore put(String key, Object value) {\n        if (key == null || value == null) {\n            TaskLogger.eTag(TAG, \"put param error, key or value is null!\");\n            return this;\n        }\n        mData.put(key, value);\n        return this;\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/param/impl/TaskParam.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.param.impl;\n\nimport com.xuexiang.xtask.core.param.IDataStore;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.utils.CommonUtils;\n\nimport java.util.Map;\n\n/**\n * 任务参数信息[数据+任务路径]\n *\n * @author xuexiang\n * @since 2021/10/26 1:36 AM\n */\npublic class TaskParam implements ITaskParam {\n\n    private static final String TAG = TaskLogger.getLogTag(\"TaskParam\");\n\n    /**\n     * 路径箭头\n     */\n    private static final String PATH_ARROW = \"->\";\n    /**\n     * 数据存储仓库\n     */\n    private final IDataStore mDataStore = new MapDataStore();\n\n    /**\n     * 任务执行路径\n     */\n    private StringBuilder mPath = new StringBuilder();\n\n    /**\n     * 构建一个空的任务参数\n     *\n     * @return 任务参数\n     */\n    public static TaskParam get() {\n        return new TaskParam();\n    }\n\n    /**\n     * 构建一个任务参数\n     *\n     * @param key   键\n     * @param value 值\n     * @return 任务参数\n     */\n    public static TaskParam get(String key, Object value) {\n        TaskParam taskParam = new TaskParam();\n        taskParam.put(key, value);\n        return taskParam;\n    }\n\n    @Override\n    public void addPath(String path) {\n        mPath.append(PATH_ARROW).append(path);\n    }\n\n    @Override\n    public void addGroupPath(String path, int index, int total) {\n        if (index < 0 || index >= total) {\n            return;\n        }\n        mPath.append(PATH_ARROW);\n        if (index == 0) {\n            mPath.append(\"[\");\n        }\n        mPath.append(path);\n        if (index == total - 1) {\n            mPath.append(\"]\");\n        }\n    }\n\n    @Override\n    public String getPath() {\n        return mPath.toString();\n    }\n\n    @Override\n    public void updatePath(String path) {\n        mPath = new StringBuilder(path);\n    }\n\n    @Override\n    public IDataStore getDataStore() {\n        return mDataStore;\n    }\n\n    @Override\n    public void updateData(IDataStore iDataStore) {\n        if (iDataStore == null) {\n            TaskLogger.wTag(TAG, \"updateData ignore, iDataStore is null!\");\n            return;\n        }\n        if (CommonUtils.isEmpty(iDataStore.getData())) {\n            return;\n        }\n        for (Map.Entry<String, Object> entry : iDataStore.getData().entrySet()) {\n            put(entry.getKey(), entry.getValue());\n        }\n    }\n\n    @Override\n    public void updateParam(String path, IDataStore iDataStore) {\n        updatePath(path);\n        updateData(iDataStore);\n    }\n\n    @Override\n    public void updateParam(ITaskParam taskParam) {\n        if (taskParam == null) {\n            TaskLogger.wTag(TAG, \"updateParam ignore, taskParam is null!\");\n            return;\n        }\n        updateParam(taskParam.getPath(), taskParam.getDataStore());\n    }\n\n    @Override\n    public Object get(String key) {\n        return mDataStore.get(key);\n    }\n\n    @Override\n    public TaskParam put(String key, Object value) {\n        mDataStore.put(key, value);\n        return this;\n    }\n\n    @Override\n    public <T> T getObject(String key, Class<T> clazz) {\n        return mDataStore.getObject(key, clazz);\n    }\n\n    @Override\n    public <T> T getObject(String key, T defaultValue) {\n        return mDataStore.getObject(key, defaultValue);\n    }\n\n    @Override\n    public String getString(String key) {\n        return mDataStore.getString(key);\n    }\n\n    @Override\n    public String getString(String key, String defaultValue) {\n        return mDataStore.getString(key, defaultValue);\n    }\n\n    @Override\n    public boolean getBoolean(String key) {\n        return mDataStore.getBoolean(key);\n    }\n\n    @Override\n    public boolean getBoolean(String key, boolean defaultValue) {\n        return mDataStore.getBoolean(key, defaultValue);\n    }\n\n    @Override\n    public int getInt(String key) {\n        return mDataStore.getInt(key);\n    }\n\n    @Override\n    public int getInt(String key, int defaultValue) {\n        return mDataStore.getInt(key, defaultValue);\n    }\n\n    @Override\n    public Map<String, Object> getData() {\n        return mDataStore.getData();\n    }\n\n    @Override\n    public void clear() {\n        mDataStore.clear();\n        mPath.delete(0, mPath.length());\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/param/impl/TaskResult.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.param.impl;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.logger.TaskLogger;\n\n/**\n * 任务执行结果\n *\n * @author xuexiang\n * @since 2021/10/27 2:11 AM\n */\npublic class TaskResult extends TaskParam implements ITaskResult {\n\n    private static final String TAG = TaskLogger.getLogTag(\"TaskResult\");\n\n    /**\n     * 获取成功的结果\n     *\n     * @return 任务执行结果\n     */\n    public static TaskResult succeed() {\n        return new TaskResult(ITaskResult.SUCCESS, \"\");\n    }\n\n    /**\n     * 获取失败的结果\n     *\n     * @return 任务执行结果\n     */\n    public static TaskResult failed() {\n        return new TaskResult(ITaskResult.ERROR, \"\");\n    }\n\n    /**\n     * 获取失败的结果\n     *\n     * @param code 失败的错误码\n     * @return 任务执行结果\n     */\n    public static TaskResult failed(int code) {\n        return new TaskResult(code, \"\");\n    }\n\n    /**\n     * 获取失败的结果\n     *\n     * @param code    失败的错误码\n     * @param message 错误信息\n     * @return 任务执行结果\n     */\n    public static TaskResult failed(int code, String message) {\n        return new TaskResult(code, message);\n    }\n\n    /**\n     * 任务执行结果码\n     */\n    private int mCode;\n\n    /**\n     * 任务执行信息\n     */\n    private String mMessage;\n\n    /**\n     * 空构造方法\n     */\n    public TaskResult() {\n\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param taskParam 任务参数\n     */\n    public TaskResult(@NonNull ITaskParam taskParam) {\n        updateParam(taskParam.getPath(), taskParam.getDataStore());\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param taskResult 任务结果\n     */\n    public TaskResult(@NonNull ITaskResult taskResult) {\n        saveResult(taskResult);\n    }\n\n\n    /**\n     * 构造方法\n     *\n     * @param code    结果码\n     * @param message 消息\n     */\n    public TaskResult(int code, String message) {\n        setResult(code, message);\n    }\n\n    @Override\n    public int getCode() {\n        return mCode;\n    }\n\n    public TaskResult setCode(int code) {\n        mCode = code;\n        return this;\n    }\n\n    @Override\n    public String getMessage() {\n        return mMessage;\n    }\n\n    public TaskResult setMessage(String message) {\n        mMessage = message;\n        return this;\n    }\n\n    /**\n     * 设置结果\n     *\n     * @param code    结果码\n     * @param message 消息\n     */\n    @Override\n    public void setResult(int code, String message) {\n        mCode = code;\n        mMessage = message;\n    }\n\n    @Override\n    public void saveResult(ITaskResult taskResult) {\n        if (taskResult == null) {\n            TaskLogger.eTag(TAG, \"saveResult error, taskResult is null!\");\n            return;\n        }\n        updateParam(taskResult.getPath(), taskResult.getDataStore());\n        setResult(taskResult.getCode(), taskResult.getMessage());\n    }\n\n    @Override\n    public void saveResultNotPath(ITaskResult taskResult) {\n        if (taskResult == null) {\n            TaskLogger.eTag(TAG, \"saveResultNotPath error, taskResult is null!\");\n            return;\n        }\n        updateData(taskResult.getDataStore());\n        setResult(taskResult.getCode(), taskResult.getMessage());\n    }\n\n    @Override\n    public String getDetailMessage() {\n        return \"[code]:\" + mCode + \", [msg]:\" + mMessage;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskResult{\" +\n                \"mCode=\" + mCode +\n                \", mMessage='\" + mMessage + '\\'' +\n                '}';\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/IGroupTaskStep.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step;\n\nimport java.util.List;\n\n/**\n * 组任务步骤\n *\n * @author xuexiang\n * @since 1/30/22 6:18 PM\n */\npublic interface IGroupTaskStep {\n\n    /**\n     * 增加执行任务\n     *\n     * @param taskStep 执行任务\n     * @return 任务链执行引擎\n     */\n    IGroupTaskStep addTask(ITaskStep taskStep);\n\n    /**\n     * 增加执行任务集合\n     *\n     * @param taskStepList 执行任务集合\n     * @return 任务链执行引擎\n     */\n    IGroupTaskStep addTasks(List<ITaskStep> taskStepList);\n\n    /**\n     * 清理任务\n     */\n    void clearTask();\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/ITaskStep.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.impl.TaskParam;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\n\n/**\n * 任务步骤\n *\n * @author xuexiang\n * @since 2021/10/18 9:11 PM\n */\npublic interface ITaskStep extends Runnable, ICancelable, ITaskStepController {\n\n    /**\n     * 设置任务步骤的生命周期\n     *\n     * @param taskStepLifecycle 任务步骤的生命周期\n     * @return 任务步骤\n     */\n    ITaskStep setTaskStepLifecycle(@NonNull ITaskStepLifecycle taskStepLifecycle);\n\n    /**\n     * 设置任务处理者\n     *\n     * @param taskStepHandler 任务处理者\n     * @return 任务步骤\n     */\n    ITaskStep setTaskStepHandler(@NonNull ITaskStepHandler taskStepHandler);\n\n    /**\n     * 设置执行的线程类型\n     *\n     * @param threadType 线程类型\n     * @return 任务步骤\n     */\n    ITaskStep setThreadType(@NonNull ThreadType threadType);\n\n    /**\n     * 设置执行的任务参数\n     *\n     * @param taskParam 任务参数\n     * @return 任务步骤\n     */\n    ITaskStep setTaskParam(@NonNull ITaskParam taskParam);\n\n    /**\n     * 获取执行的线程类型\n     *\n     * @return 线程类型\n     */\n    @NonNull\n    ThreadType getThreadType();\n\n    /**\n     * 是否接收执行\n     *\n     * @return 是否执行，默认是true\n     */\n    boolean accept();\n\n    /**\n     * 任务准备工作\n     *\n     * @param taskParam 任务参数\n     */\n    void prepareTask(TaskParam taskParam);\n\n    /**\n     * 设置任务取消接口\n     *\n     * @param cancelable 取消接口\n     */\n    void setCancelable(ICancelable cancelable);\n\n    /**\n     * 执行任务\n     *\n     * @throws Exception 异常\n     */\n    void doTask() throws Exception;\n\n    /**\n     * 设置是否正在运行\n     *\n     * @param isRunning 是否正在运行\n     */\n    void setIsRunning(boolean isRunning);\n\n    /**\n     * 是否正在运行\n     *\n     * @return 是否正在运行\n     */\n    boolean isRunning();\n\n    /**\n     * 是否正在等待\n     *\n     * @return 是否正在等待\n     */\n    boolean isPending();\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/ITaskStepController.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.ITaskResult;\n\n/**\n * 任务步骤执行控制器\n *\n * @author xuexiang\n * @since 1/30/22 6:33 PM\n */\npublic interface ITaskStepController {\n\n    /**\n     * 获取任务步骤名称\n     *\n     * @return 任务步骤的名称\n     */\n    String getName();\n\n    /**\n     * 获取任务的参数\n     *\n     * @return 任务参数\n     */\n    @NonNull\n    ITaskParam getTaskParam();\n\n    /**\n     * 通知任务链任务步骤执行完毕\n     *\n     * @param result 任务执行结果\n     */\n    void notifyTaskSucceed(@NonNull ITaskResult result);\n\n    /**\n     * 通知任务链执行发生异常\n     *\n     * @param result 任务执行结果\n     */\n    void notifyTaskFailed(@NonNull ITaskResult result);\n\n    /**\n     * 资源释放\n     */\n    void recycle();\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/ITaskStepHandler.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step;\n\nimport androidx.annotation.NonNull;\n\n/**\n * 任务处理者\n *\n * @author xuexiang\n * @since 2021/10/18 9:10 PM\n */\npublic interface ITaskStepHandler {\n\n    /**\n     * 任务执行之前的处理\n     *\n     * @param step 任务\n     */\n    void beforeTask(@NonNull ITaskStep step);\n\n    /**\n     * 任务执行完毕的处理\n     *\n     * @param step 任务\n     */\n    void afterTask(@NonNull ITaskStep step);\n\n    /**\n     * 任务执行发生异常\n     *\n     * @param step      任务\n     * @param exception 异常\n     */\n    void onTaskException(@NonNull ITaskStep step, Exception exception);\n\n    /**\n     * 是否接收执行任务\n     *\n     * @param step 任务\n     * @return true：执行；false：不执行\n     */\n    boolean accept(@NonNull ITaskStep step);\n\n    /**\n     * 任务执行完成的处理\n     *\n     * @param step 任务\n     */\n    void handleTaskSucceed(@NonNull ITaskStep step);\n\n    /**\n     * 任务执行失败的处理\n     *\n     * @param step 任务\n     */\n    void handleTaskFailed(@NonNull ITaskStep step);\n\n    /**\n     * 任务执行被取消的处理\n     *\n     * @param step 任务\n     */\n    void handleTaskCancelled(@NonNull ITaskStep step);\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/ITaskStepLifecycle.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\n\n/**\n * 任务步骤的生命周期管理\n *\n * @author xuexiang\n * @since 1/30/22 4:51 PM\n */\npublic interface ITaskStepLifecycle {\n\n    /**\n     * 任务步骤执行完毕\n     *\n     * @param step   任务步骤\n     * @param result 任务执行结果\n     */\n    void onTaskStepCompleted(@NonNull ITaskStep step, @NonNull ITaskResult result);\n\n    /**\n     * 任务步骤执行发生异常\n     *\n     * @param step   任务步骤\n     * @param result 任务执行结果\n     */\n    void onTaskStepError(@NonNull ITaskStep step, @NonNull ITaskResult result);\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/impl/AbstractGroupTaskStep.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step.impl;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.impl.TaskParam;\nimport com.xuexiang.xtask.core.param.impl.TaskResult;\nimport com.xuexiang.xtask.core.step.IGroupTaskStep;\nimport com.xuexiang.xtask.core.step.ITaskStep;\nimport com.xuexiang.xtask.core.step.ITaskStepLifecycle;\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.utils.CommonUtils;\nimport com.xuexiang.xtask.utils.TaskUtils;\n\nimport java.util.List;\nimport java.util.concurrent.CopyOnWriteArrayList;\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * 抽象任务组(不进行具体的任务）\n *\n * @author xuexiang\n * @since 2/1/22 11:27 PM\n */\npublic abstract class AbstractGroupTaskStep extends AbstractTaskStep implements ITaskStepLifecycle, IGroupTaskStep {\n\n    private static final String TAG = TaskLogger.getLogTag(\"AbstractGroupTaskStep\");\n\n    /**\n     * 任务组的编号【静态全局】\n     */\n    private static final AtomicInteger GROUP_TASK_NUMBER = new AtomicInteger(1);\n\n    /**\n     * 任务组名称\n     */\n    private final String mName;\n    /**\n     * 任务结果\n     */\n    private final TaskResult mResult = new TaskResult();\n\n    /**\n     * 执行任务集合\n     */\n    private final List<ITaskStep> mTasks = new CopyOnWriteArrayList<>();\n\n    /**\n     * 任务执行索引\n     */\n    protected AtomicInteger mTaskIndex = new AtomicInteger(0);\n\n    /**\n     * 任务执行总数\n     */\n    protected int mTaskTotalSize;\n\n    /**\n     * 构造方法\n     */\n    public AbstractGroupTaskStep() {\n        mName = generationGroupName();\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param name 任务组名称\n     */\n    public AbstractGroupTaskStep(@NonNull String name) {\n        mName = name;\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param threadType 线程类型\n     */\n    public AbstractGroupTaskStep(@NonNull ThreadType threadType) {\n        super(threadType);\n        mName = generationGroupName();\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param name      任务组名称\n     * @param taskParam 任务参数\n     */\n    public AbstractGroupTaskStep(@NonNull String name, @NonNull ITaskParam taskParam) {\n        mName = name;\n        setTaskParam(taskParam);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param name       任务组名称\n     * @param threadType 线程类型\n     */\n    public AbstractGroupTaskStep(@NonNull String name, @NonNull ThreadType threadType) {\n        super(threadType);\n        mName = name;\n    }\n\n    @Override\n    public AbstractGroupTaskStep addTask(ITaskStep taskStep) {\n        if (taskStep != null) {\n            taskStep.setTaskStepLifecycle(this);\n            mTasks.add(taskStep);\n        }\n        return this;\n    }\n\n    @Override\n    public AbstractGroupTaskStep addTasks(List<ITaskStep> taskStepList) {\n        if (!CommonUtils.isEmpty(taskStepList)) {\n            for (ITaskStep taskStep : taskStepList) {\n                addTask(taskStep);\n            }\n        }\n        return this;\n    }\n\n    @Override\n    public AbstractGroupTaskStep setTaskParam(@NonNull ITaskParam taskParam) {\n        super.setTaskParam(taskParam);\n        mResult.updateParam(taskParam);\n        return this;\n    }\n\n    @Override\n    public AbstractGroupTaskStep setThreadType(@NonNull ThreadType threadType) {\n        super.setThreadType(threadType);\n        return this;\n    }\n\n    /**\n     * 初始化组任务\n     */\n    protected void initGroupTask() {\n        mTaskTotalSize = TaskUtils.findTaskStepSize(getTasks());\n        mTaskIndex.set(0);\n        TaskLogger.dTag(TAG, getTaskLogName() + \" initGroupTask, task total size:\" + mTaskTotalSize);\n    }\n\n    @Override\n    public void prepareTask(TaskParam taskParam) {\n        super.prepareTask(taskParam);\n        mResult.updateParam(taskParam);\n    }\n\n    @Override\n    public void clearTask() {\n        if (CommonUtils.isEmpty(mTasks)) {\n            return;\n        }\n        for (ITaskStep taskStep : mTasks) {\n            taskStep.recycle();\n        }\n        mTasks.clear();\n    }\n\n    @Override\n    public void recycle() {\n        mResult.clear();\n        clearTask();\n        super.recycle();\n    }\n\n    @Override\n    public void cancel() {\n        if (isCancelled()) {\n            return;\n        }\n        for (ITaskStep taskStep : mTasks) {\n            taskStep.cancel();\n        }\n        super.cancel();\n    }\n\n    @NonNull\n    @Override\n    public ITaskParam getTaskParam() {\n        return mResult;\n    }\n\n    @Override\n    public String getName() {\n        return mName;\n    }\n\n    public List<ITaskStep> getTasks() {\n        return mTasks;\n    }\n\n    public TaskResult getResult() {\n        return mResult;\n    }\n\n    @Override\n    protected String getTaskLogName() {\n        return \"Group task step [\" + getName() + \"]\";\n    }\n\n    /**\n     * 自动生成组名\n     *\n     * @return 组名\n     */\n    @NonNull\n    private String generationGroupName() {\n        return \"GroupTaskStep-\" + GROUP_TASK_NUMBER.getAndIncrement();\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/impl/AbstractTaskStep.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step.impl;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.param.impl.TaskParam;\nimport com.xuexiang.xtask.core.param.impl.TaskResult;\nimport com.xuexiang.xtask.core.step.ITaskStep;\nimport com.xuexiang.xtask.core.step.ITaskStepHandler;\nimport com.xuexiang.xtask.core.step.ITaskStepLifecycle;\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\n\nimport java.util.concurrent.atomic.AtomicBoolean;\n\n/**\n * 抽象任务执行步骤\n *\n * @author xuexiang\n * @since 2021/11/2 1:22 AM\n */\npublic abstract class AbstractTaskStep implements ITaskStep {\n\n    private static final String TAG = TaskLogger.getLogTag(\"AbstractTaskStep\");\n\n    /**\n     * 是否正在等待\n     */\n    private final AtomicBoolean mIsPending = new AtomicBoolean(true);\n    /**\n     * 是否正在运行\n     */\n    private final AtomicBoolean mIsRunning = new AtomicBoolean(false);\n    /**\n     * 是否取消\n     */\n    private final AtomicBoolean mIsCancelled = new AtomicBoolean(false);\n    /**\n     * 是否已经通知执行结果\n     */\n    private final AtomicBoolean mIsNotified = new AtomicBoolean(false);\n    /**\n     * 任务步骤的生命周期管理\n     */\n    private ITaskStepLifecycle mTaskStepLifecycle;\n    /**\n     * 线程执行类型\n     */\n    private ThreadType mThreadType;\n    /**\n     * 任务参数\n     */\n    @NonNull\n    private ITaskParam mTaskParam;\n    /**\n     * 任务处理\n     */\n    private ITaskStepHandler mTaskHandler;\n    /**\n     * 任务取消接口\n     */\n    private ICancelable mCancelable;\n\n    /**\n     * 构造方法\n     */\n    public AbstractTaskStep() {\n        this(ThreadType.ASYNC, TaskParam.get());\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param threadType 线程类型\n     */\n    public AbstractTaskStep(ThreadType threadType) {\n        this(threadType, TaskParam.get());\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param taskParam 任务参数\n     */\n    public AbstractTaskStep(@NonNull ITaskParam taskParam) {\n        this(ThreadType.ASYNC, taskParam);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param threadType 线程类型\n     * @param taskParam  任务参数\n     */\n    public AbstractTaskStep(ThreadType threadType, @NonNull ITaskParam taskParam) {\n        mThreadType = threadType;\n        mTaskParam = taskParam;\n    }\n\n    @Override\n    public AbstractTaskStep setTaskStepLifecycle(@NonNull ITaskStepLifecycle taskStepLifecycle) {\n        mTaskStepLifecycle = taskStepLifecycle;\n        return this;\n    }\n\n    @Override\n    public AbstractTaskStep setTaskStepHandler(@NonNull ITaskStepHandler taskStepHandler) {\n        mTaskHandler = taskStepHandler;\n        return this;\n    }\n\n    @Override\n    public AbstractTaskStep setThreadType(@NonNull ThreadType threadType) {\n        mThreadType = threadType;\n        return this;\n    }\n\n    @Override\n    public AbstractTaskStep setTaskParam(@NonNull ITaskParam taskParam) {\n        mTaskParam = taskParam;\n        return this;\n    }\n\n    @NonNull\n    @Override\n    public ThreadType getThreadType() {\n        return mThreadType;\n    }\n\n    @NonNull\n    @Override\n    public ITaskParam getTaskParam() {\n        return mTaskParam;\n    }\n\n    @Override\n    public void setCancelable(ICancelable cancelable) {\n        mCancelable = cancelable;\n    }\n\n    @Override\n    public void setIsRunning(boolean isRunning) {\n        mIsRunning.set(isRunning);\n    }\n\n    @Override\n    public boolean isRunning() {\n        return mIsRunning.get();\n    }\n\n    @Override\n    public boolean isPending() {\n        return mIsPending.get();\n    }\n\n    @Override\n    public boolean accept() {\n        if (mTaskHandler != null) {\n            return mTaskHandler.accept(this);\n        }\n        return true;\n    }\n\n    @Override\n    public void prepareTask(TaskParam taskParam) {\n        getTaskParam().updateParam(taskParam);\n    }\n\n    @Override\n    public void notifyTaskSucceed(@NonNull ITaskResult result) {\n        if (mIsNotified.get()) {\n            TaskLogger.wTag(TAG, getTaskLogName() + \" has notified！\");\n            return;\n        }\n        mIsNotified.set(true);\n        mIsRunning.set(false);\n        if (isCancelled()) {\n            TaskLogger.wTag(TAG, getTaskLogName() + \" has cancelled！\");\n            return;\n        }\n        TaskLogger.dTag(TAG, getTaskLogName() + \" succeed!\");\n        if (mTaskHandler != null) {\n            mTaskHandler.handleTaskSucceed(this);\n        }\n        if (mTaskStepLifecycle != null) {\n            result.updateParam(getTaskParam());\n            mTaskStepLifecycle.onTaskStepCompleted(this, result);\n        }\n    }\n\n    @Override\n    public void notifyTaskFailed(@NonNull ITaskResult result) {\n        if (mIsNotified.get()) {\n            TaskLogger.wTag(TAG, getTaskLogName() + \" has notified！\");\n            return;\n        }\n        mIsNotified.set(true);\n        mIsRunning.set(false);\n        TaskLogger.eTag(TAG, getTaskLogName() + \" failed, \" + result.getDetailMessage());\n        if (mTaskHandler != null) {\n            mTaskHandler.handleTaskFailed(this);\n        }\n        if (mTaskStepLifecycle != null) {\n            result.updateParam(getTaskParam());\n            mTaskStepLifecycle.onTaskStepError(this, result);\n        }\n    }\n\n    @Override\n    public void recycle() {\n        TaskLogger.dTag(TAG, getTaskLogName() + \" recycle...\");\n        if (isRunning() && !isCancelled()) {\n            cancel();\n        }\n        mTaskParam.clear();\n        mTaskStepLifecycle = null;\n        mTaskHandler = null;\n        mCancelable = null;\n    }\n\n    @Override\n    public void cancel() {\n        if (isCancelled()) {\n            return;\n        }\n        if (isPending() || isRunning()) {\n            TaskLogger.dTag(TAG, getTaskLogName() + \" cancel...\");\n        }\n        if (mCancelable != null) {\n            mCancelable.cancel();\n        }\n        mIsCancelled.set(true);\n        if (mTaskHandler != null) {\n            mTaskHandler.handleTaskCancelled(this);\n        }\n    }\n\n    @Override\n    public boolean isCancelled() {\n        return mIsCancelled.get();\n    }\n\n    @Override\n    public void run() {\n        if (isCancelled()) {\n            TaskLogger.wTag(TAG, getTaskLogName() + \" has cancelled, do not need to run！\");\n            return;\n        }\n        setIsRunning(true);\n        try {\n            processTask();\n        } catch (Exception e) {\n            TaskLogger.eTag(TAG, getTaskLogName() + \" has error！\", e);\n            if (mTaskHandler != null) {\n                mTaskHandler.onTaskException(this, e);\n            }\n        }\n    }\n\n    /**\n     * 执行任务\n     *\n     * @throws Exception 异常\n     */\n    protected void processTask() throws Exception {\n        updateProcessTaskPath();\n        if (mTaskHandler != null) {\n            mTaskHandler.beforeTask(this);\n        }\n        if (isRunning()) {\n            doTask();\n        }\n        if (mTaskHandler != null) {\n            mTaskHandler.afterTask(this);\n        }\n    }\n\n    /**\n     * 更新任务处理的路径\n     */\n    private void updateProcessTaskPath() {\n        getTaskParam().addPath(getName());\n        TaskLogger.dTag(TAG, getTaskRunningDetailLogInfo());\n        mIsPending.set(false);\n    }\n\n    private String getTaskRunningDetailLogInfo() {\n        if (TaskLogger.isLogThreadName()) {\n            return getTaskLogName() + \" has run, thread: \" + Thread.currentThread().getName() + \", path:\" + getTaskParam().getPath();\n        } else {\n            return getTaskLogName() + \" has run, path: \" + getTaskParam().getPath();\n        }\n    }\n\n    /**\n     * 获取任务的日志名称\n     *\n     * @return 任务的日志名称\n     */\n    protected String getTaskLogName() {\n        return \"Task step [\" + getName() + \"]\";\n    }\n\n    // ==================默认提供的通知方法=========================//\n\n    /**\n     * 通知任务链任务步骤执行完毕\n     */\n    public void notifyTaskSucceed() {\n        notifyTaskSucceed(TaskResult.succeed());\n    }\n\n    /**\n     * 通知任务链任务步骤执行失败\n     */\n    public void notifyTaskFailed() {\n        notifyTaskFailed(TaskResult.failed());\n    }\n\n    /**\n     * 通知任务链任务步骤执行失败\n     *\n     * @param code 失败的错误码\n     */\n    public void notifyTaskFailed(int code) {\n        notifyTaskFailed(TaskResult.failed(code));\n    }\n\n    /**\n     * 通知任务链任务步骤执行失败\n     *\n     * @param code    失败的错误码\n     * @param message 错误信息\n     */\n    public void notifyTaskFailed(int code, String message) {\n        notifyTaskFailed(TaskResult.failed(code, message));\n    }\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/impl/AutoDestroyTaskChainCallback.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step.impl;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.ITaskChainCallback;\nimport com.xuexiang.xtask.core.ITaskChainEngine;\nimport com.xuexiang.xtask.core.param.ITaskResult;\n\n/**\n * 自动销毁任务链的任务链执行回调\n *\n * @author xuexiang\n * @since 2/10/22 10:26 PM\n */\npublic class AutoDestroyTaskChainCallback implements ITaskChainCallback {\n\n    @Override\n    public boolean isCallBackOnMainThread() {\n        return false;\n    }\n\n    @Override\n    public void onTaskChainStart(@NonNull ITaskChainEngine engine) {\n\n    }\n\n    @Override\n    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n        engine.destroy();\n    }\n\n    @Override\n    public void onTaskChainError(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n\n    }\n\n    @Override\n    public void onTaskChainCancelled(@NonNull ITaskChainEngine engine) {\n\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/impl/AutoNotifyTaskStepHandler.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step.impl;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.param.impl.TaskResult;\nimport com.xuexiang.xtask.core.step.ITaskStep;\nimport com.xuexiang.xtask.core.step.ITaskStepHandler;\n\n/**\n * 自动通知任务执行结果处理者\n *\n * @author xuexiang\n * @since 2021/11/2 1:48 AM\n */\npublic class AutoNotifyTaskStepHandler implements ITaskStepHandler {\n    @Override\n    public void beforeTask(@NonNull ITaskStep step) {\n\n    }\n\n    @Override\n    public void afterTask(@NonNull ITaskStep step) {\n        step.notifyTaskSucceed(TaskResult.succeed());\n    }\n\n    @Override\n    public void onTaskException(@NonNull ITaskStep step, Exception exception) {\n        step.notifyTaskFailed(TaskResult.failed(ITaskResult.PROCESS_TASK_THROW_EXCEPTION, exception.getMessage()));\n    }\n\n    @Override\n    public boolean accept(@NonNull ITaskStep step) {\n        return true;\n    }\n\n    @Override\n    public void handleTaskSucceed(@NonNull ITaskStep step) {\n\n    }\n\n    @Override\n    public void handleTaskFailed(@NonNull ITaskStep step) {\n\n    }\n\n    @Override\n    public void handleTaskCancelled(@NonNull ITaskStep step) {\n\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/impl/TaskChainCallbackAdapter.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step.impl;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.ITaskChainCallback;\nimport com.xuexiang.xtask.core.ITaskChainEngine;\nimport com.xuexiang.xtask.core.param.ITaskResult;\n\n/**\n * 任务链执行回调适配器【默认回主线程的回调】\n *\n * @author xuexiang\n * @since 1/31/22 9:11 PM\n */\npublic abstract class TaskChainCallbackAdapter implements ITaskChainCallback {\n\n    @Override\n    public boolean isCallBackOnMainThread() {\n        return true;\n    }\n\n    @Override\n    public void onTaskChainStart(@NonNull ITaskChainEngine engine) {\n\n    }\n\n    @Override\n    public void onTaskChainError(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {\n\n    }\n\n    @Override\n    public void onTaskChainCancelled(@NonNull ITaskChainEngine engine) {\n\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/core/step/impl/TaskCommand.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.core.step.impl;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.core.param.ITaskParam;\nimport com.xuexiang.xtask.core.param.ITaskResult;\nimport com.xuexiang.xtask.core.param.impl.TaskParam;\nimport com.xuexiang.xtask.core.param.impl.TaskResult;\nimport com.xuexiang.xtask.core.step.ITaskStepController;\n\n/**\n * 任务命令，执行简单任务\n *\n * @author xuexiang\n * @since 1/31/22 2:28 AM\n */\npublic abstract class TaskCommand implements ITaskStepController {\n\n    /**\n     * 任务步骤执行控制器\n     */\n    private ITaskStepController mController;\n\n    /**\n     * 设置任务步骤执行控制器\n     *\n     * @param controller 控制器\n     * @return this\n     */\n    public TaskCommand setTaskStepResultController(ITaskStepController controller) {\n        mController = controller;\n        return this;\n    }\n\n    /**\n     * 通知任务链任务步骤执行完毕\n     */\n    public void notifyTaskSucceed() {\n        notifyTaskSucceed(TaskResult.succeed());\n    }\n\n    /**\n     * 通知任务链任务步骤执行失败\n     */\n    public void notifyTaskFailed() {\n        notifyTaskFailed(TaskResult.failed());\n    }\n\n    /**\n     * 通知任务链任务步骤执行失败\n     *\n     * @param code 失败的错误码\n     */\n    public void notifyTaskFailed(int code) {\n        notifyTaskFailed(TaskResult.failed(code));\n    }\n\n    /**\n     * 通知任务链任务步骤执行失败\n     *\n     * @param code    失败的错误码\n     * @param message 错误信息\n     */\n    public void notifyTaskFailed(int code, String message) {\n        notifyTaskFailed(TaskResult.failed(code, message));\n    }\n\n    @Override\n    public void notifyTaskSucceed(@NonNull ITaskResult result) {\n        if (mController != null) {\n            mController.notifyTaskSucceed(result);\n        }\n    }\n\n    @Override\n    public void notifyTaskFailed(@NonNull ITaskResult result) {\n        if (mController != null) {\n            mController.notifyTaskFailed(result);\n        }\n    }\n\n    @Override\n    public String getName() {\n        return mController != null ? mController.getName() : \"unknown\";\n    }\n\n    @NonNull\n    @Override\n    public ITaskParam getTaskParam() {\n        return mController != null ? mController.getTaskParam() : TaskParam.get();\n    }\n\n    /**\n     * 执行任务\n     *\n     * @throws Exception 异常\n     */\n    public abstract void run() throws Exception;\n\n    @Override\n    public void recycle() {\n        if (mController != null) {\n            mController.recycle();\n        }\n    }\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/utils/CancellerPoolUtils.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.utils;\n\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancellerPool;\nimport com.xuexiang.xtask.thread.pool.cancel.TaskCancellerPool;\n\nimport java.util.Collection;\n\n/**\n * 取消者订阅池工具类\n *\n * @author xuexiang\n * @since 2/7/22 1:17 PM\n */\npublic final class CancellerPoolUtils {\n\n    private static ICancellerPool sCancellerPool = new TaskCancellerPool();\n\n    private CancellerPoolUtils() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    /**\n     * 设置自定义的取消者订阅池\n     *\n     * @param sCancellerPool 取消者订阅池\n     */\n    public static void setCancellerPool(ICancellerPool sCancellerPool) {\n        CancellerPoolUtils.sCancellerPool = sCancellerPool;\n    }\n\n    /**\n     * 添加取消者\n     *\n     * @param name       取消者名称\n     * @param cancelable 取消接口\n     * @return 是否执行成功\n     */\n    public static boolean add(String name, ICancelable cancelable) {\n        return sCancellerPool.add(name, cancelable);\n    }\n\n    /**\n     * 去除取消者\n     *\n     * @param name 取消者名称\n     * @return 是否执行成功\n     */\n    public static boolean remove(String name) {\n        return sCancellerPool.remove(name);\n    }\n\n    /**\n     * 指定取消者执行\n     *\n     * @param name 取消者名称\n     * @return 是否执行成功\n     */\n    public static boolean cancel(String name) {\n        return sCancellerPool.cancel(name);\n    }\n\n    /**\n     * 指定取消者集合执行\n     *\n     * @param names 取消者集合\n     */\n    public static void cancel(String... names) {\n        sCancellerPool.cancel(names);\n    }\n\n\n    /**\n     * 指定取消者集合执行\n     *\n     * @param names 取消者集合\n     */\n    public static void cancel(Collection<String> names) {\n        sCancellerPool.cancel(names);\n    }\n\n    /**\n     * 所有取消者执行\n     */\n    public static void cancelAll() {\n        sCancellerPool.cancelAll();\n    }\n\n    /**\n     * 清除所有\n     *\n     * @param ifNeedCancel 是否在清除前取消\n     */\n    public static void clear(boolean ifNeedCancel) {\n        sCancellerPool.clear(ifNeedCancel);\n    }\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/utils/CommonUtils.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.utils;\n\nimport com.xuexiang.xtask.logger.TaskLogger;\n\nimport java.util.Collection;\nimport java.util.Map;\n\n/**\n * 普通工具类\n *\n * @author xuexiang\n * @since 2021/10/26 1:47 AM\n */\npublic final class CommonUtils {\n\n    private static final String TAG = TaskLogger.getLogTag(\"CommonUtils\");\n\n    private CommonUtils() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    /**\n     * 类型强转\n     *\n     * @param object 需要强转的对象\n     * @param clazz  需要强转的类型\n     * @param <T>\n     * @return 类型强转结果\n     */\n    public static <T> T cast(final Object object, Class<T> clazz) {\n        return clazz != null && clazz.isInstance(object) ? (T) object : null;\n    }\n\n    /**\n     * 类型强转\n     *\n     * @param object       需要强转的对象\n     * @param defaultValue 强转的默认值\n     * @param <T>\n     * @return 类型强转结果\n     */\n    public static <T> T cast(Object object, T defaultValue) {\n        if (defaultValue == null) {\n            return null;\n        } else if (object == null) {\n            return null;\n        } else {\n            return defaultValue.getClass() == object.getClass() ? (T) object : defaultValue;\n        }\n    }\n\n    /**\n     * 判断字符串是否为 null 或长度为 0\n     *\n     * @param s 待校验字符串\n     * @return {@code true}: 空<br> {@code false}: 不为空\n     */\n    public static boolean isEmpty(final CharSequence s) {\n        return s == null || s.length() == 0;\n    }\n\n    /**\n     * 集合是否为空\n     *\n     * @param collection 集合\n     * @return true: 为空，false：不为空\n     */\n    public static <E> boolean isEmpty(final Collection<E> collection) {\n        return collection == null || collection.isEmpty();\n    }\n\n    /**\n     * Map是否为空\n     *\n     * @param obj Map\n     * @return true: 为空，false：不为空\n     */\n    public static boolean isEmpty(final Map obj) {\n        return obj == null || obj.isEmpty();\n    }\n\n    /**\n     * 不能为null\n     *\n     * @param object  对象\n     * @param message 错误信息\n     * @param <T>\n     * @return\n     */\n    public static <T> T requireNonNull(final T object, final String message) {\n        if (object == null) {\n            throw new NullPointerException(message);\n        }\n        return object;\n    }\n\n    /**\n     * 获取集合的大小\n     *\n     * @param collection 集合\n     * @return 集合的大小\n     */\n    public static <E> int getSize(final Collection<E> collection) {\n        return collection != null ? collection.size() : 0;\n    }\n\n}\n"
  },
  {
    "path": "xtask-core/src/main/java/com/xuexiang/xtask/utils/TaskUtils.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.utils;\n\nimport android.os.Looper;\n\nimport com.xuexiang.xtask.core.ThreadType;\nimport com.xuexiang.xtask.core.step.ITaskStep;\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.thread.XTaskExecutor;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\n\nimport java.util.List;\n\n/**\n * XTask内部工具类\n *\n * @author xuexiang\n * @since 1/31/22 8:40 PM\n */\npublic final class TaskUtils {\n\n    private static final String TAG = TaskLogger.getLogTag(\"TaskUtils\");\n\n    private TaskUtils() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    /**\n     * 是否是主线程\n     *\n     * @return 是否是主线程\n     */\n    public static boolean isMainThread() {\n        return Looper.getMainLooper() == Looper.myLooper();\n    }\n\n    /**\n     * 切到主线程运行\n     *\n     * @param runnable 命令\n     */\n    public static void runOnMainThread(Runnable runnable) {\n        XTaskExecutor.get().postToMain(runnable);\n    }\n\n    /**\n     * 查找下一条需要执行的任务\n     *\n     * @param taskStepList 执行任务集合\n     * @param taskStep     当前任务\n     * @return 下一条执行任务\n     */\n    public static ITaskStep findNextTaskStep(List<ITaskStep> taskStepList, ITaskStep taskStep) {\n        if (CommonUtils.isEmpty(taskStepList)) {\n            return null;\n        }\n        int index = 0;\n        if (taskStep != null) {\n            index = taskStepList.indexOf(taskStep) + 1;\n        }\n        for (; index < taskStepList.size(); index++) {\n            ITaskStep target = taskStepList.get(index);\n            if (target != null && target.accept()) {\n                return target;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 查找需要执行的任务总数\n     *\n     * @param taskStepList 执行任务集合\n     * @return 需要执行的任务总数\n     */\n    public static int findTaskStepSize(List<ITaskStep> taskStepList) {\n        int count = 0;\n        if (!CommonUtils.isEmpty(taskStepList)) {\n            for (ITaskStep taskStep: taskStepList) {\n                if (taskStep != null && taskStep.accept()) {\n                    count++;\n                }\n            }\n        }\n        return count;\n    }\n\n    /**\n     * 执行任务\n     *\n     * @param taskStep 需要执行的任务\n     * @return 取消接口\n     */\n    public static ICancelable executeTask(ITaskStep taskStep) {\n        if (taskStep == null) {\n            TaskLogger.eTag(TAG, \"execute task failed, taskStep is null!\");\n            return null;\n        }\n        ThreadType type = taskStep.getThreadType();\n        if (type == ThreadType.MAIN) {\n            XTaskExecutor.get().postToMain(taskStep);\n            return null;\n        } else if (type == ThreadType.ASYNC_EMERGENT) {\n            return XTaskExecutor.get().emergentSubmit(taskStep);\n        } else if (type == ThreadType.ASYNC) {\n            return XTaskExecutor.get().submit(taskStep);\n        } else if (type == ThreadType.ASYNC_IO) {\n            return XTaskExecutor.get().ioSubmit(taskStep);\n        } else if (type == ThreadType.ASYNC_BACKGROUND) {\n            return XTaskExecutor.get().backgroundSubmit(taskStep);\n        } else {\n            taskStep.run();\n            return null;\n        }\n    }\n\n}\n"
  },
  {
    "path": "xtask-thread/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "xtask-thread/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion build_versions.target_sdk\n    buildToolsVersion build_versions.build_tools\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion build_versions.target_sdk\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n}\n\ndependencies {\n    compileOnly deps.androidx.appcompat\n}\n\n\napply from: '../JitPackUpload.gradle'\n\n"
  },
  {
    "path": "xtask-thread/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "xtask-thread/src/main/AndroidManifest.xml",
    "content": "<!--\n  ~ Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~       http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  ~\n  -->\n\n<manifest package=\"com.xuexiang.xtask.thread\" />\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/logger/ILogger.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.logger;\n\n/**\n * 日志记录接口\n *\n * @author xuexiang\n * @since 2021/10/9 4:33 PM\n */\npublic interface ILogger {\n\n    /**\n     * 打印信息\n     *\n     * @param priority 优先级\n     * @param tag      标签\n     * @param message  信息\n     * @param t        出错信息\n     */\n    void log(int priority, String tag, String message, Throwable t);\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/logger/LogcatLogger.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.logger;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\n\nimport java.io.PrintWriter;\nimport java.io.StringWriter;\n\n/**\n * 默认Logcat日志记录\n *\n * @author xuexiang\n * @since 2021/10/9 4:29 PM\n */\npublic class LogcatLogger implements ILogger {\n\n    /**\n     * logcat里日志的最大长度.\n     */\n    private static final int MAX_LOG_LENGTH = 4000;\n\n    /**\n     * 打印信息\n     *\n     * @param priority 优先级\n     * @param tag      标签\n     * @param message   信息\n     * @param t        出错信息\n     */\n    @Override\n    public void log(int priority, String tag, String message, Throwable t) {\n        if (message != null && message.length() == 0) {\n            message = null;\n        }\n        if (message == null) {\n            if (t == null) {\n                return; // Swallow message if it's null and there's no throwable.\n            }\n            message = getStackTraceString(t);\n        } else {\n            if (t != null) {\n                message += \"\\n\" + getStackTraceString(t);\n            }\n        }\n\n        log(priority, tag, message);\n    }\n\n    public static String getStackTraceString(Throwable t) {\n        // Don't replace this with Log.getStackTraceString() - it hides\n        // UnknownHostException, which is not what we want.\n        StringWriter sw = new StringWriter(256);\n        PrintWriter pw = new PrintWriter(sw, false);\n        t.printStackTrace(pw);\n        pw.flush();\n        return sw.toString();\n    }\n\n\n    /**\n     * 使用LogCat输出日志，字符长度超过4000则自动换行.\n     *\n     * @param priority 优先级\n     * @param tag      标签\n     * @param message  信息\n     */\n    public void log(int priority, String tag, String message) {\n        int subNum = message.length() / MAX_LOG_LENGTH;\n        if (subNum > 0) {\n            int index = 0;\n            for (int i = 0; i < subNum; i++) {\n                int lastIndex = index + MAX_LOG_LENGTH;\n                String sub = message.substring(index, lastIndex);\n                logSub(priority, tag, sub);\n                index = lastIndex;\n            }\n            logSub(priority, tag, message.substring(index, message.length()));\n        } else {\n            logSub(priority, tag, message);\n        }\n    }\n\n\n    /**\n     * 使用LogCat输出日志.\n     *\n     * @param priority 优先级\n     * @param tag      标签\n     * @param sub      信息\n     */\n    private void logSub(int priority, @NonNull String tag, @NonNull String sub) {\n        switch (priority) {\n            case Log.VERBOSE:\n                Log.v(tag, sub);\n                break;\n            case Log.DEBUG:\n                Log.d(tag, sub);\n                break;\n            case Log.INFO:\n                Log.i(tag, sub);\n                break;\n            case Log.WARN:\n                Log.w(tag, sub);\n                break;\n            case Log.ERROR:\n                Log.e(tag, sub);\n                break;\n            case Log.ASSERT:\n                Log.wtf(tag, sub);\n                break;\n            default:\n                Log.v(tag, sub);\n                break;\n        }\n    }\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/logger/TaskLogger.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.logger;\n\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\n\n/**\n * TaskLogger日志记录\n *\n * @author xuexiang\n * @since 2021/10/9 4:31 PM\n */\npublic final class TaskLogger {\n\n    private TaskLogger() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    //==============常量================//\n    /**\n     * 默认tag\n     */\n    public final static String TASK_LOG_TAG = \"TaskLogger\";\n    /**\n     * 最大日志优先级【日志优先级为最大等级，所有日志都不打印】\n     */\n    private final static int MAX_LOG_PRIORITY = 10;\n    /**\n     * 最小日志优先级【日志优先级为最小等级，所有日志都打印】\n     */\n    private final static int MIN_LOG_PRIORITY = 0;\n\n    //==============属性================//\n    /**\n     * 默认的日志记录为Logcat\n     */\n    private static ILogger sILogger = new LogcatLogger();\n\n    private static String sTag = TASK_LOG_TAG;\n    /**\n     * 是否是调试模式\n     */\n    private static boolean sIsDebug = false;\n    /**\n     * 日志打印优先级\n     */\n    private static int sLogPriority = MAX_LOG_PRIORITY;\n\n    /**\n     * 是否打印任务执行所在的线程名\n     */\n    private static boolean sIsLogThreadName = false;\n\n    //==============属性设置================//\n\n    /**\n     * 获取类的打印日志TAG\n     *\n     * @param clazz 类\n     * @return 打印日志TAG\n     */\n    public static String getLogTag(@NonNull Class<?> clazz) {\n        return sTag + \"_\" + clazz.getSimpleName();\n    }\n\n    /**\n     * 获取类的打印日志TAG\n     *\n     * @param className 类名\n     * @return 打印日志TAG\n     */\n    public static String getLogTag(@NonNull String className) {\n        return sTag + \"_\" + className;\n    }\n\n    /**\n     * 设置日志记录者的接口\n     *\n     * @param logger 日志记录接口\n     */\n    public static void setLogger(@NonNull ILogger logger) {\n        TaskLogger.sILogger = logger;\n    }\n\n    /**\n     * 设置日志的tag\n     *\n     * @param tag 日志的tag\n     */\n    public static void setTag(String tag) {\n        TaskLogger.sTag = tag;\n    }\n\n    /**\n     * 设置是否是调试模式\n     *\n     * @param isDebug 是否是调试模式\n     */\n    public static void setDebug(boolean isDebug) {\n        TaskLogger.sIsDebug = isDebug;\n    }\n\n    /**\n     * 设置打印日志的等级（只打印改等级以上的日志）\n     *\n     * @param priority 日志的等级\n     */\n    public static void setPriority(int priority) {\n        TaskLogger.sLogPriority = priority;\n    }\n\n    /**\n     * 设置是否打印任务执行所在的线程名\n     *\n     * @param isLogThreadName 是否打印任务执行所在的线程名\n     */\n    public static void setIsLogThreadName(boolean isLogThreadName) {\n        TaskLogger.sIsLogThreadName = isLogThreadName;\n    }\n\n    /**\n     * 是否打印任务执行所在的线程名\n     *\n     * @return 是否打印任务执行所在的线程名\n     */\n    public static boolean isLogThreadName() {\n        return sIsLogThreadName;\n    }\n\n    //===================对外接口=======================//\n\n    /**\n     * 设置是否打开调试\n     *\n     * @param isDebug 是否是调试模式\n     */\n    public static void debug(boolean isDebug) {\n        debug(isDebug ? TASK_LOG_TAG : \"\");\n    }\n\n    /**\n     * 设置调试模式\n     *\n     * @param tag tag,如果不为空是调试模式\n     */\n    public static void debug(String tag) {\n        if (!TextUtils.isEmpty(tag)) {\n            setDebug(true);\n            setPriority(MIN_LOG_PRIORITY);\n            setTag(tag);\n        } else {\n            setDebug(false);\n            setPriority(MAX_LOG_PRIORITY);\n            setTag(\"\");\n        }\n    }\n\n    //=============打印方法===============//\n\n    /**\n     * 打印任何（所有）信息\n     *\n     * @param msg 日志信息\n     */\n    public static void v(String msg) {\n        if (enableLog(Log.VERBOSE)) {\n            sILogger.log(Log.VERBOSE, sTag, msg, null);\n        }\n    }\n\n    /**\n     * 打印任何（所有）信息\n     *\n     * @param tag tag信息\n     * @param msg 日志信息\n     */\n    public static void vTag(String tag, String msg) {\n        if (enableLog(Log.VERBOSE)) {\n            sILogger.log(Log.VERBOSE, tag, msg, null);\n        }\n    }\n\n    /**\n     * 打印调试信息\n     *\n     * @param msg 调试信息\n     */\n    public static void d(String msg) {\n        if (enableLog(Log.DEBUG)) {\n            sILogger.log(Log.DEBUG, sTag, msg, null);\n        }\n    }\n\n    /**\n     * 打印调试信息\n     *\n     * @param tag tag信息\n     * @param msg 调试信息\n     */\n    public static void dTag(String tag, String msg) {\n        if (enableLog(Log.DEBUG)) {\n            sILogger.log(Log.DEBUG, tag, msg, null);\n        }\n    }\n\n    /**\n     * 打印提示性的信息\n     *\n     * @param msg 提示性的信息\n     */\n    public static void i(String msg) {\n        if (enableLog(Log.INFO)) {\n            sILogger.log(Log.INFO, sTag, msg, null);\n        }\n    }\n\n    /**\n     * 打印提示性的信息\n     *\n     * @param tag tag信息\n     * @param msg 提示性的信息\n     */\n    public static void iTag(String tag, String msg) {\n        if (enableLog(Log.INFO)) {\n            sILogger.log(Log.INFO, tag, msg, null);\n        }\n    }\n\n    /**\n     * 打印warning警告信息\n     *\n     * @param msg 警告信息\n     */\n    public static void w(String msg) {\n        if (enableLog(Log.WARN)) {\n            sILogger.log(Log.WARN, sTag, msg, null);\n        }\n    }\n\n    /**\n     * 打印warning警告信息\n     *\n     * @param tag tag信息\n     * @param msg 警告信息\n     */\n    public static void wTag(String tag, String msg) {\n        if (enableLog(Log.WARN)) {\n            sILogger.log(Log.WARN, tag, msg, null);\n        }\n    }\n\n    /**\n     * 打印出错信息\n     *\n     * @param msg 出错信息\n     */\n    public static void e(String msg) {\n        if (enableLog(Log.ERROR)) {\n            sILogger.log(Log.ERROR, sTag, msg, null);\n        }\n    }\n\n    /**\n     * 打印出错信息\n     *\n     * @param tag tag信息\n     * @param msg 出错信息\n     */\n    public static void eTag(String tag, String msg) {\n        if (enableLog(Log.ERROR)) {\n            sILogger.log(Log.ERROR, tag, msg, null);\n        }\n    }\n\n    /**\n     * 打印出错堆栈信息\n     *\n     * @param t 出错堆栈信息\n     */\n    public static void e(Throwable t) {\n        if (enableLog(Log.ERROR)) {\n            sILogger.log(Log.ERROR, sTag, null, t);\n        }\n    }\n\n    /**\n     * 打印出错堆栈信息\n     *\n     * @param tag tag信息\n     * @param t   出错堆栈信息\n     */\n    public static void eTag(String tag, Throwable t) {\n        if (enableLog(Log.ERROR)) {\n            sILogger.log(Log.ERROR, tag, null, t);\n        }\n    }\n\n\n    /**\n     * 打印出错堆栈信息\n     *\n     * @param msg 出错信息\n     * @param t   出错堆栈信息\n     */\n    public static void e(String msg, Throwable t) {\n        if (enableLog(Log.ERROR)) {\n            sILogger.log(Log.ERROR, sTag, msg, t);\n        }\n    }\n\n    /**\n     * 打印出错堆栈信息\n     *\n     * @param tag tag信息\n     * @param msg 出错堆栈信息\n     * @param t   出错堆栈信息\n     */\n    public static void eTag(String tag, String msg, Throwable t) {\n        if (enableLog(Log.ERROR)) {\n            sILogger.log(Log.ERROR, tag, msg, t);\n        }\n    }\n\n    /**\n     * 打印严重的错误信息\n     *\n     * @param msg 严重的错误信息\n     */\n    public static void wtf(String msg) {\n        if (enableLog(Log.ASSERT)) {\n            sILogger.log(Log.ASSERT, sTag, msg, null);\n        }\n    }\n\n    /**\n     * 打印严重的错误信息\n     *\n     * @param tag tag信息\n     * @param msg 严重的错误信息\n     */\n    public static void wtfTag(String tag, String msg) {\n        if (enableLog(Log.ASSERT)) {\n            sILogger.log(Log.ASSERT, tag, msg, null);\n        }\n    }\n\n    /**\n     * 打印日志\n     *\n     * @param tag tag信息\n     * @param msg 日志信息\n     */\n    public static void log(int priority, String tag, String msg) {\n        if (enableLog(priority)) {\n            sILogger.log(priority, tag, msg, null);\n        }\n    }\n\n    /**\n     * 能否打印\n     *\n     * @param logPriority 日志等级\n     * @return 能否打印日志\n     */\n    private static boolean enableLog(int logPriority) {\n        return isDebug() && logPriority >= sLogPriority;\n    }\n\n    /**\n     * 当前是否是调试模式\n     *\n     * @return 是否是调试模式\n     */\n    public static boolean isDebug() {\n        return sILogger != null && sIsDebug;\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/XTaskExecutor.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.thread.executor.ICategoryExecutorCore;\nimport com.xuexiang.xtask.thread.executor.IPriorityExecutorCore;\nimport com.xuexiang.xtask.thread.executor.IScheduledExecutorCore;\nimport com.xuexiang.xtask.thread.executor.impl.CategoryExecutorCore;\nimport com.xuexiang.xtask.thread.executor.impl.PriorityExecutorCore;\nimport com.xuexiang.xtask.thread.executor.impl.ScheduledExecutorCore;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * XTask的执行者\n *\n * @author xuexiang\n * @since 2021/10/9 2:30 AM\n */\npublic class XTaskExecutor implements IPriorityExecutorCore, ICategoryExecutorCore, IScheduledExecutorCore {\n\n    private static volatile XTaskExecutor sInstance = null;\n\n    /**\n     * 优先级执行内核实现接口\n     */\n    private IPriorityExecutorCore mPriorityExecutorCore;\n    /**\n     * 分类执行内核实现接口\n     */\n    private ICategoryExecutorCore mCategoryExecutorCore;\n    /**\n     * 周期执行内核实现接口\n     */\n    private IScheduledExecutorCore mScheduledExecutorCore;\n\n    /**\n     * 获取XTask的执行者\n     *\n     * @return XTask的执行者\n     */\n    public static XTaskExecutor get() {\n        if (sInstance == null) {\n            synchronized (XTaskExecutor.class) {\n                if (sInstance == null) {\n                    sInstance = new XTaskExecutor();\n                }\n            }\n        }\n        return sInstance;\n    }\n\n    /**\n     * 私有构造方法\n     */\n    private XTaskExecutor() {\n        mCategoryExecutorCore = new CategoryExecutorCore();\n        mPriorityExecutorCore = new PriorityExecutorCore();\n        mScheduledExecutorCore = new ScheduledExecutorCore();\n    }\n\n    /**\n     * 设置优先级控制的执行内核实现接口\n     *\n     * @param priorityExecutorCore 优先级控制的执行内核实现接口\n     * @return this\n     */\n    public XTaskExecutor setPriorityExecutorCore(@NonNull IPriorityExecutorCore priorityExecutorCore) {\n        mPriorityExecutorCore = priorityExecutorCore;\n        return this;\n    }\n\n    /**\n     * 设置类别执行内核实现接口\n     *\n     * @param categoryExecutorCore 类别执行内核实现接口\n     * @return this\n     */\n    public XTaskExecutor setCategoryExecutorCore(@NonNull ICategoryExecutorCore categoryExecutorCore) {\n        mCategoryExecutorCore = categoryExecutorCore;\n        return this;\n    }\n\n    /**\n     * 设置周期执行内核的实现接口\n     *\n     * @param scheduledExecutorCore 周期执行内核的实现接口\n     * @return this\n     */\n    public XTaskExecutor setScheduledExecutorCore(@NonNull IScheduledExecutorCore scheduledExecutorCore) {\n        mScheduledExecutorCore = scheduledExecutorCore;\n        return this;\n    }\n\n    @Override\n    public void shutdown() {\n        mCategoryExecutorCore.shutdown();\n        mPriorityExecutorCore.shutdown();\n        mScheduledExecutorCore.shutdown();\n    }\n\n    //================PriorityExecutorCore==================//\n\n    @Override\n    public ICancelable submit(Runnable task, int priority) {\n        return mPriorityExecutorCore.submit(task, priority);\n    }\n\n    @Override\n    public ICancelable submit(String groupName, Runnable task, int priority) {\n        return mPriorityExecutorCore.submit(groupName, task, priority);\n    }\n\n    //================CategoryExecutorCore==================//\n\n    @Override\n    public boolean postToMain(Runnable task) {\n        return mCategoryExecutorCore.postToMain(task);\n    }\n\n    @Override\n    public ICancelable postToMainDelay(Runnable task, long delayMillis) {\n        return mCategoryExecutorCore.postToMainDelay(task, delayMillis);\n    }\n\n    @Override\n    public ICancelable emergentSubmit(Runnable task) {\n        return mCategoryExecutorCore.emergentSubmit(task);\n    }\n\n    @Override\n    public ICancelable submit(Runnable task) {\n        return mCategoryExecutorCore.submit(task);\n    }\n\n    @Override\n    public ICancelable backgroundSubmit(Runnable task) {\n        return mCategoryExecutorCore.backgroundSubmit(task);\n    }\n\n    @Override\n    public ICancelable ioSubmit(Runnable task) {\n        return mCategoryExecutorCore.ioSubmit(task);\n    }\n\n    @Override\n    public ICancelable groupSubmit(String groupName, Runnable task) {\n        return mCategoryExecutorCore.groupSubmit(groupName, task);\n    }\n\n    //================ScheduledExecutorCore==================//\n\n    @Override\n    public ICancelable schedule(Runnable task, long delay, TimeUnit unit) {\n        return mScheduledExecutorCore.schedule(task, delay, unit);\n    }\n\n    @Override\n    public ICancelable scheduleAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit unit) {\n        return mScheduledExecutorCore.scheduleAtFixedRate(task, initialDelay, period, unit);\n    }\n\n    @Override\n    public ICancelable scheduleWithFixedDelay(Runnable task, long initialDelay, long period, TimeUnit unit) {\n        return mScheduledExecutorCore.scheduleWithFixedDelay(task, initialDelay, period, unit);\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/executor/ICategoryExecutorCore.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.executor;\n\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\n\n/**\n * 拥有不同类别的执行者内核实现接口\n *\n * @author xuexiang\n * @since 1/27/22 12:50 AM\n */\npublic interface ICategoryExecutorCore extends IExecutorCore {\n\n    /**\n     * 执行任务到主线程\n     *\n     * @param task 任务\n     * @return 是否执行成功\n     */\n    boolean postToMain(Runnable task);\n\n    /**\n     * 延迟执行任务到主线程\n     *\n     * @param task        任务\n     * @param delayMillis 延迟时间\n     * @return 取消接口\n     */\n    ICancelable postToMainDelay(Runnable task, long delayMillis);\n\n    /**\n     * 执行紧急异步任务【线程的优先级默认是10】\n     *\n     * @param task 任务\n     * @return 取消接口\n     */\n    ICancelable emergentSubmit(Runnable task);\n\n    /**\n     * 执行普通异步任务【线程的优先级是5】\n     *\n     * @param task 任务\n     * @return 取消接口\n     */\n    ICancelable submit(Runnable task);\n\n    /**\n     * 执行后台异步任务【线程的优先级是1】\n     *\n     * @param task 任务\n     * @return 取消接口\n     */\n    ICancelable backgroundSubmit(Runnable task);\n\n    /**\n     * 执行io耗时的异步任务【线程的优先级是5】\n     *\n     * @param task 任务\n     * @return 取消接口\n     */\n    ICancelable ioSubmit(Runnable task);\n\n    /**\n     * 执行分组异步任务【线程的优先级是5】\n     *\n     * @param groupName 任务组名\n     * @param task      任务\n     * @return 取消接口\n     */\n    ICancelable groupSubmit(String groupName, Runnable task);\n\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/executor/IExecutorCore.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.executor;\n\n/**\n * 执行者内核实现接口\n *\n * @author xuexiang\n * @since 1/26/22 2:25 AM\n */\npublic interface IExecutorCore {\n\n    /**\n     * 停止工作\n     */\n    void shutdown();\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/executor/IPriorityExecutorCore.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.executor;\n\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\n\n/**\n * 拥有优先级控制的执行者内核实现接口\n *\n * @author xuexiang\n * @since 2021/11/10 1:04 AM\n */\npublic interface IPriorityExecutorCore extends IExecutorCore {\n\n    /**\n     * 执行异步任务\n     *\n     * @param task     任务\n     * @param priority 优先级\n     * @return 取消接口\n     */\n    ICancelable submit(Runnable task, int priority);\n\n    /**\n     * 按组执行异步任务\n     *\n     * @param groupName 任务组名\n     * @param task      任务\n     * @param priority  优先级\n     * @return 取消接口\n     */\n    ICancelable submit(String groupName, Runnable task, int priority);\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/executor/IScheduledExecutorCore.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.executor;\n\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * 拥有周期执行能力的内核实现接口\n *\n * @author xuexiang\n * @since 3/19/22 6:40 PM\n */\npublic interface IScheduledExecutorCore extends IExecutorCore {\n\n    /**\n     * 执行延期任务\n     *\n     * @param task  任务\n     * @param delay 延迟时长\n     * @param unit  时间单位\n     * @return 取消接口\n     */\n    ICancelable schedule(Runnable task, long delay, TimeUnit unit);\n\n    /**\n     * 执行周期任务（以固定频率执行的任务）\n     *\n     * @param task         任务\n     * @param initialDelay 初始延迟时长\n     * @param period       间隔时长\n     * @param unit         时间单位\n     * @return 取消接口\n     */\n    ICancelable scheduleAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit unit);\n\n    /**\n     * 执行周期任务（以固定延时执行的任务，延时是相对当前任务结束为起点计算开始时间）\n     *\n     * @param task         任务\n     * @param initialDelay 初始延迟时长\n     * @param period       间隔时长\n     * @param unit         时间单位\n     * @return 取消接口\n     */\n    ICancelable scheduleWithFixedDelay(Runnable task, long initialDelay, long period, TimeUnit unit);\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/executor/impl/CategoryExecutorCore.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.executor.impl;\n\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.text.TextUtils;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.thread.executor.ICategoryExecutorCore;\nimport com.xuexiang.xtask.thread.pool.DefaultThreadPoolExecutor;\nimport com.xuexiang.xtask.thread.pool.TaskThreadFactory;\nimport com.xuexiang.xtask.thread.pool.cancel.CancelHandlerRunnable;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\nimport com.xuexiang.xtask.thread.utils.ExecutorUtils;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.SynchronousQueue;\n\n/**\n * 不同类别的执行者内核实现\n * <p>\n * Emergent: 核心线程数为2，最大线程为∞，60s keepTime，SynchronousQueue（不阻塞），线程优先级10\n * Normal: 核心线程数和最大线程为CPU数，0s keepTime，LinkedBlockingQueue（128），线程优先级5\n * Background: 核心线程数和最大线程为2，0s keepTime，LinkedBlockingQueue（128），线程优先级1\n * <p>\n * 线程组: 核心线程数和最大线程为2～4之间，30s keepTime，LinkedBlockingQueue（128），线程优先级5\n * io: 核心线程数和最大线程为(2*CPU数+1)，30s keepTime，LinkedBlockingQueue（128），线程优先级5\n *\n * @author xuexiang\n * @since 1/26/22 2:33 AM\n */\npublic class CategoryExecutorCore implements ICategoryExecutorCore {\n\n    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();\n    private static final int CORE_POOL_SIZE = 2;\n    private static final int GROUP_CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));\n    private static final int IO_POOL_SIZE = CPU_COUNT * 2 + 1;\n    private static final int EMERGENT_KEEP_ALIVE_SECONDS = 60;\n    private static final String GROUP_FACTORY_NAME_PREFIX = \"CategoryGroup-\";\n\n    private final Handler mMainHandler = new Handler(Looper.getMainLooper());\n    /**\n     * 紧急线程池，核心线程数为2，最大线程为∞，60s keepTime，SynchronousQueue（不阻塞），线程优先级10\n     */\n    private DefaultThreadPoolExecutor mEmergentExecutor;\n    /**\n     * 普通线程池，核心线程数和最大线程为CPU数，0s keepTime，LinkedBlockingQueue（128），线程优先级5\n     */\n    private DefaultThreadPoolExecutor mNormalExecutor;\n    /**\n     * 后台线程池，核心线程数和最大线程为2，0s keepTime，LinkedBlockingQueue（128），线程优先级1\n     */\n    private DefaultThreadPoolExecutor mBackgroundExecutor;\n    /**\n     * 组线程池，核心线程数和最大线程为2～4之间，30s keepTime，LinkedBlockingQueue（128），线程优先级5\n     */\n    private Map<String, DefaultThreadPoolExecutor> mGroupExecutorMap = new ConcurrentHashMap<>();\n    /**\n     * io线程池，核心线程数和最大线程为(2*CPU数+1)，30s keepTime，LinkedBlockingQueue（128），线程优先级5\n     */\n    private DefaultThreadPoolExecutor mIoExecutor;\n\n    @Override\n    public boolean postToMain(Runnable task) {\n        if (ExecutorUtils.isMainThread()) {\n            task.run();\n            return true;\n        }\n        return mMainHandler.post(task);\n    }\n\n    @Override\n    public ICancelable postToMainDelay(Runnable task, long delayMillis) {\n        return CancelHandlerRunnable.get(mMainHandler, task).startDelayed(delayMillis);\n    }\n\n    @Override\n    public ICancelable emergentSubmit(Runnable task) {\n        return submitTask(getTargetExecutor(Thread.MAX_PRIORITY), task);\n    }\n\n    @Override\n    public ICancelable submit(Runnable task) {\n        return submitTask(getTargetExecutor(Thread.NORM_PRIORITY), task);\n    }\n\n    @Override\n    public ICancelable backgroundSubmit(Runnable task) {\n        return submitTask(getTargetExecutor(Thread.MIN_PRIORITY), task);\n    }\n\n    @Override\n    public ICancelable ioSubmit(Runnable task) {\n        return submitTask(getIoExecutor(), task);\n    }\n\n    @Override\n    public ICancelable groupSubmit(String groupName, Runnable task) {\n        return submitTask(getGroupExecutor(groupName), task);\n    }\n\n    @Override\n    public void shutdown() {\n        mMainHandler.removeCallbacksAndMessages(null);\n        ExecutorUtils.shutdown(mEmergentExecutor);\n        mEmergentExecutor = null;\n        ExecutorUtils.shutdown(mNormalExecutor);\n        mNormalExecutor = null;\n        ExecutorUtils.shutdown(mBackgroundExecutor);\n        mBackgroundExecutor = null;\n        ExecutorUtils.shutdown(mIoExecutor);\n        mIoExecutor = null;\n        ExecutorUtils.shutdown(mGroupExecutorMap.values());\n        mGroupExecutorMap.clear();\n    }\n\n    /**\n     * 提交任务\n     *\n     * @param executor 线程池\n     * @param task     任务\n     * @return 取消执行的接口\n     */\n    private ICancelable submitTask(@NonNull DefaultThreadPoolExecutor executor, Runnable task) {\n        return executor.submit(task);\n    }\n\n    /**\n     * 获取线程池\n     *\n     * @param priority 优先级\n     * @return 线程池\n     */\n    @NonNull\n    private DefaultThreadPoolExecutor getTargetExecutor(int priority) {\n        if (priority == Thread.MAX_PRIORITY) {\n            return getEmergentExecutor();\n        } else if (priority == Thread.NORM_PRIORITY) {\n            return getNormalExecutor();\n        } else {\n            return getBackgroundExecutor(priority);\n        }\n    }\n\n    private DefaultThreadPoolExecutor getEmergentExecutor() {\n        if (mEmergentExecutor == null) {\n            mEmergentExecutor = DefaultThreadPoolExecutor.newBuilder(CORE_POOL_SIZE)\n                    .setMaximumPoolSize(Integer.MAX_VALUE)\n                    .setKeepAliveTime(EMERGENT_KEEP_ALIVE_SECONDS)\n                    .setWorkQueue(new SynchronousQueue<Runnable>())\n                    .setThreadFactory(TaskThreadFactory.getFactory(\"Emergent\", Thread.MAX_PRIORITY))\n                    .build();\n        }\n        return mEmergentExecutor;\n    }\n\n    private DefaultThreadPoolExecutor getNormalExecutor() {\n        if (mNormalExecutor == null) {\n            mNormalExecutor = DefaultThreadPoolExecutor.newBuilder(CPU_COUNT)\n                    .setKeepAliveTime(0)\n                    .setThreadFactory(TaskThreadFactory.getFactory(\"Normal\", Thread.NORM_PRIORITY))\n                    .build();\n        }\n        return mNormalExecutor;\n    }\n\n    private DefaultThreadPoolExecutor getBackgroundExecutor(int priority) {\n        if (mBackgroundExecutor == null) {\n            mBackgroundExecutor = DefaultThreadPoolExecutor.newBuilder(CORE_POOL_SIZE)\n                    .setKeepAliveTime(0)\n                    .setThreadFactory(TaskThreadFactory.getFactory(\"Background\", priority))\n                    .build();\n        }\n        return mBackgroundExecutor;\n    }\n\n    private DefaultThreadPoolExecutor getIoExecutor() {\n        if (mIoExecutor == null) {\n            mIoExecutor = DefaultThreadPoolExecutor.newBuilder(IO_POOL_SIZE)\n                    .setThreadFactory(TaskThreadFactory.getFactory(\"Io\", Thread.NORM_PRIORITY))\n                    .build();\n        }\n        return mIoExecutor;\n    }\n\n    /**\n     * 获取组线程池\n     *\n     * @param groupName 组名称\n     * @return 线程池\n     */\n    @NonNull\n    private DefaultThreadPoolExecutor getGroupExecutor(String groupName) {\n        if (TextUtils.isEmpty(groupName)) {\n            return getTargetExecutor(Thread.NORM_PRIORITY);\n        } else {\n            DefaultThreadPoolExecutor executor = mGroupExecutorMap.get(groupName);\n            if (executor == null) {\n                executor = DefaultThreadPoolExecutor.newBuilder(GROUP_CORE_POOL_SIZE)\n                        .setThreadFactory(TaskThreadFactory.getFactory(GROUP_FACTORY_NAME_PREFIX + groupName))\n                        .build();\n                mGroupExecutorMap.put(groupName, executor);\n            }\n            return executor;\n        }\n    }\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/executor/impl/PriorityExecutorCore.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.executor.impl;\n\nimport android.text.TextUtils;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.thread.executor.IExecutorCore;\nimport com.xuexiang.xtask.thread.executor.IPriorityExecutorCore;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\nimport com.xuexiang.xtask.thread.pool.PriorityThreadPoolExecutor;\nimport com.xuexiang.xtask.thread.pool.TaskThreadFactory;\nimport com.xuexiang.xtask.thread.utils.ExecutorUtils;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * 拥有优先级控制，使用PriorityThreadPoolExecutor实现的线程执行内核，通过阻塞队列(PriorityBlockingQueue)来实现优先级的控制。\n *\n * @author xuexiang\n * @since 2021/11/10 1:17 AM\n */\npublic class PriorityExecutorCore implements IPriorityExecutorCore, IExecutorCore {\n\n    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();\n    private static final int GROUP_CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));\n    private static final String GROUP_FACTORY_NAME_PREFIX = \"PriorityGroup-\";\n\n    private PriorityThreadPoolExecutor mExecutor;\n\n    private Map<String, PriorityThreadPoolExecutor> mGroupExecutorMap = new ConcurrentHashMap<>();\n\n    @Override\n    public ICancelable submit(Runnable task, int priority) {\n        return submitTask(getThreadPoolExecutor(null), task, priority);\n    }\n\n    @Override\n    public ICancelable submit(String groupName, Runnable task, int priority) {\n        return submitTask(getThreadPoolExecutor(groupName), task, priority);\n    }\n\n    @Override\n    public void shutdown() {\n        ExecutorUtils.shutdown(mExecutor);\n        mExecutor = null;\n        ExecutorUtils.shutdown(mGroupExecutorMap.values());\n        mGroupExecutorMap.clear();\n    }\n\n    /**\n     * 提交任务\n     *\n     * @param executor 线程池\n     * @param task     任务\n     * @param priority 优先级\n     * @return 取消执行的接口\n     */\n    private ICancelable submitTask(@NonNull PriorityThreadPoolExecutor executor, Runnable task, int priority) {\n        return executor.submit(task, priority);\n    }\n\n    /**\n     * 获取线程池\n     *\n     * @param groupName 组名称\n     * @return 线程池\n     */\n    @NonNull\n    private PriorityThreadPoolExecutor getThreadPoolExecutor(String groupName) {\n        if (TextUtils.isEmpty(groupName)) {\n            if (mExecutor == null) {\n                mExecutor = PriorityThreadPoolExecutor.getDefault();\n            }\n            return mExecutor;\n        } else {\n            PriorityThreadPoolExecutor executor = mGroupExecutorMap.get(groupName);\n            if (executor == null) {\n                executor = PriorityThreadPoolExecutor.newBuilder(GROUP_CORE_POOL_SIZE)\n                        .setThreadFactory(TaskThreadFactory.getFactory(GROUP_FACTORY_NAME_PREFIX + groupName))\n                        .build();\n                mGroupExecutorMap.put(groupName, executor);\n            }\n            return executor;\n        }\n    }\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/executor/impl/ScheduledExecutorCore.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.executor.impl;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.thread.executor.IScheduledExecutorCore;\nimport com.xuexiang.xtask.thread.pool.DefaultScheduledThreadPoolExecutor;\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\nimport com.xuexiang.xtask.thread.utils.ExecutorUtils;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * 拥有周期执行能力的内核实现\n *\n * @author xuexiang\n * @since 3/20/22 1:15 AM\n */\npublic class ScheduledExecutorCore implements IScheduledExecutorCore {\n\n    private DefaultScheduledThreadPoolExecutor mExecutor;\n\n    @Override\n    public ICancelable schedule(Runnable task, long delay, TimeUnit unit) {\n        return getThreadPoolExecutor().schedule(task, delay, unit);\n    }\n\n    @Override\n    public ICancelable scheduleAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit unit) {\n        return getThreadPoolExecutor().scheduleAtFixedRate(task, initialDelay, period, unit);\n    }\n\n    @Override\n    public ICancelable scheduleWithFixedDelay(Runnable task, long initialDelay, long period, TimeUnit unit) {\n        return getThreadPoolExecutor().scheduleWithFixedDelay(task, initialDelay, period, unit);\n    }\n\n    @Override\n    public void shutdown() {\n        ExecutorUtils.shutdown(mExecutor);\n        mExecutor = null;\n    }\n\n    /**\n     * 获取线程池\n     *\n     * @return 线程池\n     */\n    @NonNull\n    private DefaultScheduledThreadPoolExecutor getThreadPoolExecutor() {\n        if (mExecutor == null) {\n            mExecutor = DefaultScheduledThreadPoolExecutor.getDefault();\n        }\n        return mExecutor;\n    }\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/DefaultScheduledThreadPoolExecutor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool;\n\nimport com.xuexiang.xtask.thread.pool.base.BaseScheduledThreadPoolExecutor;\nimport com.xuexiang.xtask.thread.pool.cancel.IScheduledFuture;\n\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.Delayed;\nimport java.util.concurrent.FutureTask;\nimport java.util.concurrent.RejectedExecutionHandler;\nimport java.util.concurrent.RunnableScheduledFuture;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * 默认的定时线程池\n *\n * @author xuexiang\n * @since 3/19/22 5:41 PM\n */\npublic class DefaultScheduledThreadPoolExecutor extends BaseScheduledThreadPoolExecutor {\n\n    /**\n     * 获取默认配置的优先级线程池\n     *\n     * @return 线程池\n     */\n    public static DefaultScheduledThreadPoolExecutor getDefault() {\n        return new Builder().build();\n    }\n\n    /**\n     * 获取优先级线程池的构建者\n     *\n     * @return 构建者\n     */\n    public static Builder newBuilder() {\n        return new Builder();\n    }\n\n    /**\n     * 获取优先级线程池的构建者\n     *\n     * @param corePoolSize 核心(执行)线程池的线程数\n     * @return 构建者\n     */\n    public static Builder newBuilder(int corePoolSize) {\n        return new Builder(corePoolSize);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize  核心(执行)线程池的线程数\n     * @param threadFactory 线程创建工厂\n     * @param handler       拒绝执行的处理\n     */\n    public DefaultScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler) {\n        super(corePoolSize, threadFactory, handler);\n    }\n\n    @Override\n    protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task) {\n        return new DefaultScheduledFuture<>(callable, task);\n    }\n\n    @Override\n    protected <V> RunnableScheduledFuture<V> decorateTask(Runnable runnable, RunnableScheduledFuture<V> task) {\n        return new DefaultScheduledFuture<>(runnable, task);\n    }\n\n    @Override\n    public IScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {\n        return (IScheduledFuture<?>) super.schedule(command, delay, unit);\n    }\n\n    @Override\n    public IScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {\n        return (IScheduledFuture<?>) super.scheduleAtFixedRate(command, initialDelay, period, unit);\n    }\n\n    @Override\n    public IScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {\n        return (IScheduledFuture<?>) super.scheduleWithFixedDelay(command, initialDelay, delay, unit);\n    }\n\n    /**\n     * 默认ScheduledFuture\n     *\n     * @author xuexiang\n     * @since 3/19/22 5:52 PM\n     */\n    public static class DefaultScheduledFuture<V> extends FutureTask<V> implements IScheduledFuture<V> {\n\n        private RunnableScheduledFuture<V> mTask;\n\n        DefaultScheduledFuture(Callable<V> callable, RunnableScheduledFuture<V> task) {\n            super(callable);\n            mTask = task;\n        }\n\n        DefaultScheduledFuture(Runnable runnable, RunnableScheduledFuture<V> task) {\n            super(runnable, null);\n            mTask = task;\n        }\n\n        @Override\n        public void cancel() {\n            cancel(true);\n        }\n\n        @Override\n        public long getDelay(TimeUnit unit) {\n            return mTask.getDelay(unit);\n        }\n\n        @Override\n        public int compareTo(Delayed o) {\n            return mTask.compareTo(o);\n        }\n\n        @Override\n        public boolean isPeriodic() {\n            return mTask.isPeriodic();\n        }\n\n        @Override\n        public boolean cancel(boolean mayInterruptIfRunning) {\n            return mTask.cancel(mayInterruptIfRunning);\n        }\n\n        @Override\n        public void run() {\n            mTask.run();\n        }\n    }\n\n    //==============================构建者===================================//\n\n    /**\n     * 默认线程池构建者\n     */\n    public static final class Builder {\n        /**\n         * 默认核心线程数\n         */\n        private static final int DEFAULT_CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() + 1;\n        /**\n         * 默认线程工厂名\n         */\n        private static final String DEFAULT_FACTORY_NAME = \"DefaultScheduled\";\n        /**\n         * 核心(执行)线程池的线程数\n         */\n        int corePoolSize;\n        /**\n         * 线程创建工厂\n         */\n        ThreadFactory threadFactory;\n        /**\n         * 拒绝执行的处理\n         */\n        RejectedExecutionHandler handler;\n\n        /**\n         * 构造方法\n         */\n        public Builder() {\n            this(DEFAULT_CORE_POOL_SIZE);\n        }\n\n        /**\n         * 构造方法\n         *\n         * @param corePoolSize 核心(执行)线程池的线程数\n         */\n        public Builder(int corePoolSize) {\n            this.corePoolSize = corePoolSize;\n        }\n\n        public Builder setCorePoolSize(int corePoolSize) {\n            this.corePoolSize = corePoolSize;\n            return this;\n        }\n\n        public Builder setThreadFactory(ThreadFactory threadFactory) {\n            this.threadFactory = threadFactory;\n            return this;\n        }\n\n        public Builder setHandler(RejectedExecutionHandler handler) {\n            this.handler = handler;\n            return this;\n        }\n\n        /**\n         * 构建\n         *\n         * @return 优先级线程池\n         */\n        public DefaultScheduledThreadPoolExecutor build() {\n            if (threadFactory == null) {\n                threadFactory = TaskThreadFactory.getFactory(DEFAULT_FACTORY_NAME);\n            }\n            if (handler == null) {\n                handler = new TaskRecordPolicy();\n            }\n            return new DefaultScheduledThreadPoolExecutor(corePoolSize, threadFactory, handler);\n        }\n    }\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/DefaultThreadPoolExecutor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool;\n\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.thread.pool.base.BaseThreadPoolExecutor;\nimport com.xuexiang.xtask.thread.pool.cancel.IFuture;\n\nimport java.util.concurrent.BlockingQueue;\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.FutureTask;\nimport java.util.concurrent.LinkedBlockingQueue;\nimport java.util.concurrent.RejectedExecutionHandler;\nimport java.util.concurrent.RunnableFuture;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * 默认线程池\n *\n * @author xuexiang\n * @since 1/25/22 2:00 AM\n */\npublic class DefaultThreadPoolExecutor extends BaseThreadPoolExecutor {\n\n    /**\n     * 获取默认配置的优先级线程池\n     *\n     * @return 线程池\n     */\n    public static DefaultThreadPoolExecutor getDefault() {\n        return new Builder().build();\n    }\n\n    /**\n     * 获取优先级线程池的构建者\n     *\n     * @return 构建者\n     */\n    public static DefaultThreadPoolExecutor.Builder newBuilder() {\n        return new Builder();\n    }\n\n    /**\n     * 获取优先级线程池的构建者\n     *\n     * @param corePoolSize 核心(执行)线程池的线程数\n     * @return 构建者\n     */\n    public static Builder newBuilder(int corePoolSize) {\n        return new Builder(corePoolSize);\n    }\n\n    /**\n     * 获取优先级线程池的构建者\n     *\n     * @param corePoolSize  核心(执行)线程池的线程数\n     * @param maximumPoolSize 线程池最大能容纳的线程数\n     * @param keepAliveTime 当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n     * @param unit          等待时长的单位\n     * @return 构建者\n     */\n    public static Builder newBuilder(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit) {\n        return new Builder(corePoolSize, maximumPoolSize, keepAliveTime, unit);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize    核心(执行)线程池的线程数\n     * @param maximumPoolSize 线程池最大能容纳的线程数\n     * @param keepAliveTime   当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n     * @param unit            等待时长的单位\n     * @param workQueue       线程池工作队列，用于在任务完成之前保留任务的队列执行\n     * @param threadFactory   线程创建工厂\n     * @param handler         拒绝执行的处理\n     */\n    private DefaultThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);\n    }\n\n    @Override\n    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {\n        return new DefaultFuture<>(callable);\n    }\n\n    @Override\n    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {\n        return new DefaultFuture<>(runnable, value);\n    }\n\n    @Override\n    public IFuture<?> submit(@NonNull Runnable task) {\n        return (IFuture<?>) super.submit(task);\n    }\n\n    /**\n     * 默认Future\n     *\n     * @author xuexiang\n     * @since 1/25/22 2:09 AM\n     */\n    public static class DefaultFuture<V> extends FutureTask<V> implements IFuture<V> {\n\n        DefaultFuture(Callable<V> callable) {\n            super(callable);\n        }\n\n        DefaultFuture(Runnable runnable, V result) {\n            super(runnable, result);\n        }\n\n        @Override\n        public void cancel() {\n            cancel(true);\n        }\n    }\n\n\n    //==============================构建者===================================//\n\n    /**\n     * 默认线程池构建者\n     */\n    public static final class Builder {\n        /**\n         * 默认核心线程数【非IO操作】\n         */\n        private static final int DEFAULT_CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() + 1;\n        /**\n         * 默认的等待时长\n         */\n        private static final long DEFAULT_KEEP_ALIVE_TIME = 30;\n        /**\n         * 默认线程工厂名\n         */\n        private static final String DEFAULT_FACTORY_NAME = \"Default\";\n        /**\n         * 默认阻塞队列的大小\n         */\n        private static final int DEFAULT_BLOCKING_QUEUE_SIZE = 128;\n        /**\n         * 核心(执行)线程池的线程数\n         */\n        int corePoolSize;\n        /**\n         * 线程池最大能容纳的线程数\n         */\n        int maximumPoolSize;\n        /**\n         * 当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n         */\n        long keepAliveTime;\n        /**\n         * 等待时长的单位\n         */\n        TimeUnit unit;\n        /**\n         * 线程池工作队列，用于在任务完成之前保留任务的队列执行\n         */\n        BlockingQueue<Runnable> workQueue;\n        /**\n         * 线程创建工厂\n         */\n        ThreadFactory threadFactory;\n        /**\n         * 拒绝执行的处理\n         */\n        RejectedExecutionHandler handler;\n\n        /**\n         * 构造方法\n         */\n        public Builder() {\n            this(DEFAULT_CORE_POOL_SIZE);\n        }\n\n        /**\n         * 构造方法\n         *\n         * @param corePoolSize 核心(执行)线程池的线程数\n         */\n        public Builder(int corePoolSize) {\n            this(corePoolSize, corePoolSize, DEFAULT_KEEP_ALIVE_TIME, TimeUnit.SECONDS);\n        }\n\n        /**\n         * 构造方法\n         *\n         * @param corePoolSize    核心(执行)线程池的线程数\n         * @param maximumPoolSize 线程池最大能容纳的线程数\n         * @param keepAliveTime   当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n         * @param unit            等待时长的单位\n         */\n        public Builder(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit) {\n            this.corePoolSize = corePoolSize;\n            this.maximumPoolSize = maximumPoolSize;\n            this.keepAliveTime = keepAliveTime;\n            this.unit = unit;\n        }\n\n        public Builder setCorePoolSize(int corePoolSize) {\n            this.corePoolSize = corePoolSize;\n            return this;\n        }\n\n        public Builder setMaximumPoolSize(int maximumPoolSize) {\n            this.maximumPoolSize = maximumPoolSize;\n            return this;\n        }\n\n        public Builder setKeepAliveTime(long keepAliveTime) {\n            this.keepAliveTime = keepAliveTime;\n            return this;\n        }\n\n        public Builder setUnit(TimeUnit unit) {\n            this.unit = unit;\n            return this;\n        }\n\n        public Builder setWorkQueue(BlockingQueue<Runnable> workQueue) {\n            this.workQueue = workQueue;\n            return this;\n        }\n\n        public Builder setThreadFactory(ThreadFactory threadFactory) {\n            this.threadFactory = threadFactory;\n            return this;\n        }\n\n        public Builder setHandler(RejectedExecutionHandler handler) {\n            this.handler = handler;\n            return this;\n        }\n\n        /**\n         * 构建\n         *\n         * @return 优先级线程池\n         */\n        public DefaultThreadPoolExecutor build() {\n            if (workQueue == null) {\n                workQueue = new LinkedBlockingQueue<>(DEFAULT_BLOCKING_QUEUE_SIZE);\n            }\n            if (threadFactory == null) {\n                threadFactory = TaskThreadFactory.getFactory(DEFAULT_FACTORY_NAME);\n            }\n            if (handler == null) {\n                handler = new TaskRecordPolicy();\n            }\n            return new DefaultThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);\n        }\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/PriorityThreadPoolExecutor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool;\n\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.thread.pool.base.BaseThreadPoolExecutor;\nimport com.xuexiang.xtask.thread.priority.IPriority;\nimport com.xuexiang.xtask.thread.priority.IPriorityComparable;\nimport com.xuexiang.xtask.thread.priority.IPriorityFuture;\nimport com.xuexiang.xtask.thread.priority.IPriorityRunnable;\nimport com.xuexiang.xtask.thread.priority.impl.DefaultPriorityCallable;\nimport com.xuexiang.xtask.thread.priority.impl.DefaultPriorityFuture;\nimport com.xuexiang.xtask.thread.priority.impl.DefaultPriorityRunnable;\nimport com.xuexiang.xtask.thread.priority.impl.Priority;\n\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.PriorityBlockingQueue;\nimport java.util.concurrent.RejectedExecutionHandler;\nimport java.util.concurrent.RunnableFuture;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * 一个具有指定和动态调整任务优先级能力的Java线程池，阻塞队列是PriorityBlockingQueue(无界），按优先级进行排序。\n * 注意：PriorityBlockingQueue是无界阻塞队列。\n * <p>\n * 线程池的执行顺序：\n * <p>\n * 核心线程池 -> 阻塞队列 -> 最大线程数(新建线程） -> RejectedExecutionHandler\n * <p>\n * 因此，该线程池起作用的主要是在阻塞队列这一层。\n *\n * @author xuexiang\n * @since 2021/10/9 2:28 AM\n */\npublic class PriorityThreadPoolExecutor extends BaseThreadPoolExecutor {\n\n    private static final String TAG = TaskLogger.getLogTag(\"PriorityThreadPoolExecutor\");\n\n    /**\n     * 获取默认配置的优先级线程池\n     *\n     * @return 线程池\n     */\n    public static PriorityThreadPoolExecutor getDefault() {\n        return new Builder().build();\n    }\n\n    /**\n     * 获取优先级线程池的构建者\n     *\n     * @return 构建者\n     */\n    public static Builder newBuilder() {\n        return new Builder();\n    }\n\n    /**\n     * 获取优先级线程池的构建者\n     *\n     * @param corePoolSize 核心(执行)线程池的线程数\n     * @return 构建者\n     */\n    public static Builder newBuilder(int corePoolSize) {\n        return new Builder(corePoolSize);\n    }\n\n    /**\n     * 获取优先级线程池的构建者\n     *\n     * @param corePoolSize  核心(执行)线程池的线程数\n     * @param keepAliveTime 当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n     * @param unit          等待时长的单位\n     * @return 构建者\n     */\n    public static Builder newBuilder(int corePoolSize, long keepAliveTime, TimeUnit unit) {\n        return new Builder(corePoolSize, keepAliveTime, unit);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize    核心(执行)线程池的线程数\n     * @param maximumPoolSize 线程池最大能容纳的线程数，因为PriorityBlockingQueue是无界阻塞队列，因此maximumPoolSize没有任何意义。\n     * @param keepAliveTime   当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n     * @param unit            等待时长的单位\n     * @param workQueue       线程池工作队列，用于在任务完成之前保留任务的队列执行\n     * @param threadFactory   线程创建工厂\n     * @param handler         拒绝执行的处理\n     */\n    private PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, PriorityBlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);\n    }\n\n    /**\n     * 指定优先级执行Runnable\n     *\n     * @param command  命令\n     * @param priority 优先级\n     * @return IPriorityRunnable\n     */\n    public IPriorityRunnable execute(Runnable command, int priority) {\n        if (command instanceof IPriorityRunnable) {\n            this.execute(command);\n            return (IPriorityRunnable) command;\n        }\n        IPriorityRunnable runnable = new DefaultPriorityRunnable(new Priority(priority), command);\n        this.execute(runnable);\n        return runnable;\n    }\n\n    /**\n     * 指定优先级执行Runnable\n     *\n     * @param task     任务\n     * @param priority 优先级\n     * @return IPriorityFuture\n     */\n    public IPriorityFuture<?> submit(Runnable task, int priority) {\n        if (task instanceof IPriority) {\n            return (IPriorityFuture<?>) this.submit(task);\n        }\n        return (IPriorityFuture<?>) this.submit(new DefaultPriorityRunnable(new Priority(priority), task));\n    }\n\n    /**\n     * 指定优先级执行Runnable\n     *\n     * @param task     任务\n     * @param result   结果\n     * @param priority 优先级\n     * @return IPriorityFuture\n     */\n    public <T> IPriorityFuture<T> submit(Runnable task, T result, int priority) {\n        if (task instanceof IPriority) {\n            return (IPriorityFuture<T>) this.submit(task, result);\n        }\n        return (IPriorityFuture<T>) this.submit(new DefaultPriorityRunnable(new Priority(priority), task),\n                result);\n    }\n\n    /**\n     * 指定优先级执行Callable\n     *\n     * @param task     任务\n     * @param priority 优先级\n     * @return IPriorityFuture\n     */\n    public <T> IPriorityFuture<T> submit(Callable<T> task, int priority) {\n        if (task instanceof IPriority) {\n            return (IPriorityFuture<T>) this.submit(task);\n        }\n        return (IPriorityFuture<T>) this.submit(new DefaultPriorityCallable<>(new Priority(priority), task));\n    }\n\n    @Override\n    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {\n        return new DefaultPriorityFuture<>(callable);\n    }\n\n    @Override\n    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {\n        return new DefaultPriorityFuture<>(runnable, value);\n    }\n\n    /**\n     * 传递子类PriorityRunnable，传递Runnable而非PriorityRunnable的话，将不支持优先级调整\n     * 如果要使用Runnable又需要支持优先级可用扩展方法{{@link #execute(Runnable, int)}}并使用其返回值进行优先级调整\n     *\n     * @param command 命令\n     */\n    @Override\n    public void execute(Runnable command) {\n        if (command instanceof IPriorityComparable) {\n            super.execute(command);\n            return;\n        }\n        if (command instanceof IPriority) {\n            super.execute(new DefaultPriorityRunnable((IPriority) command, command));\n            return;\n        }\n        super.execute(new DefaultPriorityRunnable(new Priority(), command));\n    }\n\n    /**\n     * 传递子类PriorityRunnable，传递Runnable而非PriorityRunnable的话，将不支持优先级调整\n     * 如果要使用Runnable又需要支持优先级可用扩展方法{{@link #submit(Runnable, int)}}并使用其返回值进行优先级调整\n     *\n     * @param task 任务\n     * @return Future\n     */\n    @Override\n    public Future<?> submit(Runnable task) {\n        if (task instanceof IPriorityComparable) {\n            return super.submit(task);\n        }\n        if (task instanceof IPriority) {\n            return super.submit(new DefaultPriorityRunnable((IPriority) task, task));\n        }\n        return super.submit(new DefaultPriorityRunnable(new Priority(), task));\n    }\n\n    /**\n     * 传递子类PriorityRunnable，传递Runnable而非PriorityRunnable的话，将不支持优先级调整\n     * 如果要使用Runnable又需要支持优先级可用扩展方法{{@link #submit(Runnable, Object, int)}}并使用其返回值进行优先级调整\n     *\n     * @param task   任务\n     * @param result 结果\n     * @return Future\n     */\n    @Override\n    public <T> Future<T> submit(Runnable task, T result) {\n        if (task instanceof IPriorityComparable) {\n            return super.submit(task, result);\n        }\n        if (task instanceof IPriority) {\n            return super.submit(new DefaultPriorityRunnable((IPriority) task, task), result);\n        }\n        return super.submit(new DefaultPriorityRunnable(new Priority(), task), result);\n    }\n\n    /**\n     * 传递子类PriorityCallable，传递Callable而非PriorityCallable的话，将不支持优先级调整\n     * 如果要使用Callable又需要支持优先级可用扩展方法{{@link #submit(Callable, int)}}并使用其返回值进行优先级调整\n     *\n     * @param task 任务\n     * @return Future\n     */\n    @Override\n    public <T> Future<T> submit(Callable<T> task) {\n        if (task instanceof IPriorityComparable) {\n            return super.submit(task);\n        }\n        if (task instanceof IPriority) {\n            return super.submit(new DefaultPriorityCallable<>((IPriority) task, task));\n        }\n        return super.submit(new DefaultPriorityCallable<>(new Priority(), task));\n    }\n\n    //==============================构建者===================================//\n\n    /**\n     * 优先级线程池构建者\n     */\n    public static final class Builder {\n        /**\n         * 默认核心线程数【非IO操作】\n         */\n        private static final int DEFAULT_CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() + 1;\n        /**\n         * 默认的等待时长\n         */\n        private static final long DEFAULT_KEEP_ALIVE_TIME = 30;\n        /**\n         * 默认线程工厂名\n         */\n        private static final String DEFAULT_FACTORY_NAME = \"Priority\";\n        /**\n         * 核心(执行)线程池的线程数\n         */\n        int corePoolSize;\n        /**\n         * 当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n         */\n        long keepAliveTime;\n        /**\n         * 等待时长的单位\n         */\n        TimeUnit unit;\n        /**\n         * 线程池工作队列，用于在任务完成之前保留任务的队列执行\n         */\n        PriorityBlockingQueue<Runnable> workQueue;\n        /**\n         * 线程创建工厂\n         */\n        ThreadFactory threadFactory;\n        /**\n         * 拒绝执行的处理\n         */\n        RejectedExecutionHandler handler;\n\n        /**\n         * 构造方法\n         */\n        public Builder() {\n            this(DEFAULT_CORE_POOL_SIZE);\n        }\n\n        /**\n         * 构造方法\n         *\n         * @param corePoolSize 核心(执行)线程池的线程数\n         */\n        public Builder(int corePoolSize) {\n            this(corePoolSize, DEFAULT_KEEP_ALIVE_TIME, TimeUnit.SECONDS);\n        }\n\n        /**\n         * 构造方法\n         *\n         * @param corePoolSize  核心(执行)线程池的线程数\n         * @param keepAliveTime 当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n         * @param unit          等待时长的单位\n         */\n        public Builder(int corePoolSize, long keepAliveTime, TimeUnit unit) {\n            this.corePoolSize = corePoolSize;\n            this.keepAliveTime = keepAliveTime;\n            this.unit = unit;\n        }\n\n        public Builder setCorePoolSize(int corePoolSize) {\n            this.corePoolSize = corePoolSize;\n            return this;\n        }\n\n        public Builder setKeepAliveTime(long keepAliveTime) {\n            this.keepAliveTime = keepAliveTime;\n            return this;\n        }\n\n        public Builder setUnit(TimeUnit unit) {\n            this.unit = unit;\n            return this;\n        }\n\n        public Builder setWorkQueue(PriorityBlockingQueue<Runnable> workQueue) {\n            this.workQueue = workQueue;\n            return this;\n        }\n\n        public Builder setThreadFactory(ThreadFactory threadFactory) {\n            this.threadFactory = threadFactory;\n            return this;\n        }\n\n        public Builder setHandler(RejectedExecutionHandler handler) {\n            this.handler = handler;\n            return this;\n        }\n\n        /**\n         * 构建\n         *\n         * @return 优先级线程池\n         */\n        public PriorityThreadPoolExecutor build() {\n            if (workQueue == null) {\n                workQueue = new PriorityBlockingQueue<>();\n            }\n            if (threadFactory == null) {\n                threadFactory = TaskThreadFactory.getFactory(DEFAULT_FACTORY_NAME);\n            }\n            if (handler == null) {\n                handler = new TaskRecordPolicy();\n            }\n            return new PriorityThreadPoolExecutor(corePoolSize, corePoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);\n        }\n    }\n\n}"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/TaskRecordPolicy.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool;\n\nimport com.xuexiang.xtask.logger.TaskLogger;\n\nimport java.util.concurrent.RejectedExecutionHandler;\nimport java.util.concurrent.ThreadPoolExecutor;\n\n/**\n * 记录日志的拒绝策略\n *\n * @author xuexiang\n * @since 2021/12/16 2:02 AM\n */\npublic class TaskRecordPolicy implements RejectedExecutionHandler {\n\n    private static final String TAG = TaskLogger.getLogTag(\"RecordPolicy\");\n\n    @Override\n    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {\n        TaskLogger.eTag(TAG, \"Runnable task has been rejected! Thread [\" + Thread.currentThread().getName() + \"], Runnable: \" + r + \", ThreadPoolExecutor: \" + e);\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/TaskThreadFactory.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool;\n\nimport androidx.annotation.IntRange;\nimport androidx.annotation.NonNull;\n\nimport com.xuexiang.xtask.logger.TaskLogger;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * 自定义线程创建工厂\n *\n * @author xuexiang\n * @since 2021/10/9 4:01 PM\n */\npublic class TaskThreadFactory implements ThreadFactory {\n\n    private static final String TAG = TaskLogger.getLogTag(\"TaskThreadFactory\");\n\n    /**\n     * 线程池的编号池【静态全局】<优先级，线程池的编号>\n     */\n    private static final Map<Integer, AtomicInteger> POOL_NUMBER_MAP = new ConcurrentHashMap<>();\n    /**\n     * 线程组\n     */\n    private final ThreadGroup mThreadGroup;\n    /**\n     * 线程的编号\n     */\n    private final AtomicInteger mThreadNumber = new AtomicInteger(1);\n    /**\n     * 线程名前缀\n     */\n    private final String mNamePrefix;\n    /**\n     * 创建的线程优先级\n     */\n    private final int mPriority;\n\n    /**\n     * 获取线程创建工厂\n     *\n     * @param factoryName 工厂名\n     * @return 线程创建工厂\n     */\n    public static TaskThreadFactory getFactory(@NonNull String factoryName) {\n        return new TaskThreadFactory(factoryName, Thread.NORM_PRIORITY);\n    }\n\n    /**\n     * 获取线程创建工厂\n     *\n     * @param factoryName 工厂名\n     * @param priority    线程的优先级\n     * @return 线程创建工厂\n     */\n    public static TaskThreadFactory getFactory(@NonNull String factoryName, @IntRange(from = Thread.MIN_PRIORITY, to = Thread.MAX_PRIORITY) int priority) {\n        return new TaskThreadFactory(factoryName, priority);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param factoryName 工厂名\n     * @param priority    线程的优先级\n     */\n    private TaskThreadFactory(@NonNull String factoryName, @IntRange(from = Thread.MIN_PRIORITY, to = Thread.MAX_PRIORITY) int priority) {\n        SecurityManager securityManager = System.getSecurityManager();\n        mThreadGroup = (securityManager != null) ? securityManager.getThreadGroup() : Thread.currentThread().getThreadGroup();\n        mNamePrefix = factoryName + \"-task-pool(\" + priority + \") No.\" + getTaskPoolNumber(priority) + \", thread No.\";\n        mPriority = priority;\n    }\n\n    @Override\n    public Thread newThread(Runnable r) {\n        String threadName = mNamePrefix + mThreadNumber.getAndIncrement();\n        TaskLogger.iTag(TAG, \"Thread production, name is [\" + threadName + \"]\");\n        Thread thread = new Thread(mThreadGroup, r, threadName, 0);\n        if (thread.isDaemon()) {\n            // 设置为非守护线程\n            thread.setDaemon(false);\n        }\n        if (thread.getPriority() != mPriority) {\n            thread.setPriority(mPriority);\n        }\n        // 捕获多线程处理中的异常\n        thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {\n            @Override\n            public void uncaughtException(Thread thread, Throwable ex) {\n                TaskLogger.eTag(TAG, \"Running task appeared exception! Thread [\" + thread.getName() + \"], because [\" + ex.getMessage() + \"]\");\n            }\n        });\n        return thread;\n    }\n\n    private int getTaskPoolNumber(int priority) {\n        AtomicInteger poolNumber = POOL_NUMBER_MAP.get(priority);\n        if (poolNumber == null) {\n            poolNumber = new AtomicInteger(1);\n            POOL_NUMBER_MAP.put(priority, poolNumber);\n        }\n        return poolNumber.getAndIncrement();\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/base/BaseScheduledThreadPoolExecutor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool.base;\n\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.thread.priority.IPriority;\nimport com.xuexiang.xtask.thread.utils.PriorityUtils;\n\nimport java.util.concurrent.CancellationException;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.RejectedExecutionHandler;\nimport java.util.concurrent.ScheduledThreadPoolExecutor;\nimport java.util.concurrent.ThreadFactory;\n\n/**\n * ScheduledThreadPoolExecutor线程池基类\n * <p>\n * maximumPoolSize：Integer.MAX_VALUE\n * keepAliveTime：10L\n * unit：MILLISECONDS\n * workQueue：DelayedWorkQueue\n *\n * @author xuexiang\n * @since 3/19/22 4:49 PM\n */\npublic class BaseScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor {\n\n    private static final String TAG = TaskLogger.getLogTag(\"BaseScheduledThreadPoolExecutor\");\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize 核心(执行)线程池的线程数\n     */\n    public BaseScheduledThreadPoolExecutor(int corePoolSize) {\n        super(corePoolSize);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize  核心(执行)线程池的线程数\n     * @param threadFactory 线程创建工厂\n     */\n    public BaseScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) {\n        super(corePoolSize, threadFactory);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize 核心(执行)线程池的线程数\n     * @param handler      拒绝执行的处理\n     */\n    public BaseScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler) {\n        super(corePoolSize, handler);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize  核心(执行)线程池的线程数\n     * @param threadFactory 线程创建工厂\n     * @param handler       拒绝执行的处理\n     */\n    public BaseScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler) {\n        super(corePoolSize, threadFactory, handler);\n    }\n\n    @Override\n    protected void beforeExecute(Thread t, Runnable r) {\n        super.beforeExecute(t, r);\n        if (t == null) {\n            return;\n        }\n        if (!TaskLogger.isLogThreadName()) {\n            return;\n        }\n        if (r instanceof IPriority) {\n            TaskLogger.dTag(TAG, \"Running task start execute, id:\" + ((IPriority) r).getId() + \", priority:\" + ((IPriority) r).priority() + \", in Thread [\" + Thread.currentThread().getName() + \"]\");\n        } else {\n            TaskLogger.dTag(TAG, \"Running task start execute, in Thread [\" + Thread.currentThread().getName() + \"]\");\n        }\n    }\n\n    /**\n     * 线程执行结束，顺便看一下有么有什么乱七八糟的异常\n     */\n    @Override\n    protected void afterExecute(Runnable r, Throwable t) {\n        super.afterExecute(r, t);\n        if (t == null && r instanceof Future<?> && ((Future<?>) r).isDone()) {\n            try {\n                ((Future<?>) r).get();\n            } catch (CancellationException ce) {\n                t = ce;\n            } catch (ExecutionException ee) {\n                t = ee.getCause();\n            } catch (InterruptedException ie) {\n                Thread.currentThread().interrupt();\n            }\n        }\n        if (t != null) {\n            TaskLogger.wTag(TAG, \"Running task appeared exception! Thread [\" + Thread.currentThread().getName() + \"], because [\" + t.getMessage() + \"]\\n\" + PriorityUtils.formatStackTrace(t.getStackTrace()));\n        }\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/base/BaseThreadPoolExecutor.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool.base;\n\nimport com.xuexiang.xtask.logger.TaskLogger;\nimport com.xuexiang.xtask.thread.priority.IPriority;\nimport com.xuexiang.xtask.thread.utils.PriorityUtils;\n\nimport java.util.concurrent.BlockingQueue;\nimport java.util.concurrent.CancellationException;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.RejectedExecutionHandler;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * ThreadPoolExecutor线程池基类\n * <p>\n * 线程池的执行顺序：\n * <p>\n * 核心线程池(A) -> 阻塞队列(B) -> 最大线程数(C)[新建线程] -> RejectedExecutionHandler\n * <p>\n * 一个线程最多同时容纳的任务数= 阻塞队列(B) + 最大线程数(C)\n * <p>\n * allowCoreThreadTimeOut为true, 线程池数量最后销毁到0个。为false时, 线程池数量最后销毁到核心线程数。\n *\n * 阻塞队列:\n *\n * 1.ArrayBlockingQueue、LinkedBlockingQueue是有界阻塞队列。如果直接使用LinkedBlockingQueue的默认构造函数（默认大小是Integer.MAX_VALUE）可视为无界阻塞队列。\n * 2.PriorityBlockingQueue是无界阻塞队列。\n * 3.SynchronousQueue是无缓冲队列，一般设置这个的时候maximumPoolSize需要设置为Integer.MAX_VALUE\n *\n * @author xuexiang\n * @since 2021/12/16 2:05 AM\n */\npublic class BaseThreadPoolExecutor extends ThreadPoolExecutor {\n\n    private static final String TAG = TaskLogger.getLogTag(\"BaseThreadPoolExecutor\");\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize    核心(执行)线程池的线程数\n     * @param maximumPoolSize 线程池最大能容纳的线程数\n     * @param keepAliveTime   当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n     * @param unit            等待时长的单位\n     * @param workQueue       线程池工作队列，用于在任务完成之前保留任务的队列执行\n     */\n    public BaseThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize    核心(执行)线程池的线程数\n     * @param maximumPoolSize 线程池最大能容纳的线程数\n     * @param keepAliveTime   当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n     * @param unit            等待时长的单位\n     * @param workQueue       线程池工作队列，用于在任务完成之前保留任务的队列执行\n     * @param threadFactory   线程创建工厂\n     */\n    public BaseThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize    核心(执行)线程池的线程数\n     * @param maximumPoolSize 线程池最大能容纳的线程数\n     * @param keepAliveTime   当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n     * @param unit            等待时长的单位\n     * @param workQueue       线程池工作队列，用于在任务完成之前保留任务的队列执行\n     * @param handler         拒绝执行的处理\n     */\n    public BaseThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);\n    }\n\n    /**\n     * 构造方法\n     *\n     * @param corePoolSize    核心(执行)线程池的线程数\n     * @param maximumPoolSize 线程池最大能容纳的线程数\n     * @param keepAliveTime   当线程数大于核心数时，多余空闲线程在终止前等待新任务的最长时间。\n     * @param unit            等待时长的单位\n     * @param workQueue       线程池工作队列，用于在任务完成之前保留任务的队列执行\n     * @param threadFactory   线程创建工厂\n     * @param handler         拒绝执行的处理\n     */\n    public BaseThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);\n    }\n\n    @Override\n    protected void beforeExecute(Thread t, Runnable r) {\n        super.beforeExecute(t, r);\n        if (t == null) {\n           return;\n        }\n        if (!TaskLogger.isLogThreadName()) {\n            return;\n        }\n        if (r instanceof IPriority) {\n            TaskLogger.dTag(TAG, \"Running task start execute, id:\" + ((IPriority) r).getId() + \", priority:\" + ((IPriority) r).priority() + \", in Thread [\" + Thread.currentThread().getName() + \"]\");\n        } else {\n            TaskLogger.dTag(TAG, \"Running task start execute, in Thread [\" + Thread.currentThread().getName() + \"]\");\n        }\n    }\n\n    /**\n     * 线程执行结束，顺便看一下有么有什么乱七八糟的异常\n     */\n    @Override\n    protected void afterExecute(Runnable r, Throwable t) {\n        super.afterExecute(r, t);\n        if (t == null && r instanceof Future<?> && ((Future<?>) r).isDone()) {\n            try {\n                ((Future<?>) r).get();\n            } catch (CancellationException ce) {\n                t = ce;\n            } catch (ExecutionException ee) {\n                t = ee.getCause();\n            } catch (InterruptedException ie) {\n                Thread.currentThread().interrupt();\n            }\n        }\n        if (t != null) {\n            TaskLogger.wTag(TAG, \"Running task appeared exception! Thread [\" + Thread.currentThread().getName() + \"], because [\" + t.getMessage() + \"]\\n\" + PriorityUtils.formatStackTrace(t.getStackTrace()));\n        }\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/cancel/CancelHandlerRunnable.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool.cancel;\n\nimport android.os.Handler;\n\nimport androidx.annotation.NonNull;\n\nimport java.lang.ref.WeakReference;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\n/**\n * 可以取消的供Handler使用的Runnable\n *\n * @author xuexiang\n * @since 3/21/22 1:34 AM\n */\npublic class CancelHandlerRunnable implements Runnable, ICancelable {\n\n    /**\n     * 获取可以取消的Runnable\n     *\n     * @param handler  handler\n     * @param runnable 执行任务\n     * @return 可以取消的Runnable\n     */\n    public static CancelHandlerRunnable get(@NonNull Handler handler, @NonNull Runnable runnable) {\n        return new CancelHandlerRunnable(handler, runnable);\n    }\n\n    private WeakReference<Handler> mHandler;\n\n    private Runnable mRunnable;\n\n    private AtomicBoolean mIsCancelled = new AtomicBoolean(false);\n\n    /**\n     * 构造方法\n     *\n     * @param handler  handler\n     * @param runnable 执行任务\n     */\n    private CancelHandlerRunnable(@NonNull Handler handler, @NonNull Runnable runnable) {\n        mHandler = new WeakReference<>(handler);\n        mRunnable = runnable;\n    }\n\n    /**\n     * 开始延期执行\n     *\n     * @param delayMillis 延期时间\n     * @return 取消接口\n     */\n    public ICancelable startDelayed(long delayMillis) {\n        final Handler handler = mHandler.get();\n        if (handler != null) {\n            handler.postDelayed(this, delayMillis);\n        }\n        return this;\n    }\n\n    @Override\n    public void cancel() {\n        if (isCancelled()) {\n            return;\n        }\n        final Handler handler = mHandler.get();\n        if (handler == null) {\n            return;\n        }\n        handler.removeCallbacks(this);\n        mIsCancelled.set(true);\n    }\n\n    @Override\n    public boolean isCancelled() {\n        return mIsCancelled.get();\n    }\n\n    @Override\n    public void run() {\n        if (mRunnable != null) {\n            mRunnable.run();\n        }\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/cancel/ICancelable.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool.cancel;\n\n/**\n * 可取消执行的实现接口\n *\n * @author xuexiang\n * @since 2021/11/2 12:20 AM\n */\npublic interface ICancelable {\n\n    /**\n     * 取消\n     */\n    void cancel();\n\n    /**\n     * 获取是否已取消\n     *\n     * @return 是否已取消\n     */\n    boolean isCancelled();\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/cancel/ICanceller.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool.cancel;\n\n/**\n * 取消者\n *\n * @author xuexiang\n * @since 2/7/22 12:39 PM\n */\npublic interface ICanceller extends ICancelable {\n\n    /**\n     * 获取取消的标识\n     *\n     * @return 取消的标识\n     */\n    String getName();\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/cancel/ICancellerPool.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool.cancel;\n\nimport java.util.Collection;\n\n/**\n * 取消者订阅池\n *\n * @author xuexiang\n * @since 2/7/22 1:03 PM\n */\npublic interface ICancellerPool {\n\n    /**\n     * 添加取消者\n     *\n     * @param name       取消者名称\n     * @param cancelable 取消接口\n     * @return 是否执行成功\n     */\n    boolean add(String name, ICancelable cancelable);\n\n    /**\n     * 去除取消者\n     *\n     * @param name 取消者名称\n     * @return 是否执行成功\n     */\n    boolean remove(String name);\n\n    /**\n     * 指定取消者执行\n     *\n     * @param name 取消者名称\n     * @return 是否执行成功\n     */\n    boolean cancel(String name);\n\n    /**\n     * 指定取消者集合执行\n     *\n     * @param names 取消者集合\n     */\n    void cancel(String... names);\n\n    /**\n     * 指定取消者集合执行\n     *\n     * @param names 取消者集合\n     */\n    void cancel(Collection<String> names);\n\n    /**\n     * 所有取消者执行\n     */\n    void cancelAll();\n\n    /**\n     * 清楚所有\n     *\n     * @param ifNeedCancel 是否在清除前取消\n     */\n    void clear(boolean ifNeedCancel);\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/cancel/IFuture.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool.cancel;\n\nimport java.util.concurrent.Future;\n\n/**\n * 可直接取消任务的Future接口\n *\n * @author xuexiang\n * @since 1/25/22 2:04 AM\n */\npublic interface IFuture<T> extends Future<T>, ICancelable {\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/cancel/IScheduledFuture.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool.cancel;\n\nimport java.util.concurrent.RunnableScheduledFuture;\n\n/**\n * 可直接取消任务的RunnableScheduledFuture接口\n *\n * @author xuexiang\n * @since 3/20/22 1:30 AM\n */\npublic interface IScheduledFuture<T> extends RunnableScheduledFuture<T>, ICancelable {\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/pool/cancel/TaskCancellerPool.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.pool.cancel;\n\nimport com.xuexiang.xtask.thread.utils.CancelUtils;\n\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * 任务取消者池\n *\n * @author xuexiang\n * @since 2/7/22 12:43 PM\n */\npublic final class TaskCancellerPool implements ICancellerPool {\n\n    private Map<String, ICancelable> mPool = new ConcurrentHashMap<>();\n\n    @Override\n    public boolean add(String name, ICancelable cancelable) {\n        if (name == null || cancelable == null) {\n            return false;\n        }\n        return mPool.put(name, cancelable) != null;\n    }\n\n    @Override\n    public boolean remove(String name) {\n        if (name == null) {\n            return false;\n        }\n        return mPool.remove(name) != null;\n    }\n\n    @Override\n    public boolean cancel(String name) {\n        if (name == null) {\n            return false;\n        }\n        ICancelable cancelable = mPool.get(name);\n        boolean result = CancelUtils.cancel(cancelable);\n        mPool.remove(name);\n        return result;\n    }\n\n    @Override\n    public void cancel(String... names) {\n        for (String name : names) {\n            cancel(name);\n        }\n    }\n\n    @Override\n    public void cancel(Collection<String> names) {\n        for (String name : names) {\n            cancel(name);\n        }\n    }\n\n    @Override\n    public void cancelAll() {\n        if (mPool.isEmpty()) {\n            return;\n        }\n        CancelUtils.cancel(mPool.values());\n        mPool.clear();\n    }\n\n    @Override\n    public void clear(boolean ifNeedCancel) {\n        if (ifNeedCancel) {\n            cancelAll();\n        } else {\n            mPool.clear();\n        }\n    }\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/IPriority.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority;\n\n/**\n * 优先级排序接口\n *\n * @author xuexiang\n * @since 2021/10/9 2:32 AM\n */\npublic interface IPriority {\n\n    /**\n     * 获取优先级，越大越靠前\n     *\n     * @return 优先级\n     */\n    int priority();\n\n    /**\n     * 改变优先级，越大越靠前\n     *\n     * @param priority 优先级\n     */\n    void priority(int priority);\n\n    /**\n     * 获取序号\n     *\n     * @return 序号\n     */\n    long getId();\n\n    /**\n     * 设置序号\n     *\n     * @param id 序号\n     */\n    void setId(long id);\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/IPriorityCallable.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority;\n\nimport java.util.concurrent.Callable;\n\n/**\n * 具有优先级排序的Callable接口\n *\n * @author xuexiang\n * @since 2021/10/9 2:36 AM\n */\npublic interface IPriorityCallable<V> extends IPriorityComparable<IPriority>, Callable<V> {\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/IPriorityComparable.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority;\n\n/**\n * 具有优先级排序的Comparable接口\n *\n * @author xuexiang\n * @since 2021/10/9 2:36 AM\n */\npublic interface IPriorityComparable<T> extends IPriority, Comparable<T> {\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/IPriorityFuture.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority;\n\nimport com.xuexiang.xtask.thread.pool.cancel.IFuture;\n\n/**\n * 具有优先级排序的Future接口\n *\n * @author xuexiang\n * @since 2021/10/9 2:31 AM\n */\npublic interface IPriorityFuture<V> extends IPriorityComparable<IPriority>, IFuture<V> {\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/IPriorityRunnable.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority;\n\n/**\n * 具有优先级排序的Runnable接口\n *\n * @author xuexiang\n * @since 2021/10/9 2:34 AM\n */\npublic interface IPriorityRunnable extends IPriorityComparable<IPriority>, Runnable {\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/IPriorityStrategy.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority;\n\n/**\n * 优先级策略实现接口\n *\n * @author xuexiang\n * @since 2021/10/9 12:15 PM\n */\npublic interface IPriorityStrategy {\n\n    /**\n     * 比较两个优先级\n     *\n     * @param priority 优先级\n     * @param other    比较的优先级\n     * @return 比较结果，如果priority比other的优先级高，那么结果<0;\n     */\n    int compare(IPriority priority, IPriority other);\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/impl/DefaultPriorityCallable.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority.impl;\n\nimport com.xuexiang.xtask.thread.priority.IPriority;\nimport com.xuexiang.xtask.thread.priority.IPriorityCallable;\nimport com.xuexiang.xtask.thread.utils.PriorityUtils;\n\nimport java.util.concurrent.Callable;\n\n/**\n * 具有优先级排序的Callable\n *\n * @author xuexiang\n * @since 2021/10/9 11:35 AM\n */\npublic class DefaultPriorityCallable<V> implements IPriorityCallable<V> {\n    /**\n     * 优先级\n     */\n    private IPriority mPriority;\n    /**\n     * 执行任务\n     */\n    private Callable<V> mCallable;\n\n    public DefaultPriorityCallable(IPriority priority, Callable<V> callable) {\n        mPriority = priority;\n        mCallable = callable;\n        setId(PriorityUtils.generateId());\n    }\n\n    @Override\n    public void priority(int priority) {\n        if (mPriority != null) {\n            mPriority.priority(priority);\n        }\n    }\n\n    @Override\n    public long getId() {\n        return mPriority != null ? mPriority.getId() : 0;\n    }\n\n    @Override\n    public void setId(long id) {\n        if (mPriority != null) {\n            mPriority.setId(id);\n        }\n    }\n\n    @Override\n    public int priority() {\n        return mPriority != null ? mPriority.priority() : 0;\n    }\n\n    @Override\n    public int compareTo(IPriority other) {\n        return PriorityUtils.compare(this, other);\n    }\n\n    @Override\n    public V call() throws Exception {\n        if (mCallable != null) {\n            return mCallable.call();\n        }\n        return null;\n    }\n\n    @Override\n    public String toString() {\n        return \"DefaultPriorityCallable{\" +\n                \", mPriority=\" + mPriority +\n                \", mCallable=\" + mCallable +\n                '}';\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/impl/DefaultPriorityFuture.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority.impl;\n\nimport com.xuexiang.xtask.thread.priority.IPriority;\nimport com.xuexiang.xtask.thread.priority.IPriorityFuture;\nimport com.xuexiang.xtask.thread.utils.PriorityUtils;\n\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.FutureTask;\n\n/**\n * 具有优先级排序的Future\n *\n * @author xuexiang\n * @since 2021/10/9 11:16 AM\n */\npublic class DefaultPriorityFuture<V> extends FutureTask<V> implements IPriorityFuture<V> {\n\n    /**\n     * 优先级\n     */\n    private IPriority mPriority;\n\n    public DefaultPriorityFuture(Callable<V> callable) {\n        super(callable);\n        if (callable instanceof IPriority) {\n            mPriority = (IPriority) callable;\n        }\n        setId(PriorityUtils.generateId());\n    }\n\n    public DefaultPriorityFuture(Runnable runnable, V result) {\n        super(runnable, result);\n        if (runnable instanceof IPriority) {\n            mPriority = (IPriority) runnable;\n        }\n        setId(PriorityUtils.generateId());\n    }\n\n    @Override\n    public void priority(int priority) {\n        if (mPriority != null) {\n            mPriority.priority(priority);\n        }\n    }\n\n    @Override\n    public long getId() {\n        return mPriority != null ? mPriority.getId() : 0;\n    }\n\n    @Override\n    public void setId(long id) {\n        if (mPriority != null) {\n            mPriority.setId(id);\n        }\n    }\n\n    @Override\n    public int priority() {\n        return mPriority != null ? mPriority.priority() : 0;\n    }\n\n    @Override\n    public int compareTo(IPriority other) {\n        return PriorityUtils.compare(this, other);\n    }\n\n    @Override\n    public String toString() {\n        return \"DefaultPriorityFuture{\" +\n                \", mPriority=\" + mPriority +\n                '}';\n    }\n\n    @Override\n    public void cancel() {\n        cancel(true);\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/impl/DefaultPriorityRunnable.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority.impl;\n\nimport com.xuexiang.xtask.thread.priority.IPriority;\nimport com.xuexiang.xtask.thread.priority.IPriorityRunnable;\nimport com.xuexiang.xtask.thread.utils.PriorityUtils;\n\n/**\n * 具有优先级排序的Runnable\n *\n * @author xuexiang\n * @since 2021/10/9 11:32 AM\n */\npublic class DefaultPriorityRunnable implements IPriorityRunnable {\n    /**\n     * 优先级\n     */\n    private IPriority mPriority;\n    /**\n     * 执行任务\n     */\n    private Runnable mRunnable;\n\n    public DefaultPriorityRunnable(IPriority priority, Runnable runnable) {\n        mPriority = priority;\n        mRunnable = runnable;\n        setId(PriorityUtils.generateId());\n    }\n\n    @Override\n    public void priority(int priority) {\n        if (mPriority != null) {\n            mPriority.priority(priority);\n        }\n    }\n\n    @Override\n    public long getId() {\n        return mPriority != null ? mPriority.getId() : 0;\n    }\n\n    @Override\n    public void setId(long id) {\n        if (mPriority != null) {\n            mPriority.setId(id);\n        }\n    }\n\n    @Override\n    public int priority() {\n        return mPriority != null ? mPriority.priority() : 0;\n    }\n\n    @Override\n    public int compareTo(IPriority other) {\n        return PriorityUtils.compare(this, other);\n    }\n\n    @Override\n    public void run() {\n        if (mRunnable != null) {\n            mRunnable.run();\n        }\n    }\n\n    @Override\n    public String toString() {\n        return \"DefaultPriorityRunnable{\" +\n                \", mPriority=\" + mPriority +\n                \", mRunnable=\" + mRunnable +\n                '}';\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/impl/DefaultPriorityStrategy.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority.impl;\n\nimport com.xuexiang.xtask.thread.priority.IPriority;\nimport com.xuexiang.xtask.thread.priority.IPriorityStrategy;\n\n/**\n * 默认的优先级比较策略\n * 优先级值大的放前面，当优先值一样的，序号小的放前面\n *\n * @author xuexiang\n * @since 2021/10/9 3:05 PM\n */\npublic class DefaultPriorityStrategy implements IPriorityStrategy {\n    @Override\n    public int compare(IPriority priority, IPriority other) {\n        if (priority == null || other == null) {\n            return 0;\n        }\n        if (priority.priority() == other.priority()) {\n            // ASC(升序)，序号小的放前面\n            return priority.getId() < other.getId() ? -1 : 1;\n        } else {\n            // DESC(降序), 优先级大的放前面\n            return priority.priority() > other.priority() ? -1 : 1;\n        }\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/priority/impl/Priority.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.priority.impl;\n\nimport com.xuexiang.xtask.thread.priority.IPriority;\n\n/**\n * 优先级【先比较优先级，再比较序号】\n *\n * @author xuexiang\n * @since 2021/10/9 11:29 AM\n */\npublic class Priority implements IPriority {\n\n    /**\n     * 优先级\n     */\n    private int mPriority;\n\n    /**\n     * 序号\n     */\n    private long mId;\n\n    public Priority() {\n\n    }\n\n    public Priority(int priority) {\n        mPriority = priority;\n    }\n\n    @Override\n    public int priority() {\n        return mPriority;\n    }\n\n    @Override\n    public void priority(int priority) {\n        mPriority = priority;\n    }\n\n    @Override\n    public long getId() {\n        return mId;\n    }\n\n    @Override\n    public void setId(long id) {\n        mId = id;\n    }\n\n    @Override\n    public String toString() {\n        return \"Priority{\" +\n                \"mPriority=\" + mPriority +\n                \", mId=\" + mId +\n                '}';\n    }\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/utils/CancelUtils.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.utils;\n\nimport com.xuexiang.xtask.thread.pool.cancel.ICancelable;\n\nimport java.util.Collection;\n\n/**\n * 取消任务工具类\n *\n * @author xuexiang\n * @since 3/20/22 2:34 AM\n */\npublic final class CancelUtils {\n\n\n    /**\n     * 取消执行接口\n     *\n     * @param cancelable 可取消执行的实现接口\n     * @return 取消执行的结果\n     */\n    public static boolean cancel(ICancelable cancelable) {\n        if (cancelable != null && !cancelable.isCancelled()) {\n            cancelable.cancel();\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * 取消执行接口集合\n     *\n     * @param cancelables 可取消执行的实现接口集合\n     */\n    public static void cancel(Collection<ICancelable> cancelables) {\n        if (cancelables == null || cancelables.isEmpty()) {\n            return;\n        }\n        for (ICancelable cancelable : cancelables) {\n            cancel(cancelable);\n        }\n    }\n\n    /**\n     * 取消执行接口集合\n     *\n     * @param cancelables 可取消执行的实现接口集合\n     */\n    public static void cancel(ICancelable... cancelables) {\n        if (cancelables == null || cancelables.length == 0) {\n            return;\n        }\n        for (ICancelable cancelable : cancelables) {\n            cancel(cancelable);\n        }\n    }\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/utils/ExecutorUtils.java",
    "content": "/*\n * Copyright (C) 2022 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.utils;\n\nimport android.os.Looper;\n\nimport java.util.Collection;\nimport java.util.concurrent.ExecutorService;\n\n/**\n * 线程池工具\n *\n * @author xuexiang\n * @since 1/21/22 2:11 AM\n */\npublic final class ExecutorUtils {\n\n    private ExecutorUtils() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    /**\n     * 关闭线程池\n     *\n     * @param executor 线程池\n     */\n    public static void shutdown(ExecutorService executor) {\n        if (executor != null && !executor.isShutdown()) {\n            executor.shutdown();\n        }\n    }\n\n    /**\n     * 关闭线程池\n     *\n     * @param executors 线程池集合\n     */\n    public static void shutdown(Collection<? extends ExecutorService> executors) {\n        if (executors == null || executors.isEmpty()) {\n            return;\n        }\n        for (ExecutorService executor : executors) {\n            shutdown(executor);\n        }\n    }\n\n    /**\n     * 是否是主线程\n     *\n     * @return 是否是主线程\n     */\n    public static boolean isMainThread() {\n        return Looper.getMainLooper() == Looper.myLooper();\n    }\n\n}\n"
  },
  {
    "path": "xtask-thread/src/main/java/com/xuexiang/xtask/thread/utils/PriorityUtils.java",
    "content": "/*\n * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *       http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.xuexiang.xtask.thread.utils;\n\nimport com.xuexiang.xtask.thread.priority.IPriority;\nimport com.xuexiang.xtask.thread.priority.IPriorityStrategy;\nimport com.xuexiang.xtask.thread.priority.impl.DefaultPriorityStrategy;\n\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * 优先级工具类\n *\n * @author xuexiang\n * @since 2021/10/9 12:08 PM\n */\npublic final class PriorityUtils {\n\n    private static final AtomicLong SEQ = new AtomicLong(0);\n\n    private static IPriorityStrategy sPriorityStrategy = new DefaultPriorityStrategy();\n\n    private PriorityUtils() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    /**\n     * 自动生成id\n     *\n     * @return 生成的id\n     */\n    public static long generateId() {\n        return SEQ.getAndIncrement();\n    }\n\n    /**\n     * 设置优先级策略实现接口\n     *\n     * @param sPriorityStrategy 优先级策略\n     */\n    public static void setPriorityStrategy(IPriorityStrategy sPriorityStrategy) {\n        PriorityUtils.sPriorityStrategy = sPriorityStrategy;\n    }\n\n    /**\n     * 比较两个优先级\n     *\n     * @param priority 优先级\n     * @param other    比较的优先级\n     * @return 比较结果，如果priority比other的优先级高，那么结果<0;\n     */\n    public static int compare(IPriority priority, IPriority other) {\n        if (sPriorityStrategy == null) {\n            sPriorityStrategy = new DefaultPriorityStrategy();\n        }\n        return sPriorityStrategy.compare(priority, other);\n    }\n\n    /**\n     * 格式化堆栈信息\n     *\n     * @param stackTrace 堆栈信息数组\n     */\n    public static String formatStackTrace(StackTraceElement[] stackTrace) {\n        StringBuilder sb = new StringBuilder();\n        for (StackTraceElement element : stackTrace) {\n            sb.append(\"    at \").append(element.toString());\n            sb.append(\"\\n\");\n        }\n        return sb.toString();\n    }\n\n}\n"
  }
]